Eclipse RCP教程 – 19 – 菜单和工具栏应用程序对象

19.1. 增加菜单和工具栏选项

你可以通过Application Model将菜单和工具栏添加到你的RCP应用程序之中,它们可以被放置到各种位置。例如,你可以为窗体或Part增加一个菜单。这些元素会直接或间接地定义一个与之关联的类。这个类的实例由框架创建并且负责处理当一个菜单或工具栏选项被选中时的行为。这样的类被称为Handler类。

19.2. Command和Handler的用途

Eclipse Application Model允许你指定Command和Handler。

使用Command或Handler模型元素是可选的。你可以使用 Direct MenuItem 或 Direct ToolItem 模型元素。他们定义了一个对类(Handler类)的引用。这个Handler类的实例由框架创建并且它的注解方法会由框架按需调用。菜单和工具中支持分割线(Separator)。

一个Command是一个抽象动作的描述,它可以被执行,例如:保存、编辑或复制。

一个Command与其实现细节并未耦合在一起。Eclipse框架并未提供标准的命令。因此你需要在应用程序模型(Application Model)中创建所有需要的命令。

一个Command的行为通过一个Handler来定义。一个Handler模型元素会通过Handler的contributionURI 属性指向一个类(Handler类)。这个属性在模型编辑器中会显示为 Class URI 。

Command被Handled MenuItem 和Handled ToolItem模型元素所使用。

使用Command或使用直接(Direct MenuItem 、Direct ToolItem )选项,我们更倾向于前者。使用Command和Handler允许你为不同的情况(应用程序或Part)定义不同的Handler,并且你可以为Handler所关联的Command定义按键绑定。

19.3. Handler类的行为注解(Behavior annotations)和依赖注入

在一个Handler类中必须有一个方法带有 @Execute注解。另外还可以在一个方法上增加 @CanExecute注解。如果你在多个方法上使用了相同的注解,框架仅会调用其中的一个方法。Eclipse运行时使用依赖注入来提供方法参数。这些注解的用途如下表所示:

7. Handler类的行为注解
注解 描述
@Execute 标记对Handler类的行为负责的方法。一旦相关的UI元素(例如菜单项)被选中,则框架会执行一次此方法。
@CanExecute 标记一个方法,该方法会被Eclipse框架调用,用于检查该Hander类是否可以被执行。如果一个Handler类的此方法返回false,则Eclipse会禁用对应的UI元素。例如,如果Handler类的 @CanExecute方法返回true,则保存按钮处于激活状态。此方法的默认返回值为true,如果一个Handler类总是可以被执行,则无需实现@CanExecute方法。

下面的样例展示了实现一个Handler类:

一个Handler实例并没有其自身的Eclipse Context(IEclipseContext)。它在激活的模型元素的Eclipse Context中被执行。在大多数情况下,这个Context是激活的Part的Context。

所有需要的参数应该被注入到带有@Execute注解的方法之中,Handler类可以在执行过程中检索其运行时信息。

 20170326_010 如果你从激活的Context中获取参数值,总是会获取被以参数形式注入到带有@Execute 或@CanExecute注解的方法中的值。

19.4.为一个Command确定相关的Handler

如果一个Command被选中,运行时会为该命令确定一个相关的Handler。Application Model允许你为一个应用程序、窗体或Part创建一个Handler。

对一个给定的范围,每一个Command仅可以带有一个有效的Handler。Eclipse框架会选择与模型元素更为匹配的Handler。

例如,如果“Copy”Command带有两个Handler,一个对于窗体而另一个对于Part,则运行时会选择与当前被用户选中的模型元素最接近的Handler。

19.5. 计算 @CanExecute返回值

如果Eclipse Context发生了变化,则带有 @CanExecute注解的方法会被框架所调用。例如,如果你选择了一个新的Part。如果该方法返回值为false,则框架会禁用所有指向该Command的菜单栏和工具栏选项。

你可以通过Event Broker发布Event来请求重新计算@CanExecute方法返回值。

19.6. 速记符(Mnemonics)

Application model 允许你定义速记符。速记符在菜单上显示为带有下划线的字母,当用户按住 ALT  键时允许用户快速通过键盘来访问对应的菜单项。

在标签定义中,你可以在准备定义为速记符的字母前面添加&符号前缀。例如,如果你使用&Save标签,则当 Alt 键被按下时,字母S会被下划线标记出来。

19.7. Command和Handler ID的命名模式

建议ID以你的项目的顶级包名开头并且仅使用小写字母。

Command和Handler的ID应用反应出它们的关系。例如,如果你实现了一个ID为com.example.contacts.commands.show的Command,则你可以使用com.example.contacts.handler.show作为对应的Handler的ID。如果对于同一个Command带有多个Handler,则添加一个后缀来描述其目的,例如com.example.contacts.handler.show.details。

如果你实现了类似save、copy这样的常用功能,则应该使用已有的平台ID,以便其他Eclipse贡献者更好地将这些ID与操作系统进行集成(例如在Mac OS中,选项(Preferences)经常会被放到第一个菜单项下面)。更为完整的Command ID清单可以在org.eclipse.ui.IWorkbenchCommandConstants中找到。

8. 常用Command的默认ID
Command ID
Save org.eclipse.ui.file.save
Save All org.eclipse.ui.file.saveAll
Undo org.eclipse.ui.edit.undo
Redo org.eclipse.ui.edit.redo
Cut org.eclipse.ui.edit.cut
Copy org.eclipse.ui.edit.copy
Paste org.eclipse.ui.edit.paste
Delete org.eclipse.ui.edit.delete
Import org.eclipse.ui.file.import
Export org.eclipse.ui.file.export
Select All org.eclipse.ui.edit.selectAll
About org.eclipse.ui.help.aboutAction
Preferences org.eclipse.ui.window.preferences
Exit org.eclipse.ui.file.exit

打赏一下
支付宝
微信
除非注明,博客文章均为原创,转载请标明文章地址
本文地址: http://www.javafxchina.net/blog/2017/05/eclipse-rcp-19/
百度已收录