/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
package complex.sfx2.tools;
import com.sun.star.accessibility.AccessibleRole;
import com.sun.star.accessibility.XAccessible;
import com.sun.star.accessibility.XAccessibleAction;
import com.sun.star.accessibility.XAccessibleContext;
import com.sun.star.awt.XExtendedToolkit;
import com.sun.star.awt.XWindow;
import com.sun.star.beans.PropertyValue;
import com.sun.star.frame.XController;
import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XDispatch;
import com.sun.star.frame.XDispatchProvider;
import com.sun.star.frame.XModel;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.text.XTextDocument;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.util.URL;
import com.sun.star.util.XCloseable;
import com.sun.star.util.XURLTransformer;
import util.AccessibilityTools;
import util.WriterTools;
/**
* Methods to open Writer docs
*
*/
public class WriterHelper {
private XMultiServiceFactory m_xMSF =
null;
/**
* Creates a new instance of WriterHelper
*
* @param xMSF
* The MultiServiceFactory gained from the office
*/
public WriterHelper(XMultiServiceFactory xMSF) {
this.m_xMSF = xMSF;
}
/**
* Opens an empty document
*
* @return a reference to the opened document is returned
*/
public XTextDocument openEmptyDoc() {
return WriterTools.createTextDoc(m_xMSF);
}
/**
* Closes a given XTextDocument
*
* @param xTextDoc
* the text document to be closed
* @return if an error occurs the errormessage is returned and an empty
* String if not
*/
public String closeDoc(XTextDocument xTextDoc) {
XCloseable closer = UnoRuntime.queryInterface(XCloseable.
class,
xTextDoc);
String err =
"";
try {
closer.close(
true);
}
catch (com.sun.star.util.CloseVetoException e) {
err =
"couldn't close document " + e;
System.out.println(err);
}
return err;
}
private XTextDocument xLocalDoc =
null;
/**
* a TextDocument is opened by pressing a button in a dialog given by
* uno-URL
*
* @param url
* the uno-URL of the dialog to be opened
* @param createButton
* the language dependent label of the button to be pressed
* @param destroyLocal
* if true the document that has been opened to dispatch the
* dialog is closed before the method returns, otherwise this
* document remains open
* @return returns the created Textdocument
*/
public XTextDocument openFromDialog(String url, String createButton,
boolean destroyLocal)
throws Exception {
xLocalDoc = WriterTools.createTextDoc(m_xMSF);
XComponent comp = UnoRuntime
.queryInterface(XComponent.
class, xLocalDoc);
XModel aModel = UnoRuntime.queryInterface(XModel.
class, comp);
XController xController = aModel.getCurrentController();
// Opening Dialog
XDispatchProvider xDispProv = UnoRuntime.queryInterface(
XDispatchProvider.
class, xController.getFrame());
XURLTransformer xParser = UnoRuntime.queryInterface(
XURLTransformer.
class,
m_xMSF.createInstance(
"com.sun.star.util.URLTransformer"));
// Because it's an in/out parameter
// we must use an array of URL objects.
URL[] aParseURL =
new URL[] {
new URL() };
aParseURL[0].Complete = url;
xParser.parseStrict(aParseURL);
XDispatch xDispatcher = xDispProv.queryDispatch(aParseURL[0],
"",
com.sun.star.frame.FrameSearchFlag.SELF
| com.sun.star.frame.FrameSearchFlag.CHILDREN);
if (xDispatcher !=
null) {
PropertyValue[] dispatchArguments =
new PropertyValue[0];
xDispatcher.dispatch(aParseURL[0], dispatchArguments);
}
if (createButton.length() > 1) {
XExtendedToolkit tk = getToolkit();
Object atw = tk.getActiveTopWindow();
XWindow xWindow = UnoRuntime.queryInterface(XWindow.
class, atw);
XAccessible xRoot = AccessibilityTools.getAccessibleObject(xWindow);
XAccessibleContext buttonContext = AccessibilityTools
.getAccessibleObjectForRole(xRoot,
AccessibleRole.PUSH_BUTTON, createButton);
XAccessibleAction buttonAction = UnoRuntime.queryInterface(
XAccessibleAction.
class, buttonContext);
try {
System.out
.println(
"Name: " + buttonContext.getAccessibleName());
buttonAction.doAccessibleAction(0);
}
catch (com.sun.star.lang.IndexOutOfBoundsException e) {
System.out.println(
"Couldn't press button");
}
util.utils.waitForEventIdle(m_xMSF);
}
XDesktop xDesktop = getDesktop();
XTextDocument returnDoc = UnoRuntime.queryInterface(
XTextDocument.
class, xDesktop.getCurrentComponent());
if (destroyLocal) {
closeDoc(xLocalDoc);
xLocalDoc =
null;
}
return returnDoc;
}
public void closeFromDialog() {
closeDoc(xLocalDoc);
xLocalDoc =
null;
}
/**
* creates an instance of com.sun.star.awt.Toolkit to query the
* XExtendedToolkit interface
*
* @return returns the gained XExtendedToolkit Interface
*/
public XExtendedToolkit getToolkit()
throws com.sun.star.uno.Exception {
Object toolkit = m_xMSF.createInstance(
"com.sun.star.awt.Toolkit");
XExtendedToolkit tk = UnoRuntime.queryInterface(XExtendedToolkit.
class,
toolkit);
return tk;
}
/**
* creates an instance of com.sun.star.frame.Desktop to query the XDesktop
* interface
*
* @return returns the gained XDesktop interface
*/
private XDesktop getDesktop()
throws com.sun.star.uno.Exception {
Object desk = m_xMSF.createInstance(
"com.sun.star.frame.Desktop");
XDesktop xDesktop = UnoRuntime.queryInterface(XDesktop.
class, desk);
return xDesktop;
}
}