Indholdsstrukturering

Editorer har ofte nogle tilsvarende funktioner til indholdsstrukturering, som medfører en struktureret fremvisningen af og hjælper brugeren med at navigere gennem indholdet i editoren.

Arbejdsbænken indeholder en standardstrukturoversigt til dette formål.  Brugeren af arbejdsbænken styrer, hvornår denne oversigt skal være synlig, via menuen Vindue > Vis oversigt.

Da den generiske TextEditor ikke kender noget til strukturen i sin test, kan den ikke angive en funktionsmåde for en interessant strukturoversigt. Derfor sker der ikke så meget i den standard strukturoversigt, som vises nedenfor.

Standardindholdsstruktur

 

Editorer i tekststrukturen kan levere deres egen indholdsstruktureringsside til strukturoversigten. Strukturen til en editor angives, når arbejdsbænken anmoder om en adapter af typen 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);
}

En indholdsstruktureringsside skal implementere IContentOutlinePage. Denne grænseflade kombinerer evnen til at give lyttere til ændring af valg (ISelectionProvider) besked om funktionsmåden forbundet med at være en side i en oversigt (IPage). Funktioner til indholdsstrukturering implementeres typisk vha. JFace-fremvisningsfunktioner.  Standardimplementering af en funktion til indholdsstrukturering (ContentOutlinePage) anvender en JFace-træstruktur til at vise en hierarkisk repræsentation af strukturen. Denne repræsentation egner sig til mange struktureringsfunktioner, herunder JavaContentOutlinePage.

Lad os se på implementeringen af siden. Når struktursiden oprettes af editoren i sekvensen ovenfor, angives dets inputelement til editorens inputelement. Dette input kan ofte sendes direkte til struktureringssidens fremvisningsfunktion, som illustreret nedenfor.

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

Oprettelse af træstrukturfremvisningen overtages fra ContentOutlinePage. Udbyderen af standardetiketter bruges. Indholdsudbyderen stilles til rådighed i JavaContentOutlinePage og er ansvarlig for at analysere editorinputtet i individuelle segmenter, hver gang det ændres.

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

Teksten analyseres i intervaller, som kaldes segmenter, i dokumentet. Disse segmenter vises efter navn i strukturoversigten.

Struktureringsfunktion til Java-eksempel

Når valget ændres, hentes det valgte segment. Dets forskydninger bruges til angivelse af fremhævningsintervallet i editoren.

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