OO-Snippets: Remove iterative and transient menubar items

Commons

Keywordsmenubar, transient, remove, search menubar
LanguageJava
ApplicationOffice
AuthorsTobias Krais
Supported Versions2.0.x  
Supported OSAll  
Question
Answer

This expample demonstrates how to remove menubar items transient,

that means temporary. It searches the menus iterative to find all menu

items that are same. The search criteria is a CommandURL of an item.

Code-Snippet-Listing (snippet-source)

package de.twc.oocom;

import java.util.Vector;

import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.container.XIndexAccess;
import com.sun.star.container.XIndexContainer;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XLayoutManager;
import com.sun.star.lang.IllegalArgumentException;
import com.sun.star.lang.IndexOutOfBoundsException;
import com.sun.star.lang.WrappedTargetException;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.ui.XUIElementSettings;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;

public class TemporaryRemoveMenuEntry {

    public TemporaryRemoveMenuEntry(){
        //Empty Constructor for OOComNG
    }
    
    // The file that should be processed, e.g. "/tmp/hello_world.ods"
    private String source_File = "/home/tobias/test.odt";
    private String ooport = "9000";

    public static void main(String[] arg){
        TemporaryRemoveMenuEntry myOOComNG = new TemporaryRemoveMenuEntry();
        
        try {
            myOOComNG.openDocument();
        }
        catch(Exception e) {
                System.out.println(e);
        }
    }

    private void openDocument() throws java.lang.Exception {
        XComponentContext xRemoteContext = Bootstrap.bootstrap();
        System.out.println("Connected to a running OpenOffice ...");
        // get OO desktop
        XMultiComponentFactory xRemoteServiceManager 
                = xRemoteContext.getServiceManager();
        Object desktop = xRemoteServiceManager.createInstanceWithContext(
                "com.sun.star.frame.Desktop", xRemoteContext
        );
        // query the XComponentLoader interface from the desktop
        XComponentLoader xComponentLoader =
                (XComponentLoader)UnoRuntime.queryInterface(
                XComponentLoader.class, desktop);

        PropertyValue[] myProperties = new PropertyValue[1];
        PropertyValue xProperty = new PropertyValue();
            xProperty.Name = "ReadOnly";
            xProperty.Value = new Boolean(false);
        myProperties[0] = xProperty;

        // load document
        XComponent openedDocument = xComponentLoader.loadComponentFromURL(
                "file://" + source_File,
                "_blank",
                Integer.parseInt(ooport),
                myProperties);

        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();
        
        XPropertySet xPropSet = (XPropertySet) UnoRuntime.queryInterface(
                XPropertySet.class, xFrame);
        XLayoutManager xLayoutManager = (XLayoutManager) UnoRuntime.queryInterface(
                XLayoutManager.class,
                xPropSet.getPropertyValue("LayoutManager"));
        
        // Getting the menubar
        com.sun.star.ui.XUIElement myMenubar 
            = xLayoutManager.getElement("private:resource/menubar/menubar");
        // Getting the menubar settings
        XUIElementSettings myMenuBarSettings = (XUIElementSettings)
                UnoRuntime.queryInterface(XUIElementSettings.class, myMenubar);
        // Casting the settings into a container to be able to get the properties
        XIndexContainer myMenuBarSettingsContainer = (XIndexContainer)
                UnoRuntime.queryInterface(
                XIndexContainer.class, myMenuBarSettings.getSettings(true));

        // Creating a Vector containing all menus with a "Save" item
        Vector foundSaveMenuItems = searchMenuForItem(".uno:Save",
                myMenuBarSettingsContainer,
                new Vector());
        // Remove the menu items
        removeMenuItems(foundSaveMenuItems);

        // Make changes only transient (temporary).
        com.sun.star.beans.XPropertySet xps = (XPropertySet)
                UnoRuntime.queryInterface(XPropertySet.class, myMenubar);
        xps.setPropertyValue("Persistent", new Boolean(false));

        // Apply settings to the root container (includes all subcontainers)
        myMenuBarSettings.setSettings(myMenuBarSettingsContainer);
    }
    
    /**
     * Method that removes the given menu items. The given Vector contains a
     * XIndexContainer at first position (the menu containing the Item to remove)
     * and an Integer at second position (the item number of the item to remove.
     * The changes are transient (temporary).
     * 
     * @param itemsToRemove
     * @throws IndexOutOfBoundsException
     * @throws WrappedTargetException
     */
    public void removeMenuItems(Vector itemsToRemove) throws
            IndexOutOfBoundsException,
            WrappedTargetException
    {
        // Starting with the last Element, because removing changes item index
        for (int i = itemsToRemove.size() -1; i >= 0; i--)
        {
            Vector thisVectorItem = (Vector)itemsToRemove.elementAt(i);
            XIndexContainer thisMenuContainer = (XIndexContainer)
                thisVectorItem.elementAt(0);
            Integer menuPosition = (Integer)thisVectorItem.elementAt(1);

            // remove the item, but settings must be set to make it visible
            thisMenuContainer.removeByIndex(menuPosition.intValue());
        }
    }
    
    /**
     * Method that searches menus and its submenus for the "CommandURL"
     * property. The returned Vector consists of Vectors. Each contained Vector
     * has two values. The first gives the XIndexContainer where the searched
     * menu item was found, the second is an Integer that tells the position
     * where the menu item was found.   
     * 
     * @param myCommandURL
     * @param myMenuContainer
     * @param foundMenuItems
     * @return
     * @throws IllegalArgumentException
     * @throws IndexOutOfBoundsException
     * @throws WrappedTargetException
     */
    public Vector searchMenuForItem(String myCommandURL,
            XIndexContainer myMenuContainer, Vector foundMenuItems)
            throws IllegalArgumentException,
                IndexOutOfBoundsException,
                WrappedTargetException  {

        if(myMenuContainer != null) {
            for(int g = 0; g < myMenuContainer.getCount(); g++) {
                // Getting the properties of the given container
                PropertyValue[] gMenuItem = (PropertyValue[])
                        com.sun.star.uno.AnyConverter.toObject(
                        PropertyValue[].class,
                        myMenuContainer.getByIndex(g));
                for(int h = 0; h < gMenuItem.length; h++)
                {
                    if(gMenuItem[h].Name.equals("CommandURL"))
                    {
                        if(gMenuItem[h].Value.equals(myCommandURL))
                        {
                            Vector thisMenuItem = new Vector();
                                thisMenuItem.addElement(myMenuContainer);
                                thisMenuItem.addElement(g);
                            foundMenuItems.addElement(thisMenuItem);
                            break;
                        }
                    }
                    else if(gMenuItem[h].Name.equals("ItemDescriptorContainer"))
                    {
                        XIndexAccess subMenuAccess = (XIndexAccess)
                                com.sun.star.uno.AnyConverter.toObject(
                                XIndexAccess.class,
                                gMenuItem[h].Value);
                        XIndexContainer subMenuContainer = (XIndexContainer)
                                UnoRuntime.queryInterface(
                                XIndexContainer.class, subMenuAccess);
                        if(subMenuAccess != null)
                        {
                            searchMenuForItem(myCommandURL,
                                    subMenuContainer,
                                    foundMenuItems);
                        }
                    }
                }
            }
        }
        return foundMenuItems;
    }
}

Changelog

DateUserModification
2006-02-28tobiaskraisInitial version

and