// 下階層用テンプレート
#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>

ここまで作成したプラグインは以下よりダウンロードできます。

[[ソースコード(ViewVC)>http://www.masatom.in/viewvc/Examples/trunk/nu.mine.kino.plugin.newaction/plugin.xml?view=markup&pathrev=131]]


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


#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>

ここまで作成したプラグインは以下よりダウンロードできます。

[[ソースコード(ViewVC)>http://www.masatom.in/viewvc/Examples/trunk/nu.mine.kino.plugin.newaction/plugin.xml?view=markup&pathrev=132]]


いままで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>

ここまで作成したプラグインは以下よりダウンロードできます。

[[ソースコード(ViewVC)>http://www.masatom.in/viewvc/Examples/trunk/nu.mine.kino.plugin.newaction/plugin.xml?view=markup&pathrev=133]]



**トップレベルのメニューにアクションを追加したい。 [#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>

ここまで作成したプラグインは以下よりダウンロードできます。

[[ソースコード(ViewVC)>http://www.masatom.in/viewvc/Examples/trunk/nu.mine.kino.plugin.newaction/plugin.xml?view=markup&pathrev=134]]


このように
 locationURI="menu:org.eclipse.ui.main.menu?after=additions"
とURIの指定をorg.eclipse.ui.main.menu にすればOKです。トップメニューにはファイルとヘルプの間にadditionsを付けてあるので、afterで指定しています。

#ref(rcp05.png)


**ビューのメニューバーもこの拡張ポイントでできる [#n948a773]
さて、EclipseやRCPのメインのメニューバーに対してメニューやコマンドを追加する方法を見てきましたが、ビューの右肩の△メニューに追加する時にもこの拡張ポイントを使用します。[[Eclipse3.3以前は org.eclipse.ui.viewActions 拡張ポイント>http://www.masatom.in/pukiwiki/?cmd=read&page=Eclipse%2F%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3%B3%AB%C8%AF%A4%CETIPS%BD%B8%2Forg.eclipse.ui.IViewActionDelegate%28%A5%DD%A5%C3%A5%D7%A5%A2%A5%C3%A5%D7%A1%A6%A5%E1%A5%CB%A5%E5%A1%BC%A5%D0%A1%BC%29]]を用いていました。

さて、下記のような既存のメニュー部に、拡張ポイントでコマンドを追加してみます。
#ref(rcp06.png)

上記の部分は以下のようにセパレータが挿入されているとします。
 [△プルダウン]
    |
    |   -[Action 1]
    |   -"セパレータ"     - "hogehoge"
    |   -[Action 2]

またビューのIDは
 nu.mine.kino.plugin.samples.rcp.view3
だとします。

このhogehogeの箇所に、コマンドを追加する拡張ポイントの指定は以下の通り。
 <extension point="org.eclipse.ui.menus">
   <!-- view に追加する場合は、ViewのIDを指定する -->
   <!-- かつては、org.eclipse.ui.viewActions 拡張ポイント 
        をつかって実装していた箇所 -->
   <menuContribution 
     locationURI="menu:nu.mine.kino.plugin.samples.rcp.view3?after=hogehoge">
     <menu id="nu.mine.kino.plugin.newaction.menu1" 
         label="他人のビューにメニュー追加">
       <command commandId="nu.mine.kino.plugin.samples.rcp.command" 
         label="他人のビューにコマンド追加" style="push">
       </command>
     </menu>
   </menuContribution>
 </extension>

ここまで作成したプラグインは以下よりダウンロードできます。

[[ソースコード(ViewVC)>http://www.masatom.in/viewvc/Examples/trunk/nu.mine.kino.plugin.newaction/plugin.xml?view=markup&pathrev=135]]


上記のように、URLにはビューのIDを指定し、パラメタに差し込みたい場所のセパレータ名"hogehoge" を指定してあげればOKです。

#ref(rcp07.png)

Action 1 とAction 2の間に、コマンドが追加されました。



**あるビューがアクティブの場合のみ、あるコマンドを選択可能にする [#hed31734]
あるビューでのみ使用したいコマンドがあったとき、そのビューがアクティブ状態のときのみコマンドを選択可能にすることができます。

-「サンプルコマンド」が選択できない
#ref(active01.png)

~~
-View3がアクティブになったら、「サンプルコマンド」が選択できるようになった
#ref(active02.png)

この機能を利用するには、ハンドラに対して下記のように条件を指定する拡張ポイントを設定します。 条件を指定する拡張ポイントはorg.eclipse.core.expressions.definitions です。これで条件を定義し、その拡張ポイントのIDをハンドラに関連づけます。

 <extension point="org.eclipse.core.expressions.definitions">
   <definition id="nu.mine.kino.plugin.samples.rcp.view3.isActive">
     <with variable="activePartId">
       <equals value="nu.mine.kino.plugin.samples.rcp.view3"></equals>
     </with>
   </definition>
 </extension> <!--アクティブなビュー(正確にはpart)のid -->
 
 <!-- ハンドラと、先の条件設定の関連づけ-->
 <extension point="org.eclipse.ui.handlers">
   <handler 
     commandId="nu.mine.kino.plugin.newaction.commands.sampleCommand" 
     class="nu.mine.kino.plugin.newaction.handlers.SampleHandler">
   </handler>
   <handler commandId="nu.mine.kino.plugin.samples.rcp.command" 
     class="nu.mine.kino.plugin.newaction.handlers.SampleHandler">
     <activeWhen> <!--下の条件の場合だけ、選択可能にする。 --> 
         <reference  <!-- さきのdefinitionのidを関連づけ -->
           definitionId="nu.mine.kino.plugin.samples.rcp.view3.isActive">
         </reference>
     </activeWhen>
   </handler>
 </extension>
 
 <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>
       <command commandId="nu.mine.kino.plugin.newaction.commands.sampleCommand" 
         label="アクティブ・非アクティブコマンド" style="push">
       </command>
     </menu>
   </menuContribution>
 </extension>

ここまで作成したプラグインは以下よりダウンロードできます。

[[ソースコード(ViewVC)>http://www.masatom.in/viewvc/Examples/trunk/nu.mine.kino.plugin.newaction/plugin.xml?view=markup&pathrev=136]]

一つのハンドラに activeWhenというタグで条件設定を関連づけました。

こうすることで、あるビュー(nu.mine.kino.plugin.samples.rcp.view3)がアクティブの時にだけ、選択することができるコマンドを設定することが出来ます。選択できる・できないなので、見えなくなるわけではないですね。

参考。
-[[Associating a handler with a command while a part type is active>http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/workbench_cmd_handlers.htm]] <-このページの上の方にかいてありますね



**あるビューがアクティブのばあいのみ、あるメニュー構成をメニューバーに表示する。 [#na3953cc]
次に、あるビューがアクティブの時だけ、EclipseやRCPのメインメニューバーに 指定したメニュー構成を表示する方法です。Eclipse 3.2までは [[org.eclipse.ui.actionSetPartAssociations 拡張ポイント>http://www.masatom.in/pukiwiki/Eclipse/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3%B3%AB%C8%AF%A4%CETIPS%BD%B8/%A4%A2%A4%EB%A5%D3%A5%E5%A1%BC%A4%AC%A5%A2%A5%AF%A5%C6%A5%A3%A5%D6%A4%CE%BB%FE%A4%CE%A4%DF%C9%BD%BC%A8%A4%B5%A4%EC%A4%EB%A5%A2%A5%AF%A5%B7%A5%E7%A5%F3/]]を用いて実装出来たモノですね。



-メニューバーに表示されていない
#ref(visible01.png)

~~
-View3がアクティブになったら、メニューバーにメニューが表示された
#ref(visible02.png)



先の、コマンド単位で選択可能・不可能を制御する例では、ハンドラに対して org.eclipse.core.expressions.definitions 拡張ポイントを関連づけました。今回はメニュー単位の表示制御なので org.eclipse.core.expressions.definitions 拡張ポイントを、 org.eclipse.ui.menus 拡張ポイントの menu の設定に対して関連づけます。

 <extension point="org.eclipse.core.expressions.definitions">
   <definition id="nu.mine.kino.plugin.samples.rcp.view3.isActive">
     <with variable="activePartId">
       <equals value="nu.mine.kino.plugin.samples.rcp.view3"></equals>
     </with>
   </definition>
 </extension> <!--アクティブなビュー(正確にはpart)のid -->
 
 <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>
       <visibleWhen><!--下の条件の場合だけ、表示する。 --> 
         <reference 
           definitionId="nu.mine.kino.plugin.samples.rcp.view3.isActive">
         </reference>
       </visibleWhen>
     </menu>
   </menuContribution>
 </extension>



ここまで作成したプラグインは以下よりダウンロードできます。

[[ソースコード(ViewVC)>http://www.masatom.in/viewvc/Examples/trunk/nu.mine.kino.plugin.newaction/plugin.xml?view=markup&pathrev=137]]

これでさっきのキャプチャのように、あるビューがアクティブになったときのみ、メニューバーにメニューが表示されるようになりました。








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

**ソースコード [#h35bfa90]
-[[プラグインのソースコード(ViewVC)>http://www.masatom.in/viewvc/Examples/tags/V20100117_01/nu.mine.kino.plugin.newaction/]]
-[[RCPのソースコード(ViewVC)>http://www.masatom.in/viewvc/Examples/tags/V20100117_02/nu.mine.kino.plugin.samples.rcp/]]

**関連リンク [#v5811993]
-[[Eclipse/プラグイン開発のTIPS集/メニューバーを構築する]]
-[[Eclipse/プラグイン開発のTIPS集/キーバインディングを設定する(Eclipse3.3版)]]
-[[Eclipse/プラグイン開発のTIPS集/あるビューがアクティブの時のみ表示されるアクション]]
-[[Contribution visibility>http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/workbench_cmd_menus.htm]]



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

#comment
#topicpath


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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS