Re: [dev] Adding menus / menu items at Runtime
Hi Kent, I found this helpful: http://documentation.openoffice.org/HOW_TO/various_topics/HowTo_modify_context_menu.pdf however this may only be relevant to the context menu. yes, its only for the context menu. I will throw a glance on it. Thanks, Tobias --- Tobias Krais [EMAIL PROTECTED] wrote: Hi together, since some weeks I'm developing a little OpenOffice connector for a program we develeped (called JUDAS: www.judas.de). At the moment I try to add a menu called JUDAS to the menu bar at runtime. I found how to disable menus at runtime, but not how to add them. You may ask why is it necessary that the menus should be added at runtime. The menus should appear only if OpenOffice was started by JUDAS. If the user starts OpenOffice by itself, the menu should not appear. My question is: is it possible to generate menus at runtime? We are using OOo2. If yes, do you have examples or know where I should start studying? If not, how would you solve this issue? Greetings, Tobias - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] __ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: [dev] Adding menus / menu items at Runtime
Hi Carsten, My question is: is it possible to generate menus at runtime? We are using OOo2. If yes, do you have examples or know where I should start studying? I think I answered this question on the mailing list api.openoffice.org several times. I attached two small examples which modifies the menu bar of an application module. If you only want to do temporary changes, please use the transient example. Thanks a lot. I will try the transient example because only temporary changes are needed. Is it possible to do the same in Java? At the moment I am searching the ML archiv dev@api.openoffice.org for this topic. Thanks for the hint. Greetings, Tobias Regards, Carsten REM * BASIC * Sub Main REM *** Adds a item to the File Menu only transient. Means REM *** that this menu item only exists for and during the REM *** lifetime of the current frame. REM *** Initialize strings sMenuBar = private:resource/menubar/menubar sMyPopupMenuCmdId = .uno:PickList sMyCommand = macro:///Standard.Module1.Test() REM *** Retrieve the current frame of my model oModel = ThisComponent if not isNull( oModel ) then REM *** Retrieve frame from current controller oFrame = oModel.getCurrentController().getFrame() REM *** Retrieve the layout manager of my current frame oLayoutManager = oFrame.LayoutManager() REM *** Retrieve the menu bar from the layout manager oMenuBar = oLayoutManager.getElement( sMenuBar ) REM *** Retrieve writable configuration settings from menu bar oMenuBarSettings = oMenuBar.getSettings( true ) REM *** Make our changes only transient. An Add-on should REM *** never change configuration persistently as it can REM *** be deinstalled by a user without any chance to REM *** undo its configuration changes! REM *** Please look for bug #i46194 which prevents using REM *** oMenuBar.Persistent = false!! oMenuBar.Persistent = false REM *** Look for the File popup menu and add our command REM *** We must look if we haven't added our command already! fileMenuIndex = FindPopupMenu( sMyPopupMenuCmdId, oMenuBarSettings ) if fileMenuIndex = 0 then oPopupMenuItem() = oMenuBarSettings.getByIndex(fileMenuIndex) oPopupMenu = GetProperty( ItemDescriptorContainer, oPopupMenuItem() ) if not isNull( oPopupMenu ) then if FindCommand( sMyCommand, oPopupMenu ) = -1 then oMenuItem = CreateMenuItem( sMyCommand, Standard.Module1.Test ) nCount = oPopupMenu.getCount() oPopupMenu.insertByIndex( nCount, oMenuItem ) endif endif else msgbox No file menu found! endif oMenuBar.setSettings( oMenuBarSettings ) endif End Sub Function FindCommand( Command as String, oPopupMenu as Object ) as Integer nCount = oPopupMenu.getCount()-1 for i = 0 to nCount oMenuItem() = oPopupMenu.getByIndex(i) nPropertyCount = ubound(oMenuItem()) for j = 0 to nPropertyCount if oMenuItem(j).Name = CommandURL then if oMenuItem(j).Value = Command then FindCommand = j exit function endif endif next j next i FindCommand = -1 End Function Function FindPopupMenu( Command as String, oMenuBarSettings as Object ) as Integer for i = 0 to oMenuBarSettings.getCount()-1 oPopupMenu() = oMenuBarSettings.getByIndex(i) nPopupMenuCount = ubound(oPopupMenu()) for j = 0 to nPopupMenuCount if oPopupMenu(j).Name = CommandURL then if oPopupMenu(j).Value = Command then FindPopupMenu = j exit function endif endif next j next i FindPopupMenu = -1 End Function Function GetProperty( PropertyName as String, properties() as Variant ) as Variant for j = lbound( properties() ) to ubound( properties() ) oPropertyValue = properties(j) if oPropertyValue.Name = PropertyName then GetProperty = oPropertyValue.Value exit function endif next j GetProperty = null end function Function CreateMenuItem( Command as String, Label as String ) as Variant Dim aMenuItem(2) as new com.sun.star.beans.PropertyValue aMenuItem(0).Name = CommandURL aMenuItem(0).Value = Command aMenuItem(1).Name = Label aMenuItem(1).Value = Label aMenuItem(2).Name = Type aMenuItem(2).Value = 0 CreateMenuItem = aMenuItem() End Function Sub Test MsgBox Test End Sub REM * BASIC * Sub Main REM *** Creates a top-level popup menu on the Writer menu bar persistently. REM *** It checks if its popup menu has already been added to the menu bar
Re: [dev] Adding menus / menu items at Runtime
Couldn't you package this as an Code-Snippet. Using Paolos Snippet-Creator found here this would take less than a minute ;-) http://www.paolo-mantovani.org/ Tom Carsten Driesner wrote: Tobias Krais wrote: Hi together, since some weeks I'm developing a little OpenOffice connector for a program we develeped (called JUDAS: www.judas.de). At the moment I try to add a menu called JUDAS to the menu bar at runtime. I found how to disable menus at runtime, but not how to add them. You may ask why is it necessary that the menus should be added at runtime. The menus should appear only if OpenOffice was started by JUDAS. If the user starts OpenOffice by itself, the menu should not appear. My question is: is it possible to generate menus at runtime? We are using OOo2. If yes, do you have examples or know where I should start studying? Hi Tobias, I think I answered this question on the mailing list api.openoffice.org several times. I attached two small examples which modifies the menu bar of an application module. If you only want to do temporary changes, please use the transient example. Regards, Carsten REM * BASIC * Sub Main REM *** Adds a item to the File Menu only transient. Means REM *** that this menu item only exists for and during the REM *** lifetime of the current frame. REM *** Initialize strings sMenuBar = private:resource/menubar/menubar sMyPopupMenuCmdId = .uno:PickList sMyCommand = macro:///Standard.Module1.Test() REM *** Retrieve the current frame of my model oModel = ThisComponent if not isNull( oModel ) then REM *** Retrieve frame from current controller oFrame = oModel.getCurrentController().getFrame() REM *** Retrieve the layout manager of my current frame oLayoutManager = oFrame.LayoutManager() REM *** Retrieve the menu bar from the layout manager oMenuBar = oLayoutManager.getElement( sMenuBar ) REM *** Retrieve writable configuration settings from menu bar oMenuBarSettings = oMenuBar.getSettings( true ) REM *** Make our changes only transient. An Add-on should REM *** never change configuration persistently as it can REM *** be deinstalled by a user without any chance to REM *** undo its configuration changes! REM *** Please look for bug #i46194 which prevents using REM *** oMenuBar.Persistent = false!! oMenuBar.Persistent = false REM *** Look for the File popup menu and add our command REM *** We must look if we haven't added our command already! fileMenuIndex = FindPopupMenu( sMyPopupMenuCmdId, oMenuBarSettings ) if fileMenuIndex = 0 then oPopupMenuItem() = oMenuBarSettings.getByIndex(fileMenuIndex) oPopupMenu = GetProperty( ItemDescriptorContainer, oPopupMenuItem() ) if not isNull( oPopupMenu ) then if FindCommand( sMyCommand, oPopupMenu ) = -1 then oMenuItem = CreateMenuItem( sMyCommand, Standard.Module1.Test ) nCount = oPopupMenu.getCount() oPopupMenu.insertByIndex( nCount, oMenuItem ) endif endif else msgbox No file menu found! endif oMenuBar.setSettings( oMenuBarSettings ) endif End Sub Function FindCommand( Command as String, oPopupMenu as Object ) as Integer nCount = oPopupMenu.getCount()-1 for i = 0 to nCount oMenuItem() = oPopupMenu.getByIndex(i) nPropertyCount = ubound(oMenuItem()) for j = 0 to nPropertyCount if oMenuItem(j).Name = CommandURL then if oMenuItem(j).Value = Command then FindCommand = j exit function endif endif next j next i FindCommand = -1 End Function Function FindPopupMenu( Command as String, oMenuBarSettings as Object ) as Integer for i = 0 to oMenuBarSettings.getCount()-1 oPopupMenu() = oMenuBarSettings.getByIndex(i) nPopupMenuCount = ubound(oPopupMenu()) for j = 0 to nPopupMenuCount if oPopupMenu(j).Name = CommandURL then if oPopupMenu(j).Value = Command then FindPopupMenu = j exit function endif endif next j next i FindPopupMenu = -1 End Function Function GetProperty( PropertyName as String, properties() as Variant ) as Variant for j = lbound( properties() ) to ubound( properties() ) oPropertyValue = properties(j) if oPropertyValue.Name = PropertyName then GetProperty = oPropertyValue.Value exit function endif next j GetProperty = null end function Function CreateMenuItem( Command as String, Label as String ) as Variant Dim aMenuItem(2) as new com.sun.star.beans.PropertyValue aMenuItem(0).Name = CommandURL aMenuItem(0).Value = Command aMenuItem(1).Name = Label
Re: [dev] Adding menus / menu items at Runtime
Hi Tom, Couldn't you package this as an Code-Snippet. Using Paolos Snippet-Creator found here this would take less than a minute ;-) http://www.paolo-mantovani.org/ if my plans work out this will be a good idea. I already searched the snippeds page for examples... Greetings, Tobias REM * BASIC * Sub Main REM *** Adds a item to the File Menu only transient. Means REM *** that this menu item only exists for and during the REM *** lifetime of the current frame. REM *** Initialize strings sMenuBar = private:resource/menubar/menubar sMyPopupMenuCmdId = .uno:PickList sMyCommand = macro:///Standard.Module1.Test() REM *** Retrieve the current frame of my model oModel = ThisComponent if not isNull( oModel ) then REM *** Retrieve frame from current controller oFrame = oModel.getCurrentController().getFrame() REM *** Retrieve the layout manager of my current frame oLayoutManager = oFrame.LayoutManager() REM *** Retrieve the menu bar from the layout manager oMenuBar = oLayoutManager.getElement( sMenuBar ) REM *** Retrieve writable configuration settings from menu bar oMenuBarSettings = oMenuBar.getSettings( true ) REM *** Make our changes only transient. An Add-on should REM *** never change configuration persistently as it can REM *** be deinstalled by a user without any chance to REM *** undo its configuration changes! REM *** Please look for bug #i46194 which prevents using REM *** oMenuBar.Persistent = false!! oMenuBar.Persistent = false REM *** Look for the File popup menu and add our command REM *** We must look if we haven't added our command already! fileMenuIndex = FindPopupMenu( sMyPopupMenuCmdId, oMenuBarSettings ) if fileMenuIndex = 0 then oPopupMenuItem() = oMenuBarSettings.getByIndex(fileMenuIndex) oPopupMenu = GetProperty( ItemDescriptorContainer, oPopupMenuItem() ) if not isNull( oPopupMenu ) then if FindCommand( sMyCommand, oPopupMenu ) = -1 then oMenuItem = CreateMenuItem( sMyCommand, Standard.Module1.Test ) nCount = oPopupMenu.getCount() oPopupMenu.insertByIndex( nCount, oMenuItem ) endif endif else msgbox No file menu found! endif oMenuBar.setSettings( oMenuBarSettings ) endif End Sub Function FindCommand( Command as String, oPopupMenu as Object ) as Integer nCount = oPopupMenu.getCount()-1 for i = 0 to nCount oMenuItem() = oPopupMenu.getByIndex(i) nPropertyCount = ubound(oMenuItem()) for j = 0 to nPropertyCount if oMenuItem(j).Name = CommandURL then if oMenuItem(j).Value = Command then FindCommand = j exit function endif endif next j next i FindCommand = -1 End Function Function FindPopupMenu( Command as String, oMenuBarSettings as Object ) as Integer for i = 0 to oMenuBarSettings.getCount()-1 oPopupMenu() = oMenuBarSettings.getByIndex(i) nPopupMenuCount = ubound(oPopupMenu()) for j = 0 to nPopupMenuCount if oPopupMenu(j).Name = CommandURL then if oPopupMenu(j).Value = Command then FindPopupMenu = j exit function endif endif next j next i FindPopupMenu = -1 End Function Function GetProperty( PropertyName as String, properties() as Variant ) as Variant for j = lbound( properties() ) to ubound( properties() ) oPropertyValue = properties(j) if oPropertyValue.Name = PropertyName then GetProperty = oPropertyValue.Value exit function endif next j GetProperty = null end function Function CreateMenuItem( Command as String, Label as String ) as Variant Dim aMenuItem(2) as new com.sun.star.beans.PropertyValue aMenuItem(0).Name = CommandURL aMenuItem(0).Value = Command aMenuItem(1).Name = Label aMenuItem(1).Value = Label aMenuItem(2).Name = Type aMenuItem(2).Value = 0 CreateMenuItem = aMenuItem() End Function Sub Test MsgBox Test End Sub REM * BASIC * Sub Main REM *** Creates a top-level popup menu on the Writer menu bar persistently. REM *** It checks if its popup menu has already been added to the menu bar REM *** and does nothing. REM *** The popup menu contains one menu item with a REM *** Initialize strings sMenuBar = private:resource/menubar/menubar sMyPopupMenuCmdId = vnd.openoffice.org:MyMenu REM *** Retrieve the module configuration manager from central module configuration manager supplier oModuleCfgMgrSupplier = createUnoService(com.sun.star.ui.ModuleUIConfigurationManagerSupplier) REM *** Retrieve the module configuration manager with module identifier REM *** See
Re: [dev] Adding menus / menu items at Runtime
Hi Carsten, Thanks a lot. I will try the transient example because only temporary changes are needed. Is it possible to do the same in Java? Yes, you can also use Java. The example uses a UNO API, therefore you can use any supported language. sounds very good. At the moment I am reading your document http://specs.openoffice.org/ui_in_general/api/ProgrammaticControlOfMenuAndToolbarItems.sxw and up to now it is easy to read. If I have further questions should I post them to dev@api.openoffice.org or on this list? Greetings, Tobias - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
[dev] Adding menus / menu items at Runtime
Hi together, since some weeks I'm developing a little OpenOffice connector for a program we develeped (called JUDAS: www.judas.de). At the moment I try to add a menu called JUDAS to the menu bar at runtime. I found how to disable menus at runtime, but not how to add them. You may ask why is it necessary that the menus should be added at runtime. The menus should appear only if OpenOffice was started by JUDAS. If the user starts OpenOffice by itself, the menu should not appear. My question is: is it possible to generate menus at runtime? We are using OOo2. If yes, do you have examples or know where I should start studying? If not, how would you solve this issue? Greetings, Tobias - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: [dev] Adding menus / menu items at Runtime
Tobias Krais wrote: Hi together, since some weeks I'm developing a little OpenOffice connector for a program we develeped (called JUDAS: www.judas.de). At the moment I try to add a menu called JUDAS to the menu bar at runtime. I found how to disable menus at runtime, but not how to add them. You may ask why is it necessary that the menus should be added at runtime. The menus should appear only if OpenOffice was started by JUDAS. If the user starts OpenOffice by itself, the menu should not appear. My question is: is it possible to generate menus at runtime? We are using OOo2. There is an example and a hint for documentation on the dev@api.openoffice.org mailing list. I quote Carsten Driesner: There is an API to configure your menu (toolbars), but it's not a low-level API like XMenu/XMenuListener. For example, it's not possible to disable certain menu item with it. The Office UI is highly dynamic and therefor there is no easy way to force menu item to be disabled/enabled. You can use DispatchInterceptors or the disable commands feature (both are documented in the DevelopersGuide for OOo 1.1.x). Currently the developer documentation which describes the new APIs is not ready yet. A first introduction to our new API can be found here: http://specs.openoffice.org/ui_in_general/api/ProgrammaticControlOfMenuAndToolbarItems.sxw I attached some examples which work on the Beta. Please keep in mind that the namespace drafts will removed on a later version, I think 1.9.83. The real namespaces will be com.sun.star.ui and com.sun.star.frame. -- REM * BASIC * Sub Main REM *** Creates a top-level popup menu on the Writer menu bar persistently. REM *** It checks if its popup menu has already been added to the menu bar REM *** and does nothing. REM *** The popup menu contains one menu item with a REM *** Initialize strings sMenuBar = private:resource/menubar/menubar sMyPopupMenuCmdId = vnd.openoffice.org:MyMenu REM *** Retrieve the module configuration manager from central module configuration manager supplier oModuleCfgMgrSupplier = createUnoService(drafts.com.sun.star.ui.ModuleUIConfigurationManagerSupplier) REM *** Retrieve the module configuration manager with module identifier REM *** See drafts.com.sun.star.frame.ModuleManager for more information oModuleCfgMgr = oModuleCfgMgrSupplier.getUIConfigurationManager( com.sun.star.text.TextDocument ) oMenuBarSettings = oModuleCfgMgr.getSettings( sMenuBar, true ) REM *** Look for our top-level popup menu. Can be identified by the CommandURL property. bHasAlreadyPopupMenu = false nCount = oMenuBarSettings.getCount() for i = 0 to nCount-1 oPopupMenu() = oMenuBarSettings.getByIndex( i ) nPopupMenuCount = ubound(oPopupMenu()) for j = 0 to nPopupMenuCount if oPopupMenu(j).Name = CommandURL then if oPopupMenu(j).Value = sMyPopupMenuCmdId then bHasAlreadyPopupMenu = true end if endif next j next i if not bHasAlreadyPopupMenu then sString = My Macro's oPopupMenu = CreatePopupMenu( sMyPopupMenuCmdId, sString, oMenuBarSettings ) oPopupMenuContainer = oPopupMenu(3).Value oMenuItem = CreateMenuItem( macro:///Standard.Module1.Test(), Standard.Module1.Test ) oPopupMenuContainer.insertByIndex( 0, oMenuItem ) oMenuBarSettings.insertByIndex( nCount, oPopupMenu ) oModuleCfgMgr.replaceSettings( sMenuBar, oMenuBarSettings ) end if End Sub Function CreatePopupMenu( CommandId, Label, Factory ) as Variant Dim aPopupMenu(3) as new com.sun.star.beans.PropertyValue aPopupMenu(0).Name = CommandURL aPopupMenu(0).Value = CommandId aPopupMenu(1).Name = Label aPopupMenu(1).Value = Label aPopupMenu(2).Name = Type aPopupMenu(2).Value = 0 aPopupMenu(3).Name = ItemDescriptorContainer aPopupMenu(3).Value = Factory.createInstanceWithContext( GetDefaultContext() ) CreatePopupMenu = aPopupMenu() End Function Function CreateMenuItem( Command as String, Label as String ) as Variant Dim aMenuItem(2) as new com.sun.star.beans.PropertyValue aMenuItem(0).Name = CommandURL aMenuItem(0).Value = Command aMenuItem(1).Name = Label aMenuItem(1).Value = Label aMenuItem(2).Name = Type aMenuItem(2).Value = 0 CreateMenuItem = aMenuItem() End Function Sub Test MsgBox Test End Sub -- REM * BASIC * Sub Main REM *** Modifies the standard bar of the BasicIDE module REM *** Initialize strings
Re: [dev] Adding menus / menu items at Runtime
Tobias Krais wrote: Hi together, since some weeks I'm developing a little OpenOffice connector for a program we develeped (called JUDAS: www.judas.de). At the moment I try to add a menu called JUDAS to the menu bar at runtime. I found how to disable menus at runtime, but not how to add them. You may ask why is it necessary that the menus should be added at runtime. The menus should appear only if OpenOffice was started by JUDAS. If the user starts OpenOffice by itself, the menu should not appear. My question is: is it possible to generate menus at runtime? We are using OOo2. If yes, do you have examples or know where I should start studying? Hi Tobias, I think I answered this question on the mailing list api.openoffice.org several times. I attached two small examples which modifies the menu bar of an application module. If you only want to do temporary changes, please use the transient example. Regards, Carsten REM * BASIC * Sub Main REM *** Adds a item to the File Menu only transient. Means REM *** that this menu item only exists for and during the REM *** lifetime of the current frame. REM *** Initialize strings sMenuBar = private:resource/menubar/menubar sMyPopupMenuCmdId = .uno:PickList sMyCommand = macro:///Standard.Module1.Test() REM *** Retrieve the current frame of my model oModel = ThisComponent if not isNull( oModel ) then REM *** Retrieve frame from current controller oFrame = oModel.getCurrentController().getFrame() REM *** Retrieve the layout manager of my current frame oLayoutManager = oFrame.LayoutManager() REM *** Retrieve the menu bar from the layout manager oMenuBar = oLayoutManager.getElement( sMenuBar ) REM *** Retrieve writable configuration settings from menu bar oMenuBarSettings = oMenuBar.getSettings( true ) REM *** Make our changes only transient. An Add-on should REM *** never change configuration persistently as it can REM *** be deinstalled by a user without any chance to REM *** undo its configuration changes! REM *** Please look for bug #i46194 which prevents using REM *** oMenuBar.Persistent = false!! oMenuBar.Persistent = false REM *** Look for the File popup menu and add our command REM *** We must look if we haven't added our command already! fileMenuIndex = FindPopupMenu( sMyPopupMenuCmdId, oMenuBarSettings ) if fileMenuIndex = 0 then oPopupMenuItem() = oMenuBarSettings.getByIndex(fileMenuIndex) oPopupMenu = GetProperty( ItemDescriptorContainer, oPopupMenuItem() ) if not isNull( oPopupMenu ) then if FindCommand( sMyCommand, oPopupMenu ) = -1 then oMenuItem = CreateMenuItem( sMyCommand, Standard.Module1.Test ) nCount = oPopupMenu.getCount() oPopupMenu.insertByIndex( nCount, oMenuItem ) endif endif else msgbox No file menu found! endif oMenuBar.setSettings( oMenuBarSettings ) endif End Sub Function FindCommand( Command as String, oPopupMenu as Object ) as Integer nCount = oPopupMenu.getCount()-1 for i = 0 to nCount oMenuItem() = oPopupMenu.getByIndex(i) nPropertyCount = ubound(oMenuItem()) for j = 0 to nPropertyCount if oMenuItem(j).Name = CommandURL then if oMenuItem(j).Value = Command then FindCommand = j exit function endif endif next j next i FindCommand = -1 End Function Function FindPopupMenu( Command as String, oMenuBarSettings as Object ) as Integer for i = 0 to oMenuBarSettings.getCount()-1 oPopupMenu() = oMenuBarSettings.getByIndex(i) nPopupMenuCount = ubound(oPopupMenu()) for j = 0 to nPopupMenuCount if oPopupMenu(j).Name = CommandURL then if oPopupMenu(j).Value = Command then FindPopupMenu = j exit function endif endif next j next i FindPopupMenu = -1 End Function Function GetProperty( PropertyName as String, properties() as Variant ) as Variant for j = lbound( properties() ) to ubound( properties() ) oPropertyValue = properties(j) if oPropertyValue.Name = PropertyName then GetProperty = oPropertyValue.Value exit function endif next j GetProperty = null end function Function CreateMenuItem( Command as String, Label as String ) as Variant Dim aMenuItem(2) as new com.sun.star.beans.PropertyValue aMenuItem(0).Name = CommandURL aMenuItem(0).Value = Command aMenuItem(1).Name = Label aMenuItem(1).Value = Label aMenuItem(2).Name = Type aMenuItem(2).Value = 0 CreateMenuItem = aMenuItem() End Function Sub Test MsgBox Test End Sub REM * BASIC * Sub Main REM *** Creates a top-level popup menu on the Writer menu bar persistently. REM *** It checks if its popup menu has already been added to the menu bar