Um conjunto abrangente de classes e interfaces está disponível para a construção de interfaces do usuário complexas. Felizmente, não precisamos compreender todas para fazer algo simples. Começaremos olhando alguns conceitos que foram expostos na interface do usuário do workbench e a estrutura correspondente deles sob as coberturas.
Temos utilizado o termo workbench de modo impreciso para nos referirmos"à janela que abre quando você inicia a plataforma." Vamos nos aprofundar um pouco e ver alguns dos componentes visuais que formam o workbench.
No restante desta discussão, quando utilizarmos o termo workbench, estaremos nos referindo à janela workbench (IWorkbenchWindow). A janela workbench é a janela de nível superior em um workbench. É o quadro que armazena a barra de menus, a barra de ferramentas, a linha de status, a barra de atalhos e as páginas. Em geral, não é preciso programar a janela workbench. Basta saber que ela está lá.
Nota: você pode abrir várias janelas workbench utilizando Perspectiva->Abrir. Por padrão, novas perspectivas são abertas na mesma janela workbench. Outras opções estão disponíveis (consulte a página de preferências do workbench para obter detalhes). Cada janela workbench é um mundo independente de editores e exibições, portanto, vamos nos centralizar apenas em uma única janela workbench.
Do ponto de vista do usuário, um workbench contém exibições e editores. Há algumas outras classes utilizadas para implementar a janela workbench.
Na janela workbench, você encontrará uma ou mais páginas(IWorkbenchPage) que, por sua vez, contêm partes. As páginas são mecanismos de implementação para agrupamento de partes. Geralmente, não é preciso programar a página, mas você a verá no contexto da programação e depuração.
Nota: as páginas são utilizadas na implementação de Perspectivas. Elas permitem que partes do workbench sejam colocadas em um contêiner externo sem a preocupação com o fato de a perspectiva estar aberta na mesma janela workbench ou em uma nova janela.
Exibições e editores são para onde movemos detalhes da implementação de alguma programação comum de plug-in. Quando você inclui um componente visual no workbench, deve decidir se deseja implementar uma exibição ou um editor. Como decidir isso?
Em ambos os casos, você estará construindo a exibição ou o editor de acordo com um ciclo de vida comum.
Você implementa um método createPartControl para criar os widgets do SWT que representam o componente visual. É preciso determinar quais widgets utilizar e alocar qualquer recurso da UI relacionado para exibir a exibição ou o editor.
Quando a exibição ou o editor recebe o foco, você recebe uma notificação setFocus para poder definir o foco para o widget correto.
Quando a exibição ou o editor é fechado, você recebe uma mensagem dispose para anunciar que a exibição ou o editor está sendo fechado. Neste ponto, os controles alocados em createPartControl já foram descartados, mas é preciso descartar qualquer recurso gráfico (como cursores, ícones ou fontes) alocado durante a criação dos controles ou da resposta aos eventos do widget.
Em todo esse ciclo de vida, os eventos serão disparados da página que contém o workbench para notificar as partes interessadas sobre a abertura, ativação, desativação e o fechamento de exibições e editores.
Parece simples? Pode ser. Essa é a beleza das exibições e dos editores do workbench. Eles são apenas identificadores do widget e podem ser tão simples ou complexos quanto precisem ser. Vimos a mais simples das exibições anteriormente, quando construímos uma exibição hello world. Ela está aqui novamente, agora que explicamos um pouco melhor o que está acontecendo.
package org.eclipse.examples.helloworld;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.SWT;
import org.eclipse.ui.part.ViewPart;
public class HelloWorldView extends ViewPart {
Label label;
public HelloWorldView() {
}
public void createPartControl(Composite parent) {
label = new Label(parent, SWT.WRAP);
label.setText("Hello World");
}
public void setFocus() {
// defina o foco para o meu widget. Para
um etiqueta, isso não
// faz muito sentido, mas para conjuntos
mais complexos de widgets
// você deveria decidir qual terá o
foco.
}
}
Observe que não implementamos um método dispose(), pois não fizemos nada além de criar um etiqueta no método createPartControl(parent). Se tivéssemos alocado qualquer recurso da UI, como imagens ou fontes, teríamos que tê-las descartado aqui. Como estendemos a classe ViewPart, herdamos a implementação "do nothing" de dispose().