Recursos da interface de utilizador

O pacote org.eclipse.jface.resource define classes que ajudam os plug-ins a gerir recursos da UI como, por exemplo, tipos de letra e ícones.

Muitos dos pontos de extensão da área de trabalho permitem aos plug-ins facultar ícones que se podem utilizar para mostrar os seus contributos na área de trabalho. Dado que os sistemas operativos de GUI suportam um número limitado de imagens ou tipos de letra na memória de cada vez, os recursos de UI de um plug-in devem ser cuidadosamente geridos e por vezes partilhados entre widgets.

Já vimos várias referências a ícones no plug-in da ferramenta readme. Alguns destes ícones estão especificados na marcação do ficheiro plugin.xml.

<extension
   point="org.eclipse.ui.views">
	<category 
	   id="org.eclipse.ui.examples.readmetool"
	   name="%Views.category">
	</category>
	<view
 	   id="org.eclipse.ui.examples.readmetool.views.SectionsView"
	   name="%Views.ReadmeSections"
	   icon="icons/view16/sections.png"
	   category="org.eclipse.ui.examples.readmetool"
	   class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView">
	</view>
</extension>

Também já vimos código que descreve imagens de improviso. O seguinte é oriundo do ReadmeEditorActionBarContributor da ferramenta readme.

   public ReadmeEditorActionBarContributor() {
      	...
	action1 = new EditorAction(MessageUtil.getString("Editor_Action1")); 
	action1.setToolTipText(MessageUtil.getString("Readme_Editor_Action1")); 
	action1.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_DISABLE);
	action1.setImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_ENABLE);
	...

O JFace faculta classes de suporte básico que permitem aos plug-ins gerirem os seus ícones e tipos de letra sem se preocuparem quando os objectos gráficos da plataforma correspondente são criados e inutilizados. Estas classes de suporte são utilizadas directamente por plug-ins como se mostra em cima ou indirectamente quando a área de trabalho utiliza estas classes para obter imagens que estejam descritas em marcação de pontos de extensão.

Descritores de imagens e o registo

A classe Image de SWT representa uma imagem na perspectiva do sistema operativo. Dado que a maioria dos sistemas operativos de GUI tem um número limitado de imagens que se podem abrir em simultâneo, os plug-ins devem ter cuidado quando as criam, e assegurar que também os inutilizam devidamente quando acabarem de os utilizar. Ao utilizar as classes ImageDescriptor e ImageRegistry de JFace em vez da imagem de SWT, os plug-ins geralmente podem evitar criar, gerir e inutilizar estas imagens directamente.

Descritor de imagens

A classe ImageDescriptor pode ser utilizada como descrição ligeira de uma imagem, pois especifica tudo o que é necessário para criar uma imagem como, por exemplo, o URL ou nome de ficheiro onde se pode obter a imagem. As classes ImageDescriptors não atribuem uma verdadeira imagem de plataforma, a menos que tal seja especificamente solicitado com o método createImage().

Os descritores de imagens são a melhor estratégia quando o código se encontra estruturado de modo a definir todos os ícones num sítio e a atribuí-los conforme o necessário. Os descritores de imagens podem ser criados em qualquer altura sem preocupação com recursos de SO, o que torna conveniente criá-los todos em código de inicialização.

Registo de imagens

A classe ImageRegistry é utilizada para manter uma lista das imagens denominadas. Os clientes podem adicionar descritores de imagens ou imagens de SWT directamente à lista. Quando uma imagem é solicitada pelo nome ao registo, o registo devolve a imagem se esta tiver sido criada ou cria uma a partir do descritor. Isto permite aos clientes do registo partilharem imagens.

As imagens que forem adicionadas ao ou obtidas do registo não devem ser inutilizadas por cliente algum. O registo é responsável pela inutilização das imagens dado que estas são partilhadas por vários clientes. O registo inutiliza as imagens quando o sistema da GUI da plataforma é encerrado.

Padrões de plug-in para utilizar imagens

Especificar a imagem no ficheiro plugin.xml

Onde possível, especifique o ícone para os objectos de UI do seu plug-in no ficheiro plugin.xml. Muitos dos pontos de extensão da área de trabalho incluem parâmetros de configuração para um ficheiro de ícones. Ao definir os ícones no contributo de extensão no ficheiro plugin.xml, deixa-se a estratégia de gestão de imagens com a plataforma. Dado que os ícones são normalmente mantidos no directório do plug-in, isto permite especificar os ícones e gerir os ficheiros todos num único sítio.

Os outros padrões só devem ser considerados quando não se pode especificar o ícone como parte do contributo de extensão.

Criação explícita

Criar explicitamente uma imagem é a melhor estratégia quando a imagem não é frequentemente utilizada nem partilhada. A imagem pode ser criada directamente no SWT e inutilizada após a utilização.

Também se pode criar explicitamente imagens com um ImageDescriptor e invocando o método createImage(). Tal como no primeiro caso, deve ser invocado o método dispose() para a imagem depois desta já não ser necessária.  Por exemplo, se um diálogo criar uma imagem quando esta é aberta, deverá inutilizar a imagem quando esta for fechada.

Registo de imagens

Quando uma imagem é utilizada frequentemente num plug-in e partilhada por vários objectos diferentes na UI, é útil registar o descritor de imagem junto de um ImageRegistry. As imagens no registo serão partilhadas com qualquer objecto que consulte uma imagem com o mesmo nome. Não deve inutilizar imagens existentes no registo dado que são partilhadas por outros objectos.

Adicionar uma imagem ao registo de imagens é a melhor estratégia quando a imagem é utilizada frequentemente, talvez durante o tempo de vida do plug-in, e é partilhada por muitos objectos. A desvantagem de utilizar o registo é que as imagens no registo só são inutilizadas quando o sistema da GUI for encerrado. Dado que existe um limite ao número de imagens na plataforma (SWT) que podem estar abertas em simultâneo, os plug-ins devem ter o cuidado de não registar demasiados ícones num registo.

A classe AbstractUIPlugin inclui protocolo para criar um registo de imagens abrangente para plug-ins.

Fornecedores de etiquetas

Quando um ícone é frequentemente utilizado para apresentar artigos em determinado visualizador, poderá ser partilhado por artigos semelhantes no visualizador mediante um fornecedor de etiquetas. Dado que um fornecedor de etiquetas é responsável por devolver uma imagem para qualquer objecto num visualizador, poderá controlar a criação da imagem e de qualquer partilha de imagem por objectos no visualizador.

O fornecedor de etiquetas pode utilizar qualquer das técnicas anteriormente abordadas para produzir uma imagem. Se procurar as várias implementações de getImage() nas subclasses LabelProvider, verá uma variedade de abordagens, incluindo colocação em memória cache de um único ícone para objectos e manutenção de uma tabela de imagens por tipos.   As imagens criadas por um fornecedor de etiquetas devem ser inutilizadas no método dispose() do fornecedor, o qual é chamado quando o visualizador for inutilizado.

Utilizar um fornecedor de etiquetas é um bom compromisso entre criação explícita e o registo de imagens. Este promove a partilha de ícones como o registo de imagens, mas ainda mantém o controlo sobre a criação e inutilização da imagem propriamente dita.

Classe de imagem abrangente para plug-ins

Ao ajustar um plug-in, é comum experimentar todos os diferentes padrões de criação de imagens. Pode ser útil isolar o processo decisório relativo à criação de imagens numa classe separada e instruir todos os clientes para utilizarem a classe a fim de obterem todas as imagens. Deste modo, a sequência de criação pode ser ajustada para reflectir as verdadeiras características de desempenho do plug-in. 

ResourceManager

A classe ResourceManager (gestor de recursos) é utilizada para manter uma correlação de ImageDescriptors com Images de modo a que se possa reutilizar uma imagem mediante simples referência através do descritor. Quando uma imagem é solicitada pelo descritor ao registo, o registo devolve a imagem se esta tiver sido criada ou cria uma a partir do descritor. Isto permite aos clientes do registo partilharem imagens.

O ResourceManager de nível superior é um DeviceResourceManager que é criado num Ecrã (display). O ResourceManager definido por JFaceResources.getResources() é DeviceResourceManager e pode ser utilizado como ResourceManager de nível superior. Se precisar de um ResourceManager com um ciclo de vida mais curto do que o DeviceResourceManager, poderá criar um LocalResourceManager como descendente e inutilizá-lo quando já não precisar dele.

Um DeviceResourceManager será inutilizado quando o Ecrã utilizado para o criar também o for, de modo que não é necessário código de gestão especial.

As imagens que forem adicionadas ao ou obtidas do gestor não devem ser inutilizadas por cliente algum. O gestor é responsável pela inutilização das imagens dado que estas são partilhadas por vários clientes. O registo inutiliza as imagens quando o ResourceManager que as retém for encerrado.

Registo de tipos de letra

Os tipos de letra são outro recurso limitado nos sistemas operativos de plataforma. As questões de criação e inutilização são as mesmas para tipos de letra que para imagens, e implicam compromissos de velocidade/espaço semelhantes. Regra geral, os tipos de letra são atribuídos em SWT mediante pedido de um tipo de letra com um nome de tipo dependente da plataforma.

A classe FontRegistry mantém a tabela de tipos de letra pelos seus nomes, e gere a atribuição e inutilização dos tipos de letra.

Regra geral, os plug-ins devem evitar atribuir tipos de letra ou descrever tipos de letra com nomes específicos a plataformas. Embora o registo de tipos de letra seja utilizado internamente no JFace, não costuma ser utilizado por plug-ins. A classe JFaceResources deve ser utilizada para aceder a tipos de letra comuns.

É muito comum permitir aos utilizadores especificarem as suas preferências para tipos de letra de aplicações numa página de preferências.  Nestes casos, deve ser utilizado o FontFieldEditor para obter o nome do tipo de letra junto do utilizador, e poderá ser utilizado um FontRegistry para manter o tipo de letra.   O FontFieldEditor só é utilizado em páginas de preferências.

JFaceResources

A classe JFaceResources controla o acesso a tipos de letra e imagens comuns à plataforma, e mantém um registo interno de tipos de letra e imagens para que os clientes possam partilhar tipos de letra e imagens denominados.

Existem muitas técnicas utilizadas na área de trabalho e noutros plug-ins para partilhar imagens onde for solicitado. O registo de imagens JFaceResources não é amplamente utilizado em código de área de trabalho e plug-in.

A utilização de tipos de letra é muito mais simples. A área de trabalho e a maioria dos plug-ins utilizam a classe JFaceResources para solicitar tipos de letra pelo seu nome lógico. São facultados métodos como, por exemplo, getDialogFont() e getDefaultFont() para que os plug-ins possam utilizar os tipos de letra esperados na sua UI.