Re: [dev] Adding menus / menu items at Runtime

2006-02-14 Thread Tobias Krais
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

2006-02-14 Thread Tobias Krais
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

2006-02-14 Thread Tom Schindl
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

2006-02-14 Thread Tobias Krais
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

2006-02-14 Thread Tobias Krais
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

2006-02-13 Thread Tobias Krais
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

2006-02-13 Thread Mathias Bauer
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

2006-02-13 Thread Carsten Driesner

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