Su conector puede utilizar decoradores para anotar información en las imágenes de los recursos y de otros objetos que aparezcan en las vistas del entorno de trabajo. Los decoradores son de utilidad cuando el conector aporta funciones para tipos de recursos existentes. Muchas de las vistas estándar del entorno de trabajo participan en el proceso de mostrar decoraciones.
Por ejemplo, el PDE contribuye con decoradores que permiten distinguir los proyectos binarios de los proyectos fuente.
El proyecto com.example.helloworld es el único proyecto fuente mostrado en el navegador. Observe cómo los demás proyectos binarios muestran el decorador de binario en la parte superior izquierda del icono de proyecto Java. Este decorador es una contribución del PDE realizada mediante el punto de extensión org.eclipse.ui.decorators.
<extension point="org.eclipse.ui.decorators"> <decorator lightweight="true" quadrant="TOP_LEFT" adaptable="true" label="%decorator.label" icon="icons/full/ovr16/binary_co.png" state="false" id="org.eclipse.pde.ui.binaryProjectDecorator"> <description> %decorator.desc </description> <enablement> ... </enablement> </decorator> </extension>
Existen varias formas de suministrar una implementación de decorador. Este código utiliza la forma más sencilla, conocida como decorador declarativo (declarative) ligero (lightweight). Cuando se define un decorador declarativo ligero, el código contiene una descripción completa del icono, la situación y las condiciones de habilitación del decorador. Los decoradores declarativos son de utilidad cuando sólo se utiliza un icono para decorar la etiqueta. El conector sólo necesita especificar el cuadrante (quadrant) del icono regular donde debe colocarse el decorador y el icono (icon) de la superposición. Como se muestra en la imagen, el icono binario del PDE aparece superpuesto en el cuadrante superior izquierdo del icono de paquete.
Si el conector necesita manipular el texto de la etiqueta además del icono, o si el tipo de icono se determina dinámicamente, puede utilizar un decorador ligero no declarativo. En este caso, debe definirse una clase de implementación que implemente ILightweightLabelDecorator. La clase designada es responsable de suministrar un prefijo, un sufijo y una imagen de superposición durante la ejecución que se apliquen a la etiqueta. La mecánica de la concatenación del prefijo y el sufijo con el texto de la etiqueta y de la realización de la superposición se manejan en el código del entorno de trabajo en una hebra de segundo plano. Por tanto, el trabajo realizado por el conector en la implementación correspondiente de ILightweightLabelDecorator debe ser a prueba de hebras de UI. (Consulte el apartado Ejecutar código desde una hebra que no es de UI para obtener más detalles).
Los siguientes códigos XML muestran cómo el cliente CVS define su decorador mediante esta técnica:
<extension point="org.eclipse.ui.decorators"> <decorator objectClass="org.eclipse.core.resources.IResource" adaptable="true" label="%DecoratorStandard.name" state="false" lightweight= "true" quadrant = "BOTTOM_RIGHT" class="org.eclipse.team.internal.ccvs.ui.CVSLightweightDecorator" id="org.eclipse.team.cvs.ui.decorator"> <description> %DecoratorStandard.desc </description> </decorator> </extension>
El usuario es quien controla en última instancia los decoradores por medio de la página de preferencias Decoraciones de etiqueta del entorno de trabajo. Pueden activarse y desactivarse decoradores individuales. Aun así, es aconsejable diseñar los decoradores de manera que no se solapen ni entren en conflicto con los decoradores existentes del SDK de la plataforma. Si varios conectores añaden decoradores ligeros al mismo cuadrante, los conflictos se resuelven de forma no determinista.
El conector también puede realizar por sí mismo toda la gestión de imágenes y etiquetas. En este caso, el atributo lightweight debe establecerse en false y el atributo class debe nombrar una clase que implemente ILabelDecorator. Esta clase permite decorar la imagen y el texto de la etiqueta original con anotaciones propias. Proporciona una mayor flexibilidad, ya que el usuario no está limitado a los prefijos, sufijos y superposiciones de cuadrantes simples.
Los demás atributos de un decorador son independientes del estilo de implementación. Los atributos label y description designan el texto utilizado para nombrar y describir el decorador en el diálogo de preferencias. El atributo objectClass nombra la clase de objetos a los que debe aplicarse el decorador. El atributo enablement permite describir las condiciones bajo las que el objeto debe decorarse. El indicador adaptable indica si también deben decorarse los objetos que se adaptan a IResource. El indicador state controla si el decorador es visible por omisión.
Si los decoradores incluyen información que cueste de calcular o que pueda distraer la atención, tal vez le interese aportar preferencias propias que permitan al usuario ajustar todavía más el decorador una vez activado. Esta técnica es la que utiliza el cliente CVS.
Ciclo de actualizaciones de decoradores
La decoración se inicia al renovar los proveedores de etiquetas que utilizan DecoratorManager para proporcionar la decoración. Dado que el proceso de decoración se realiza en segundo plano, habrá un período en que se solicite la etiqueta y se active el evento labelProviderChanged que tomará el cálculo de decoración. Durante este período, la decoración en un Objeto sólo se calculará una vez por razones de eficacia. Si el decorador cambia durante este período es posible que se emita un resultado caducado, ya que se pasarán por alto la segunda llamada y las posteriores para decorar un elemento.
Los contribuyentes decoradores deben evitar cambiar sus decoradores mientras se produce la decoración. Si esto no es posible, se necesitará una segunda llamada para decorar un elemento después de procesar labelProviderChanged.