Uma exibição é uma parte do workbench que pode navegar uma hierarquia de informações ou exibir propriedades para um objeto. Apenas uma instância de uma determinada exibição é aberta em uma página do workbench. Quando o usuário faz seleções ou outras alterações em uma exibição, essas alterações são imediatamente refletidas no workbench. Muitas vezes, as exibições são fornecidas para suportar um editor correspondente. Por exemplo, uma exibição outline mostra uma exibição estruturada das informações em um editor. Uma exibição propriedades mostra as propriedades de um objeto que está sendo editado atualmente.
O ponto de extensão org.eclipse.ui.views permite que os plug-ins incluam exibições no workbench. Os plug-ins que contribuem com uma exibição devem registrá-la no arquivo plugin.xml e fornecer informações de configuração sobre a exibição, como sua classe de implementação, a categoria (ou grupo) de exibições a qual pertence e o nome e o ícone que devem ser utilizados para descrever a exibição em menus e rótulos.
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 está ciente da existência das outras exibições do workbench e responde à navegação e alterações de 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="%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>
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 Janela->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 e, nesse caso, ela será preenchida com seções do arquivo Readme.
Como o plug-in reconhece o arquivo readme e como sabia sobre as alterações de seleção? Se pudermos rastrear as respostas a essas perguntas, 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 uma parte do código para começar.
public void createPartControl(Composite parent) { viewer = new ListViewer(parent); ... // incluir-me como um ouvinte de seleção global getSite().getPage().addSelectionListener(this); // preparar a seleção selectionChanged(null, getSite().getPage().getSelection()); }
A exibição cria e armazena um ListViewer e registra-se como um ouvinte de seleção na sua página. Ele obtém a página em um IViewSite, que 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. O que acontece quando somos notificados de uma alteração de seleção? O seguinte código é executado:
public void selectionChanged(IWorkbenchPart part, ISelection sel) { //se a seleção for um arquivo Readme, obtenha as seções dele. AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel); viewer.setInput(input); }
Parece que a classe ReadmeModelFactory é responsável pela transformação da seleção em seções do Leia-me e essas seções são entrada para o visualizador que criamos no método createPartControl.
Mas como o visualizador ocupou os widgets de lista? Por enquanto, suponhamos apenas que, uma vez que o visualizador tomou conhecimento do seu elemento de entrada, ele soube como ocupar um widget de lista com as informações - apesar de tudo, é um ListViewer. Se quiser saber agora como é este visualizador, vá para Visualizadores.
Ainda não sabemos como os arquivos Leia-me são detectados ou de onde vem as informações de seção do arquivo. Uma olhada rápida no ReadmeModelFactory pode dar alguma idéia.
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 for um arquivo Readme, 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 Readme 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 de arquivo (IFile). Se for, verificamos se a sua extensão corresponde à extensão ".readme". Quando soubermos que temos um arquivo Leia-me, poderemos utilizar outros métodos para analisar as seções. É possível procurar no resto do ReadmeModelFactory, MarkElement e DefaultSectionsParser pelos detalhes da análise do arquivo.
Abordamos muitos conceitos comuns do workbench estudando essa extensão. Agora, mudaremos para algumas outras extensões do workbench e examinaremos como o plug-in pode contribuir mais com a UI do workbench.