El paquete org.eclipse.jface.resource define clases que ayudan a los conectores a gestionar recursos de la UI, como fonts e iconos.
La mayoría de los puntos de extensión del entorno de trabajo permiten a los conectores suministrar iconos que pueden utilizarse para mostrar sus contribuciones en el entorno de trabajo. Puesto que los sistemas operativos de GUI soportan un número limitado de imágenes o fonts en la memoria a la vez, los recursos de la UI de los conectores deben gestionarse con precaución y a veces compartirse entre widgets.
Ya se han visto varias referencias a los iconos en el conector de la herramienta readme. Algunos de estos iconos se han especificado en la marcación del plugin.xml.
<extension
point="org.eclipse.ui.views">
<category
id="org.eclipse.ui.examples.readmetool"
name="&Readme">
</category>
<view
id="org.eclipse.ui.examples.readmetool.views.SectionsView"
name="Readme Sections"
icon="icons/basic/view16/sections.gif"
category="org.eclipse.ui.examples.readmetool"
class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView">
</view>
</extension>
También se ha visto código que describe imágenes de manera rápida. Lo siguiente procede de ReadmeEditorActionBarContributor de la herramienta readme.
public ReadmeEditorActionBarContributor() {
...
action1 = new EditorAction("&Editor Action1");
action1.setToolTipText("Readme Editor Action1");
action1.setImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE);
...
JFace proporciona las clases de soporte básico que permiten a los conectores gestionar sus iconos y fonts sin que les afecte cuándo se crean y destruyen los correspondientes objetos gráficos de la plataforma. Estas clases de soporte las utilizan directamente los conectores, tal como se ha mostrado anteriormente, o indirectamente cuando el entorno de trabajo utiliza estas clases para obtener imágenes que se han descrito en la marcación del punto de extensión.
La clase Image de SWT representa una imagen desde el punto de vista del sistema operativo. Puesto que la mayoría de sistemas operativos de GUI tienen un número limitado de imágenes que pueden abrirse a la vez, los conectores deben actuar con precaución al crearlas y asegurarse de desecharlas adecuadamente cuando ya no se necesitan. Al utilizar las clases ImageDescriptor y ImageRegistry de JFace en lugar de la imagen de SWT, generalmente los conectores pueden evitar que se creen, gestionen y desechen estas imágenes directamente.
La clase ImageDescriptor puede utilizarse como una descripción simple de una imagen. Especifica todo lo que se necesita para crear una imagen, como el URL o el nombre de archivo donde se puede obtener la imagen. ImageDescriptors no asigna una imagen de plataforma real a menos que se solicite de manera específica mediante el método createImage().
Los descriptores de imágenes son el mejor procedimiento cuando el código está estructurado de manera que define todos los iconos en un lugar y los asigna a medida que se necesitan. Los descriptores de imágenes pueden crearse en cualquier momento independientemente de los recursos del OS, pero es conveniente crearlos todos en el código de inicialización.
La clase ImageRegistry se utiliza para mantener una lista de imágenes determinadas. Los clientes pueden añadir descriptores de imágenes o imágenes de SWT en la lista directamente. Cuando se pide una imagen por su nombre del registro, éste devolverá la imagen si ha sido creada o creará una del descriptor. Esto permite a los clientes del registro compartir imágenes.
Ningún cliente debe desechar imágenes que se han añadido al registro o recuperado de él. Es el registro quien debe desechar las imágenes, ya que éstas las comparten varios clientes. El registro desechará las imágenes cuando se concluya el sistema de GUI de la plataforma.
Siempre que sea posible, especifique el icono para los objetos de la UI del conector en el archivo plugin.xml. La mayoría de puntos de extensión del entorno de trabajo incluyen parámetros de configuración para un archivo de iconos. Definir los iconos en la contribución de extensión del plugin.xml, hace que la plataforma se encargue del procedimiento de gestión de imágenes. Puesto que los iconos suelen mantenerse en el directorio del conector, esto le permite especificar los iconos y gestionar todos los archivos en un lugar.
Los demás patrones sólo deben considerarse cuando no puede especificar el icono como parte de la contribución de extensión.
Crear una imagen explícitamente es el mejor procedimiento cuando la imagen se utiliza con poca frecuencia y no se comparte. La imagen puede crearse directamente en SWT y desecharse una vez utilizada.
Las imágenes también pueden crearse de manera explícita mediante un ImageDescriptor e invocando el método createImage(). En el primer caso, el método dispose() para la imagen debe invocarse cuando la imagen ya no se vaya a utilizar. Por ejemplo, si un diálogo crea una imagen cuando se abre, debe desecharla cuando se cierra.
Cuando una imagen se utiliza con frecuencia en un conector y se comparte con muchos objetos distintos de la UI, es conveniente registrar el descriptor de la imagen utilizando unImageRegistry. Una imagen del registro se compartirá con cualquier objeto que la solicite especificando su nombre. No debe desechar ninguna imagen en el registro puesto que otros objetos la comparten.
Añadir una imagen a la imagen del registro es lo más adecuado cuando la imagen se utiliza con frecuencia, tal vez a lo largo de la vida del conector, y la comparten muchos objetos. El inconveniente de utilizar el registro es que las imágenes del registro no se desechan hasta que se concluye el sistema de GUI. Puesto que el número de imágenes de la plataforma (SWT) que se pueden abrir a la vez tiene un límite, los conectores deben actuar con precaución para no registrar demasiados iconos en un registro.
La clase AbstractUIPlugin incluye un protocolo para crear un registro de imágenes a nivel de conector.
Cuando un icono se utiliza frecuentemente para visualizar elementos en un visor concreto, puede compartirse entre elementos similares del visor mediante un proveedor de etiquetas. Puesto que el proveedor de etiquetas es el responsable de devolver una imagen para cualquier objeto del visor, puede controlar la creación de dicha imagen y el compartimiento de cualquier imagen entre objetos del visor.
El proveedor de etiquetas puede utilizar cualquiera de los procedimientos tratados anteriormente para producir una imagen. Si examina las diferentes implementaciones de getImage() en la subclase LabelProvider, verá distintos enfoques, como la colocación en antememoria de un solo icono para objetos y el mantenimiento de una tabla de imágenes por tipo. Las imágenes creadas por un proveedor de etiquetas deben desecharse en el método dispose() del proveedor, al que se llama cuando se desecha el visor.
Utilizar un proveedor de etiquetas resulta satisfactorio para la creación explícita y el registro de imágenes. Promueve el compartimiento de iconos, como el registro de imágenes, y sigue manteniendo el control sobre la creación y eliminación de la imagen real.
Cuando se realiza una ajuste fino del conector, se suelen probar todos estos patrones de creación de imágenes distintos. Puede resultar satisfactorio aislar la toma de decisiones referente a la creación de imágenes en una clase aparte e indicar a todos los clientes que utilicen dicha clase para obtener todas las imágenes. De esta manera, la secuencia de creación puede ajustarse para mostrar las características del rendimiento real del conector.
Los fonts son otro recurso limitado en sistemas operativos de plataforma. Los aspectos de creación y disposición son los mismos para los fonts que para las imágenes, por lo que necesitan cambios similares de velocidad y espacio. Generalmente, los fonts se asignan en SWT pidiendo un font con un nombre dependiente de la plataforma.
La clase FontRegistry mantiene una tabla de fonts por su nombre. Gestiona la asignación y la disposición de fonts.
En general, los conectores deben evitar la asignación o la descripción de fonts con nombres específicos de la plataforma. Aunque el registro de fonts se utiliza internamente en JFace, los conectores no suelen utilizarlo. La clase JFaceResources debe utilizarse para acceder a fonts comunes.
Es muy común permitir a los usuarios especificar sus preferencias para los fonts de la aplicación en una página de preferencias. En estos casos, debe utilizarse el FontFieldEditor para obtener del usuario el nombre del font, y puede utilizarse un FontRegistry para mantener el font. El FontFieldEditor sólo se utiliza en las páginas de preferencias.
La clase JFaceResources controla el acceso a los fonts e imágenes de la plataforma común. Mantiene un registro de fonts e imágenes interno para que los clientes puedan compartir fonts e imágenes determinados.
Existen muchos procedimientos utilizados en el entorno de trabajo y otros conectores para compartir imágenes donde se necesita. El registro de imágenes de JFaceResources no se utiliza exhaustivamente en el código de entorno de trabajo ni en el de conector.
La utilización de fonts es mucho más simple. El entorno de trabajo y la mayoría de conectores utilizan la clase JFaceResources para solicitar fonts por nombre lógico. Se proporcionan métodos, como getDialogFont() y getDefaultFont(), para que los conectores puedan utilizar los fonts esperados en su UI.