- 追加された行はこの色です。
- 削除された行はこの色です。
// 下階層用テンプレート
#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;}