Independientemente de donde se encuentra la expresión booleana, la sintaxis de la expresión seguirá el mismo formato. El elemento raíz de la habilitación y la visibilidad debe contener un subelemento. En el caso más sencillo, consistirá en un elemento objectClass, objectState, systemProperty o pluginState. En el caso más complejo, se pueden combinar los elementos and, or y not para formar una expresión booleana. Un elemento and u or puede contener 1 o varios subelementos. Un elemento not debe contener 1 solo subelemento.
Se utiliza un elemento objectClass para evaluar la clase de cada objeto de la selección. El atributo name de objectClass contiene un nombre de clase totalmente calificado. Si cada objeto de la selección implementa esta clase, la expresión se evalúa como verdadera.
Se utiliza un elemento objectState para evaluar el estado de cada objeto de la selección. En la mayoría de las situaciones, la habilitación o la visibilidad de una acción se puede determinar mediante el tipo de selección. En las demás situaciones esto no es suficiente, y la habilitación o la visibilidad debe determinarse utilizando el estado de la selección. Por ejemplo, se puede contribuir suministrando una acción para todos los objetos de tipo IFile que sean solo de lectura. Este criterio solo de lectura únicamente se puede declarar especificando un elemento objectState. Puede tener el siguiente formato:
<objectState name="readOnly" value="true"/>En el entorno de trabajo, la evaluación de esta expresión es muy difícil de llevar a cabo, porque los atributos de un objeto son específicos del tipo y van más allá del dominio del propio entorno de trabajo. Por lo tanto, el entorno de trabajo colaborará con los objetos de la selección para evaluar la expresión. Esto se realiza utilizando un IActionFilter, una estrategia de evaluación para los elementos objectState. Cuando se evalúa un elemento objectState, el entorno de trabajo pide a cada objeto de la selección un IActionFilter. Esto se lleva a cabo comprobando si implementan IActionFilter. Si esta acción falla, el entorno de trabajo solicitará un filtro mediante el mecanismo IAdaptable. Si se encuentra un filtro, el entorno de trabajo pasará los atributos de objectState al filtro para determinar si coinciden con el estado del objeto seleccionado. Si es así, el término se evalúa como verdadero. Si no hay ningún filtro de acción o si no se encuentra ninguna coincidencia, el término se evalúa como falso.
Conviene que las vistas y los editores definan un IActionFilter para cada objeto que haya en la correspondiente selección. De este modo, es más fácil que los desarrolladores de otros conectores amplíen las vistas o los editores con acciones nuevas y bien calificadas.
Se utiliza un elemento systemProperty para evaluar el estado de algunas propiedades del sistema. Internamente, el valor de la propiedad del sistema se determina invocando System.getProperty.
Se utiliza un elemento pluginState para evaluar el estado de un conector. El estado del conector puede ser Instalado o Activado.
A partir del: Release 2.0
Códigos XML de configuración:
<!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
>
Ejemplos:id: ID de un conector que puede estar o no registrado en el registro de conectores. value: estado necesario del conector. Actualmente, los estados soportados son dos: installed y activated.
A continuación se muestra un ejemplo de un conjunto de acciones
que utiliza el elemento enablement. El conjunto de acciones declara un menú
con la etiqueta Elemento de Lista y la puebla con acciones habilitadas mediante una selección
de ListElements con diversos estados. Un ListElement tiene dos
atributos: name (una serie) y flag (un valor booleano).
En este ejemplo, la acción Todos ()
se habilita siempre que se seleccione un ListElement. La acción Rojos
(
)
se habilita cuando se selecciona un ListElement con name = red. La acción No Rojos
(
)
se habilita cuando se selecciona un ListElement con name != red.
<extension point = "org.eclipse.ui.actionSets">En el siguiente ejemplo, se utiliza el elemento plug inState para controlar la habilitación de las acciones de un conjunto de acciones. La acción Instalado (
<actionSet id="org.eclipse.ui.tests.internal.ListElementActions"
label="Elemento de Lista">
<menu id="org.eclipse.ui.tests.internal.ListElementMenu"
label="Elemento de Lista"
path="additions">
<separator name="group1"/>
</menu><action id="org.eclipse.ui.tests.internal.ac1"
label="Todos"
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="Rojos"
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="No Rojos"
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">En el siguiente ejemplo se hace una demostración del elemento systemProperty. La acción Propiedad del Sistema (
<actionSet id="org.eclipse.ui.tests.internal.ListElementActions"
label="Elemento de Lista">
<menu id="org.eclipse.ui.tests.internal.ListElementMenu"
label="Elemento de Lista"
path="additions">
<separator name="group1"/>
</menu><action id="org.eclipse.ui.tests.internal.ac8"
label="Instalado"
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="Activado"
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 continuación figura un último ejemplo que hace una demostración de la declaración de visibilidad para una extensión de acción de menú emergente. La acción Rojos Y Verdadero es visible siempre que se selecciona un ListElement con name = red y flag = true.
<actionSet id="org.eclipse.ui.tests.internal.ListElementActions"
label="Elemento de Lista">
<menu id="org.eclipse.ui.tests.internal.ListElementMenu"
label="Elemento de Lista"
path="additions">
<separator name="group1"/>
</menu><action id="org.eclipse.ui.tests.internal.ac11"
label="Propiedad del Sistema"
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="Rojos Y Verdadero"
class="org.eclipse.ui.tests.api.MockActionDelegate"/>
</objectContribution>
</extension>
Implementación suministrada: para su comodidad, se han definido
filtros de acciones para marcadores, recursos y proyectos. Los pares name-value
de cada uno de ellos están declararados en IMarkerActionFilter,
IResourceActionFilter y IProjectActionFilter.