Esquematizadores de conteúdo

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.

Destacador de conteúdo predefinido

 

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.

destacador exemplo Java

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();
		}
	}
}