Wenn ein Standarddialog für ein spezielles Plug-in zu einfach strukturiert ist, können Sie mit Hilfe der Klasse Dialog einen eigenen Dialog erstellen. Es wurde bereits dargestellt, wie das Tool für Readme-Dateien ein Aktionsset durch die Aktion "Open Readme Browser" ergänzt. Dieses Aktionsset wird in der Symbolleiste der Workbench sowie im Menü Fenster > Readme-Datei-Editor angezeigt.
An dieser Stelle soll nun die Implementierung dieser Aktion in der Klasse WindowActionDelegate dieses Tools erläutert werden.
public void run(IAction action) { SectionsDialog dialog = new SectionsDialog(window.getShell(), ReadmeModelFactory.getInstance().getSections(selection)); dialog.open(); }
Die Klasse "WindowActionDelegate" für das Aktionsset verwendet die aktuelle Auswahl in der Ressourcensicht "Navigator" (die Datei .readme), um eine Liste der Abschnitte in der Readme-Datei abzurufen. Diese Liste und die Shell des Workbench-Fensters werden an die Klasse SectionsDialog übergeben.
Wenn der Benutzer die Aktion auswählt, wird die Klasse SectionsDialog geöffnet.
Die Klasse SectionsDialog wird im Plug-in des Tools für Readme-Dateien implementiert, indem die Klasse Dialog als Unterklasse in das Paket org.eclipse.jface.dialogs aufgenommen wird.
Die Klasse Dialog stellt eine Basisunterstützung für die Erstellung eines Dialog-Shell-Fensters, die Erstellung der allgemeinen Dialogschaltflächen und das Starten des Dialogs zur Verfügung. Die Unterklassen sind für die Verarbeitung des eigentlichen Dialoginhalts zuständig:
Die Klasse SectionsDialog erstellt eine SWT-Liste, um die Liste der Abschnitte anzuzeigen. Sie verwendet eine JFace-Anzeigefunktion, um die Liste mit Inhalt zu füllen. (Die JFace-Anzeigefunktionen werden unter Anzeigefunktionen näher erläutert.) Bitte beachten Sie, dass der Dialog keine der Schaltflächen für den Dialog erstellen muss, da dies durch die Superklasse vorgenommen wird.
protected Control createDialogArea(Composite parent) { Composite composite = (Composite)super.createDialogArea(parent); List list = new List(composite, SWT.BORDER); ... ListViewer viewer = new ListViewer(list); ... return composite; }
protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(MessageUtil.getString("Readme Sections")); ... }
Dialoge können nach Bedarf einfach oder komplex gestaltet werden. Bei der Implementierung eines Dialogs dient der Großteil des Dialogcodes dazu, die SWT-Steuerelemente zu erstellen, die den Inhaltsbereich darstellen, und alle erforderlichen Ereignisse zu verarbeiten, während der Dialog geöffnet ist. Sobald der Benutzer eine Schaltfläche auswählt, kann der Dialog den Status der einzelnen Steuerelemente (oder Anzeigefunktionen) abfragen, aus denen er besteht, um die erforderliche Aktion zu ermitteln.
In bestimmten Fällen kann es wünschenswert sein, Informationen zu einem Element in einem Dialog anzuzeigen, jedoch ohne den Aufwand, der mit ddem Starten eines Dialogs verbunden ist. Ein Beispiel hierfür wäre ein Dialog, der temporäre und problemlos zu entfernende Informationen bereitstellen soll, ohne die Aufmerksamkeit des Benutzers von seiner Arbeit abzulenken. In einem solchen Fall können Sie den Dialog mit der Klasse PopupDialog implementieren. Darstellung und Funktionsweise eines Dialogs der Klasse a PopupDialog unterscheidet sich in mehrfacher Hinsicht von einem herkömmlichen Dialog. Unten im Dialog werden keine Schaltflächen angezeigt. Außerddem enthält der Dialog nicht die Standardfenstertitelleiste, und seine Rahmen, Abstände und Schriftarten sind kleiner und kompakter.
Obwohl ein Dialog der Klasse PopupDialog ganz anders als ein normaler Dialog aussieht, ist der Code in der Unterklasse des Plug-ins, die den Inhalt des Dialogs definiert, fast identisch. Die SWT-Steuerelemente für den Dialog werden auch hier durch die Implementierung der Methode createDialogArea erstellt. Der Hauptunterschied im Anwendungscode besteht darin, dass der Konstruktor, der den Dialog erstellt, viel mehr Parameter als die normale Klasse Dialog enthält. So kann beispielsweise ein Auswahldialg (SectionsDialog) einfach dadurch in einen Dialog der Klasse PopupDialog geändert werden, indem die Superklasse des Dialogs geändert und der Dialog im Konstruktor konfiguriert wird:
public class SectionsDialog extends PopupDialog { protected IAdaptable input; /** * Creates a new SectionsDialog. */ public SectionsDialog(Shell parentShell, IAdaptable input) { super(parentShell, SWT.DEFAULT, false, // do not take focus when opened false, // do not persist the bounds false, // do not show a resize menu false, // do not show a menu item for persisting bounds null, // no title null); // no info text this.input = input; } ...