处理程序扩展点是 Eclipse 3.0 中定义的实验用 handlerSubmission
元素的结果。处理程序是命令在特定时间点的行为。命令可以不具有相关联的处理程序,也可以具有多个相关联的处理程序。但是,在任何时间点,命令可不具有活动的处理程序,也可以具有一个活动的处理程序。活动的处理程序是那个当前负责执行命令行为的处理程序。这与操作处理程序和可重定目标操作的概念非常相似。
处理程序扩展点允许插件开发者指定在某些条件下应活动和/或启用的处理程序。如果某一处理程序不活动,则没有命令将它的行为传递到处理程序。如果某一处理程序被禁用,则将不会要求该处理程序进行执行;该处理程序的执行被禁止。使用 3.0 中添加的表达式语言设施定义了条件。它们使用 activeWhen
和 enabledWhen
子句来表示。
工作台提供了这些表达式可依赖的一些变量。支持的变量有:活动上下文、活动编辑器、活动部件和当前选择。虽然在初始设计中不受支持,但您很容易看到如何可能添加其它变量,或甚至允许插件开发者添加其它变量。
没有指定条件的处理程序是缺省处理程序。只有当没有其它处理程序满足它们的所有条件时,缺省处理程序才成为活动的。如果两个处理程序都有满足的条件,则对这些条件进行比较。其思想是选择一个条件更特定或本地的处理程序。为此,请查看条件所引用的变量。引用更特定变量的那个条件将“胜出”。特征的顺序(从最不特定到最特定的)在 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)>
<!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);
Copyright (c) 2005 IBM Corporation and others.
All rights reserved.
This program and the accompanying materials are made
available under the terms of the Eclipse Public License v1.0 which accompanies
this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html