Os editores costumam ter esquematizadores de conteúdo correspondentes que facultam uma vista estruturada do conteúdo do editor e ajudam o utilizador a navegar pelo conteúdo do editor.
A área de trabalho faculta uma vista padrão denominada Esquema para este fim. O utilizador da área de trabalho controla quando esta vista fica visível no menu Janela > Mostrar Vista .
Dado que o TextEditor genérico nada sabe sobre a estrutura do seu texto, não pode facultar comportamento para uma vista de esquema interessante. Por conseguinte, a vista Esquema predefinida, mostrada a seguir, pouco realiza.
Os editores no quadro de texto podem facultar a sua própria página de destacadores de conteúdo à vista Esquema. O destacador de um editor é especificado quando a área de trabalho pede um adaptador do tipo IContentOutlinePage.
public Object getAdapter(Class required) { if (IContentOutlinePage.class.equals(required)) { if (fOutlinePage == null) { fOutlinePage= new JavaContentOutlinePage(getDocumentProvider(), this); if (getEditorInput() != null) fOutlinePage.setInput(getEditorInput()); } return fOutlinePage; } return super.getAdapter(required); }
Uma página de destacador de conteúdo deve implementar IContentOutlinePage. Esta interface combina a capacidade de avisar ouvintes de alterações de selecção (ISelectionProvider) com o comportamento de ser uma página numa vista (IPage). Os esquematizadores de conteúdo são geralmente implementados mediante visualizadores JFace. A implementação predefinida de um destacador de conteúdo (ContentOutlinePage) utiliza um visualizador em árvore JFace para apresentar uma representação hierárquica do esquema. Esta representação é adequada a muitos destacadores estruturados, incluindo JavaContentOutlinePage.
Vejamos a implementação da página. Quando a página de esquema é criada pelo editor na porção de código supra, o respectivo elemento de entrada de dados é definido como elemento de entrada de dados do editor. Esta entrada de dados geralmente pode ser transmitida directamente ao visualizador da página de esquema, como se processa a seguir.
public void createControl(Composite parent) { super.createControl(parent); TreeViewer viewer= getTreeViewer(); viewer.setContentProvider(new ContentProvider()); viewer.setLabelProvider(new LabelProvider()); viewer.addSelectionChangedListener(this); if (fInput != null) viewer.setInput(fInput); }
A criação do visualizador em árvore é herdada de ContentOutlinePage. É utilizado o fornecedor de etiquetas padrão. O fornecedor de conteúdo é facultado dentro de JavaContentOutlinePage e é responsável pela interpretação da entrada de dados do editor em segmentos individuais sempre que for alterada.
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { ... if (newInput != null) { IDocument document= fDocumentProvider.getDocument(newInput); if (document != null) { document.addPositionCategory(SEGMENTS); document.addPositionUpdater(fPositionUpdater); parse(document); } } }
O texto é interpretado em intervalos, denominados segmentos, dentro do documento. Estes segmentos são apresentados pelo nome na vista esquema.
Quando a selecção é alterada, o segmento seleccionado é obtido. As suas deslocações são utilizadas para definir o intervalo de destaque no editor.
public void selectionChanged(SelectionChangedEvent event) { super.selectionChanged(event); ISelection selection= event.getSelection(); if (selection.isEmpty()) fTextEditor.resetHighlightRange(); else { Segment segment= (Segment) ((IStructuredSelection) selection).getFirstElement(); int start= segment.position.getOffset(); int length= segment.position.getLength(); try { fTextEditor.setHighlightRange(start, length, true); } catch (IllegalArgumentException x) { fTextEditor.resetHighlightRange(); } } }