本篇转载自点击打开链接
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,弹出如下界面:
<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>
效果如图所示: