コンテキストメニューの公開
「ビュー上のコンテキストメニュー(1)(2)」でコンテキストメニューの作成方法を解説した。しかし,それだけでは「自分よがりな」メニューであり,他人に優しいメニューではない。
既存のコンテキストメニューへメニュー項目を追加する方法を,「コンテキストメニューへのアクションの追加」で説明した。これにより,Package ExplorerビューやOutlineビューなどに備わっているコンテキストメニューへ,独自のメニュー項目を追加できる。しかし,これは「予めメニュー項目を他のプラグインが追加できるようにしてくれている」からなのだ。
コンテキストメニューは,Eclipseの拡張性を高く保つために,他のプラグインに対してコンテキストメニューが公開される。そして,コンテキストメニューは,メニュー項目を他のプラグインが追加できるように,拡張ポジションを持っておくべきである。「ビュー上のコンテキストメニュー(1)(2)」では,コンテキストメニューの公開も拡張ポジションの準備もしていないため,他人に優しくないのである。
まずコンテキストメニューの公開方法であるが,これは以下のソースコードで実現する。
MenuManager menuManager = new MenuManager();
// コンテキストメニュー作成処理(1)(2)
getSite().registerContextMenu(menuManager,
getSite().getSelectionProvider());
ViewPartクラスのgetSiteメソッドを呼び出してIWorkbenchPartSiteインタフェースのオブジェクトを取得し,そのregisterContextMenuメソッドにMenuManagerオブジェクトを渡してコンテキストメニューを登録し公開する。この際,コンテキストメニューのIDは,上記の処理を行ったビューのIDに一致する。もしコンテキストメニューのIDを変えたければ,IDを指定して登録するタイプのreigsterContextMenuメソッドもあるので,そっちを使用する。ISelectionProviderインタフェースのオブジェクトは,自作してもいいけど,通常は上記のようにIWorkbenchPartSiteオブジェクトから取得して渡せばよい。
これでコンテキストメニューを公開できたのだが,これでは公開しただけでメニュー項目の追加ができない。拡張ポジションを準備して,メニュー項目が追加される位置を決めておかなければならない。そのためには,コンテキストメニューに以下のメニュー項目を追加しておく。
public void menuAboutToShow(IMenuManager menu) {
menu.add(new TestAction());
menu.add(new Separator(
IWorkbenchActionConstants.MB_ADDITIONS));
menu.add(new Separator(
IWorkbenchActionConstants.MB_ADDITIONS + "-end"));
}
メニュー項目として,「こっからここまでだよ」とSeparatorオブジェクトを追加して教えてあげる。その際に,IWorkbenchActionConstantsクラスのMB_ADDITIONS定数を指定して,拡張ポジションの区切りであることを示しておく。
上記により,他のプラグインは公開されたコンテキストメニューのIDを元に,独自のメニュー項目を追加することができるようになる。もちろん「そんなことはさせないぜ!」というプラグイン作者は,上記のような拡張機構をつかわないことも自由である。。。
| 固定リンク
この記事へのコメントは終了しました。
コメント