Uma exibição é uma parte do workbench que pode navegar uma hierarquia de informações ou exibir propriedades para um objeto. Muitas vezes, as exibições são fornecidas para suportar um editor correspondente Por exemplo, uma exibição contorno mostra uma exibição estruturada de informações em um editor. Uma exibição propriedades mostra as propriedades de um objeto que estão sendo editadas no momento.
Quando o usuário faz seleções ou qualquer tipo de alterações em uma exibição, as alterações são refletidas imediatamente em outras partes relacionadas da interface do usuário. Somente uma ocorrência de qualquer exibição fornecida é aberta em uma página do workbench.
O ponto de extensão org.eclipse.ui.views permite que os plug-ins incluam exibições no workbench. Os plug-ins que contribuemcom uma exibição devem registrá-la no arquivo plugin.xml deles, juntamente com as informações de configuração sobre a exibição, como sua classe de implementação, a categoria (ou grupo) das exibições a qual pertence e o nome e o ícone que devem ser utilizados para descrever a exibição em menus e etiquetas.
A interface da exibição é definida em IViewPart, mas os plug-ins podem optar por estender a classe ViewPart, em vez de implementar um IViewPart desde o início.
Implementamos uma extensão de exibição mínima no exemplo hello world. Agora, veremos um que sabe da existência das outras exibições do workbench e responde à navegação e seleção do usuário no workbench. Primeiro, vamos dar uma olhada na declaração da extensão no 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>
Isso deve parecer bastante familiar. Vimos que uma nova exibição, ReadmeSectionsView, é uma contribuição para o workbench. O view id, name e category são especificados como vimos anteriormente. Um icon é também fornecido para a exibição, utilizando um caminho relativo para o diretório de instalação do plug-in.
Vamos dar uma olhada em ReadmeSectionsView. Você pode mostrar qualquer exibição no workbench, selecionando Perspectiva->Mostrar Exibição->Outro... e selecionando a exibição na lista Mostrar Exibição.
Quando mostramos ReadmeSectionsView, aparece uma exibição com uma lista nela. A lista estará vazia, a menos que cliquemos em um arquivo com extensão .readme. Nesse caso, ele preenche a lista com seções do arquivo Leia me.
Como o plug-in sabe sobre as alterações de seleção e como ele reconheceu o arquivo Leia me? Se pudermos rastrear isso no código, conseguiremos compreender como construir plug-ins integrados ao workbench.
Começaremos com o conhecido método createPartControl. Como vimos no exemplo Hello World, é onde os widgets que representam uma exibição são criados. Vamos ignorar alguns dos códigos para começar.
public void createPartControl(Composite parent) {
viewer = new ListViewer(parent);
...
// incluir-me como um atendente de seleção global
getSite().getPage().addSelectionatendente(this);
// prepare a seleção
selectionChanged(null, getSite().getPage().getSelection());
}
A exibição cria e armazena um ListViewer e registra-se como um atendente de seleção na sua página. Ele obtém a página em um IViewSite, o qual contém informações sobre o contexto da exibição, como a janela, a página de conteúdo e o plug-in do workbench. Quando somos notificados de uma alteração de seleção, o que acontece? O seguinte código é executado:
public void selectionChanged(IWorkbenchPart part, ISelection sel) {
//se a seleção é um arquivo Leia me, obtenha suas seções.
AdaptableList input =
ReadmeModelFactory.getInstance().getSections(sel);
viewer.setInput(input);
}
Parece que a classe ReadmeModelFactory está envolvida na transformação da seleção em seções do Leia me, as quais sabe-se que são entrada para o visualizador que criamos no método createPartControl.
Sabemos que a exibição registrou seu interesse nas alterações de seleção. De certo modo a seleção converteu-se em entrada apropriada para nosso visualizador. Além disso, o visualizador fez alguma mágica para preencher um widget de lista.
Se você precisa saber agora o que é esse visualizador, vá para Visualizadores. Por enquanto, diremos apenas que assim que o visualizador toma conhecimento do seu elemento de entrada, ele sabe como preencher um widget de lista com as informações. (Apesar de tudo, é um ListViewer). Mas como sabíamos quando tínhamos um arquivo Leia me e de onde vieram as informações para o visualizador? Uma olhada rápida em ReadmeModelFactory traz algum esclarecimento.
public AdaptableList getSections(ISelection sel) {
// Se sel não for uma seleção estruturada, apenas retornar.
if (!(sel instanceof IStructuredSelection))
return null;
IStructuredSelection structured = (IStructuredSelection)sel;
//se a seleção é um arquivo Leia me, obtenha as seções dele.
Object object = structured.getFirstElement();
if (object instanceof IFile) {
IFile file = (IFile) object;
String extension =
file.getFileExtension();
if (extension != null && extension.equals(IReadmeConstants.EXTENSION)) {
return
getSections(file);
}
}
//o objeto selecionado não é um arquivo Leia me
return null;
}
Verificamos a seleção para ver se ela é estruturada (múltipla). (O conceito de uma seleção estruturada vem dos visualizadores do JFace). Para o primeiro objeto na seleção, verificamos se ele é um recurso (IFile) do arquivo. Se for, verificamos sua extensão para ver se ela corresponde à extensão ".readme". Assim que sabemos ter um arquivo Leia me, podemos utilizar outros métodos para analisar as seções. Você pode navegar pelo restante do ReadmeModelFactory, do MarkElement e do DefaultSectionsParser para obter detalhes sobre a análise do arquivo.
Abordamos muitos conceitos comuns do workbench estudando essa extensão. Agora, iremos para algumas outras extensões do workbench e examinaremos como o plug-in pode contribuir mais com a UI do workbench.