Expressões

Descrição: As expressões boolean são utilizadas para definir a visibilidade e ativação de várias extensões de ações no workbench.  Por exemplo, um elemento enablement pode ser definido em qualquer extensão de ação.  Esse elemento contém uma expressão boolean que define os critérios de ativação da ação.  Um elemento visibility pode ser definido para uma extensão da ação do menu popup.  Esse elemento contém uma expressão boolean que define os critérios de visibilidade da ação.

Independente do local em que a expressão boolean é encontrada, a sintaxe da expressão seguirá o mesmo formato.  O elemento raiz da ativação e da visibilidade deve conter um subelemento.  No caso mais simples, consistirá em um elemento objectClass, objectState, systemProperty ou pluginState.  No caso mais complexo, os elementos and, or ou not podem ser combinados para formar uma expressão boolean.  Um elemento and ou or pode conter 1 ou mais subelementos.  Um elemento not deve conter apenas 1 subelemento.

Um elemento objectClass é utilizado para avaliar a classe de cada objeto na seleção.  O atributo name de objectClass contém um nome de classe completo.  Se cada objeto na seleção implementar esta classe, a expressão será avaliada como true.

Um elemento objectState é utilizado para avaliar o estado de cada objeto na seleção.  Na maioria das situações, a ativação ou visibilidade de uma ação pode ser determinada pelo tipo de seleção.  Em outras situações, isto não é suficiente e a ativação ou visibilidade devem ser determinadas utilizando o estado da seleção.  Por exemplo, você pode contribuir com uma ação para todos os objetos do tipo IFile, que são somente leitura. Esses critérios somente leitura só podem ser declarados especificando-se um elemento objectState.  O formato pode ser o seguinte:

<objectState name="readOnly" value="true"/>
No workbench, é muito difícil realizar a avaliação dessa expressão, porque os atributos de um objeto são específicos do tipo e estão além do domínio do próprio workbench.  Desse modo, o workbench colaborará com os objetos na seleção para avaliar a expressão.  Isso é feito utilizando um IActionFilter, uma estratégia de avaliação para elementos objectState.  Quando um elemento objectState é avaliado, o workbench solicita um IActionFilter a cada objeto na seleção.  Ele faz isso como teste para ver se implementa IActionFilter.  Se falhar, o workbench solicitará um filtro utilizando o mecanismo IAdaptable.  Se o filtro for encontrado, o workbench transmitirá os atributos objectState para o filtro para determinar se correspondem ao estado do objeto selecionado.  Se corresponder, o termo será avaliado como true.  Se o filtro de ação não existir, ou não houver correspondência, o termo será avaliado como false.

As exibições e os editores são estimulados a definir um IActionFilter para cada objeto em sua seleção.  Isso facilita para que outros desenvolvedores de plug-in estendam essas exibições ou editores com ações novas, bem qualificadas.

Um elemento systemProperty é utilizado para avaliar o estado de algumas propriedades do sistema.  Por outro lado, o valor da propriedade de sistema também é determinado chamando-se System.getProperty.

Um elemento pluginState é utilizado para avaliar o estado de um plug-in.  O estado do plug-in pode ser instalado ou ativado.

Desde: Release 2.0

Marcação da Configuração:

   <!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 - o id de um plug-in que pode ou não estar registrado no registro de plug-ins.
  • value - o estado exigido do plug-in.  Atualmente, dois estados são suportados: instalado e ativado.
  • Exemplos:

    A seguir, um exemplo de conjunto de ações que utiliza o elemento enablement.  O conjunto de ações declara um menu com o rótulo List Element e o preenche, em seguida, com ações que são ativadas por uma seleção de ListElements com vários estados.  Um ListElement tem dois atributos: name (uma cadeia) e flag (boolean).  Neste exemplo, a ação All (Tag A) é ativada sempre que um ListElement é selecionado.  A ação Red (Tag B) é ativada quando um ListElement com name = red é selecionado.  E a ação Not Red (Tag C) é ativada quando um ListElement com name != red é selecionado.

    <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>
    Tag A     <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>
    Tag 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>
    Tag 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>
    No exemplo a seguir, o elemento pluginState é utilizado para controlar a ativação de ações em um conjunto de ações.  A ação Instalada (Tag A) é ativada quando o plug-in com x.y.z.myPlugin é instalado.  A ação Ativada (Tag B) é ativada quando o mesmo plug-in foi ativado.
    <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>
    Tag 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>
    Tag 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>
    No exemplo a seguir, o elemento systemProperty é demonstrado.  A ação System Property (Tag A) é ativada quando a propriedade de sistema ActionExpressionVar é igual a "bubba".
    <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>
    Tag 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>
    A seguir, um exemplo final que demonstra a declaração de visibilidade de uma extensão de ação do menu popup.  A ação Red e True fica visível sempre que um ListElement é selecionado com name = red e flag = 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>


    Implementação Fornecida: Para maior comodidade, foram definidos filtros de ação para marcadores, recursos e projetos.  Os pares name-value de cada um são declarados em IMarkerActionFilter, IResourceActionFilter e IProjectActionFilter.

    Copyright IBM Corporation e outros 2000, 2002.