Eine Sicht ist eine Workbench-Komponente, in der der Benutzer in einer Hierarchie aus Informationen navigieren oder Eigenschaften für ein Objekt anzeigen kann. Sichten werden häufig zur Unterstützung eines entsprechenden Editors bereitgestellt. Eine Sicht Gliederung zeigt beispielsweise die Struktur der Informationen in einem Editor an. Eine Sicht Eigenschaften enthält die Eigenschaften eines Objekts, das gerade bearbeitet wird.
Wenn der Benutzer Elemente auswählt oder auf andere Weise Änderungen in einer Sicht vornimmt, werden die Änderungen sofort in anderen zugehörigen Komponenten der Benutzerschnittstelle wiedergegeben. Auf einer Workbench-Seite kann jeweils nur ein Exemplar einer bestimmten Sicht geöffnet sein.
Am Erweiterungspunkt org.eclipse.ui.views können Plug-ins Sichten zur Workbench hinzufügen. Plug-ins, die die Workbench durch eine Sicht ergänzen, müssen die Sicht zusammen mit ihren Konfigurationsdaten (z. B. Implementierungsklasse, Kategorie (oder Gruppe) der Sichten, zu der sie gehört, sowie Name und Symbol zur Beschreibung der Sicht in Menüs und Anzeigenelementen) in ihrer Datei plugin.xml registrieren.
Die Schnittstelle für Sichten ist in IViewPart definiert. Plug-ins können jedoch auch die Klasse ViewPart erweitern, statt eine Schnittstelle IViewPart ganz neu zu erstellen.
Im Beispiel des Plug-ins "Hello World" wurde eine minimale Sichterweiterung implementiert. An dieser Stelle soll eine Erweiterung erläutert werden, die andere Workbench-Sichten erkennt sowie auf die Navigations- und Auswahlaktionen des Benutzers in der Workbench reagiert. In diesem Zusammenhang wird zunächst die Deklaration der Erweiterung in der Datei plugin.xml vorgestellt:
<extension
point="org.eclipse.ui.views">
<category
id="org.eclipse.ui.examples.readmetool"
name="&Readme">
</category>
<view
id="org.eclipse.ui.examples.readmetool.views.SectionsView"
name="Readme Sections"
icon="icons/basic/view16/sections.gif"
category="org.eclipse.ui.examples.readmetool"
class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView">
</view>
</extension>
Diese Datei kommt Ihnen wahrscheinlich bekannt vor. Sie können feststellen, dass die Workbench durch eine neue Sicht namens ReadmeSectionsView ergänzt wird. Die Parameter view id, name und category wurden wie in den vorherigen Beispielen definiert. Außerdem wird über den Parameter icon ein Symbol für die Sicht bereitgestellt, wobei ein auf das Installationsverzeichnis des Plug-ins bezogener relativer Pfad verwendet wird.
Sehen Sie sich jetzt die Sicht ReadmeSectionsView genauer an. Sie können jede beliebige Sicht in der Workbench aufrufen, indem Sie die Menüoptionen Perspektive > Sicht anzeigen > Andere... verwenden und dann die Sicht in der Liste Sicht anzeigen auswählen.
Wenn Sie die Sicht ReadmeSectionsView aufrufen, wird eine Sicht mit einer Liste ausgegeben. Diese Liste ist so lange leer, bis Sie auf eine Datei mit der Erweiterung .readme klicken. Dann wird die Liste mit den Abschnitten der Readme-Datei gefüllt.
Wie stellt nun das Plug-in fest, dass die Auswahl geändert wurde, und woran erkennt es die Readme-Datei? Durch die Beantwortung dieser Frage anhand des Codes werden Sie gleichzeitig besser verstehen, wie integrierte Workbench-Plug-ins erstellt werden können.
Am Beginn steht die schon bekannte Methode createPartControl. Wie im Beispiel von "Hello World" bereits dargestellt, werden in dieser Methode die Fensterobjekte erstellt, die eine Sicht darstellen. (Die folgende Beschreibung lässt einen Teil des Codes am Anfang aus und konzentriert sich vor allem auf die im vorliegenden Zusammenhang interessante Stelle.)
public void createPartControl(Composite parent) {
viewer = new ListViewer(parent);
...
// Selbst als Listener-Funktion für globale Auswahl hinzufügen
getSite().getPage().addSelectionListener(this);
// Auswahl vorbereiten
selectionChanged(null, getSite().getPage().getSelection());
}
Die Sicht erstellt und speichert eine Listener-Funktion für die Sicht (ListViewer) und registriert sich auf ihrer Seite selbst als Listener-Funktion für die Auswahl. Der Abruf der Seite erfolgt über eine Schnittstelle IViewSite, die Informationen zum Kontext der Sicht (Workbench-Fenster, aufnehmende Seite und Plug-in) enthält. Wenn nun eine Benachrichtigung über eine Auswahländerung gesendet wird, wird der folgende Code ausgeführt:
public void selectionChanged(IWorkbenchPart part, ISelection sel) {
// Falls Auswahl eine Readme-Datei ist, Abschnitte abrufen.
AdaptableList input =
ReadmeModelFactory.getInstance().getSections(sel);
viewer.setInput(input);
}
Es hat den Anschein, als ob die Klasse ReadmeModelFactory an der Umwandlung der Auswahl in Abschnitte der Readme-Datei beteiligt ist (diese Abschnitte sind als Eingabe für die Anzeigefunktion zu verstehen, die in der Methode createPartControl erstellt wurde).
Bei der Registrierung der Sicht wurde eine entsprechende Benachrichtigung bei Auswahländerungen angefordert. Die Auswahl wurde in eine geeignete Eingabe für die Anzeigefunktion konvertiert. Die Anzeigefunktion wiederum hat ein Listenfensterobjekt ausgefüllt.
Wenn Sie an dieser Stelle Hintergrundinformationen zu Anzeigefunktionen benötigen, lesen Sie den Abschnitt Anzeigefunktionen. Für den Beispielzweck ist die Erläuterung ausreichend, dass die Anzeigefunktion - sobald sie das Eingabeelement erhält - weiß, wie die Informationen in einem Listenfensterobjekt dargestellt werden müssen (da es sich um eine Anzeigefunktion für eine Liste handelt). Woher stammt nun aber die Information, dass eine Readme-Datei vorlag, und woher stammen die Auswahlinformationen für die Anzeigefunktion? Diese Frage kann durch eine kurze Betrachtung der Klasse ReadmeModelFactory beantwortet werden.
public AdaptableList getSections(ISelection sel) {
// Falls die Auswahl keine strukturierte Auswahl ist,
lediglich Rückgabe.
if (!(sel instanceof IStructuredSelection))
return null;
IStructuredSelection structured = (IStructuredSelection)sel;
//Falls die Auswahl eine Readme-Datei ist,
Abschnitte abrufen.
Object object = structured.getFirstElement();
if (object instanceof IFile) {
IFile file = (IFile) object;
String extension =
file.getFileExtension();
if (extension != null && extension.equals(IReadmeConstants.EXTENSION)) {
return
getSections(file);
}
}
//Ausgewähltes Objekt ist keine Readme-Datei
return null;
}
Die Auswahl wird überprüft, um festzustellen, ob es sich um eine strukturierte Auswahl, also eine Mehrfachauswahl handelt. (Das Konzept der strukturierten Auswahl stammt aus den Anzeigefunktionen von JFace.) Beim ersten Objekt in der Auswahl wird geprüft, ob es sich um eine Dateiressource handelt (IFile). Falls ja, wird ermittelt, ob die Erweiterung mit der Erweiterung .readme übereinstimmt. Sobald feststeht, dass es sich um eine Readme-Datei handelt, können die Abschnitte durch andere Methoden syntaktisch analysiert werden. Details zur Syntaxanalyse finden Sie in ReadmeModelFactory, MarkElement und DefaultSectionsParser.
Im Zuge der Erläuterung dieser Erweiterung wurden eine Vielzahl allgemeiner Workbench-Konzepte behandelt. Als Nächstes werden einige andere Workbench-Erweiterungen vorgestellt, und es wird beschrieben, wie die Benutzerschnittstelle der Workbench durch Ihr Plug-in weiter ergänzt werden kann.