Direct menu, tool item 以及 handler 模型元素指向一个类,这个类用行为 annotation 来标注用户选择相关的用户接口元素时,框架将调用的方法。为了简洁,下面的描述用 handler 类来表示这样的类。
handler 类的行为 annotation 在下表描述:
Annotation | 描述 |
---|---|
@Execute | 标注方法为 handler 类的 action,框架在相关的用户接口元素(例如菜单项)被选择的时候调用这个方法。 |
@CanExecute | 标注方法可以被框架访问来检查 handler 类是否可以执行。如果 handler 类在这个方法中返回 false,Eclipse 禁止相应的用户接口元素。例如,当 handler 类在 @CanExecute 方法中返回 true 时,保存按钮是活动的。 这个方法默认是 true,意味着,如果 handler 类总是可以执行的话,它不需要实现一个 @CanExecute 方法。 |
警告:顺应 Javadoc,只有一个方法允许用 @Execute annotation,同样的规则对于 @CanExecute 一样,虽然框架当前对于几个方法用这些 annotation 标注不抱怨,但是你应该避免这样,否则哪个方法被调用是不确定的。
注意:Eclipse 运行时尝试注入这些方法中指定的所有参数。
下面的例子演示 handler 类的实现:
package com.example.e4.rcp.todo.handlers;
// import statements cut out
// ..
public class ExitHandler {
@Execute
public void execute(IWorkbench workbench) {
workbench.close();
}
// NOT REQUIRED IN THIS EXAMPLE
// just to demonstrates the usage of
// the annotation
@CanExecute
public boolean canExecute() {
return true;
}
}
handler 类在那个 handler 被调用的 IEclipseContext 中执行,也就是说,当前窗口中活动的那个,在大部分情况下,这是活动的 Part 的上下文。在你的应用程序启动时,handler 类初始化在另一个上下文,也就是应用程序或者窗口上下文。
所有需求的参数应该被注入到 @Execute 注解的方法,因为你希望 handler 类在执行时得到它的运行时信息。
警告:为了确保你从活动的上下文得到期盼的值注入到你的 handler 类,永远不要再它里面用字段或构造器注入。
如果一个 command 被选择了,运行时讲决定 command 对应的 handlers。
每个 command 在一个给定的范围只有一个有效的 handler,应用程序模型允许你为应用程序、一个窗口、或者一个 Part 创建一个 handler。
如果为 command 指定了多个 handler,Eclipse 将选择对于模型元素最特殊的那个 handler。
例如,假设对于 Copy
command 有 2 个 handler,一个是 for 窗口,一个是 for Part,那么运行时选择接近当前用户选择的模型元素的那个。
当 handler 选择后,@CanExecute 被调用,因此 handler 可以决定是否有能力在给定的上下文中执行,如果它返回 false,那么将禁止指向那个 command 的菜单和工具项。