// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents

**Eclipse/RCPのメニューバーの構築 [#xfe6d579]

Eclipse/RCPのメニューバーの構築は、以下の2つの方法で行うことができます。
-プログラムからプログラマティカルに
-拡張ポイントから宣言的に

[[TUTORIALS 26 Developing for the Rich Client Platform:http://www.eclipsecon.org/2005/tutorials.php]]
によると
-(メニューと、常に表示しておくアクションなど)最小のスケルトンをプログラマティカルに
-それ以外は宣言的に

となっていますね。



***プログラムからプログラマティカルに [#f392fc18]
さて、スケルトンとなる最小の構成をEclipse/RCPのフレームワークで作ります。

RCPは
 IPlatformRunnable -> WorkbenchAdvisor 
 -> WorkbenchWindowAdvisor -> ActionBarAdvisor 
(の実装クラス)という順番に呼び出されるパタンになっていて、メニューバーはこの
 org.eclipse.ui.application.ActionBarAdvisor
内の
 protected void makeActions(IWorkbenchWindow window);
 protected void fillMenuBar(IMenuManager menuBar) ;
をOverrideすることで実装します。

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



-ActionBarAdvisor の実装クラス

 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;
   }
 }

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


#ref(menu01.png)

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

ポイントは
-すでに定義済みのアクションは
 quitAction = ActionFactory.QUIT.create(window); <- 終了
などActionFactoryから取得できる

-protected void fillMenuBar(IMenuManager menuBar);

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

などです。

***グループ名などについて [#u9f12328]
さて、先のコードで、
 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"
    |   -[○○について] - 

この場合、"セパレータ"部分は、正式名称((完全修飾メニュー・パスというらしい))は
 help/group01 (メニュー名/グループ名)
となります。この名称を、拡張ポイントでアクションを追加するときに使用するわけです。

***拡張ポイントから宣言的に [#ge84d99c]
では先の"セパレータ"部分にアクションを追加します。セパレータの完全修飾メニュー・パスは
 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の箇所に "追加アクション。" というアクションが追加されました。

#ref(menu02.png)


----
この記事は
#vote(おもしろかった,そうでもない)

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

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