Esquematizadores de contenido

A menudo, los editores tienen sus correspondientes esquematizadores de contenido que proporcionan una vista estructurada del contenido del editor y ayudan al usuario a navegar por él.

El entorno de trabajo proporciona una vista Esquema estándar con esta finalidad.  El usuario del entorno de trabajo controla cuándo está visible esta vista mediante el menú Ventana > Mostrar vista.

Puesto que la clase TextEditor genérica no tiene información alguna sobre la estructura de su texto, no puede proporcionar un comportamiento para una vista de esquema que sea interesante.  Por lo tanto, la vista Esquema por omisión que se muestra a continuación no resulta muy útil.

Esquematizador de contenido por omisión

 

Los editores de la infraestructura de texto pueden suministrar su propia página de esquematizador de contenido a la vista Esquema.  El esquematizador de un editor se especifica cuando el entorno de trabajo solicita un adaptador de 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);
}

Una página de esquematizador de contenido debe implementar IContentOutlinePage.   Esta interfaz combina la capacidad para informar a los escuchas de cambios de selección (ISelectionProvider) con el comportamiento consistente en ser una página de una vista (IPage).  Generalmente, los esquematizadores de contenido se implementan mediante visores JFace.  La implementación por omisión de un esquematizador de contenido (ContentOutlinePage) utiliza un visor de árbol JFace para visualizar una representación jerárquica del esquema.  Esta representación es adecuada para muchos esquematizadores estructurados, incluyendo JavaContentOutlinePage.

Examinemos la implementación de la página. Cuando el editor creó la página de esquema en el fragmento de código anterior, su elemento de entrada se estableció en el elemento de entrada del editor.  Esta entrada se puede pasar a menudo directamente al visor de la página de esquema, tal como se muestra a continuación.

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

La creación del visor de árbol se hereda de ContentOutlinePage.  Se utiliza el proveedor de etiquetas estándar. El proveedor de contenido se suministra dentro de JavaContentOutlinePage y es responsable de analizar la entrada del editor en segmentos individuales siempre que cambia.

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

El texto se analiza en rangos, denominados segmentos, del documento.  Estos segmentos se visualizan por el nombre en la vista de esquema.

Esquematizador de ejemplo Java

Cuando cambia la selección, el segmento seleccionado se recupera.  Sus desplazamientos se utilizan para establecer el rango resaltado en el 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();
		}
	}
}