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; } }
これで、以下のようにメニューバーが構築されました。
[ワークベンチ] | |-[File] | -[終了] | |-[Help] | -[検索] | -[○○について]
ポイントは
quitAction = ActionFactory.QUIT.create(window); <- 終了などActionFactory?から取得できる
がワークベンチのメニューバーのインスタンスなので、そこにアクションを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の箇所に "追加アクション。" というアクションが追加されました。
この記事は
現在のアクセス:18798