Es wurde bereits erläutert, wie Benutzerschnittstellenergänzungen der Workbench (z. B. Sichten, Editoren, Assistenten und Dialoge) direkt durch SWT-Fensterobjekte 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 Fensterobjekte erstellen und weiterhin Ihre Modellobjekte verwenden. Wenn Sie ein SWT-Fensterobjekt 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-Fensterobjekte, da sie den allgemeinen Code für die Verarbeitung von Fensterobjektereignissen 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 Fensterobjekte in SWT. Anzeigefunktionen werden am häufigsten bei Fensterobjekten für Listen, Baumstrukturen, Tabellen und Text verwendet.
Jeder Anzeigefunktion ist ein SWT-Fensterobjekt zugeordnet. Dieses Fensterobjekt 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 Fensterobjekt 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-Fensterobjekt 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 Fensterobjekte wieder den Elementen zuordnen, die der Client der Anzeigefunktion kennt.
Clients, die ein SWT-Fensterobjekt 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 verarbeitet alle Operationen, über die 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 Inhalt- und Label-Provider 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-Fensterobjekt 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-Tabellenfensterobjekts 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 Fensterobjekte, wenn der Benutzer sie zur Bearbeitung benötigt. Dies wird durch die Klassen CellEditor (z.B. TextCellEditor und CheckboxCellEditor) erreicht. Eine virtuelle Tabelle, die nur bei der Anzeige aufgefüllt wird. Die Tabellenanzeigefunktion führt nur eine bestimmte zahl an Ergebnissen auf, ungeachtet dessen, was tatsächlich erzeugt wurde. Die Datenbank "lazily" benötigt JIT und wird immer nur eine vorherbestimmte Anzahl gleichzeitig abfragen.
Textfensterobjekte 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-Fensterobjekt StyledText. Anzeigefunktionen für Text bieten dem Client ein Dokumentmodell und verwalten die Konvertierung des Dokuments in die Informationen zur Textdarstellung, die durch das Textfensterobjekt 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 Fensterobjekt 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 Fensterobjekt 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 Fensterobjekt 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 Fensterobjekte 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 des Providers ist für eine Eins-zu-eins-Beziehung zwischen dem Provider 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 Fensterobjekten 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.
Eine Funktion zur Bereitstellung einer Bezeichnung kann mehr als nur Text und eine Grafik anzeigen. JFace bietet mehrere Klassen und Schnittstellen, um die beliebteste Zusatzfunktionalität zu unterstützen. Die folgenden Klassen werden von TableViewer, AbstractTreeViewer und TableTreeViewer unterstützt.
Ab Eclipse 3.1 ist es möglich, die Farben einer Ansicht auf zwei Arten zu beeinflussen - entweder über seine eigene Funktion zur Bereitstellung von Bezeichnungen, oder über einen Dekorator, der Farben und Schriftarten bestimmt. Im Allgemeinen ist es besser, die Farb- und Schriftartunterstützung in Funktionen zur Bereitstellung von Bezeichnungen zu verwenden, da Dekoratoren sich auf sämtliche Ansichten auswirken, die einen bestimmten Typ anzeigen. Wenn Sie dennoch einen Farb- oder Schriftartdekorator verwenden, stellen Sie sicher, dass die entsprechenden Werte in der Benutzervorgabenseite für Farben und Schriftarten eingestellt werden können.
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 der Inhalt-Provider 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.