office-gobmx/qadevOOo/runner/util/BasicMacroTools.java

261 lines
10 KiB
Java

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
package util;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.container.XNameAccess;
import com.sun.star.frame.XController;
import com.sun.star.frame.XDispatch;
import com.sun.star.frame.XDispatchProvider;
import com.sun.star.frame.XFrame;
import com.sun.star.frame.XModel;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.script.XLibraryContainer;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.util.*;
import com.sun.star.util.URL;
import com.sun.star.util.XURLTransformer;
public class BasicMacroTools {
private final XDispatchProvider mDispProv;
private final XMultiServiceFactory mMSF;
private final XURLTransformer mParser;
private final XNameAccess mLCxNA; //LibraryContainer::XNameAccess
private final XLibraryContainer mLCxLC; //LibraryContainer::XLibraryContainer
/*
*While initializing the Basic Libraries will be appendend to the Document
*/
public BasicMacroTools(XMultiServiceFactory msf, XModel xModel,
XComponent xDoc) throws java.lang.Exception {
try {
mMSF = msf;
mDispProv = makeDispatchProvider(mMSF, xModel);
mParser = makeParser(mMSF);
Object DocLibCont = null;
try {
XPropertySet xDocProps = (XPropertySet) UnoRuntime.queryInterface(
XPropertySet.class, xDoc);
DocLibCont = xDocProps.getPropertyValue("BasicLibraries");
} catch (com.sun.star.uno.Exception e) {
throw new Exception(
"Couldn't get BasicLibraries-Container from document: " + e.toString());
}
mLCxNA = (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class,
DocLibCont);
mLCxLC = (XLibraryContainer) UnoRuntime.queryInterface(
XLibraryContainer.class, DocLibCont);
} catch (Exception e) {
throw new Exception("could not initialize BasicMacros " +
e.toString());
}
}
/*
* While initializing the Basic Libraries will be appendend to the Office
*/
public BasicMacroTools(XMultiServiceFactory msf, XModel xModel)
throws java.lang.Exception {
try {
mMSF = msf;
mDispProv = makeDispatchProvider(mMSF, xModel);
mParser = makeParser(mMSF);
Object ASLC = null;
try {
ASLC = mMSF.createInstance(
"com.sun.star.script.ApplicationScriptLibraryContainer");
} catch (com.sun.star.uno.Exception e) {
throw new Exception(
"Couldn't create ApplicationScriptLibraryContainer" + e.toString());
}
mLCxNA = (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class,
ASLC);
mLCxLC = (XLibraryContainer) UnoRuntime.queryInterface(
XLibraryContainer.class, ASLC);
} catch (Exception e) {
throw new Exception("could not initialize BasicMacros " +
e.toString());
}
}
private static XDispatchProvider makeDispatchProvider(XMultiServiceFactory mMSF,
XModel aModel)
throws java.lang.Exception {
XController xController = aModel.getCurrentController();
XFrame xFrame = xController.getFrame();
if (xFrame == null) {
throw new Exception("Could not create DispatchProvider");
}
return (XDispatchProvider) UnoRuntime.queryInterface(
XDispatchProvider.class, xFrame);
}
private static XURLTransformer makeParser(XMultiServiceFactory mMSF)
throws java.lang.Exception {
try {
return (com.sun.star.util.XURLTransformer) UnoRuntime.queryInterface(
XURLTransformer.class, mMSF.createInstance(
"com.sun.star.util.URLTransformer"));
} catch (Exception e) {
throw new Exception("could not create UTL-Transformer " +
e.toString());
}
}
public void loadLibrary(String LibraryName, String LibraryURL)
throws java.lang.Exception {
try {
appendLibrary(LibraryName, LibraryURL);
} catch (java.lang.Exception e) {
e.printStackTrace();
throw new Exception("ERROR: Could not append Library " +
LibraryName + e.toString());
}
try {
mLCxLC.loadLibrary(LibraryName);
} catch (com.sun.star.container.NoSuchElementException e) {
e.printStackTrace();
throw new Exception("ERROR: Could not load Library " +
LibraryName + e.toString());
} catch (com.sun.star.lang.WrappedTargetException e) {
e.printStackTrace();
throw new Exception("ERROR: Could not load Library " +
LibraryName + e.toString());
}
}
private void appendLibrary(String LibraryName, String LibraryURL)
throws java.lang.Exception {
try {
removeLibrary(LibraryName);
} catch (java.lang.Exception e) {
}
try {
mLCxLC.createLibraryLink(LibraryName, LibraryURL, false);
} catch (com.sun.star.container.ElementExistException e) {
e.printStackTrace();
throw new Exception("ERROR: Library " + LibraryName +
"already exist." + e.toString());
} catch (com.sun.star.uno.Exception e) {
e.printStackTrace();
throw new Exception("Could not link Basic library:" +
LibraryName + e.toString());
}
}
public void removeLibrary(String LibraryName) throws java.lang.Exception {
if (mLCxNA.hasByName(LibraryName)) {
try {
mLCxLC.removeLibrary(LibraryName);
} catch (com.sun.star.container.NoSuchElementException e) {
e.printStackTrace();
throw new Exception("Could not remove Basic library:" +
LibraryName + ": Library does not exist" + e.toString());
} catch (com.sun.star.lang.WrappedTargetException e) {
e.printStackTrace();
throw new Exception("Could not remove Basic library:" +
LibraryName + e.toString());
}
}
}
public void runMarco(String MacroName) throws java.lang.Exception {
URL[] aParseURL = new URL[1];
aParseURL[0] = new URL();
aParseURL[0].Complete = "macro://./" + MacroName; //Standard.Stock.GetSymbol('micro','')";
mParser.parseStrict(aParseURL);
URL aURL = aParseURL[0];
XDispatch xDispatcher = mDispProv.queryDispatch(aURL, "", 0);
if (xDispatcher != null) {
xDispatcher.dispatch(aURL, null);
} else {
throw new Exception("Could not run Macro " + MacroName);
}
}
/**
* Set the given <CODE>secureURL</CODE> as secure URL for marco execution.
* The macros of documents located in <CODE>secureURL</CODE> will be executed
* automatically.
* @param xMSF the XMultiServiceFactory
* @param secureURL the URL the documet is located
* @throws java.lang.Exception throws this exception on any error
*/
public static void addSecureBasicMarcosURL(XMultiServiceFactory xMSF, String secureURL)
throws Exception {
secureURL = utils.getFullURL(secureURL);
// configure Office to allow to execute macos
PropertyValue[] ProvArgs = new PropertyValue [1];
PropertyValue Arg = new PropertyValue();
Arg.Name = "nodepath";
Arg.Value = "/org.openoffice.Office.Common/Security";
ProvArgs[0] = Arg;
Object oProvider = xMSF.createInstance("com.sun.star.configuration.ConfigurationProvider");
XMultiServiceFactory oProviderMSF = (XMultiServiceFactory)
UnoRuntime.queryInterface(XMultiServiceFactory.class, oProvider);
Object oSecure = oProviderMSF.createInstanceWithArguments(
"com.sun.star.configuration.ConfigurationUpdateAccess",
ProvArgs);
XPropertySet oSecureProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, oSecure);
Object oScripting = oSecureProps.getPropertyValue("Scripting");
XPropertySet oScriptingSettings = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, oScripting);
oScriptingSettings.setPropertyValue("SecureURL", new String[]{secureURL});
oScriptingSettings.setPropertyValue("OfficeBasic", new Integer(2));
XChangesBatch oSecureChange = (XChangesBatch) UnoRuntime.queryInterface(XChangesBatch.class, oSecure);
oSecureChange.commitChanges();
}
}