Le 19 oct. 06, à 14:52, Carsten Driesner a écrit :

Julien Galand wrote:
Thanks for this link.
I had tried this previously and it didn't work, but I think I have now found the cause (there is apparently a bug in the C++ UNO binding about the awt::KeyEvent structure, for which I have just posted a mail in this mailing list), and I could make it work. But the real question in my previous mail was to display the shortcut in the menu line. The code snippet above doesn't change anything in the menu added by the "transient change" method (I have set the same command URL on the shortcut and the menu line, hoping that OO would associate both automatically). Is there a way to display for example "Ctrl+F12" on the right of a menu line (and right-justified) ?
Hi Julien,

OpenOffice.org should display all associated keyboard shortcuts automatically in the menu. If it doesn't work for your example, then I guess that it's a bug. So could you write me a bug for this issue and add a small example to reproduce it?


Hi Carsten,

I have spent several hours to boil down the phenomenon.
From my tests, I have concluded that this "display connection" of the shortcut with its menu line doesn't work when the menu line is in a submenu (i.e. not a line in a menu of the menu bar, but in a submenu of a menu).
When it is simply a menu line of a menu of the menu bar, it works.

It looks like a bug. I use OO 2.0.3.

With regards to a sample code, I have got one, but only in JScript, as I am much more used to it than Basic. Copy the sample below in a text file, say "Insert_new_menu_and_shortcut.js". I launch the script in Windows, with a simple command line (OO should be running) :

cscript "Insert_new_menu_and_shortcut.js"

I hope JScript won't be a burden for you. If it were, tell me and I will try to translate it in OO Basic with my little knowledge of it.
Here is the sample :

(you can try both cases, with a simple menu line, or with a submenu, by assigning the 3rd parameter of 'InsertMenu') ________________________________________________________________________ __________________________

var ooServMgr = WScript.CreateObject("com.sun.star.ServiceManager");

var mycommand = "macro:///Standard.Module1.Test()";

// Set the 3rd parameter to 'true' to insert a submenu in the "File" menu.
// This submenu has only one line.
// Or 'false' to insert only the menu line in the "File" menu.
//
InsertMenu(ooServMgr, mycommand, true);

InsertShortcut(ooServMgr, mycommand);

function InsertMenu(ooServMgr, myCommand, bWithSubmenu) {
        var ooDesktop = ooServMgr.createInstance("com.sun.star.frame.Desktop");
        var curFrame  = ooDesktop.getCurrentFrame();
        var layoutMgr = curFrame.LayoutManager;

        var menuElementName = "private:resource/menubar/menubar";
        var menuBar         = layoutMgr.getElement(menuElementName);
        var menuBarSettings = menuBar.getSettings(true);

        menuBar.Persistent = false;

        // Find the "File" popup menu.
        //
        var fileMenuIndex = FindCommand(".uno:PickList", menuBarSettings);

        if (fileMenuIndex >= 0) {
var popupMenuItem = menuBarSettings.getByIndex(fileMenuIndex).toArray();
                var popupMenu = GetProperty("ItemDescriptorContainer", 
popupMenuItem);
        
                //if (FindCommand(myCommand, popupMenu)==-1)
                {
                        var menuItem;
menuItem = CreateMenuItem(ooServMgr, myCommand, "Test shortcut", null);
                        
                        var menuItemPassed = ooServMgr.Bridge_GetValueObject();
                        
menuItemPassed.Set("[]com.sun.star.beans.PropertyValue", menuItem);
                        
                        if (bWithSubmenu) {
                                var submenu;
submenu = menuBarSettings.createInstanceWithContext(ooServMgr.DefaultContext);
                                submenu.insertByIndex(0, menuItemPassed);
                                
menuItem = CreateMenuItem(ooServMgr, "", "Test shortcut submenu", submenu);
                                
menuItemPassed.Set("[]com.sun.star.beans.PropertyValue", menuItem);
                        }
                        
                        popupMenu.insertByIndex(popupMenu.getCount(), 
menuItemPassed);
                }
        }
        menuBar.setSettings(menuBarSettings);
}

function FindCommand(command, menuBarSettings) {
        for (var i=0; i<menuBarSettings.getCount(); i++) {
                var popupMenu = menuBarSettings.getByIndex(i).toArray();
                
                for (var j=0; j<popupMenu.length; j++) {
if (popupMenu[j].Name=="CommandURL" && popupMenu[j].Value==command) return i;
                }
        }
        return -1;
}

function GetProperty(propertyName, properties) {
        for (var i = 0; i<properties.length; i++) {
                if (properties[i].Name==propertyName) return 
properties[i].Value;
        }
        return null;
}
        
function CreateMenuItem(ooServMgr, command, label, submenu) {
        var menuItem = new Array(3 + (submenu != null));
        
menuItem[0] = ooServMgr.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); menuItem[1] = ooServMgr.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); menuItem[2] = ooServMgr.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
        
        menuItem[0].Name  = "CommandURL";
        menuItem[0].Value = command;
        menuItem[1].Name  = "Label";
        menuItem[1].Value = label;
        menuItem[2].Name  = "Type";
        menuItem[2].Value = 0;
        
        if (submenu != null) {
menuItem[3] = ooServMgr.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
                menuItem[3].Name  = "ItemDescriptorContainer";
                menuItem[3].Value = submenu;
        }

        return menuItem;
}

function InsertShortcut(ooServMgr, command) {
var xUICfgSupp = ooServMgr.createInstance("com.sun.star.ui.ModuleUIConfigurationManagerSu pplier"); var xUICfgMgr = xUICfgSupp.getUIConfigurationManager("com.sun.star.text.TextDocument");
        var shortcutMgr = xUICfgMgr.getShortCutManager();

        var keyEvent = ooServMgr.Bridge_GetStruct("com.sun.star.awt.KeyEvent");

        keyEvent.KeyCode = 778; // F11
        keyEvent.Modifiers = 2; // Shift==1; Ctrl==2

        try {
                if (shortcutMgr.getCommandByKeyEvent(keyEvent)==command) {
                        shortcutMgr.removeKeyEvent(keyEvent);
                }
        }
        catch(e) {
                var type = typeof e;
        }

        shortcutMgr.setKeyEvent(keyEvent, command);
        shortcutMgr.store();
}

________________________________________________________________________ __________________________

Julien Galand

Reply via email to