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
>
Exemplos: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.
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
() é ativada
sempre que um ListElement é selecionado. A ação Red (
)
é ativada quando um ListElement com name = red é selecionado. E a ação
Not Red (
)
é ativada quando um ListElement com name != red é selecionado.
<extension point = "org.eclipse.ui.actionSets">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 (
<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><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><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><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>
<extension point = "org.eclipse.ui.actionSets">No exemplo a seguir, o elemento systemProperty é demonstrado. A ação System Property (
<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><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><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>
<extension point = "org.eclipse.ui.actionSets">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.
<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><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>
<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.