/**************************************************************
*
* 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 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 secureURL
as secure URL for marco execution.
* The macros of documents located in secureURL
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();
}
}