Funzioni di struttura del contenuto

Gli editor presentano spesso delle funzioni di struttura del contenuto corrispondenti che forniscono una vista strutturata del contenuto dell'editor e assistono l'utente durante l'esplorazione.

A questo scopo, il workbench fornisce una vista Struttura standard.  L'utente del workbench controlla quando questa vista è visibile mediante i menu Finestra> Mostra vista.

Poiché il generico TextEditor non è in possesso di alcuna informazione relativa alla struttura del proprio testo, non può fornire la funzionalità per una vista di struttura interessante.  Quindi, la vista Struttura predefinita, riportata di seguito, non è in grado di fornire caratteristiche interessanti.

Funzione di struttura del contenuto predefinita

 

Gli editor nella struttura del testo sono in grado di fornire la propria pagina della funzione di struttura del contenuto alla vista struttura.  La funzione di struttura per un editor viene specificata quando il workbench richiede un adattatore del 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 pagina della funzione di struttura del contenuto deve implementare IContentOutlinePage.  Questa interfaccia combina la capacità di notifica ai listener di modifica della selezione (ISelectionProvider) con la funzionalità di rappresentare una pagina in una vista (IPage).  Le strutture del contenuto vengono generalmente implementate mediante i visualizzatori JFace.  L'implementazione predefinita di una struttura del contenuto (ContentOutlinePage) utilizza un visualizzatore di struttura JFace per visualizzare una rappresentazione gerarchica della struttura.  Tale rappresentazione si adatta a molte strutture organizzate, compresa JavaContentOutlinePage.

Verrà illustrata l'implementazione della pagina. Quando la pagina della struttura è stata creata dall'editor nel frammento sopra riportato, l'elemento di input è stato impostato sull'elemento di input dell'editor.  Questo input può spesso essere trasmesso direttamente al visualizzatore della pagina della struttura, come avviene di seguito.

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 creazione del visualizzatore di struttura viene ereditata da ContentOutlinePage.  Vengono utilizzati i fornitori di contenuti ed etichette standard. Ad ogni impostazione (o modifica) dell'input dell'editor,  JavaContentOutlinePage ottiene un documento per l'input dell'editor e analizza il testo.

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

Il testo viene analizzato in intervalli, denominati segmenti, all'interno del documento.  Tali segmenti vengono visualizzati in base al nome nella vista struttura.

Quando la selezione cambia, il segmento selezionato viene richiamato.  I relativi offset vengono utilizzati per impostare l'intervallo di evidenziazione nell'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();
		}
	}
}
Copyright IBM Corporation e altri 2000, 2003.