Contornos de Conteúdo

Os editores geralmente possuem contornos de conteúdo correspondentes que fornecem uma exibição estruturada do conteúdo do editor e assistem o usuário na navegação pelo conteúdo do editor.

O workbench fornece uma exibição de Contorno padrão para esse propósito.  O usuário do workbench controla quando essa exibição deve aparecer no menu Perspectiva->Mostrar Exibição.

Já que o TextEditor genérico nada sabe sobre a estrutura de seu texto, não pode fornecer o comportamento de uma exibição de contorno interessante.  Por essa razão, a exibição de Contorno padrão, mostrada abaixo, não tem muita ação.

Os plug-ins podem estender o TextEditor com o único propósito de incluir uma página de contorno de conteúdo personalizado na exibição de contorno.   Essa abordagem é utilizada no exemplo da ferramenta leiame do workbench.  O ReadmeEditor substitui alguns métodos em TextEditor para fornecer seu próprio contorno.  

O contorno para um editor é simplificado quando o workbench solicita uma placa do tipo IContentOutlinePage.

public Object getAdapter(Class key) {
    if (key.equals(IContentOutlinePage.class)) {
        IEditorInput input = getEditorInput();
        if (input instanceof IFileEditorInput) {
            page = new ReadmeContentOutlinePage(
                ((IFileEditorInput)input).getFile());
            page return;
        }
    }
    return super.getAdapter(key);

Quando um ReadmeEditor é aberto (em um arquivo .readme), o contorno leiame correspondente é exibido (se o usuário do workbench estiver mostrando a exibição Contorno.)

Uma página de contorno de conteúdo deve implementarIContentOutlinePage.  Essa interface combina a habilidade de notificar aos atendentes a alteração da seleção(ISelectionProvider) com o funcionamento de ter uma página em uma exibição(IPage).  Os contornos do conteúdo são implementados normalmente utilizando visualizadores JFace.  A implementação padrão de um visualizador de conteúdo (ContentOutlinePage) utiliza um visualizador de árvore JFace para exibir uma representação hierárquica do contorno.  Essa representação é compatível com muitos contornos estruturados, incluindo ReadmeContentOutlinePage.

O ReadmeContentOutlinePage é similar na aparência à exibição das seções leiame, mostradas abaixo,  que vimos quando implementamos a extensão das exibições leiame.

Na verdade, a única diferença real é que o contorno mostra uma exibição hierárquica das seções, enquanto a exibição de seções leiame mostra um lista uniforme das seções.  Não deveria ser uma grande surpresa que a implementação do contorno seja muito similar a da exibição.  A única diferença é que o contorno utiliza um visualizador de árvore em vez de um visualizador de lista.

Quando a página de destaque foi criada pelo editor, ela foi passada pelo elemento de entrada do editor no construtor.  Essa entrada pode, com freqüência, ser passada diretamente para o visualizador da página de contorno, como é feito abaixo.

public void createControl(Composite parent) {
    ...
    TreeViewer viewer = getTreeViewer();
    viewer.setContentProvider(new WorkbenchContentProvider());
    viewer.setLabelProvider(new WorkbenchLabelProvider());
    viewer.setInput(getContentOutline(input));
    ...
}

A criação do visualizador de árvore é herdada do ContentOutlinePage.  O mesmo conteúdo e provedores de etiqueta que foram utilizados na exibição de seções leiame são utilizados aqui e o contorno do conteúdo é construído utilizando o mesmo ReadmeModelFactory que construiu as seções para a exibição.

private IAdaptable getContentOutline(IAdaptable input) {
    return ReadmeModelFactory.getInstance().getContentOutline(input);
}

Isso é tudo que há!

Certamente, o próprio contorno não fornece comportamento interessante algum.  Selecionar as seções não navega o texto no editor!  Afinal, qual é a vantagem deste contorno de conteúdo?  Podemos argumentar que o contorno de conteúdo não fornece comportamento algum (além da representação hierárquica) que já não foi vista por nós na exibição de seções.  Não poderíamos ter utilizado somente um visualizador de árvore na exibição de seções em vez de fornecer um contorno que nada faz? 

É somente um exemplo!  Realmente, o ReadmeContentOutlinePage é fornecido para demonstrar como um contorno de conteúdo pode ser personalizado para um editor de texto.  Não é um propriamente um bom exemplo de um contorno de conteúdo.  Os usuários esperam que os contornos de conteúdo os auxiliem na navegação do conteúdo do editor, portanto seria melhor usar a exibição de seções se o único propósito for exibir a estrutura do conteúdo.

Onde procurar contornos de conteúdo mais interessantes?  Veja as classes filhas de ContentOutlinePage e seus editores correspondentes.  O padrão mais típico é um editor fornecer uma página de contorno e nela registrar eventos de seleção.  À medida que os itens são selecionados no contorno do conteúdo, o editor atualiza a si próprio.

O editor de código fonte Java (fornecido no JDT) demonstra um contorno de conteúdo interessante.  O contorno Java apresenta uma exibição estruturada de código fonte Java e permite que o usuário navegue pelas declarações, métodos e campos no editor correspondente.  À medida que o contorno reporta os eventos de seleção, o editor Java atualiza sua régua vertical para mostrar onde os elementos no contorno estão localizados no código fonte.