Eclipse4 RCP 指南

Handler 类的依赖注入

Handler 类和它们的行为 annotation

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 类在那个 handler 被调用的 IEclipseContext 中执行,也就是说,当前窗口中活动的那个,在大部分情况下,这是活动的 Part 的上下文。在你的应用程序启动时,handler 类初始化在另一个上下文,也就是应用程序或者窗口上下文。

所有需求的参数应该被注入到 @Execute 注解的方法,因为你希望 handler 类在执行时得到它的运行时信息。

警告:为了确保你从活动的上下文得到期盼的值注入到你的 handler 类,永远不要再它里面用字段或构造器注入。

Handlers 的范围

如果一个 command 被选择了,运行时讲决定 command 对应的 handlers。

每个 command 在一个给定的范围只有一个有效的 handler,应用程序模型允许你为应用程序、一个窗口、或者一个 Part 创建一个 handler。

如果为 command 指定了多个 handler,Eclipse 将选择对于模型元素最特殊的那个 handler。

例如,假设对于 Copy command 有 2 个 handler,一个是 for 窗口,一个是 for Part,那么运行时选择接近当前用户选择的模型元素的那个。

当 handler 选择后,@CanExecute 被调用,因此 handler 可以决定是否有能力在给定的上下文中执行,如果它返回 false,那么将禁止指向那个 command 的菜单和工具项。