blob: 2f2a6c0b82baca0143bd4a7e4830401824fe75b0 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
package basicrunner.basichelper;
import com.sun.star.beans.PropertyValue;
import com.sun.star.lang.XInitialization;
import com.sun.star.lang.XSingleServiceFactory;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.lang.XTypeProvider;
import com.sun.star.uno.Type;
import com.sun.star.frame.XDispatch;
import com.sun.star.frame.XDispatchProvider;
import com.sun.star.frame.XModel;
import com.sun.star.util.XURLTransformer;
import com.sun.star.frame.XController;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.util.URL;
import com.sun.star.lang.XMultiServiceFactory;
import util.utils;
import com.sun.star.lang.XComponent;
import lib.StatusException;
import lib.Status;
import util.SOfficeFactory;
import com.sun.star.ui.dialogs.XExecutableDialog;
public class ThreadRunner implements XServiceInfo, XSingleServiceFactory {
static final String __serviceName = "basichelper.ThreadRunner";
static ThreadRunnerImpl oThreadRunner = null;
public ThreadRunner(XMultiServiceFactory xMSF) {
oThreadRunner = new ThreadRunnerImpl(xMSF);
}
public Object createInstanceWithArguments(Object[] args) {
return oThreadRunner;
}
public Object createInstance() {
return createInstanceWithArguments(null);
}
public byte[] getImplementationId() {
return toString().getBytes();
}
public Type[] getTypes() {
Class interfaces[] = getClass().getInterfaces();
Type types[] = new Type[interfaces.length];
for(int i = 0; i < interfaces.length; ++ i)
types[i] = new Type(interfaces[i]);
return types;
}
public boolean supportsService(String name) {
return __serviceName.equals(name);
}
public String[] getSupportedServiceNames() {
return new String[] {__serviceName};
}
public String getImplementationName() {
return getClass().getName();
}
}
class ThreadRunnerImpl implements XInitialization, XTypeProvider {
Object oDoc = null;
String actionType = null;
String actionParm = null;
XMultiServiceFactory oMSF = null;
public ThreadRunnerImpl(XMultiServiceFactory MSF) {
oMSF = MSF;
}
public void initialize(Object[] params) throws com.sun.star.uno.Exception {
boolean parmsOK = false;
if (!(params[0] instanceof String)) {
throw new StatusException(Status.failed(
"Wrong first parameter for ThreadRunner, allowed values:" +
"'OpenToolkitDialog', 'OpenDialogFromFile', 'ExecuteDialog'"));
}
actionType = (String) params[0];
if (actionType.equals("OpenToolkitDialog")) {
if (params.length != 3 || !(params[2] instanceof Object) ||
!(params[1] instanceof String) ) {
throw new StatusException(Status.failed("Expected the " +
"following type of parameters for 'OpenToolkitDialog': " +
"String, Object"));
}
actionParm = (String)params[1];
oDoc = (Object)params[2];
ToolkitDialogThread aThread =
new ToolkitDialogThread(oMSF, oDoc, actionParm);
aThread.start();
} else if (actionType.equals("OpenDialogFromFile")) {
if (params.length != 2 || !(params[1] instanceof String) ) {
throw new StatusException(Status.failed("Expected the " +
"following type of parameters for 'OpenDialogFromFile': " +
"String"));
}
actionParm = (String)params[1];
DialogFromFileThread bThread =
new DialogFromFileThread(oMSF, actionParm);
bThread.start();
} else if ( actionType.equals("ExecuteDialog")) {
if (params.length != 2 || !(params[1] instanceof String)) {
throw new StatusException(Status.failed("Expected the " +
"following type of parameters for 'ExecuteDialog': " +
"String"));
}
ExecuteDialogThread cThread =
new ExecuteDialogThread(oMSF, (String)params[1]);
cThread.start();
} else {
System.out.println("Error! ThreadRunnerImpl.initialize(): " +
"Incorrect parameters!");
}
}
public byte[] getImplementationId() {
return toString().getBytes();
}
public Type[] getTypes() {
Class interfaces[] = getClass().getInterfaces();
Type types[] = new Type[interfaces.length];
for(int i = 0; i < interfaces.length; ++ i)
types[i] = new Type(interfaces[i]);
return types;
}
}
class ToolkitDialogThread extends Thread {
Object oDoc = null;
String url = null;
XMultiServiceFactory msf = null;
public ToolkitDialogThread(XMultiServiceFactory xMSF, Object doc, String sUrl) {
oDoc = doc;
url = sUrl;
msf = xMSF;
}
public void run() {
XModel aModel = (XModel) UnoRuntime.queryInterface(XModel.class, oDoc);
XController xController = aModel.getCurrentController();
try {
XDispatchProvider xDispProv = (XDispatchProvider)
UnoRuntime.queryInterface( XDispatchProvider.class, xController );
XURLTransformer xParser = (com.sun.star.util.XURLTransformer)
UnoRuntime.queryInterface(XURLTransformer.class,
msf.createInstance("com.sun.star.util.URLTransformer"));
URL[] aParseURL = new URL[1];
aParseURL[0] = new URL();
aParseURL[0].Complete = url;
xParser.parseStrict(aParseURL);
URL aURL = aParseURL[0];
XDispatch xDispatcher = xDispProv.queryDispatch( aURL,"",0);
if( xDispatcher != null )
xDispatcher.dispatch( aURL, null );
} catch (com.sun.star.uno.Exception e) {
System.out.println("Couldn't open dialog!!!");
throw new StatusException( "Couldn't open dialog!!!", e );
}
}
}
class DialogFromFileThread extends Thread {
String url = null;
SOfficeFactory SOF = null;
XMultiServiceFactory myMSF = null;
public DialogFromFileThread(XMultiServiceFactory xMSF, String sUrl) {
url = sUrl;
SOF = SOfficeFactory.getFactory(xMSF);
myMSF = xMSF;
}
public void run() {
try {
PropertyValue[] args = new PropertyValue[1];
args[0] = new PropertyValue();
args[0].Name = "InteractionHandler";
args[0].Value = myMSF.createInstance(
"com.sun.star.comp.uui.UUIInteractionHandler");
String testUrl= utils.getFullTestURL(url);
System.out.println("loading "+testUrl);
XComponent xDoc = SOF.loadDocument(testUrl, args);
} catch (com.sun.star.uno.Exception e) {
System.out.println("Couldn't create document!!!");
throw new StatusException( "Couldn't create document!!!", e );
}
}
}
class ExecuteDialogThread extends Thread {
XMultiServiceFactory xMSF = null;
String serviceName = null;
public ExecuteDialogThread(XMultiServiceFactory xMSF, String serviceName) {
this.xMSF = xMSF;
this.serviceName = serviceName;
}
public void run() {
Object dlg = null;
try {
dlg = xMSF.createInstance(serviceName);
} catch(com.sun.star.uno.Exception e) {
throw new StatusException(Status.failed("Couldn't create service"));
}
XExecutableDialog execDlg = (XExecutableDialog)UnoRuntime.queryInterface
(XExecutableDialog.class, dlg);
execDlg.execute();
}
}