最开始的时刻,都是使用org.eclipse.ui.popupMenus (上下文菜单)和org.eclipse.ui.actionSets(视图菜单,主菜单)来创建Eclipse菜单。
原来都是使用下面的方式来创建菜单:
<extension point="org.eclipse.ui.popupMenus">
<objectContribution
id="com.xyz.C1"
objectClass="org.eclipse.core.resources.IFile"
nameFilter="*.java">
<menu
id="com.xyz.xyzMenu"
path="additions"
label="&XYZ Java Tools">
<separator name="group1"/>
</menu>
<action
id="com.xyz.runXYZ"
label="&Run XYZ Tool"
style="push"
menubarPath="com.xyz.xyzMenu/group1"
icon="icons/runXYZ.gif"
helpContextId="com.xyz.run_action_context"
class="com.xyz.actions.XYZToolActionDelegate"
enablesFor="1" />
</objectContribution>
同样Eclipse也提供了Commands Framework框架来创建菜单,使用CommandsFramework需要用到3个扩展点:
org.eclipse.ui.commands
org.eclipse.ui.handlers
org.eclipse.ui.menus
org.eclipse.ui.commands
命令定义。
· id 该command的唯一标识,在handler和menu都会用到这个id。
· name 该命令的名字,可以起到一个翻译解释的作用。如果在menu的label属性没有定义时,在界面上会显示该name的值。
· defaultHandler 默认处理类,如果该commandId没有被绑定到handler扩展点,那么就会调用该defaultHandler处理类(这个属性还与IExecutableExtension有联系)。
<extension
point="org.eclipse.ui.commands">
<command
defaultHandler="com.winse.eclipse.examples.handler.HelloHandler"
id="com.winse.eclipse.examples.command.hellocmdusedefault"
name="Hello CMD use DefaultHandler">
</command>
<command
id="com.winse.eclipse.examples.command.hellocmd"
name="Hello CMD">
</command>
</extension>
当menus扩展点中没有定义label属性时,会在界面中显示command的name属性。

org.eclipse.ui.handlers
这个用于设置处理类。需要处理的对象可以通过HandleUtil获得。
· commandId 绑定到的command,既上面的org.eclipse.ui.commands扩展点设置的id。
· class 处理类
<extension
point="org.eclipse.ui.handlers">
<handler
class="com.winse.eclipse.examples.handler.HelloHandler"
commandId="com.winse.eclipse.examples.command.hellocmd">
</handler>
</extension>
public class HelloHandler extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
MessageDialog.openInformation(
HandlerUtil.getActiveWorkbenchWindow(event).getShell(),
"Hello.", "my first eclise command framework example.");
return null;
}
}
org.eclipse.ui.menus
定义命令出现的位置。
· locationURI 定义menu节点的插入点。这个重点难点,这个参数请参考最后的链接。
· id 菜单(menu或command)的标识,可以用于locationURI的after与before来进行菜单的排序。
· label 菜单的显示名称(可选,如果没有填写,会使用命令的name属性,但推荐在这里定义)。
· commandId 需要执行的命令Id。
<extension
point="org.eclipse.ui.menus">
<menuContribution
allPopups="false"
locationURI="menu:org.eclipse.ui.main.menu">
<menu
id="fileMenu"
label="file">
<command
commandId="com.winse.eclipse.examples.command.hellocmd"
label="Hello"
style="push">
</command>
<command
commandId="com.winse.eclipse.examples.command.hellocmdusedefault"
id="hellodefault"
style="push">
</command>
</menu>
</menuContribution>
</extension>
完成上面三个扩展点的定义后,就可以来进行测试了。
我们的命令放置在主菜单栏上(menu:org.eclipse.ui.main.menu),所以,我们可以看到如图效果:

传统的actionSets, editorAction这些扩展点的方式与命令框架的CommandFramework之间其实没有太多的比较可言了。但CommandFramework提供了菜单创建的统一方式locationURI,不需要去学习很多扩展点的使用;同时,我们Command可以复用,我们甚至可以无需知道命令是怎么实现的,例如退出eclipse的exit命令,我们只需要定义一个menus,然后复用这个command即可(我觉得这个是它最大的优势);还有就是可以很方便的绑定快捷键bindings。
<menuContribution
locationURI="menu:org.eclipse.ui.main.menu">
<menu
label="File">
<command
commandId="org.eclipse.ui.file.exit"
label="Exit">
</command>
</menu>
</menuContribution>
参考资料:
1 研读 http://wiki.eclipse.org/Menu_Contributions#Menu_URIs 一文,从中获取如何使用 menuContribution, locationURI 。
2 阅读 http://wiki.eclipse.org/Command_Core_Expressions 一文,理解 Eclipse Command 表达式的用途。
3 深入理解菜单(Menu)功能及其扩展点 http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-menuext/index.html
4 http://www.vogella.com/articles/EclipseCommandsAdvanced/article.html
5 http://www.vogella.com/articles/EclipseCommands/article.html

本文介绍在Eclipse中使用传统方式及CommandsFramework创建菜单的方法。详细解释了org.eclipse.ui.commands、org.eclipse.ui.handlers和org.eclipse.ui.menus三个扩展点的配置,并通过示例展示了如何定义命令、处理类和菜单位置。
2546

被折叠的 条评论
为什么被折叠?



