// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents


Eclipse/プラグイン開発のTIPS集/メニューバーを構築する のページで、アクションクラスを用いたメニューバーの構築する方法についてまとめました。さて、Eclipse/プラグイン開発のTIPS集/キーバインディングを設定する(Eclipse3.3版) でも書きましたが、Eclipse3.3からはアクション関連の機構は、かわりに org.eclipse.ui.commands 拡張ポイント関連を使うのを推奨しているようです。 メニューバーの構築方法もそれにともなって標準のやり方が変わっているようなので、このページにまとめておきます。


標準的な構成は元ページ Eclipse/プラグイン開発のTIPS集/メニューバーを構築する のEclipse/RCPをそのまま用いてみようと思います。



**対象のRCPのワークベンチ構成 [#w804ff7c]
もともとのEclipse/RCP のメニューバーの構成は、
 [ワークベンチ]
    |
    |-[File]            - "file"  <- IWorkbenchActionConstants.M_FILE
    |   -[終了]
    |
    |-GroupMarker       - "additions"
    |
    |-[Help]            - "help"  <- IWorkbenchActionConstants.M_HELP
    |   -[検索]
    |   -"セパレータ"   - "group01"
    |   -[○○について] - 

となっているとします。

#ref(rcp01.png)

#ref(rcp02.png)

**拡張ポイントから宣言的に [#o26e0d60]
拡張ポイントを用いて宣言的にメニューに項目を追加するには、いままではorg.eclipse.ui.actionSets 拡張ポイントを使ってましたが、''Eclipse3.3からは org.eclipse.ui.menus 拡張ポイント''を使用します。

では先の"セパレータ"部分にコマンドを追加します。拡張ポイントの指定方法は以下の通り。
 <extension point="org.eclipse.ui.menus">
   <menuContribution
        locationURI="menu:help?after=group01">
      <command commandId="nu.mine.kino.plugin.samples.rcp.command"
        label="追加アクション。"
        style="push">
      </command>
    </menuContribution>
 </extension>

ポイントは、locationURI の指定方法です。
 locationURI="menu:help?after=group01"
これですが、ワークベンチトップに追加したおいたhelp(IWorkbenchActionConstants.M_HELPのこと) 内の、group01セパレータの後ろ、という意味になります。



ちなみにplugin.xml全体は以下の通り。
 <extension point="org.eclipse.ui.handlers">
   <handler commandId="nu.mine.kino.plugin.samples.rcp.command" 
     class="nu.mine.kino.plugin.newaction.handlers.SampleHandler">
   </handler>
 </extension>
 
 <extension point="org.eclipse.ui.commands">
   <category id="nu.mine.kino.plugin.samples.rcp.category" name="Sample"/>
   <command categoryId="nu.mine.kino.plugin.samples.rcp.category" 
     id="nu.mine.kino.plugin.samples.rcp.command" name="サンプルコマンド"/>
 </extension>
 
 <extension point="org.eclipse.ui.menus">
  <menuContribution
       locationURI="menu:help?after=group01">
     <command commandId="nu.mine.kino.plugin.samples.rcp.command"
       label="追加アクション。"
       style="push">
     </command>
   </menuContribution>
 </extension>

以上で、先のセパレータ部分に、コマンドが追加されました。


#ref(rcp03.png)


*** アクションではなく、サブメニューを追加する [#hed5215b]
次に、サブメニューを追加したいと思います。具体的には次のようにしたいと思います。

 [ワークベンチ]
    |
    |-[File]                   - "file"     <- IWorkbenchActionConstants.M_FILE
    |   -[終了]
    |
    |-[Help]                   - "help"     <- IWorkbenchActionConstants.M_HELP
    |   -[検索]
    |   -"セパレータ"          - "group01"
    |   -[追加メニュー。]      - "menu01"   <- plugin.xmlで追加
    |      -"セパレータ"       - "sepa01"   <- plugin.xmlで追加
    |      -[追加アクション。] -            <- plugin.xmlで追加
    |   -[○○について] - 

セパレータ部分に「追加メニュー。」というサブメニューを追加し、その下にさっきのアクションを追加したいと思います。

plugin.xmlに以下の通り記述します。さっきのorg.eclipse.ui.menusの記述はいったん削除しましょう。
 <extension point="org.eclipse.ui.menus">
  <menuContribution
      locationURI="menu:help?after=group01">
    <menu label="追加メニュー。">
      <separator name="sepa01" visible="true" />
      <command
        commandId="nu.mine.kino.plugin.samples.rcp.command"
        label="追加アクション。"
        style="push">
      </command>
    </menu>
  </menuContribution>
 </extension>

いままでorg.eclipse.ui.actionSets拡張ポイントを使用していたときよりも、ずいぶんとすっきりしてわかりやすくなりました。


#ref(rcp04.png)


**他の方法でもできる [#cb4c2025]
上記の方法でもちろん問題ないですが、別の方法として「追加メニュー」部にid属性で名前を付けることで、以下のように設定することも可能です。

 <!-- まずはhelp/group01の箇所にメニューとセパレータを追加 -->
 <!-- セパレータのあるメニューにはhelp_group01と名前をつけた -->
 <extension point="org.eclipse.ui.menus">
   <menuContribution locationURI="menu:help?after=group01">
     <menu id="help_group01" label="追加メニュー。">
       <separator name="sepa01" visible="true">
       </separator>
     </menu>
   </menuContribution>
 </extension>
 
 <!-- 次に、そのメニュー(id = help_group01) 内のsepa01というセパレータ-->
 <!-- の後にコマンドを追加-->
 <extension point="org.eclipse.ui.menus">
   <menuContribution locationURI="menu:help_group01?after=sepa01">
     <command commandId="nu.mine.kino.plugin.samples.rcp.command" 
       label="追加アクション" style="push">
     </command>
   </menuContribution>
 </extension>



**トップレベルのメニューにアクションを追加したい。 [#vf939986]
トップレベルのメニューへメニューを追加する方法です。拡張ポイントで宣言的にやるやり方は、以下の通り:

 <extension point="org.eclipse.ui.menus">
 <menuContribution 
     locationURI="menu:org.eclipse.ui.main.menu?after=additions">
     <menu id="nu.mine.kino.plugin.newaction.menus.sampleMenu"  label="トップのメニュー">
       <command commandId="nu.mine.kino.plugin.samples.rcp.command" 
         style="push">
       </command>
       <separator name="sepa01" visible="true">
       </separator>
       <command commandId="nu.mine.kino.plugin.samples.rcp.command" 
         label="別名。" style="push">
       </command>
       <separator name="sepa02" visible="true" />
       <command commandId="nu.mine.kino.plugin.samples.rcp.command" 
         label="別名2。" style="push">
       </command>
     </menu>
   </menuContribution>
 </extension>
このように
 locationURI="menu:org.eclipse.ui.main.menu?after=additions"
とURIの指定をorg.eclipse.ui.main.menu にすればOKです。トップメニューにはファイルとヘルプの間にadditionsを付けてあるので、afterで指定しています。

#ref(rcp05.png)


**TIPS [#cc014790]
***additionsは特別視されている? [#x13590e4]
afterでよく指定されるadditionsですが、afterの後の文字列でadditionsは特別視されているかなあ?通常だとafterの後の文字列を誤って(存在しないセパレータを指定したって事)しまうとメニューに表示されないのですが、additionsと書いておくぶんには、additionsというセパレータがなく空振りしても、最下行にちゃんと表示してくれる模様。、、、ちがうかな。。



**関連リンク [#v5811993]
-[[Eclipse/プラグイン開発のTIPS集/メニューバーを構築する]]
-[[Eclipse/プラグイン開発のTIPS集/キーバインディングを設定する(Eclipse3.3版)]]

----
この記事は
#vote(おもしろかった,そうでもない)

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS