« ビュー上のコンテキストメニュー(2) | トップページ | 特定ビューへのコンテキストメニュー項目の追加 »

2004.02.12

コンテキストメニューの公開

「ビュー上のコンテキストメニュー(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を元に,独自のメニュー項目を追加することができるようになる。もちろん「そんなことはさせないぜ!」というプラグイン作者は,上記のような拡張機構をつかわないことも自由である。。。

|

« ビュー上のコンテキストメニュー(2) | トップページ | 特定ビューへのコンテキストメニュー項目の追加 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/12631/189192

この記事へのトラックバック一覧です: コンテキストメニューの公開:

« ビュー上のコンテキストメニュー(2) | トップページ | 特定ビューへのコンテキストメニュー項目の追加 »