处理程序

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

helpContextId 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>


<!ELEMENT enablement (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

通用根元素。可以在扩展点内使用该元素来定义它的支持表达式。将使用 and 运算符来组合 enablement 表达式的子代。



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

此元素表示对其子元素表达式求值的结果的 NOT 操作。



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

此元素表示对其所有子元素表达式求值的结果执行 AND 操作。



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

此元素表示对其所有子元素表达式求值的结果执行 OR 操作。



<!ELEMENT instanceof EMPTY>

<!ATTLIST instanceof

value CDATA #REQUIRED>

此元素用来对焦点中的对象执行 instanceof 检查。如果对象的类型是由属性值指定的类型的子类型,则表达式返回 EvaluationResult.TRUE。否则,将返回 EvaluationResult.FALSE。



<!ELEMENT test EMPTY>

<!ATTLIST test

property CDATA #REQUIRED

args     CDATA #IMPLIED

value    CDATA #IMPLIED>

此元素用来对焦点中对象的属性状态进行评估。可以使用属性测试程序扩展点来扩展可测试属性的集合。如果尚未装入执行实际测试的属性测试程序,则测试表达式返回 EvaluationResult.NOT_LOADED。



<!ELEMENT systemTest EMPTY>

<!ATTLIST systemTest

property CDATA #REQUIRED

value    CDATA #REQUIRED>

通过调用 System.getProperty 方法来测试系统属性并将结果与通过值属性指定的值进行比较。



<!ELEMENT equals EMPTY>

<!ATTLIST equals

value CDATA #REQUIRED>

此元素用来对焦点中的对象执行等于检查。如果对象等于由属性值提供的值,则表达式返回 EvaluationResult.TRUE。否则,将返回 EvaluationResult.FALSE。



<!ELEMENT count EMPTY>

<!ATTLIST count

value CDATA #REQUIRED>

此元素用来测试集合中的元素数。



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

<!ATTLIST with

variable CDATA #REQUIRED>

此元素将把要检查以获取其所有子元素的对象更改为由给定变量引用的对象。如果不能解析变量,则表达式将在对变量求值时抛出 ExpressionException。将使用 and 运算符来组合 with 表达式的子代。



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

<!ATTLIST resolve

variable CDATA #REQUIRED

args     CDATA #IMPLIED>

此元素将把要检查以获取其所有子元素的对象更改为由给定变量引用的对象。如果不能解析变量,则表达式将在对变量求值时抛出 ExpressionException。将使用 and 运算符来组合 with 表达式的子代。



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

<!ATTLIST adapt

type CDATA #REQUIRED>

此元素用来使焦点中的对象适用于由属性类型指定的类型。如果尚未装入适配器或引用的类型,则表达式返回 not loaded。如果类型名称根本不存在,则表达式在求值期间将抛出 ExpressionException。将使用 and 运算符来组合 adapt 表达式的子代。



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

<!ATTLIST iterate

operator (or|and) >

此元素用来叠代类型为 java.util.Collection 的变量。如果焦点中对象的类型不是 java.util.Collection,则当对表达式求值时将抛出 ExpressionException。



<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);