处理程序

org.eclipse.ui.handlers

3.1

处理程序扩展点是 Eclipse 3.0 中定义的实验用 handlerSubmission 元素的结果。处理程序是命令在特定时间点的行为。命令可以不具有相关联的处理程序,也可以具有多个相关联的处理程序。但是,在任何时间点,命令可不具有活动的处理程序,也可以具有一个活动的处理程序。活动的处理程序是那个当前负责执行命令行为的处理程序。这与操作处理程序和可重定目标操作的概念非常相似。

处理程序扩展点允许插件开发者指定在某些条件下应活动和/或启用的处理程序。如果某一处理程序不活动,则没有命令将它的行为传递到处理程序。如果某一处理程序被禁用,则将不会要求该处理程序进行执行;该处理程序的执行被禁止。使用 3.0 中添加的表达式语言设施定义了条件。它们使用 activeWhenenabledWhen 子句来表示。

工作台提供了这些表达式可依赖的一些变量。支持的变量有:活动上下文、活动编辑器、活动部件和当前选择。虽然在初始设计中不受支持,但您很容易看到如何可能添加其它变量,或甚至允许插件开发者添加其它变量。

没有指定条件的处理程序是缺省处理程序。只有当没有其它处理程序满足它们的所有条件时,缺省处理程序才成为活动的。如果两个处理程序都有满足的条件,则对这些条件进行比较。其思想是选择一个条件更特定或本地的处理程序。为此,请查看条件所引用的变量。引用更特定变量的那个条件将“胜出”。特征的顺序(从最不特定到最特定的)在 org.eclipse.ui.ISources 中定义。

如果这仍然不能解决冲突,则没有处理程序是活动的。如果打开了特定的跟踪选项,则导致在日志中产生消息。如果有两个缺省处理程序,则也会出现冲突。插件开发者和集成测试人员有责任确保这种情况不会出现。这些条件用于避免装入不必要的插件。这些处理程序定义合并在一个代理中。要使代理装入其底层的处理程序,必须满足两个条件:必须满足该代理的条件以便它是活动的,且必须请求命令来执行代理必须授权的工作(例如,execute())。

<!ELEMENT extension (handler)>

<!ATTLIST extension

point CDATA #REQUIRED

id    CDATA #IMPLIED

name  CDATA #IMPLIED>


<!ELEMENT handler (activeWhen? | class? | enabledWhen?)>

<!ATTLIST handler

commandId CDATA #REQUIRED

class     CDATA #IMPLIED>


<!ELEMENT activeWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>



<!ELEMENT enabledWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>



<!ELEMENT class (parameter)>

<!ATTLIST class

class CDATA #IMPLIED>


<!ELEMENT parameter EMPTY>

<!ATTLIST parameter

name  CDATA #REQUIRED

value CDATA #REQUIRED>


<extension point=

"org.eclipse.ui.handlers"

>

<handler commandId=

"commandId"

class=

"org.eclipse.compare.Command"

>

<activeWhen>

<with variable=

"selection"

>

<count value=

"1"

/>

<iterate operator=

"and"

>

<adapt type=

"IResource"

/>

</iterate>

</with>

</activeWhen>

</handler>

</extension>

要进一步避免装入插件,可以指定何时启用该处理程序。如果代理仍未装入处理程序,则只有表达式语法用于确定是否启用处理程序。如果代理已装入处理程序,则首先查阅表达式语法。如果表达式语法求值为 true,则询问该处理程序是否已启用。(这是表达式语法与处理程序的已启用状态之间的短路布尔值“and”操作。)

<extension point=

"org.eclipse.ui.handlers"

>

<handler commandId=

"commandId"

class=

"org.eclipse.Handler"

>

<enabledWhen>

<with variable=

"context"

>

<property id=

"id"

value=

"debugging"

/>

</with>

</enabledWhen>

</handler>

</extension>

所有处理程序实现 org.eclipse.core.commands.IHandler。在工作台中,使用 org.eclipse.ui.handlers.IHandlerService 接口有可能激活和取消激活处理程序。可从支持的工作台对象(如 IWorkbench 本身)中检索此接口。要检索该服务,可进行类似于 IWorkbench.getAdapter(IHandlerService.class) 的调用。

也可能使用工作台中的旧代码来激活和取消激活处理程序。这可通过以下显示的旧机制来完成。对于要使用操作对菜单或工具栏进行添加的客户,此机制很有用。

 IWorkbenchPartSite mySite;
 IAction myAction;
 
 myAction.setActionDefinitionId(commandId);
 IKeyBindingService service = mySite.getKeyBindingService();
 service.registerAction(myAction);