org.eclipse.ui.views

Uma visualizaçã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 visualização é aberta em uma página do workbench.  Quando o usuário faz seleções ou outras alterações em uma visualizaçã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 visualização outline mostra uma visualização estruturada das informações em um editor.  Uma visualizaçã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 visualização devem registrá-la no arquivo plugin.xml e fornecer  informações de configuração sobre a visualizaçã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 visualização em menus e rótulos.

A interface da visualizaçã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 visualizaçã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.png"
	   category="org.eclipse.ui.examples.readmetool"
	   class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView">
	</view>
</extension>

Isso deve parecer bastante familiar. Vimos que uma nova visualizaçã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 visualizaçã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 visualização no workbench, selecionando Janela->Mostrar Visualização->Outro... e selecionando a visualização na lista Mostrar Visualização.

Quando mostramos ReadmeSectionsView, aparece uma visualizaçã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 visualizaçã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 visualizaçã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 visualizaçã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 ReadmeModelFactoryMarkElement 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.