Top / Eclipse / プラグイン開発のTIPS集 / メニューバーを構築する

Eclipse/RCPのメニューバーの構築

Eclipse/RCPのメニューバーの構築は、以下の2つの方法で行うことができます。

TUTORIALS 26 Developing for the Rich Client Platform によると

となっていますね。

プログラムからプログラマティカルに

さて、スケルトンとなる最小の構成をEclipse/RCPのフレームワークで作ります。

RCPは

IPlatformRunnable -> WorkbenchAdvisor 
-> WorkbenchWindowAdvisor -> ActionBarAdvisor 

(の実装クラス)という順番に呼び出されるパタンになっていて、メニューバーはこの

org.eclipse.ui.application.ActionBarAdvisor

内の

protected void makeActions(IWorkbenchWindow window);
protected void fillMenuBar(IMenuManager menuBar) ;

をOverrideすることで実装します。

ここでは下記のように実装しました。

package nu.mine.kino.plugin.samples.rcp;

import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;

public class ApplicationActionBarAdvisor extends ActionBarAdvisor {

  private IWorkbenchWindow window;
  private IWorkbenchAction quitAction;
  private IWorkbenchAction aboutAction;
  private IWorkbenchAction helpSearchAction;

  public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
    super(configurer);
    window = configurer.getWindowConfigurer().getWindow();
  }

  protected void makeActions(IWorkbenchWindow window) {
    quitAction = ActionFactory.QUIT.create(window);
    register(quitAction);
    aboutAction = ActionFactory.ABOUT.create(window);
    register(aboutAction);
    helpSearchAction = ActionFactory.HELP_SEARCH.create(window);
    register(helpSearchAction);
  }

  protected void fillMenuBar(IMenuManager menuBar) {
    menuBar.add(createFileMenu());
    menuBar.add(createHelpMenu());
  }

  /**
   * Creates and returns the File menu.
   */
  private MenuManager createFileMenu() {
    MenuManager menu = new MenuManager("&File",
        IWorkbenchActionConstants.M_FILE);
    menu.add(quitAction);
    return menu;
  }

  private MenuManager createHelpMenu() {
    // 根っこのメニュー追加。
    MenuManager menu = new MenuManager("&Help",
        IWorkbenchActionConstants.M_HELP); // helpというキー値
    menu.add(helpSearchAction);
    menu.add(new Separator("group01"));
    // ヘルプと、aboutの間にgroup01というグループを追加
    menu.add(aboutAction);
    return menu;
  }
}

これで、以下のようにメニューバーが構築されました。

menu01.png
[ワークベンチ]
   |
   |-[File]
   |   -[終了]
   |
   |-[Help]
   |   -[検索]
   |   -[○○について]

ポイントは

がワークベンチのメニューバーのインスタンスなので、そこにアクションをaddしていく

などです。

グループ名などについて

さて、先のコードで、

MenuManager menu = new MenuManager("&File",IWorkbenchActionConstants.M_FILE);

menu.add(new Separator("group01"));

などがありました。この IWorkbenchActionConstants?.M_FILE (文字列は"file")や、group01などは、拡張ポイントを使った宣言的メニュー追加で必要になってきます。拡張ポイントから宣言的にメニューにアクションを追加する際に、どこに追加するのかをこのグループ名で指定します。具体的に説明すると、まず先のコーディングで、各メニューの要素には以下の名前が付けられたことになります。

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

この場合、"セパレータ"部分は、正式名称*1

help/group01 (メニュー名/グループ名)

となります。この名称を、拡張ポイントでアクションを追加するときに使用するわけです。

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

では先の"セパレータ"部分にアクションを追加します。セパレータの完全修飾メニュー・パスは

help/group01

でした。

plugin.xmlに以下を追加します。

<extension point="org.eclipse.ui.actionSets" >
  <actionSet label="ラベル(つかってる?)"
    visible="true" id="nu.mine.kino.plugin.samples.rcp.actionsets">
    <action
      label="追加アクション。" <- 表示されるアクション名
       class="nu.mine.kino.plugin.samples.rcp.actions.HogeAction" <- 実装クラス
       menubarPath="help/group01" <- さっきの完全修飾メニュー・パス
       id="nu.mine.kino.plugin.samples.rcp.actions.hogeaction">
    </action>
  </actionSet>
</extension>

これで先のhelp/group01の箇所に "追加アクション。" というアクションが追加されました。

menu02.png

この記事は

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

Top / Eclipse / プラグイン開発のTIPS集 / メニューバーを構築する

現在のアクセス:18798


*1 完全修飾メニュー・パスというらしい

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS