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>
Identificador del contexto de ayuda que se relaciona con este manejadr específico. Mientras que un mandato puede proporcionar una descripción general del comportamiento de un mandato, a veces es adecuado para un mandato proporcionar ayuda más específica para su implementación.
Desde: 3.2
<!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)>
<!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);
Copyright (c) 2005 IBM Corporation y otros.
Reservados todos los derechos. Este programa y sus materiales adjuntos están disponibles bajo los términos de
la licencia pública común (Eclipse Public License) v1.0 que acompaña a esta
distribución, y está disponible en
http://www.eclipse.org/legal/epl-v10.html