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ü Perspektive > 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.
Plug-ins können die Klasse TextEditor ausschließlich zu dem Zweck erweitern, eine angepasste Seite für die Inhaltsgliederung zur Gliederungssicht hinzuzufügen. Diese Methode wird im Workbench-Beispiel des Tools für Readme-Dateien verwendet. ReadmeEditor überschreibt einige wenige Methoden in der Klasse TextEditor, um eine eigene Gliederungsfunktion zu erstellen.
Die Gliederungsfunktion für einen Editor wird angegeben, wenn die Workbench einen Adapter des Typs IContentOutlinePage anfordert.
public Object getAdapter(Class key) {
if (key.equals(IContentOutlinePage.class)) {
IEditorInput input = getEditorInput();
if (input instanceof IFileEditorInput) {
page = new
ReadmeContentOutlinePage(
((IFileEditorInput)input).getFile());
return page;
}
}
return super.getAdapter(key);
}
Sobald das Objekt ReadmeEditor (für eine Datei .readme) geöffnet wird, wird die entsprechende Gliederungsfunktion für Readme-Dateien angezeigt (sofern der Workbench-Benutzer die Sicht Gliederung öffnet).
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 ReadmeContentOutlinePage) geeignet.
ReadmeContentOutlinePage wird ähnlich wie die (unten gezeigte) Sicht für die Abschnitte von Readme-Dateien dargestellt, die bereits bei der Implementierung der Erweiterung für Sichten von Readme-Dateien vorgestellt wurde.
Der einzige echte Unterschied ist eigentlich, dass die Gliederungsfunktion eine hierarchische Sicht der Abschnitte anzeigt, während die Sicht für die Abschnitte der Readme-Dateien eine unstrukturierte Liste der Abschnitte anzeigt. Daher überrascht es nicht, dass die Implementierung der Gliederungsfunktion große Ähnlichkeit mit der Implementierung der Sicht hat. Der einzige Unterschied hierbei ist, dass die Gliederungsfunktion eine Anzeigefunktion für Baumstrukturen anstelle einer Anzeigefunktion für Listen verwendet.
Nachdem die Gliederungsseite durch den Editor erstellt wurde, wurde an sie im Konstruktor das Eingabeelement des Editors übergeben. 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) {
...
TreeViewer viewer = getTreeViewer();
viewer.setContentProvider(new WorkbenchContentProvider());
viewer.setLabelProvider(new WorkbenchLabelProvider());
viewer.setInput(getContentOutline(input));
...
}
Die Erstellung einer Anzeigefunktion für Baumstrukturen wird aus der Klasse ContentOutlinePage. übernommen. Dieselben Inhalt- und Label-Provider, die in der Sicht für Abschnitte von Readme-Dateien verwendet wurden, werden auch hier eingesetzt, und die Gliederung des Inhalts wird mit derselben Klasse ReadmeModelFactory konstruiert wie die Abschnitte für die Sicht.
private IAdaptable getContentOutline(IAdaptable input) {
return
ReadmeModelFactory.getInstance().getContentOutline(input);
}
Weitere Angaben sind für diese Implementierung nicht erforderlich.
Natürlich bietet die Gliederungsfunktion selbst kein Verhalten, das besonders interessante Aspekte hätte, denn das Auswählen von Abschnitten ist keine Navigation durch den Text im Editor. Wozu kann diese Funktion zur Inhaltsgliederung dennoch sinnvoll genutzt werden? Die Frage stellt sich, weil man vermuten könnte, dass die Funktion zur Inhaltsgliederung - abgesehen von der hierarchischen Darstellung - kein Verhalten bietet, dass nicht bereits durch die Sicht für Abschnitte bereitgestellt würde. Vielleicht wäre es ausreichend gewesen, einfach eine Anzeigefunktion für Baumstrukturen in der Sicht für Abschnitte zu verwenden, statt eine Gliederungsfunktion zu benutzen, die keine erkennbaren Funktionen ausführt.
Die Antwort liegt darin, dass es sich lediglich um ein Beispiel handelt. ReadmeContentOutlinePage wird eigentlich zur Verfügung gestellt, um zu veranschaulichen, wie eine Funktion zur Inhaltsgliederung für einen Texteditor angepasst werden kann, und ist kein gutes Beispiel für eine Funktion zur Inhaltsgliederung selbst. Benutzer erwarten, dass Funktionen zur Inhaltsgliederung ihnen bei der Navigation im Editorinhalt helfen. Daher wäre es tatsächlich eine bessere Wahl, die Sicht für Abschnitte zu verwenden, wenn lediglich eine strukturierte Anzeige des Inhalts ermöglicht werden soll.
Beispiele für anspruchsvollere Funktionen zur Inhaltsgliederung finden Sie in den Unterklassen von ContentOutlinePage und den entsprechenden Editoren. Das typischere Muster besteht daraus, dass ein Editor eine Gliederungsseite bereitstellt und Auswahlereignisse auf dieser Seite registriert. Wenn in der Inhaltsgliederung Elemente ausgewählt werden, aktualisiert der Editor sich selbst gemäß dieser Auswahl.
Im Editor für Java-Quellcode (aus JDT) wird eine interessante Funktion zur Inhaltsgliederung eingesetzt. Die Funktion zur Java-Gliederung stellt eine strukturierte Sicht für Java-Quellcode dar, in der der Benutzer durch Deklarationen, Methoden und Felder im entsprechenden Editor navigieren kann. Sobald die Gliederungsfunktion Auswahlereignisse meldet, aktualisiert der Java-Editor seine vertikale Skala und zeigt an, wo sich die in der Gliederung ausgewählten Elemente im Quellcode befinden.