Eclipse/プラグイン開発のTIPS集/メニューバーを構築する のページで、アクションクラスを用いたメニューバーの構築する方法についてまとめました。さて、Eclipse/プラグイン開発のTIPS集/キーバインディングを設定する(Eclipse3.3版) でも書きましたが、Eclipse3.3からはアクション関連の機構は、かわりに org.eclipse.ui.commands 拡張ポイント関連を使うのを推奨しているようです。 メニューバーの構築方法もそれにともなって標準のやり方が変わっているようなので、このページにまとめておきます。
標準的な構成は元ページ Eclipse/プラグイン開発のTIPS集/メニューバーを構築する のEclipse/RCPをそのまま用いてみようと思います。
もともとのEclipse/RCP のメニューバーの構成は、
[ワークベンチ] | |-[File] - "file" <- IWorkbenchActionConstants.M_FILE | -[終了] | |-GroupMarker - "additions" | |-[Help] - "help" <- IWorkbenchActionConstants.M_HELP | -[検索] | -"セパレータ" - "group01" | -[○○について] -
となっているとします。
拡張ポイントを用いて宣言的にメニューに項目を追加するには、いままでは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>
ここまで作成したプラグインは以下よりダウンロードできます。
以上で、先のセパレータ部分に、コマンドが追加されました。
次に、サブメニューを追加したいと思います。具体的には次のようにしたいと思います。
[ワークベンチ] | |-[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拡張ポイントを使用していたときよりも、ずいぶんとすっきりしてわかりやすくなりました。
上記の方法でもちろん問題ないですが、別の方法として「追加メニュー」部に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>
ここまで作成したプラグインは以下よりダウンロードできます。
トップレベルのメニューへメニューを追加する方法です。拡張ポイントで宣言的にやるやり方は、以下の通り:
<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で指定しています。
さて、EclipseやRCPのメインのメニューバーに対してメニューやコマンドを追加する方法を見てきましたが、ビューの右肩の△メニューに追加する時にもこの拡張ポイントを使用します。Eclipse3.3以前は org.eclipse.ui.viewActions 拡張ポイントを用いていました。
さて、下記のような既存のメニュー部に、拡張ポイントでコマンドを追加してみます。
上記の部分は以下のようにセパレータが挿入されているとします。
[△プルダウン] | | -[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>
ここまで作成したプラグインは以下よりダウンロードできます。
上記のように、URLにはビューのIDを指定し、パラメタに差し込みたい場所のセパレータ名"hogehoge" を指定してあげればOKです。
Action 1 とAction 2の間に、コマンドが追加されました。
あるビューでのみ使用したいコマンドがあったとき、そのビューがアクティブ状態のときのみコマンドを選択可能にすることができます。
この機能を利用するには、ハンドラに対して下記のように条件を指定する拡張ポイントを設定します。 条件を指定する拡張ポイントは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>
ここまで作成したプラグインは以下よりダウンロードできます。
一つのハンドラに activeWhenというタグで条件設定を関連づけました。
こうすることで、あるビュー(nu.mine.kino.plugin.samples.rcp.view3)がアクティブの時にだけ、選択することができるコマンドを設定することが出来ます。選択できる・できないなので、見えなくなるわけではないですね。
参考。
次に、あるビューがアクティブの時だけ、EclipseやRCPのメインメニューバーに 指定したメニュー構成を表示する方法です。Eclipse 3.2までは org.eclipse.ui.actionSetPartAssociations 拡張ポイントを用いて実装出来たモノですね。
先の、コマンド単位で選択可能・不可能を制御する例では、ハンドラに対して 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>
ここまで作成したプラグインは以下よりダウンロードできます。
これでさっきのキャプチャのように、あるビューがアクティブになったときのみ、メニューバーにメニューが表示されるようになりました。
afterでよく指定されるadditionsですが、afterの後の文字列でadditionsは特別視されているかなあ?通常だとafterの後の文字列を誤って(存在しないセパレータを指定したって事)しまうとメニューに表示されないのですが、additionsと書いておくぶんには、additionsというセパレータがなく空振りしても、最下行にちゃんと表示してくれる模様。
この記事は
現在のアクセス:17765