メニュー 
メニューを操作する方法です。OpenOffice.org 2.0 系が対象です。1.0 系では OOo API からメニューの操作ができません。
コンフィグマネジャーサプライヤー 
ツールバーの変更のためのサービスにアクセスします。
Dim oModCfgMgrSup As Object
oModCfgMgrSup = createUnoService( _
"com.sun.star.ui.ModuleUIConfigurationManagerSupplier")
このサービスを利用して、アクセスしたいツールバーのコンフィグマネジャーにアクセスします。
コンフィグマネジャー 
コンフィグマネジャーサプライヤーにアクセスするツールバーの種類を指定して、コンフィグマネジャーを作成します。
Dim oModCfgMgr As Object
oModCfgMgr = oModuleCfgMgrSupplier.getUIConfigurationManager(_
"com.sun.star.sheet.SpreadsheetDocument" )
ここで指定するツールバーの種類は、ドキュメントの種類と同じです。
メニュー設定 
メニュー設定はツールバーと違って一つだけで、"private:resource/menubar/menubar" です。
Dim sToolbar As String
Dim oMenuSettings As Object
sMenubar = "private:resource/menubar/menubar"
oMenuSettings = oModuleCfgMgr.getSettings(sMenubar ,true)
getSettings メソッドでメニューの設定にアクセスします。一つ目の引数にメニュー名を、二つ目の引数に変更可能にするかどうかを指定します。
メニューの構成 
メニューの構成を説明します。メニューは選択するとコマンドが実行される項目以外にサブメニューやトップメニューといった、コマンドが実行されないメニューもあります。
選択するとコマンドが実行される普通のメニューは次のような PropertyValue で構成されます。
' Normal Menu
Function CreateMenuItem( _
sCommand As String, sLabel As String ) as Variant
Dim aMenuMember(3) As New com.sun.star.beans.PropertyValue
aMenuMember(0).Name = "CommandURL"
aMenuMember(0).Value = sCommand
aMenuMember(1).Name = "HelpURL"
aMenuMember(1).Value = "" 'sHelpURL
aMenuMember(2).Name = "Label"
aMenuMember(2).Value = sLabel
aMenuMember(3).Name = "Type"
aMenuMember(3).Value = 0
CreateMenuItem = aMenuMember()
End Function
それぞれの項目を確認する前に、トップメニューおよびサブメニューは次のような構成です。
' Top menu or sub menu
Function CreateMenuMember( _
sCommand As String, sLabel As String, aItemDescs ) as Variant
Dim aMenuMember(4) As New com.sun.star.beans.PropertyValue
aMenuMember(0).Name = "CommandURL"
aMenuMember(0).Value = sCommand
aMenuMember(1).Name = "HelpURL"
aMenuMember(1).Value = "" 'sHelpURL
aMenuMember(2).Name = "ItemDescriptorContainer"
aMenuMember(2).Value = aItemDescs
aMenuMember(3).Name = "Label"
aMenuMember(3).Value = sLabel
aMenuMember(4).Name = "Type"
aMenuMember(4).Value = 0
CreateMenuMember = aMenuMember()
End Function
- CommandURL: メニューのコマンド
- HelpURL: ヘルプのURL
- Label: メニューの項目の表示ラベル
- Type: メニュー項目のタイプ。普通のメニューか区切り線のどちらか。
普通のメニューとサブメニューの違いは、ItemDescriptorContainer があるかどうかです。このプロパティは、インデックスで管理されたサブメニューを含みます。そのため、トップメニューもしくはサブメニューでこのプロパティがあります。
トップメニュー項目 
トップメニューの項目は「ファイル」、「編集」、「表示」、「ツール」といったものがすでにあります。メニューに追加したい項目にアクセスする必要があります。
特定のメニュー項目にアクセスしたい場合でも、名前でアクセスできないため次のように一つづつ調べます。
Dim sMenuName As String
sMenuName = ".uno:HelpMenu"
For i = 0 To oMenuSettings.getCount() -1
If GetProperty("CommandURL", oMenuSettings.getByIndex(i)) = sMenuName Then
oTopMenu = oMenuSettings.getByIndex(i)
End If
Next i
Function GetProperty( sName As String, aValues )
For i = 0 To UBound(aValues())
If aValues(i).Name = sName Then
GetProperty = aValues(i).Value
End If
Next i
End Function
トップメニューの項目は次の CommandURL を持ちます。
メニュー | CommandURL |
ファイル | .uno:PickList |
編集 | .uno:EditMenu |
表示 | .uno:ViewMenu |
挿入 | .uno:InsertMenu |
書式 | .uno:FormatMenu |
表 | .uno:TableMenu |
ツール | .uno:ToolsMenu |
データ | .uno:DataMenu |
スライドショー | .uno:SlideShowMenu |
変更 | .uno:ModifyMenu |
ウィンドウ | .uno:WindowList |
ヘルプ | .uno:HelpMenu |
新規トップメニュー 
新しいトップメニューを作成するには次のようにします。
oMenu = oMenuSetting.createInstanceWithContext( GetDefaultContext() )
oTopMenu = CreateMenuMember( sMenuName, sMenuUIName, oMenu )
oMenuSetting.insertByIndex( oMenuSetting.getCount(), oTopMenu )
サブメニュー 
サブメニューを作成します。新規トップメニューと同じです。
oMenuSub = oMenuSetting.createInstanceWithContext( GetDefaultContext() )
aSubMenu = CreateMenuMember( "submenu", sSubMenuName, oMenuSub )
oSubMenu = GetProperty( "ItemDescriptorContainer", aSubMenu )
このサブメニューにメニューを追加します。
oSubMenu.insertByIndex( oSubMenu.getCount(), CreateMenuItem( sMacro, sLabel ) )
メニューを追加した後で、次のようにしてトップメニューに追加します。下の場合にはメニューの最後に追加します。
oTopMenu.insertByIndex( oTopMenu.getCount(), aSubMenu )
区切り 
メニューの区切りはメニューと同じように追加します。
oSubMenu.insertByIndex( oSubMenu.getCount(), CreateSeparator() )
Function CreateSeparator()
Dim aMenuMember(1) As New com.sun.star.beans.PropertyValue
aMenuMember(0).Name = "CommandURL"
aMenuMember(0).Value = sCommand
aMenuMember(1).Name = "Type"
aMenuMember(1).Value = _
com.sun.star.ui.ItemType.SEPARATOR_LINE
CreateSeparator = aMenuMember()
End Function