Top / Eclipse / プラグイン開発のTIPS集 / メニューバーを構築する(Eclipse3.3版)

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

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

対象のRCPのワークベンチ構成

もともとのEclipse/RCP のメニューバーの構成は、

[ワークベンチ]
   |
   |-[File]            - "file"  <- IWorkbenchActionConstants.M_FILE
   |   -[終了]
   |
   |-GroupMarker       - "additions"
   |
   |-[Help]            - "help"  <- IWorkbenchActionConstants.M_HELP
   |   -[検索]
   |   -"セパレータ"   - "group01"
   |   -[○○について] - 

となっているとします。

rcp01.png
rcp02.png

拡張ポイントから宣言的に

拡張ポイントを用いて宣言的にメニューに項目を追加するには、いままでは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)

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

rcp03.png

アクションではなく、サブメニューを追加する

次に、サブメニューを追加したいと思います。具体的には次のようにしたいと思います。

[ワークベンチ]
   |
   |-[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)

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

rcp04.png

他の方法でもできる

上記の方法でもちろん問題ないですが、別の方法として「追加メニュー」部に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)

トップレベルのメニューにアクションを追加したい。

トップレベルのメニューへメニューを追加する方法です。拡張ポイントで宣言的にやるやり方は、以下の通り:

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

このように

locationURI="menu:org.eclipse.ui.main.menu?after=additions"

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

rcp05.png

ビューのメニューバーもこの拡張ポイントでできる

さて、EclipseやRCPのメインのメニューバーに対してメニューやコマンドを追加する方法を見てきましたが、ビューの右肩の△メニューに追加する時にもこの拡張ポイントを使用します。Eclipse3.3以前は org.eclipse.ui.viewActions 拡張ポイントを用いていました。

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

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)

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

rcp07.png

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

あるビューがアクティブの場合のみ、あるコマンドを選択可能にする

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

  • 「サンプルコマンド」が選択できない
    active01.png


  • View3がアクティブになったら、「サンプルコマンド」が選択できるようになった
    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)

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

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

参考。

あるビューがアクティブのばあいのみ、あるメニュー構成をメニューバーに表示する。

次に、あるビューがアクティブの時だけ、EclipseやRCPのメインメニューバーに 指定したメニュー構成を表示する方法です。Eclipse 3.2までは org.eclipse.ui.actionSetPartAssociations 拡張ポイントを用いて実装出来たモノですね。

  • メニューバーに表示されていない
    visible01.png


  • View3がアクティブになったら、メニューバーにメニューが表示された
    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)

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

TIPS

additionsは特別視されている?

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

ソースコード

関連リンク


この記事は

選択肢 投票
おもしろかった 5  
そうでもない 0  

Top / Eclipse / プラグイン開発のTIPS集 / メニューバーを構築する(Eclipse3.3版)

現在のアクセス:13903


添付ファイル: filevisible02.png 575件 [詳細] filevisible01.png 569件 [詳細] fileactive02.png 534件 [詳細] fileactive01.png 610件 [詳細] filercp07.png 618件 [詳細] filercp06.png 535件 [詳細] filercp05.png 600件 [詳細] filercp04.png 554件 [詳細] filercp03.png 527件 [詳細] filercp02.png 601件 [詳細] filercp01.png 651件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-11-29 (火) 16:29:13 (1087d)