Funktionen zur Inhaltsgliederung

Editoren haben häufig entsprechende Funktionen zur Inhaltsgliederung, die eine strukturierte Sicht des Editorinhalts bereitstellen und dem Benutzer bei der Navigation im Inhalt des Editors helfen.

Die Workbench stellt für diesen Zweck eine Standardsicht namens Gliederung zur Verfügung.  Der Workbench-Benutzer steuert die Situationen, in denen diese Sicht angezeigt wird, über das Menü Fenster > Sicht anzeigen.

Da die generische Klasse TextEditor die Struktur des Textes nicht kennt, kann kein Verhalten für eine ansprechende Gliederungssicht bereitgestellt werden.  Daher führt die unten gezeigte Standardsicht Gliederung keine nennenswerten Funktionen aus.

Standardmäßige Inhaltsgliederung

 

Editoren im Textgerüst können eine eigene Inhaltsgliederungsseite für die Sicht "Gliederung" bereitstellen.  Die Gliederungsfunktion für einen Editor wird angegeben, wenn die Workbench einen Adapter des Typs IContentOutlinePage anfordert.

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

Eine Inhaltsgliederungsseite muss IContentOutlinePage implementieren.  Diese Schnittstelle verbindet die Fähigkeit, Listener-Funktionen für Auswahländerungen zu benachrichtigen (ISelectionProvider), mit dem Verhalten einer Seite in einer Ansicht (IPage).  Funktionen zur Inhaltsgliederung werden normalerweise unter Verwendung von JFace-Anzeigefunktion implementiert.  Die Standardimplementierung einer Funktion zur Inhaltsgliederung (ContentOutlinePage) verwendet eine JFace-Strukturbaumanzeigefunktion, um eine hierarchische Darstellung der Gliederung anzuzeigen.  Diese Darstellung ist für viele strukturierte Gliederungsfunktionen, JavaContentOutlinePage eingeschlossen, geeignet.

Die folgende Darstellung veranschaulicht die Implementierung der Seite. Nachdem die Gliederungsseite durch den Editor im oben dargestellten Ausschnitt erstellt wurde, wird ihr Eingabeelement auf das Eingabeelement des Editors festgelegt.  Diese Eingabe kann häufig direkt an die Anzeigefunktion für die Gliederungsseite übergeben werden, was auch im folgenden Beispiel der Fall ist.

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

Die Erstellung der Strukturbaumanzeigefunktion wird aus ContentOutlinePage übernommen.  Der Standardkennsatz wird verwendet. Der Inhaltsprovider wird innerhalb von JavaContentOutlinePage geliefert und übernimmt die Aufgabe, Editoreingaben syntaktisch zu analysieren und bei jeder Änderung in einzelne Segmente zu zerlegen.

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

Der Text wird in Bereichen, den so genannten Segmenten, innerhalb des Dokuments syntaktisch analysiert. Diese Segmente werden in der Sicht "Gliederung" nach Namen sortiert angezeigt.

Java-Beispielgliederung

Wenn sich die Auswahl ändert, wird das ausgewählte Segment abgerufen.  Anhand seiner relativen Positionen wird der Hervorhebungsbereich im Editor festgelegt.

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