Anwendungsdialoge

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 implementiert keine Methode okButtonPressed. Sie übernimmt die Implementierung für die Ausführung keiner Aktion ("do-nothing") aus Dialog. Dies ist jedoch nicht der Regelfall. Normalerweise führt der Dialog bestimmte Verarbeitungen aus, wenn eine der Schaltflächen im Dialog ausgewählt wird.

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.

Kontextdialoge

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;
      }
      ...