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.

Standardgliederung für Inhalt

 

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 Seite für die Inhaltsgliederung muss die Schnittstelle IContentOutlinePage implementieren. Diese Schnittstelle kombiniert die Fähigkeit, Listener-Funktionen für Auswahländerungen zu benachrichtigen (ISelectionProvider) mit dem Verhalten einer Seite in einer Sicht (IPage).  Funktionen zur Inhaltsgliederung werden normalerweise unter Verwendung von JFace-Anzeigefunktionen implementiert. Die Standardimplementierung einer Funktion zur Inhaltsgliederung (ContentOutlinePage) verwendet eine JFace-Anzeigefunktion für Baumstrukturen, um die Gliederung hierarchisch darzustellen. Diese Darstellungsform ist für viele strukturierte Gliederungsfunktionen (inklusive JavaContentOutlinePage) 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 ausContentOutlinePage übernommen.  Für Inhalt und Bezeichnungen werden die Standardprovider verwendet. Jedes Mal, wenn die Editoreingabe definiert (oder geändert) wird, ruft   JavaContentOutlinePage ein Dokument für die Editoreingabe ab und nimmt eine Syntaxanalyse des Textes vor.

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.

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();
		}
	}
}
Copyright IBM Corporation und Andere 2000, 2003.