表达式

描述:布尔表达式用来定义工作台中许多操作扩展的可视性和启用。例如,可在任何操作扩展中定义 enablement 元素。此元素包含用来定义操作的启用标准的布尔表达式。可为弹出菜单操作扩展定义 visibility 元素。此元素包含用来定义操作的可视性标准的布尔表达式。

不管在何处找到布尔表达式,表达式的语法将遵循相同的格式。enablement 和 visibility 的根元素必须包含一个子元素。在最简单的情况下,这将由 objectClassobjectStatesystemPropertypluginState 元素组成。在更复杂的情况下,可以组合 andor 和 not 元素来构成布尔表达式。andor 元素可以包含一个或多个子元素。not 元素必须只包含一个子元素。

objectClass 元素用来评估选择的每个对象的类。objectClass 的名称属性包含全限定类名。如果选择的每个对象都实现此类,则表达式将求值为 true。

objectState 元素用来评估选择的每个对象的状态。在大多数情况下,可以通过选择类型来确定操作的启用或可视性。在其它情况下,这是不够的,必须使用选择状态来确定启用或可视性。例如,可为只读类型 IFile 的所有对象添加操作。只能通过指定 objectState 元素来声明此只读标准。它可能具有以下格式:

<objectState name="readOnly" value="true"/>
在工作台中,很难完成对此表达式的求值,原因是对象的属性是特定于类型的,并且超出了工作台本身的域。 因此,工作台将与选择的对象协作来对表达式求值。这是通过使用 IActionFilterobjectState 元素的估计策略)来完成的。 当评估 objectState 元素时,工作台将对 IActionFilter 询问选择的每个对象。 它通过测试以了解它是否实现 IActionFilter 来完成此操作。如果失败,工作台将通过 IAdaptable 机制来请求过滤器。如果找到过滤器,工作台将把 objectState 属性传送给过滤器以确定它们是否与选择的对象的状态相匹配。如果匹配,则对该条款求值为 true。如果没有操作过滤器,或不存在匹配,则将该条款求值为 false。

鼓励使用视图和编辑器来在每个对象的选择中为每个对象定义 IActionFilter。这使插件开发者更容易使用新的更适合的操作来扩展那些视图或编辑器。

systemProperty 元素用来评估某些系统特性的状态。因此,系统特性的值是通过调用 System.getProperty 来确定的。

pluginState 元素用来评估插件的状态。插件的状态可以是已安装或已激活。

起始发行版:发行版 2.0

配置标记:

   <!ELEMENT visibility (and | or | not | objectClass | objectState | systemProperty
        | pluginState)>

   <!ELEMENT enablement (and | or | not | objectClass | objectState | systemProperty
        | pluginState)>

   <!ELEMENT and (and | or | not | objectClass | objectState | systemProperty | pluginState)*>

   <!ELEMENT or (and | or | not | objectClass | objectState | systemProperty | pluginState)*>

   <!ELEMENT not (and | or | not | objectClass | objectState | systemProperty | pluginState)>

   <!ELEMENT objectClass EMPTY>
   <!ATTLIST objectClass
      name       CDATA #REQUIRED
   >

   <!ELEMENT objectState EMPTY>
   <!ATTLIST objectState
      name       CDATA #REQUIRED
      value      CDATA #REQUIRED
   >    <!ELEMENT systemProperty EMPTY>
   <!ATTLIST systemProperty
      name       CDATA #REQUIRED
      value      CDATA #REQUIRED
   >    <!ELEMENT pluginState EMPTY>
   <!ATTLIST pluginState
      id         CDATA #REQUIRED
      value      (installed | activated)
   >
  • id — 在插件注册表中可能已注册或可能未注册的插件的标识。
  • value — 插件的必需状态。当前支持两种状态:已安装和已激活。
  • 示例:

    以下是一个使用启用元素的操作集的示例。该操作集利用标号 List Element 来声明菜单,然后利用由选择各种状态的 ListElements 所启用的操作来填充它。ListElement 具有两种属性:名称(字符串)和标志(布尔值)。在此示例中,每当选择 ListElement 时,就会启用 All 操作(A 标记)。当选择了 name = red 的 ListElement 时,就会启用 Red 操作(B 标记)。当选择了 name != red 的 ListElement 时,就会启用 Not Red 操作(C 标记)。

    <extension point = "org.eclipse.ui.actionSets">
        <actionSet id="org.eclipse.ui.tests.internal.ListElementActions"
            label="List Element">
            <menu id="org.eclipse.ui.tests.internal.ListElementMenu"
                label="List Element"
                path="additions">
                <separator name="group1"/>
            </menu>
    A tag     <action id="org.eclipse.ui.tests.internal.ac1"
                label="All"
                menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
                class="org.eclipse.ui.tests.api.MockActionDelegate"
                enablesFor="1">
                <enablement>
                     <objectClass name="org.eclipse.ui.tests.api.ListElement"/>
                </enablement>
            </action>
    B 标记     <action id="org.eclipse.ui.tests.internal.ac2"
                label="Red"
                menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
                class="org.eclipse.ui.tests.api.MockActionDelegate"
                enablesFor="1">
                <enablement>
                 <and>
                  <objectClass name="org.eclipse.ui.tests.api.ListElement"/>
                  <objectState name="name" value="red"/>
                 </and>
                </enablement>
            </action>
    C 标记     <action id="org.eclipse.ui.tests.internal.ac3"
                label="Not Red"
                menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
                class="org.eclipse.ui.tests.api.MockActionDelegate"
                enablesFor="1">
                <enablement>
                 <and>
                  <objectClass name="org.eclipse.ui.tests.api.ListElement"/>
                   <not>
                   <objectState name="name" value="red"/>
                  </not>
              </and>
                </enablement>
            </action>
        </actionSet>
    </extension>
    在下面的示例中,使用 pluginState 元素来控制是否启用操作集中的操作。当安装了具有 x.y.z.myPlugin 的插件时,就会启用 Installed 操作(A 标记)。当激活了同一个插件时,就会启用 Activated 操作(B 标记)。
    <extension point = "org.eclipse.ui.actionSets">
        <actionSet id="org.eclipse.ui.tests.internal.ListElementActions"
            label="List Element">
            <menu id="org.eclipse.ui.tests.internal.ListElementMenu"
                label="List Element"
                path="additions">
                <separator name="group1"/>
            </menu>
    A 标记     <action id="org.eclipse.ui.tests.internal.ac8"
                label="Installed"
                menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
                class="org.eclipse.ui.tests.api.MockActionDelegate">
                <enablement>
                 <pluginState id="x.y.z.myPlugin" value="installed"/>
                </enablement>
            </action>
    B 标记     <action id="org.eclipse.ui.tests.internal.ac10"
                label="Activated"
                menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
                class="org.eclipse.ui.tests.api.MockActionDelegate">
                <enablement>
                 <pluginState id="x.y.z.myPlugin" value="activated"/>
                </enablement>
            </action>
        </actionSet>
    </extension>
    在下面的示例中演示了 systemProperty 元素。当 ActionExpressionVar 系统特性等于“bubba”时,就会启用 System Property 操作(A 标记)。
    <extension point = "org.eclipse.ui.actionSets">
        <actionSet id="org.eclipse.ui.tests.internal.ListElementActions"
            label="List Element">
            <menu id="org.eclipse.ui.tests.internal.ListElementMenu"
                label="List Element"
                path="additions">
                <separator name="group1"/>
            </menu>
    A 标记     <action id="org.eclipse.ui.tests.internal.ac11"
                label="System Property"
                menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
                class="org.eclipse.ui.tests.api.MockActionDelegate">
                <enablement>
                 <systemProperty name="ActionExpressionVar" value="bubba"/>
                </enablement>
            </action>
        </actionSet>
    </extension>
    以下是最后的一个示例,它演示弹出菜单操作扩展的可视性声明。每当选择了 name = redflag = trueListElement 时,就可以看到 Red 和 True 操作。
    <extension point="org.eclipse.ui.popupMenus">
        <objectContribution id="oc6"
          objectClass="org.eclipse.ui.tests.api.ListElement">
          <visibility>
             <and>
                 <objectState name="name" value="red"/>
                 <objectState name="flag" value="true"/>
             </and>
          </visibility>
          <action id="oc4" label="Red And True"
               class="org.eclipse.ui.tests.api.MockActionDelegate"/>
        </objectContribution>
    </extension>


    所提供的实现:为了方便起见,已经对标记、资源和项目定义了操作过滤器。在 IMarkerActionFilterIResourceActionFilterIProjectActionFilter 上声明了每一项的名称与值的配对。

    Copyright IBM Corporation and others 2000, 2002.