Es wurde bereits erläutert, wie Benutzerschnittstellenergänzungen der Workbench (z. B. Sichten, Editoren, Assistenten und Dialoge) direkt durch SWT-Widgets implementiert werden können. Daher stellt sich die Frage, in welchen Fällen die Verwendung einer Anzeigefunktion überhaupt sinnvoll ist.
Mit Anzeigefunktionen können Sie Widgets erstellen und weiterhin Ihre Modellobjekte verwenden. Wenn Sie ein SWT-Widget direkt einsetzen, müssen Sie Ihre Objekte in die Zeichenfolgen und Images konvertieren, die von SWT erwartet werden. Anzeigefunktionen sind eine Art Adapter für SWT-Widgets, da sie den allgemeinen Code für die Verarbeitung von Widget-Ereignissen verarbeiten, den Sie andernfalls selbst implementieren müssten.
Die erste Anzeigefunktion haben Sie in der Ergänzung für die Sicht des Tools für Readme-Dateien innerhalb von ReadmeSectionsView kennen gelernt.
public void createPartControl(Composite parent) { viewer = new ListViewer(parent); ... }
Hinweis: Mit Anzeigefunktionen können Sie Implementierungen für Workbench-Sichten und -Editoren gleichermaßen bereitstellen. Der Begriff "Anzeigefunktion" bedeutet nicht, dass sie nur bei der Implementierung von Sichten hilfreich sind. Die Funktion TextViewer wird beispielsweise in der Implementierung vieler Editoren für die Workbench und für Plug-ins verwendet.
JFace bietet Anzeigefunktionen für die meisten komplexeren Widgets in SWT. Anzeigefunktionen werden am häufigsten bei Widgets für Listen, Baumstrukturen, Tabellen und Text verwendet.
Jeder Anzeigefunktion ist ein SWT-Widget zugeordnet. Dieses Widget kann durch die Angabe eines übergeordneten Objekts Composite in einem entsprechenden Konstruktor für die Anzeigefunktion implizit erstellt oder aber explizit erstellt werden, indem zunächst das Widget erstellt und dann für die Anzeigefunktion in ihrem Konstruktor bereitgestellt wird.
Listen, Baumstrukturen und Tabellen verwenden aus Sicht des Benutzers viele allgemeine Funktionen gemeinsam wie beispielsweise das Auffüllen mit Objekten, die Auswahl, das Sortieren und das Filtern.
Diese Anzeigefunktionen verwalten eine Liste der Domänenobjekte (so genannte Elemente) und zeigen diese im entsprechenden SWT-Widget an. Eine Anzeigefunktion für Listen ist in der Lage, ein Anzeigenobjekt für Text aus jedem beliebigen Element in der Liste abzurufen. Das Anzeigenobjekt wird aus einer Schnittstelle ILabelProvider abgerufen, die in der Anzeigefunktion definiert sein kann. Anzeigefunktionen für Listen können die Rückgaben der Widgets wieder den Elementen zuordnen, die der Client der Anzeigefunktion kennt.
Clients, die ein SWT-Widget für Text verwenden, müssen auf SWT-Ebene agieren. Hierbei sind Elemente Zeichenfolgen, und Ereignisse beziehen sich häufig auf einen Index in der Liste der Zeichenfolgen. Anzeigefunktionen bieten eine Semantik der höheren Ebene. Clients werden von einer Auswahl und von Änderungen in der Liste durch Verwendung der Elemente benachrichtigt, die sie für die Anzeigefunktion zur Verfügung stellen. Die Anzeigefunktion verarbeiten alle Operationen, mit denen Indizes wieder zu Elementen zugeordnet werden, eine gefilterte Sicht der Objekte angepasst wird und bei Bedarf eine erneute Sortierung vorgenommen wird.
Die Funktionen für Filterung und Sortierung werden durch die Angabe einer Sortierfunktion für die Anzeigefunktion (Klasse ViewerSorter) und/oder einer Filterfunktion für die Anzeigefunktion (Klasse ViewerFilter) für die Anzeigefunktion verarbeitet. (Diese Funktionen können nicht nur bei Anzeigefunktionen für Listen, sondern auch bei Anzeigefunktionen für Baumstrukturen und Tabellen angegeben werden.) Der Client muss lediglich eine Klasse bereitstellen, die die Objekte in der Liste vergleichen oder filtern kann. Die Anzeigefunktionen verarbeitet die einzelnen Schritte, mit denen die Liste gemäß der angegebenen Reihenfolge und Filtereinstellungen gefüllt wird und mit denen Reihenfolge und Filterung beim Hinzufügen und Entfernen von Elementen verwaltet werden.
Anzeigefunktion sind nicht zur Erweiterung durch Clients gedacht. Um eine Anzeigefunktion anzupassen, können Sie eigene Funktionen zur Bereitstellung von Inhalt und Bezeichnungen für sie konfigurieren.
Eine Klasse ListViewer ordnet Elemente in einer Liste einem SWT-Steuerelement List zu.
Eine Klasse TreeViewer zeigt hierarchische Objekte in einem SWT-Widget Tree (Baumstruktur) an. Sie verarbeitet die einzelnen Schritte beim Erweitern und Komprimieren von Einträgen. Für die einzelnen SWT-Baumstruktursteuerelemente gibt es unterschiedliche Anzeigefunktionen für Baumstrukturen (vollständige Baumstruktur, Tabellenbaumstruktur, Baumstruktur mit Markierungsfeldern).
Eine Klasse TableViewer funktioniert ähnlich wie eine Anzeigefunktion für Listen, fügt jedoch die Möglichkeit hinzu, für jedes Element in der Tabelle mehrere Datenspalten anzuzeigen. Anzeigefunktionen für Tabellen erweitern die Funktion des SWT-Tabellen-Widgets erheblich, indem sie das Konzept der Zellenbearbeitung einführen. Mit speziellen Zelleneditoren kann der Benutzer eine Tabellenzelle über ein kombiniertes Feld, einen Dialog oder ein Text-Widget bearbeiten. Die Anzeigefunktion für die Tabelle übernimmt die Erstellung und Platzierung dieser Widgets, wenn der Benutzer sie zur Bearbeitung benötigt. Dies wird durch die Klassen CellEditor (z. B. TextCellEditor und CheckboxCellEditor) erreicht.
Text-Widgets haben viele gemeinsame semantische Merkmale (z. B. Verhalten bei Doppelklicken, Widerruf von Aktionen, Zuordnung von Farben und index- oder zeilengestützte Navigation). Eine Klasse TextViewer ist ein Adapter für ein SWT-Widget StyledText. Anzeigefunktionen für Text bieten dem Client ein Dokumentmodell und verwalten die Konvertierung des Dokuments in die Informationen zur Textdarstellung, die durch das Text-Widget bereitgestellt werden.
Anzeigefunktionen für Text werden im Abschnitt Workbench-Editoren ausführlicher erläutert.
Um eine Anzeigefunktion zu verstehen, müssen Sie sich mit der Beziehung zwischen dem Eingabeelement einer Anzeigefunktion, ihrem Inhalt, der Auswahl und den Informationen, die letztlich in dem von ihr bearbeiteten Widget angezeigt werden, vertraut machen.
Ein Eingabeelement ist das Hauptobjekt, das in der Anzeigefunktion angezeigt (oder bearbeitet) wird. Aus Sicht der Anzeigefunktion kann jedes Objekt ein Eingabeelement sein. Es wird nicht vorausgesetzt, dass eine bestimmte Schnittstelle durch das Eingabeelement implementiert wird. (Der Grund hierfür wird im Zusammenhang mit den Funktionen für die Bereitstellung von Inhalt später noch erläutert.)
Eine Anzeigefunktion muss in der Lage sein, eine Änderung des Eingabeelements zu verarbeiten. Wenn ein neues Eingabeelement in eine Anzeigefunktion gestellt wird, muss das Widget anhand des neuen Elements neu mit Inhalt gefüllt werden und die Zuordnung zum vorherigen Eingabeelement muss aufgelöst werden. Die Semantik, mit der eine Registrierung als Listener-Funktion für ein Eingabeelement erreicht und das Widget basierend auf dem Element neu mit Inhalt gefüllt wird, ist bei jeder Anzeigefunktion anders.
Eine Anzeigefunktion für Inhalt ist eine Anzeigefunktion mit einem genau definierten Protokoll für das Abrufen von Informationen aus ihrem Eingabeelement. Anzeigefunktionen für Inhalt verwenden zwei spezielle Klassen von Hilfeprogrammen, nämlich die Schnittstelle IContentProvider und die Schnittstelle ILabelProvider, um ihre Widgets mit Inhalt zu füllen und Informationen zum Eingabeelement anzuzeigen.
Die Schnittstelle IContentProvider stellt ein Basislebenszyklusprotokoll zur Verfügung, mit dem einem Eingabeelement eine Funktion zur Bereitstellung von Inhalt zugeordnet und eine Änderung des Eingabeelements verarbeitet wird. Speziellere Funktionen zur Bereitstellung von Inhalt werden bei unterschiedlichen Anzeigefunktionen implementiert. Die gängigste Funktion zur Bereitstellung von Inhalt ist die Schnittstelle IStructuredContentProvider, die eine Liste der Objekte in einem bestimmten Eingabeelement erstellen kann. Sie wird in listenähnlichen Anzeigefunktionen wie Listen, Tabellen oder Baumstrukturen verwendet. Die Funktion zur Bereitstellung von Inhalt weiß generelle, wie die Zuordnung zwischen dem Eingabeelement und dem erwarteten Inhalt der Anzeigefunktion erfolgen muss.
Die Schnittstelle ILabelProvider geht noch einen Schritt weiter. Anhand des Inhalts einer Anzeigefunktion (der aus dem Eingabeelement und der Funktion zur Bereitstellung von Inhalt abgeleitet wurde), kann sie die spezifischen Benutzerschnittstellenelemente wie Namen und Symbole erstellen, die zum Anzeigen des Inhalts in der Anzeigefunktion benötigt werden. Funktionen zur Bereitstellung von Bezeichnungen können den sparsamen Umgang mit Symbolressourcen unterstützen, da sie sicherstellen können, dass dasselbe Exemplar des Symbols für alle ähnlichen Typen in einer Anzeigefunktion verwendet wird.
Hinweis: Exemplare von bestimmten Funktionen zur Bereitstellung von Inhalt oder Bezeichnungen können nicht von mehreren Anzeigefunktionen gemeinsam benutzt werden. Auch wenn alle Anzeigefunktionen denselben Typ einer Funktion zur Bereitstellung von Inhalt oder Bezeichnungen verwenden, sollte jede Anzeigefunktion mit einem eigenen Exemplar der entsprechenden Klasse initialisiert werden. Das Lebenszyklusprotokoll der Bereitstellungsfunktion ist für eine Eins-zu-eins-Beziehung zwischen der Funktion und der entsprechenden Anzeigefunktion konzipiert.
Über Eingabeelemente und Funktionen zur Bereitstellung von Inhalt und Bezeichnungen können Anzeigefunktionen einen Großteil der Implementierungsdetails für das Füllen von Widgets verdecken. Clients einer Anzeigefunktion müssen sich nur noch um das Füllen der Anzeigefunktion mit der richtigen Eingabe und der geeigneten Funktion zur Bereitstellung von Inhalt kümmern. Die Funktion zur Bereitstellung von Bezeichnungen muss wissen, wie die Benutzerschnittstelleninformationen aus dem Inhalt der Anzeigefunktion abgeleitet werden.
Die Flexibilität, die durch Anzeigefunktionen, Funktionen zur Bereitstellung von Inhalt und Funktionen zur Bereitstellung von Bezeichnungen ermöglicht wird, kann anhand ihrer Verwendung durch die Workbench veranschaulicht werden.
Die Klasse WorkbenchContentProvider ist eine strukturierte Funktion zur Bereitstellung von Inhalt, die Inhalt aus einem Eingabeelement abruft, indem sie dessen untergeordnete Elemente anfordert. Auch hierbei wird das Konzept eines Adapters eingesetzt, um eine generische Funktionsweise zu implementieren. Sobald die Liste der Elemente vom Eingabeelement angefordert wurde, erhält die Klasse WorkbenchContentProvider eine Schnittstelle IWorkbenchAdapter für das Eingabeelement. Falls für das Eingabeelement eine Schnittstelle IWorkbenchAdapter registriert wurde, kann die Funktion zur Bereitstellung von Inhalt sicher davon ausgehen, dass das Element nach seinen untergeordneten Elementen abgefragt werden kann. Die Klasse WorkbenchContentProvider übernimmt auch die Aktualisierung der Anzeigefunktion, wenn der Arbeitsbereich geändert wird.
Die Klasse WorkbenchLabelProvider ist einen Funktion zur Bereitstellung von Bezeichnungen, die aus einem Objekt eine Schnittstelle IWorkbenchAdapter abruft, um Text und Image für das Objekt zu ermitteln. Das Konzept einer Funktion zur Bereitstellung von Bezeichnungen ist insbesondere bei Workbench-Objekten hilfreich, da hierbei eine einzige Funktion die Images zwischenspeichern kann, die in einer Anzeigefunktion gemeinsam benutzt werden. Sobald beispielsweise die Klasse WorkbenchLabelProvider ein Image zur Verwendung für eine Schnittstelle IProject erhält, kann es dieses Image zwischenspeichern und für alle Objekte von IProject verwenden, die in der Anzeigefunktion angezeigt werden.
Indem durch die Schnittstelle IWorkbenchAdapter ein gemeinsamer Adapter definiert und für viele Plattformtypen registriert wird, können diese Typen in vielen allgemeinen Anzeigefunktionen und in den Workbench-Sichten, die diese Anzeigefunktionen verwenden, korrekt dargestellt werden.