| /************************************************************** |
| * |
| * 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 <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(); |
| } |
| } |