Finestre di dialogo per applicazioni

Quando una finestra di dialogo standard è troppo semplice per il plugin in uso, è possibile crearne una personalizzata utilizzando la classe Dialog. In precedenza è stato descritto il modo in cui lo strumento readme aggiunge un'azione "apertura browser del readme" in un insieme di azioni.  Tale insieme di azioni viene visualizzato nella barra degli strumenti del workbench e nel menu Finestra->Editor del file readme.  

A questo punto è possibile esaminare l'implementazione di questa azione in WindowActionDelegate dello strumento readme.

   public void run(IAction action) {
      SectionsDialog dialog = new SectionsDialog(window.getShell(),
         ReadmeModelFactory.getInstance().getSections(selection));
      dialog.open();
   }

Il delegato dell'azione di finestra per l'insieme di azioni utilizza la selezione corrente della vista del pannello di selezione delle risorse (il file .readme) per richiamare un elenco delle sezioni contenute nel file readme. Questo elenco e la shell della finestra del workbench vengono trasferiti a SectionsDialog

Quando l'utente seleziona l'azione, viene aperta SectionsDialog.

SectionsDialog viene implementata nel plugin dello strumento readme creando sottoclassi della classe Dialog nel pacchetto org.eclipse.jface.dialogs.

La classe Dialog fornisce il supporto fondamentale per la creazione di una finestra shell della finestra di dialogo, per la creazione dei pulsanti comuni e per l'avvio della finestra di dialogo. Le sottoclassi sono responsabili della gestione del contenuto della finestra di dialogo stessa:

SectionsDialog non implementa un metodo okButtonPressed. Eredita l'implementazione "do-nothing" da Dialog. Questa situazione non è tipica. La finestra di dialogo dell'utente effettua generalmente un'elaborazione in risposta alla pressione di uno dei pulsanti della stessa finestra di dialogo.

Le finestre di dialogo possono essere semplici o complesse, a seconda delle necessità. Quando si implementa una finestra di dialogo, la maggior parte del codice della finestra riguarda la creazione dei controlli SWT che rappresentano la relativa area del contenuto e la gestione di tutti gli eventi necessari durante la visualizzazione della finestra di dialogo. Quando l'utente preme un pulsante, la finestra di dialogo può eseguire una query dello stato dei vari controlli (o dei visualizzatori) che costituiscono la finestra stessa per determinare l'azione da intraprendere.

Popup dialogs

In some cases, you might want to show information about something in a dialog, but in a way that is more "lightweight" than launching a regular dialog. For example, a dialog may be intended to provide transient information that can be easily dismissed, without taking the focus away from the user's work. If this is the case, you can use the PopupDialog class to implement the dialog. The look and feel of a PopupDialog is different than a regular Dialog in several ways. It does not have any buttons across the bottom, it does not have the standard window title bar, and its borders, spacing, and fonts are smaller and more compact.

Although a PopupDialog looks very different than a regular dialog, the code in your plug-in's subclass that defines the dialog content is almost the same. You still implement the createDialogArea method to create the SWT controls for the dialog. The main difference in the application code is that the constructor that creates the dialog has many more parameters than the regular Dialog class. For example, the SectionsDialog could be turned into a PopupDialog by simply changing the superclass of the dialog and configuring the dialog in the constructor:

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