O pacote org.eclipse.jface.resource define classes que ajudam os plug-ins a gerenciarem recursos da UI como fontes e ícones.
Muitos desses pontos de extensão do workbench permitem que os plug-ins forneçam ícones que podem ser utilizados para mostrar suas contribuições no workbench. Pelo fato de os sistemas operacionais da GUI suportarem um número limitado de imagens ou fontes na memória de uma vez, os recursos da UI dos plug-ins devem ser cuidadosamente gerenciados e, algumas vezes, compartilhados entre widgets.
Já vimos várias referências aos ícones no plug-in da ferramenta leia-me. Alguns desses ícones são especificados na marcação 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.gif" category="org.eclipse.ui.examples.readmetool" class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView"> </view> </extension>
Vimos também o código que descreve imagens em movimento. O seguinte é da ferramenta leia-me ReadmeEditorActionBarContributor.
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 fornece as classes de suporte básico que permitem que os plug-ins gerenciem seus ícones e fontes sem se preocupar com o momento em que os objetos gráficos da plataforma correspondente são criados ou destruídos. Essas classes de suporte são utilizadas diretamente pelos plug-ins como mostrado acima, ou indiretamente quando o workbench utilizar essas classes para obter imagens que são descritas na marcação do ponto de extensão.
A classe SWT Imagem representa uma imagem a partir da perspectiva do sistema operacional. Pelo fato de a maioria dos sistemas operacionais da GUI ter um limite no número de imagens que podem ser abertas de uma vez, os plug-ins deveriam ser muito cuidadosos aos criá-los e deveriam garantir que eles também sejam dispostos adequadamente quando terminar de usá-los. Utilizando o JFace ImageDescriptor e classes ImageRegistry em vez de a imagem SWT, os plug-ins podem evitar criar, gerenciar e ordenar essas imagens diretamente.
A classe ImageDescriptor pode ser utilizada como uma descrição leve de uma imagem. Ela especifica tudo o que é necessário para criar uma imagem, como o URL ou nome do arquivo onde a imagem pode ser obtida. ImageDescriptors não aloca uma imagem de plataforma real a não ser quando especificamente solicitado com o método createImage().
Os descritores de imagem são a melhor estratégia quando o código é estruturado de maneira a definir todos os ícones em um local e alocá-los à medida que se tornem necessários. Os descritores de imagem podem ser criados em qualquer momento sem se preocupar com os recursos do sistema operacional, sendo conveniente criá-los no código de inicialização.
A classe ImageRegistry é utilizada para manter uma lista de imagens nomeadas. Os clientes podem incluir descritores de imagem ou imagens SWT diretamente na lista. Quando uma imagem for solicitada de um registro pelo nome, o registro retornará a imagem se ela tiver sido criada, ou criará uma a partir do descritor. Isso permite que os clientes do registro compartilhem as imagens.
As imagens do registro que são incluídas ou recuperadas não devem ser descartadas por clientes. O registro é responsável pelo descarte das imagens desde que elas sejam compartilhadas por vários clientes. O registro descartará as imagens quando o sistema GUI da plataforma for encerrado.
Onde for possível, especifique o ícone para os objetos da UI do plug-in no arquivo plugin.xml. Muitos dos pontos de extensão do workbench incluem parâmetros de configuração de um arquivo de ícone. Definindo os ícones na contribuição de extensão no plugin.xml, você deixa a estratégia de gerenciamento de imagem ativa na plataforma. Desde que os ícones sejam normalmente mantidos no diretório de plug-in, isso permite que você especifique os ícones e gerencie todos os arquivos em um só lugar.
Os outros padrões deveriam somente ser considerados quando não é possível especificar o ícone como parte da contribuição de extensão.
Criar explicitamente uma imagem é a melhor estratégia, quando a imagem não é freqüentemente utilizada e compartilhada. A imagem pode ser criada diretamente no SWT e descartada depois do uso.
As imagens podem também ser criadas explicitamente utilizando um ImageDescriptor e chamando o método createImage(). Como no primeiro caso, o método dispose() para a imagem deve ser chamado depois que a imagem não for mais necessária. Por exemplo, se um diálogo criar uma imagem quando estiver aberto, ele deverá descartar a imagem quando for fechado.
Quando uma imagem é utilizada freqüentemente em um plug-in e compartilhada por vários objetos diferentes na UI, é útil registrar o descritor da imagem com um ImageRegistry. As imagens no registro serão compartilhadas com qualquer objeto que consulta uma imagem pelo mesmo nome. Você não deve descartar quaisquer imagens no registro desde que elas sejam compartilhadas por outros objetos.
Incluir uma imagem no registro de imagem é a melhor estratégia quando a imagem é utilizada freqüentemente, talvez durante o tempo de vida do plug-in, e é compartilhada por vários objetos. A desvantagem da utilização do registro é que as imagens no registro não são descartadas até que o sistema da GUI seja encerrado. Desde que haja um limite no número das imagens de plataforma (SWT) que podem ser abertas de uma só vez, os plug-ins devem ter cuidado para não registrar muitos ícones em um registro.
A classe AbstractUIPlugin inclui protocolo para criar um registro de imagem ampla do plug-in.
Quando um ícone é utilizado freqüentemente para exibir itens em um determinado visualizador, é possível compartilhá-lo entre itens similares no visualizador por meio de um provedor de etiquetas. Já que um provedor de etiquetas é responsável pelo retorno de uma imagem de todos os objetos em um visualizador, é possível controlar a criação da imagem e qualquer compartilhamento de imagens em todos os objetos no visualizador.
O provedor de etiquetas pode utilizar qualquer uma das técnicas discutidas anteriormente para produzir uma imagem. Se você procurar as várias implementações de getImage() nas subclasses de LabelProvider, verá várias abordagens incluindo o armazenamento em cache de um único ícone para objetos e a manutenção de uma tabela de imagens por tipo. As imagens criadas por um provedor de rótulos devem ser descartadas no método dispose() do provedor, que é chamado quando o visualizador é descartado.
Utilizar um provedor de etiquetas é um bom partido entre a criação explícita e o registro de imagens. Ele promove o compartilhamento de ícones como o registro de imagem, além disso mantém controle sobre a criação e o descarte da imagem real.
Quando se realiza o ajuste de um plug-in, é comum experimentá-lo com todos esses padrões de criação de imagem diferentes. Pode ser útil isolar a decisão tomada em relação à criação de imagem em uma classe separada e instruir todos os clientes para utilizar a classe para obter todas as imagens. Dessa forma, a seqüência de criação pode ser ajustada para refletir as características do desempenho real do plug-in.
As fontes são outro recurso limitado nos sistemas operacionais de plataformas. Os problemas de criação e descarte são os mesmos para fontes e para imagens, requerem trocas de velocidade/espaço semelhantes. Geralmente as fontes são alocadas em SWT solicitando uma fonte com um nome de fonte dependente da plataforma.
A classe FontRegistry mantém uma tabela de fontes pelos seus nomes. Ela gerencia a alocação e o descarte da fonte.
Em geral, os plug-ins deveriam evitar a alocação de qualquer fonte ou a descrição de fontes com nomes específicos de plataforma. Apesar do registro de fonte ser utilizado internamente no JFace, ele não é normalmente utilizado pelos plug-ins. A classe JFaceResources deve ser utilizada para acessar fontes comuns.
É muito comum permitir que os usuários especifiquem as suas preferências de fontes do aplicativo em uma página de preferências. Nesses casos, o FontFieldEditor deve ser utilizado para obter do usuário o nome da fonte, e um FontRegistry poderá utilizado para manter a fonte. O FontFieldEditor é utilizado apenas em páginas de preferências.
A classe JFaceResources controla acesso a fontes e imagens comuns da plataforma. Ela mantém uma fonte interna e registro de imagens para que os clientes possam compartilhar fontes e imagens nomeadas.
Há muitas técnicas utilizadas no workbench e outros plug-ins para compartilhar imagens onde for necessário. O registro de imagem JFaceResources não é amplamente utilizado em todo o workbench e no código de plug-in.
Utilizar fontes é muito mais simples. O workbench e a maioria dos plug-ins utilizam a classe JFaceResources para solicitar fontes pelo nome lógico. Os métodos como getDialogFont() e getDefaultFont() são fornecidos para que os plug-ins possam utilizar as fontes desejadas em suas UIs.