Manejadores

org.eclipse.ui.handlers

3.1

El punto de extensión de manejadores es una elaboración del elemento experimental handlerSubmission definido en Eclipse 3.0. Un manejador es el comportamiento de un mandato en un momento determinado. Un mandato puede tener asociados cero o más manejadores. Sin embargo, en cualquier momento, un mandato no tendrá ningún manejador activo o tendrá uno. El manejador activo es aquél que es responsable actualmente de llevar a cabo el comportamiento del mandato. Es muy similar al concepto de un manejador de acción y una acción cuyo destino puede modificarse.

El punto de extensión de manejadores permite que un desarrollador de plug-ins especifique un manejador que debe activarse y/o habilitarse bajo ciertas condiciones. Si un manejador está inactivo, ningún mandato delegará su comportamiento en el manejador. Si se inhabilita un manejador, a éste no se le solicitará que se ejecute; la ejecución del manejador quedará bloqueada. Las condiciones se definen mediante el recurso de lenguaje de expresiones añadido durante 3.0. Se expresan utilizando las cláusulas activeWhen y enabledWhen.

El entorno de trabajo proporciona algunas variables en las que pueden basarse estas expresiones. Las variables soportadas son: los contextos activos, el editor activo, la parte activa y la selección actual. Aunque no está soportado en este diseño inicial, es fácil ver cómo sería posible añadir otras variables, o incluso permitir que los desarrolladores de plug-ins pudieran contribuir con otras variables.

Un manejador que no especifica ninguna condición es un manejador por omisión. Un manejador por omisión sólo está activo si no se han satisfecho todas las condiciones de otro manejador. Si dos manejadores todavía tienen las condiciones satisfechas, las condiciones se comparan. La idea consiste en seleccionar un manejador cuya condición sea más específica o más local. Para ello, se consultan las variables a las que se hace referencia con la condición. La condición que hace referencia a la variable más específica, "wins". El orden de especificidad (desde la menos específica a la más específica) se define en org.eclipse.ui.ISources.

Si esto todavía no resuelve el conflicto, ningún manejador está activo. Si se activa una opción de rastreo determinada, esto conduce a que se escriba un mensaje en las anotaciones. También puede producirse un conflicto si hay dos manejadores por omisión. Es responsabilidad de los desarrolladores de plug-ins y probadores de integración el asegurarse de que esto no suceda. Estas condiciones se utilizan para evitar la carga innecesaria de plug-ins. Estas definiciones de manejador se acomodan en un proxy. Para que un proxy cargue su manejador subyacente, deben ocurrir dos cosas: las condiciones del proxy deben cumplirse para que se active y se le debe solicitar al mandato que realice algo que deba delegar (por ejemplo, execute()).

<!ELEMENT extension (handler*)>

<!ATTLIST extension

point CDATA #REQUIRED

id    CDATA #IMPLIED

name  CDATA #IMPLIED>


<!ELEMENT handler (activeWhen? , class? , enabledWhen?)>

<!ATTLIST handler

commandId     CDATA #REQUIRED

class         CDATA #IMPLIED

helpContextId CDATA #IMPLIED>


<!ELEMENT activeWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>



<!ELEMENT enabledWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>



<!ELEMENT class (parameter*)>

<!ATTLIST class

class CDATA #IMPLIED>


<!ELEMENT parameter EMPTY>

<!ATTLIST parameter

name  CDATA #REQUIRED

value CDATA #REQUIRED>


<!ELEMENT enablement (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

Elemento raíz genérico. El elemento puede utilizarse en un punto de extensión para definir su expresión enablement. Los hijos de una expresión de habilitación se combinan mediante el operador and.



<!ELEMENT not (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>

Este elemento representa una operación NOT en el resultado de evaluar la correspondiente expresión de subelemento.



<!ELEMENT and (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

Este elemento representa una operación AND en el resultado de evaluar todas las expresiones de los correspondientes subelementos.



<!ELEMENT or (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

Este elemento representa una operación OR en el resultado de evaluar todas las expresiones de subelementos.



<!ELEMENT instanceof EMPTY>

<!ATTLIST instanceof

value CDATA #REQUIRED>

Este elemento se utiliza para realizar una comprobación instanceof del objeto que tiene el foco. La expresión devuelve EvaluationResult.TRUE si el tipo del objeto es un subtipo del tipo especificado por el atributo value. De lo contrario, se devuelve EvaluationResult.FALSE.



<!ELEMENT test EMPTY>

<!ATTLIST test

property CDATA #REQUIRED

args     CDATA #IMPLIED

value    CDATA #IMPLIED>

Este elemento se utiliza para evaluar el estado de propiedad del objeto que tiene el foco. El conjunto de propiedades que pueden probarse puede ampliarse mediante el punto de extensión de probador de propiedades. La expresión de prueba devuelve EvaluationResult.NOT_LOADED si el probador de propiedades que realiza la prueba no se ha cargado todavía.



<!ELEMENT systemTest EMPTY>

<!ATTLIST systemTest

property CDATA #REQUIRED

value    CDATA #REQUIRED>

Prueba una propiedad del sistema llamando al método System.getProperty y compara el resultado con el valor especificado con el atributo value.



<!ELEMENT equals EMPTY>

<!ATTLIST equals

value CDATA #REQUIRED>

Este elemento se utiliza para realizar una comprobación equals del objeto que tiene el foco. La expresión devuelve EvaluationResult.TRUE si el objeto es igual al valor proporcionado por el atributo value. De lo contrario, se devuelve EvaluationResult.FALSE.



<!ELEMENT count EMPTY>

<!ATTLIST count

value CDATA #REQUIRED>

Este elemento se utiliza para probar el número de elementos de una colección.



<!ELEMENT with (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

<!ATTLIST with

variable CDATA #REQUIRED>

Este elemento cambia el objeto en el que hay que inspeccionar todos los elementos hijo para que pase a ser el objeto al que hace referencia la variable dada. Si la variable no se puede resolver, la expresión lanzará una ExpressionException al evaluarla. Los hijos de una expresión with se combinan mediante el operador and.



<!ELEMENT resolve (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

<!ATTLIST resolve

variable CDATA #REQUIRED

args     CDATA #IMPLIED>

Este elemento cambia el objeto en el que hay que inspeccionar todos los elementos hijo para que pase a ser el objeto al que hace referencia la variable dada. Si la variable no se puede resolver, la expresión lanzará una ExpressionException al evaluarla. Los hijos de una expresión with se combinan mediante el operador and.



<!ELEMENT adapt (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

<!ATTLIST adapt

type CDATA #REQUIRED>

Este elemento se utiliza para adaptar el objeto en foco al tipo especificado por el atributo type. La expresión retorna sin cargar si el adaptador o el tipo al que se hace referencia todavía no está cargado. Se lanza una ExpressionException durante la evaluación si el nombre del tipo no existe en absoluto. Los hijos de una expresión adapt se combinan mediante el operador and.



<!ELEMENT iterate (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>

<!ATTLIST iterate

operator (or|and) >

Este elemento se usa para reiterar una variable del tipo java.util.Collection. Si el objeto que tiene el foco no es del tipo java.util.Collection, se enviará una ExpressionException al evaluar la expresión.



<extension point=

"org.eclipse.ui.handlers"

>

<handler commandId=

"commandId"

class=

"org.eclipse.compare.Command"

>

<activeWhen>

<with variable=

"selection"

>

<count value=

"1"

/>

<iterate operator=

"and"

>

<adapt type=

"IResource"

/>

</iterate>

</with>

</activeWhen>

</handler>

</extension>

Para seguir evitando la carga de plug-ins, es posible especificar cuándo se habilitará el manejador. Si el proxy no ha cargado todavía el manejador, sólo se utiliza la sintaxis de expresiones para decidir si se ha habilitado el manejador. Si el proxy ha cargado el manejador, la sintaxis de expresiones se consulta en primer lugar. Si la sintaxis de expresiones se evalúa como verdadera, se preguntará al manejador si está habilitado. (Esta es una operación "and" booleana de cortocircuito entre la sintaxis de expresiones y el estado de habilitado del manejador.)

<extension point=

"org.eclipse.ui.handlers"

>

<handler commandId=

"commandId"

class=

"org.eclipse.Handler"

>

<enabledWhen>

<with variable=

"context"

>

<property id=

"ID":

value=

"debugging"

/>

</with>

</enabledWhen>

</handler>

</extension>

Todos los manejadores implementan org.eclipse.core.commands.IHandler. En el entorno de trabajo, es posible activar y desactivar manejadores utilizando la interfaz org.eclipse.ui.handlers.IHandlerService. Esta interfaz puede recuperarse desde objetos de entorno de trabajo de soporte, como la propia interfaz IWorkbench. Para recuperar el servicio, debería realizar una llamada como IWorkbench.getAdapter(IHandlerService.class).

También es posible activar y desactivar manejadores utilizando código de legado en el entorno de trabajo. Esto puede realizarse mediante el mecanismo de legado que se muestra a continuación. Este mecanismo es útil para los clientes que utilizan acciones para contribuir a menús o barras de herramientas.

 IWorkbenchPartSite mySite;
 IAction myAction;
 
 myAction.setActionDefinitionId(commandId);
 IKeyBindingService service = mySite.getKeyBindingService();
 service.registerAction(myAction);