特定ビューへのコンテキストメニュー項目の追加
コンテキストメニューの公開で紹介した機構によってちゃんと拡張性が確保されているコンテキストメニューに対しては,org.eclipse.ui.popupMenus拡張ポイントを使って,任意のプラグインからメニュー項目を動的に追加することができるようになる。コンテキストメニューのIDを知っていれば,そのコンテキストメニューに対して任意のメニュー項目を追加し,独自のアクションを呼び出すことができる。
では,プラグイン・マニフェストに記述する内容を見ていこう。
<extension point="org.eclipse.ui.popupMenus">
<viewerContribution
id="yoichiro.popupMenu"
targetID="yoichiro.target.view.contextMenuID">
<action
id="yoichiro.popupMenu.item"
label="Yoichiro's Menu Item"
menubarPath="additions"
class="yoichiro.popupMenu.Item">
</action>
</viewerContribution>
</extension>
extension要素のpoint属性で拡張ポイントを指定するのは既にお馴染み。そしてメニュー項目の追加だが,今回はviewerContribution要素を使用する。
コンテキストメニューへのアクションの追加では,objectContribution要素を用いた。objectContribution要素を使った場合,基本的にあるリソースのコンテキストメニューに対してアクションを追加する動きになり,あるビューに追加対象が特定されるわけではない。それに対して,viewerContribution要素を使った場合は,ビューが持つあるコンテキストメニューに特定してメニュー項目を追加することができる。
viewerContribution要素の属性を見る。id属性は追加するメニュー項目に独自に付与するIDで,任意に決めてよい。次のtargetIDは,追加対象となるコンテキストメニューのIDを記述する。ビューにコンテキストメニューがひとつしかなければ,ビューのIDがコンテキストメニューのIDのこともある(理由はコンテキストメニューの公開を見よ)。
そして具体的なメニュー項目となるアクションの定義をaction要素に記述していく。これはコンテキストメニューへのアクションの追加のときと大体同じだが,ここではmenubarPath属性が重要。menubarPath属性では,コンテキストメニュー内のメニュー項目を追加する場所を指定する。コンテキストメニューの公開で,拡張ポジションをIWorkbenchActionConstants.MB_ADDITIONS定数を使って準備した。このIWorkbenchActionConstants.MB_ADDITIONSの値が「additions」なのだ。ビュークラスのAPIリファレンスで特別な拡張ポジションの指定がなければ,「additions」をmenubarPath属性に指定してあげれば,大抵よいはず。実際のアクションの実装クラスはclass属性を用いて指定する。
viewerContribution要素の場合,アクションクラスはIViewActionDelegateインタフェースを実装する必要がある。
上記の記述でメニュー項目を自由に追加することができるようになるが,見てわかるように,コンテキストメニューのIDがわからなければメニュー項目を追加することはできない。つまり,プラグインが提供するビューのAPIリファレンスなどには,ちゃんと「こんな機能をこんなIDで公開しているので,拡張してね」という記載をするように。
| 固定リンク
この記事へのコメントは終了しました。
コメント