org.eclipse.ui.views

Uma vista é uma parte de área de trabalho que pode navegar numa hierarquia de informações ou apresentar propriedades de um objecto. Só está aberta numa página de área de trabalho uma única instância de determinada vista.  Quando o utilizador procede a selecções ou outras alterações numa vista, estas reflectem-se imediatamente na área de trabalho. As vistas costumam ser facultadas para suportar um editor correspondente. Por exemplo uma vista de destaque mostra uma vista estruturada das informações contidas num editor. Uma vista de propriedades mostra as propriedades de um objecto que esteja a ser editado.

O ponto de extensão org.eclipse.ui.views permite aos plug-ins adicionarem vistas à área de trabalho. Os plug-ins que contribuem com uma vista deve registá-la no seu ficheiro plugin.xml e facultar  informações de configuração sobre a vista como, por exemplo, classe de implementação, categoria (ou grupo) de vistas ao qual pertence e nome e ícone que devem ser usados para descrever a vista em menus e etiquetas.

A interface para vistas está definida em IViewPart, mas os plug-ins podem optar por estender a classe ViewPart em vez de implementar uma IViewPart de raiz.

Implementámos uma extensão de vista mínima no exemplo hello world. Agora veremos uma que conhece outras vistas de área de trabalho e reage à navegação do utilizador e a alterações a selecções na área de trabalho. Primeiro, vejamos a declaração da extensão em 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>
</extensão>

Isto já não deve parecer estranho. Vemos que houve contributo de uma nova vista, ReadmeSectionsView, para a área de trabalho. Os elementos ID de vista, nome e categoria estão especificados como vimos antes. Também é facultado um ícone para a vista, com um caminho relativo para o directório de instalação do plug-in.

Vejamos a ReadmeSectionsView (vista de secções readme). Pode apresentar qualquer vista na área de trabalho ao seleccionar Janela > Mostrar Vista > Outro... e seleccionar a vista na lista Mostrar Vista.

Quando mostramos a ReadmeSectionsView, aparece uma vista com uma lista. A lista está vazia a menos que se faça clique num ficheiro com extensão .readme, o que preenche a lista com secções do ficheiro readme.

Como é que o plug-in reconhece o ficheiro readme e como sabia das alterações a selecções? Se descobrirmos as respostas a estas perguntas, estaremos no bom caminho para compreender como construir plug-ins de área de trabalho integrados.

Começamos pelo método createPartControl já conhecido. Como vimos no exemplo Hello World, é aqui que são criados os widgets que representam uma vista.  Vamos ignorar algum código para começar.

public void createPartControl(Composite parent) {
      viewer = new ListViewer(parent);
      ...
      // add myself as a global selection listener
      getSite().getPage().addSelectionListener(this);

      // prime the selection
      selectionChanged(null, getSite().getPage().getSelection());
   }

A vista cria e armazena um ListViewer e regista-se a si própria como ouvinte de selecções na respectiva página. Obtém a página junto de um IViewSite, o qual contém informações sobre o contexto da vista como, por exemplo, janela de área de trabalho, a página que a contém e o respectivo plug-in. O que acontece quando somos notificados da alteração a uma selecção? É executado o seguinte código:

   public void selectionChanged(IWorkbenchPart part, ISelection sel) {
      //if the selection is a readme file, get its sections.
      AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel);
      viewer.setInput(input);
   }

Parece que a classe ReadmeModelFactory é responsável por transformar a selecção em secções de readme e estas secções são entradas de dados para o visualizador que criámos no método createPartControl.

Mas como é que o visualizador preencheu os widgets da sua lista? Por agora, suponhamos que, assim que o visualizador receber o seu elemento de entrada de dados, sabia como preencher a sua lista de widgets com as informações - afinal, é um visualizador de vistas (ListViewer).  Se quiser saber agora de que trata este visualizador, avance para Visualizadores

ainda não sabemos como são detectados os ficheiros readme ou de onde vêm as informações sobre secções do ficheiro. Basta vermos a ReadmeModelFactory para ficarmos esclarecidos.

   public AdaptableList getSections(ISelection sel) {
      // If sel is not a structured selection just return.
      if (!(sel instanceof IStructuredSelection))
     return null;
      IStructuredSelection structured = (IStructuredSelection)sel;

      //if the selection is a readme file, get its sections.
      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);
         }
      }

      //the selected object is not a readme file
     return null;
   }

Verificamos a selecção para ver se é estruturada (múltipla). (O conceito de uma selecção estruturada vem dos visualizadores JFace.) No caso do primeiro objecto na selecção, verificamos se é um recurso de ficheiro (IFile).  Se assim for, verificamos a extensão para ver se equivale a ".readme". Assim que soubermos que temos um ficheiro readme, podemos usar outros métodos para interpretar as secções.   Pode procurar nos restantes ReadmeModelFactoryMarkElement e DefaultSectionsParser para mais detalhes sobre a interpretação do ficheiro.

Já englobámos muitos conceitos de área de trabalho comuns por estudarmos esta extensão. Agora passamos a outras extensões de área de trabalho e veremos como o plug-in pode contribuir mais para a UI da área de trabalho.