当插件使用菜单扩展点之一向工作台用户界面添加操作时,它可以指定菜单项在菜单中可视和/或启用的条件。除了提供简单的启用条件(例如,选择计数和选择类)之外,插件还可以使用布尔表达式在确定应何时使操作可视或启用它时具有更多的灵活性。
布尔表达式可以包含布尔运算符(NOT、AND 和 OR),这些运算符通过对某些条件求值的预定义语法组合在一起。这些条件中有许多都是测试一个特定对象。“焦点中的对象”(正在测试的对象)的标识取决于启用表达式的特定上下文:
当指定一个值以针对这些表达式中的任何一个进行测试时,只要以下转换不成功,则假定该值是一个字符串:
可以在任何定义了 enablement 元素的扩展(例如 org.eclipse.ui.popupMenus)的扩展点参考文档中找到启用 XML 语法的完整定义。
在 R3.0 之前,这些一般化的布尔表达式不可用。下列预定义表达式以前用来对某些条件求值,而不会构建一般表达式。注意,这些表达式中的任何一个现在可以通过更一般化的语法来表示。预定义表达式仍然可以按以下方式使用:
objectClass - 如果选择中的每个对象子类化或实现类,则为 true。
objectState - 如果命名属性等于指定的值,则为 true。IActionFilter 帮助对表达式求值。操作过滤器根据目标选择和命名属性的值动态计算操作的启用条件。
systemProperty - 如果命名系统属性等于指定的值,则为 true。
pluginState - 指定应安装还是激活指定的插件(按标识)
例如,下列代码段表示可以用于操作集中试探性操作的启用表达式:
<action id="org.eclipse.examples.actionEnablement.class"
label="Red Element"
menubarPath="additions"
class="org.eclipse.examples.actionEnablement.ObjectTestAction">
<enablement>
<and>
<objectClass name="org.eclipse.examples.actionEnablement.TestElement"/>
<objectState name="name" value="red"/>
</and>
</enablement>
</action>
<action id="org.eclipse.examples.actionEnablement.property"
label="Property"
menubarPath="additions"
class="org.eclipse.examples.actionEnablement.PropertyTestAction">
<enablement>
<systemProperty name="MyTestProperty" value="puppy"/>
</enablement>
</action>
<action id="org.eclipse.examples.actionEnablement.pluginState"
label="Installed"
menubarPath="additions"
class="org.eclipse.examples.actionEnablement.PluginTestAction">
<enablement>
<pluginState id="x.y.z.anotherPlugin" value="installed"/>
</enablement>
</action>
有关这些表达式的更复杂的样本以及 XML 的完整描述,请参阅扩展点的参考文档。
下表列示扩展点,它们添加操作并总结可以如何使用 XML 标记属性和布尔表达式来影响启用。
|
扩展点名称 |
影响启用的属性 |
布尔表达式 |
|---|---|---|
|
enablesFor - 指定要启用操作所必须满足的选择计数 选择类 - 选择的对象必须子类化或实现才能启用操作的类 选择名称 - 可以应用于选择中的各个对象的通配符过滤器。 |
visibility - 布尔表达式。控制菜单项在菜单中是否可视。 enablement - 布尔表达式。控制在菜单中是否启用菜单项。在应用启用表达式之前,必须满足 enablesFor 属性、选择类和名称。 |
|
|
(仅适用于对象添加项。) objectClass - 指定选择中的各个对象必须子类化或实现的类 (适用于对象和查看器添加项) enablesFor - 指定要启用操作所必须满足的选择计数 选择类 - 选择的对象必须子类化或实现才能启用操作的类 选择名称 - 可以应用于选择中的各个对象的通配符过滤器。
|
(适用于对象和查看器添加项) visibility - 布尔表达式。控制菜单项在菜单中是否可视。 enablement - 布尔表达式。控制在菜单中是否启用菜单项。在应用启用表达式之前,必须满足 enablesFor 属性、选择类和名称。 |
可以将定义内容类型的能力(请参阅内容类型)与布尔表达式组合起来,以便根据资源的内容类型来定义更非常具体的启用或可视性条件。例如,以下片段使得弹出菜单项仅当所选文件的内容与插件的特殊内容类型相匹配时才可视。
<extension point="org.eclipse.ui.popupMenus">
<objectContribution
id="com.example.objectContributions"
objectClass="org.eclipse.core.resources.IFile"
nameFilter="*.xml">
<visibility>
<or>
<objectState
name="contentTypeId"
value="com.example.employeeRecordContentType"/>
<objectState
name="contentTypeId"
value="com.example.customerRecordContentType"/>
</or>
</visibility>
<action id="com.example.action1"
...
contentTypeId 属性可以用于 objectState 表达式中来检查所选
xml 文件的内容类型。这允许插件在启用或显示与特定类型的文件相关的菜单操作之前应用非常具体的内容检查。有关内容类型扩展的更多详细信息,请参阅内容类型。