/************************************************************** * * 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. * *************************************************************/ import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; import com.sun.star.lang.XMultiComponentFactory; import com.sun.star.beans.XPropertySet; import com.sun.star.beans.PropertyValue; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.lang.XSingleServiceFactory; import com.sun.star.util.XURLTransformer; import com.sun.star.frame.XDesktop; import com.sun.star.frame.XComponentLoader; import com.sun.star.text.XTextDocument; /* * * @author Carsten Driesner * Provides example code how to enable/disable * commands. */ public class DisableCommandsTest extends java.lang.Object { /* * A list of command names */ final static private String[] aCommandURLTestSet = { new String( "Open" ), new String( "About" ), new String( "SelectAll" ), new String( "Quit" ), }; private static XComponentContext xRemoteContext = null; private static XMultiComponentFactory xRemoteServiceManager = null; private static XURLTransformer xTransformer = null; private static XMultiServiceFactory xConfigProvider = null; /* * @param args the command line arguments */ public static void main(String[] args) { try { // get the remote office context. If necessary a new office // process is started xRemoteContext = com.sun.star.comp.helper.Bootstrap.bootstrap(); System.out.println("Connected to a running office ..."); xRemoteServiceManager = xRemoteContext.getServiceManager(); Object transformer = xRemoteServiceManager.createInstanceWithContext( "com.sun.star.util.URLTransformer", xRemoteContext ); xTransformer = (com.sun.star.util.XURLTransformer) UnoRuntime.queryInterface(com.sun.star.util.XURLTransformer.class, transformer ); Object configProvider = xRemoteServiceManager.createInstanceWithContext( "com.sun.star.configuration.ConfigurationProvider", xRemoteContext ); xConfigProvider = (com.sun.star.lang.XMultiServiceFactory) UnoRuntime.queryInterface( com.sun.star.lang.XMultiServiceFactory.class, configProvider ); // create a new test document Object oDesktop = xRemoteServiceManager.createInstanceWithContext( "com.sun.star.frame.Desktop", xRemoteContext); XComponentLoader xCompLoader =(XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, oDesktop); com.sun.star.lang.XComponent xComponent = xCompLoader.loadComponentFromURL("private:factory/swriter", "_blank", 0, new com.sun.star.beans.PropertyValue[0]); { XTextDocument xDoc =(XTextDocument) UnoRuntime.queryInterface(XTextDocument.class, xComponent); xDoc.getText().setString("You can now check the disabled commands. The " +"following commands are disabled:\n\n" +" Open...\n Exit\n Select All\n " +"About StarOffice|OpenOffice\n\nPress " + "\"return\" in the shell where you have " + "started the example to enable the " + "commands!\n\nCheck the commands again and " + "press once more \"return\" to finish the " + "example and close the document."); // ensure that the document content is optimal visible com.sun.star.frame.XModel xModel = (com.sun.star.frame.XModel)UnoRuntime.queryInterface( com.sun.star.frame.XModel.class, xDoc); // get the frame for later usage com.sun.star.frame.XFrame xFrame = xModel.getCurrentController().getFrame(); com.sun.star.view.XViewSettingsSupplier xViewSettings = (com.sun.star.view.XViewSettingsSupplier)UnoRuntime.queryInterface( com.sun.star.view.XViewSettingsSupplier.class, xModel.getCurrentController()); xViewSettings.getViewSettings().setPropertyValue( "ZoomType", new Short((short)0)); } // test document will be closed later // First we need a defined starting point. So we have to remove // all commands from the disabled set! enableCommands(); // Check if the commands are usable testCommands( false ); // Disable the commands disableCommands(); // Now the commands shouldn't be usable anymore testCommands( true ); // you can now check the test document and see which commands are // disabled System.out.println("\nYou can now check the disabled commands.\n" +"Please press 'return' to enable the commands!"); waitForUserInput(); // Remove disable commands to make Office usable again enableCommands(); // you can check the test document again and see that the commands // are enabled now System.out.println("Check again the now enabled commands.\n" +"Please press 'return' to finish the example and " +"close the document!"); waitForUserInput(); // close test document com.sun.star.util.XCloseable xCloseable = (com.sun.star.util.XCloseable) UnoRuntime.queryInterface(com.sun.star.util.XCloseable.class, xComponent ); if (xCloseable != null ) { xCloseable.close(false); } else { xComponent.dispose(); } } catch (java.lang.Exception e){ e.printStackTrace(); } finally { System.exit(0); } } /** * Wait for user input -> until the user press 'return' */ private static void waitForUserInput() throws java.io.IOException { java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)); reader.read(); } /** * Test the commands that we enabled/disabled */ private static void testCommands( boolean bDisabledCmds ) throws com.sun.star.uno.Exception { // We need the desktop to get access to the current frame Object desktop = xRemoteServiceManager.createInstanceWithContext( "com.sun.star.frame.Desktop", xRemoteContext ); com.sun.star.frame.XDesktop xDesktop = (com.sun.star.frame.XDesktop) UnoRuntime.queryInterface(com.sun.star.frame.XDesktop.class, desktop ); com.sun.star.frame.XFrame xFrame = xDesktop.getCurrentFrame(); com.sun.star.frame.XDispatchProvider xDispatchProvider = null; if ( xFrame != null ) { // We have a frame. Now we need access to the dispatch provider. xDispatchProvider = (com.sun.star.frame.XDispatchProvider)UnoRuntime.queryInterface( com.sun.star.frame.XDispatchProvider.class, xFrame ); if ( xDispatchProvider != null ) { // As we have the dispatch provider we can now check if we get // a dispatch object or not. for ( int n = 0; n < aCommandURLTestSet.length; n++ ) { // Prepare the URL com.sun.star.util.URL[] aURL = new com.sun.star.util.URL[1]; aURL[0] = new com.sun.star.util.URL(); com.sun.star.frame.XDispatch xDispatch = null; aURL[0].Complete = ".uno:" + aCommandURLTestSet[n]; xTransformer.parseSmart( aURL, ".uno:" ); // Try to get a dispatch object for our URL xDispatch = xDispatchProvider.queryDispatch( aURL[0], "", 0 ); if ( xDispatch != null ) { if ( bDisabledCmds ) System.out.println( "Something is wrong, I got dispatch object for " + aURL[0].Complete ); else System.out.println( "Ok, dispatch object for " + aURL[0].Complete ); } else { if ( !bDisabledCmds ) System.out.println("Something is wrong, I cannot get dispatch object for " + aURL[0].Complete ); else System.out.println( "Ok, no dispatch object for " + aURL[0].Complete ); } resetURL( aURL[0] ); } } else System.out.println( "Couldn't get XDispatchProvider from Frame!" ); } else System.out.println( "Couldn't get current Frame from Desktop!" ); } /** * Ensure that there are no disabled commands in the user layer. The * implementation removes all commands from the disabled set! */ private static void enableCommands() { // Set the root path for our configuration access com.sun.star.beans.PropertyValue[] lParams = new com.sun.star.beans.PropertyValue[1]; lParams[0] = new com.sun.star.beans.PropertyValue(); lParams[0].Name = new String("nodepath"); lParams[0].Value = "/org.openoffice.Office.Commands/Execute/Disabled"; try { // Create configuration update access to have write access to the // configuration Object xAccess = xConfigProvider.createInstanceWithArguments( "com.sun.star.configuration.ConfigurationUpdateAccess", lParams ); com.sun.star.container.XNameAccess xNameAccess = (com.sun.star.container.XNameAccess)UnoRuntime.queryInterface( com.sun.star.container.XNameAccess.class, xAccess ); if ( xNameAccess != null ) { // We need the XNameContainer interface to remove the nodes by name com.sun.star.container.XNameContainer xNameContainer = (com.sun.star.container.XNameContainer) UnoRuntime.queryInterface( com.sun.star.container.XNameContainer.class, xAccess ); // Retrieves the names of all Disabled nodes String[] aCommandsSeq = xNameAccess.getElementNames(); for ( int n = 0; n < aCommandsSeq.length; n++ ) { try { // remove the node xNameContainer.removeByName( aCommandsSeq[n] ); } catch ( com.sun.star.lang.WrappedTargetException e ) { } catch ( com.sun.star.container.NoSuchElementException e ) { } } } // Commit our changes com.sun.star.util.XChangesBatch xFlush = (com.sun.star.util.XChangesBatch)UnoRuntime.queryInterface( com.sun.star.util.XChangesBatch.class, xAccess); xFlush.commitChanges(); } catch ( com.sun.star.uno.Exception e ) { System.out.println( "Exception detected!" ); System.out.println( e ); } } /** * Disable all commands defined in the aCommandURLTestSet array */ private static void disableCommands() { // Set the root path for our configuration access com.sun.star.beans.PropertyValue[] lParams = new com.sun.star.beans.PropertyValue[1]; lParams[0] = new com.sun.star.beans.PropertyValue(); lParams[0].Name = new String("nodepath"); lParams[0].Value = "/org.openoffice.Office.Commands/Execute/Disabled"; try { // Create configuration update access to have write access to the // configuration Object xAccess = xConfigProvider.createInstanceWithArguments( "com.sun.star.configuration.ConfigurationUpdateAccess", lParams ); com.sun.star.lang.XSingleServiceFactory xSetElementFactory = (com.sun.star.lang.XSingleServiceFactory)UnoRuntime.queryInterface( com.sun.star.lang.XSingleServiceFactory.class, xAccess ); com.sun.star.container.XNameContainer xNameContainer = (com.sun.star.container.XNameContainer)UnoRuntime.queryInterface( com.sun.star.container.XNameContainer.class, xAccess ); if ( xSetElementFactory != null && xNameContainer != null ) { Object[] aArgs = new Object[0]; for ( int i = 0; i < aCommandURLTestSet.length; i++ ) { // Create the nodes with the XSingleServiceFactory of the // configuration Object xNewElement = xSetElementFactory.createInstanceWithArguments( aArgs ); if ( xNewElement != null ) { // We have a new node. To set the properties of the node // we need the XPropertySet interface. com.sun.star.beans.XPropertySet xPropertySet = (com.sun.star.beans.XPropertySet) UnoRuntime.queryInterface( com.sun.star.beans.XPropertySet.class, xNewElement ); if ( xPropertySet != null ) { // Create a unique node name. String aCmdNodeName = new String( "Command-" ); aCmdNodeName += i; // Insert the node into the Disabled set xPropertySet.setPropertyValue( "Command", aCommandURLTestSet[i] ); xNameContainer.insertByName( aCmdNodeName, xNewElement ); } } } // Commit our changes com.sun.star.util.XChangesBatch xFlush = (com.sun.star.util.XChangesBatch)UnoRuntime.queryInterface( com.sun.star.util.XChangesBatch.class, xAccess); xFlush.commitChanges(); } } catch ( com.sun.star.uno.Exception e ) { System.err.println( "Exception detected!" + e); e.printStackTrace(); } } /** * reset URL so it can be reused * * @param aURL * the URL that should be reseted */ private static void resetURL( com.sun.star.util.URL aURL ) { aURL.Protocol = ""; aURL.User = ""; aURL.Password = ""; aURL.Server = ""; aURL.Port = 0; aURL.Path = ""; aURL.Name = ""; aURL.Arguments = ""; aURL.Mark = ""; aURL.Main = ""; aURL.Complete = ""; } }