On 3/29/05 6:39 AM, "Carsten Driesner" <[EMAIL PROTECTED]> wrote:
> Hi Brian, > > Yes, the code works exactly how you have changed it. Your code changes > the changed configuration again and again, that's why you can see more > than one file menu (see the two insertByIndex). > > The example you found and adapted is not the way you should change the > menu bar in a context of an Add-on. An Add-on can be uninstalled and you > have no chance to remove your menu bar changes! Currently there is a bug > in our API that prevent one to change a menu bar non-persistent (see > 46194), but I it is fixed now and will be in one of the next builds. > > The example below uses therefor the persistent way, but can be easily > changed when 46194 is fixed. Please keep in mind that the macro doesn't > work directly in the Basic IDE due to oModel.getCurrentController(). You > can add a button to a toolbar and start the macro with it. > Please use this example as a template for your add-on. Carsten, Thanks, this looks like it will work much better :). I was looking through the javadocs to see what it would take to convert it to Java and it looks pretty straightforward so that's one thing off my list I thought I couldn't do. - Brian > > --- example code --- > > REM ***** BASIC ***** > > Sub Main > REM *** Adds a item to the File Menu > 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 uninstalled by a user without any chance to > REM *** undo its configuration changes! > REM *** ATTENTION: > REM *** Due to bug 46194 "oMenuBar.Persistent = false" doesn't > REM *** work. To have a working example we now use > oMenuBar.Persistent = true. > REM *** This should be changed to false when 46194 is fixed!!! > oMenuBar.Persistent = true > > 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 > > --------------------------------------------------------------------- > 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]