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 conectores
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 conectores 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 conectores y probadores de integración el asegurarse de que esto no suceda. Estas condiciones se utilizan para evitar la carga innecesaria de conectores. 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>
<!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>
<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 conectores, 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
área de trabajo, el propio 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