eclipse的菜單menu、工具欄toolbar乃至視圖的上下文菜單contextmenu都是使用Action或Command實現的。
Action即是
org.eclipse.jface.action.IAction
Command即是
org.eclipse.core.commands.Command
從它們的包名可以看出,Action是UI相關的,除了可執行代碼(run方法)以外,還會包含一些UI信息,比如動作名稱(Label),描述圖片(Image)等等。
而Command則完全是業務代碼,它更關注於操作本身,(在編輯器中,一系列被執行了的命令會進入命令棧,以此為依據來實現redo和undo功能)。
本篇文章重點要討論的是如何在eclipse的Menu欄上注冊一個Action。分三種情況討論:
1、添加一個菜單欄並添加一個菜單項
2、在自定義的菜單欄里添加一個子菜單
3、為eclipse的指定菜單欄的指定的子菜單添加一個子菜單項
所有功能使用org.eclipse.ui.actionSet實現。
1、添加一個菜單欄並添加一個菜單項
擴展點定義如下:
<extension point="org.eclipse.ui.actionSets"> <actionSet id="test.my.actionSet" label="test.my.actionSet" visible="true"> <menu id="test.my.menu" label="我的Menu"> <separator name="test.sp"> </separator> </menu> <action class="test.my.TestAction" id="test.my.action" label="我的Action" menubarPath="test.my.menu/test.sp" style="push"> </action> </actionSet> </extension>
在上述擴展配置中,我們注冊了一個ActionSet,為該ActionSet添加了一個Menu,一個Action,為Menu添加了一個Seperator。
然后將Action的menubarPath設置為[Menu ID]/[Sperarot ID]
2、在自定義的菜單欄里添加一個子菜單
<extension point="org.eclipse.ui.actionSets"> <actionSet id="test.my.actionSet" label="test.my.actionSet" visible="true"> <menu id="test.my.menu" label="我的菜單"> <separator name="test.sp"> </separator> </menu> <menu id="test.my.submenu" label="我的子菜單" path="test.my.menu/test.sp"> </menu> <action class="test.my.TestAction" id="test.my.action" label="我的Action" menubarPath="test.my.menu/test.my.submenu/additions" style="push"> </action> </actionSet> </extension>
插入子菜單的配置和插入菜單項的配置是一樣的,為子菜單添加子菜單項則需要知道菜單的ID,子菜單的ID。
在Action配置的menubarPath上填寫:[Menu ID]/[SubMenu ID]/additions
即可。效果如下圖所示:
3、為eclipse的指定菜單欄的指定的子菜單添加一個子菜單項
在RCP開發中有一個常見需求,即是為Eclipse的File菜單的New子菜單中添加一個新的子菜單項。
通過上面的學習,我們知道,只要知道菜單ID和子菜單ID,即可完成需求。
如何知道這兩項呢?
我們可以使用Plugin Menu Spy工具,如果你的Eclipse是RCP/RAP版本,或者安裝了PDE插件,就會有這個功能。
按快捷鍵alt+shift+F2
鼠標圖標會變成一個放大鏡和一張圖紙樣式,即是Plug-in Menu Spy成功啟動。
用鼠標點選File->Close,彈出如下界面:

可知菜單ID為file。
用鼠標點選File->New->Project,彈出如下界面:

可知,子菜單ID為new
於是,添加如下配置:
<extension point="org.eclipse.ui.actionSets"> <actionSet id="test.my.actionSet" label="test.my.actionSet" visible="true"> <action class="test.my.TestAction" id="test.my.action" label="我的Action" menubarPath="file/new/additions" style="push"> </action> </actionSet> </extension>
效果如圖所示: