Boîtes de dialogue de l'application

Lorsqu'une boîte de dialogue standard est trop simple pour votre plug-in, vous pouvez générer votre propre boîte de dialogue à l'aide de la classe Dialog. Nous avons vu au préalable comment l'outil readme participe à l'action "Open Readme Browser" dans un jeu d'actions. Ce dernier apparaît dans la barre d'outils du plan de travail et dans le menu Fenêtre->Editeur de fichier Readme.  

A présent, nous sommes prêts à aborder l'implémentation de l'action WindowActionDelegate dans l'outil readme.

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

Le délégué d'action de la fenêtre pour l'action définie utilise la sélection courante dans la vue du navigateur des ressources (fichier .readme) pour obtenir la liste des sections du fichier readme. Cette liste et le shell de la fenêtre du plan de travail sont transmis à SectionsDialog

Lorsque l'utilisateur sélectionne l'action, SectionsDialog est ouvert.

SectionsDialog est implémenté dans le plug-in de l'outil readme en sous-classant la classe Dialog dans le package org.eclipse.jface.dialogs.

La classe Dialog fournit un support de base pour la génération d'une fenêtre shell de dialogue, la création des boutons de commande courants et le lancement de la boîte de dialogue. Les sous-classes sont responsables du traitement du contenu de la boîte de dialogue.

SectionsDialog n'implémente pas de méthode okButtonPressed. L'implémentation "ne rien faire" est héritée à partir de Dialog. Cette opération est atypique. En général, un traitement est effectué en réponse à l'activation de l'un des boutons de commande de la boîte de dialogue.

Les boîtes de dialogue peuvent être aussi simples ou compliquées que nécessaire. Lorsque vous implémentez une boîte de dialogue, une grande partie de son code est impliqué dans la création des contrôles SWT représentant sa zone de contenu et traitant les événements nécessaires lorsque la boîte de dialogue est active. Lorsqu'un bouton est activé par l'utilisateur, la boîte de dialogue peut interroger l'état des divers contrôles (ou afficheurs) qui la constitue pour déterminer ce qu'elle doit faire.

Boîtes de dialogue en incrustation

Dans certains cas, vous pouvez être amené à afficher des informations sur un élément dans une boîte de dialogue, mais de manière plus "simple" que lancer une boîte de dialogue classique. Par exemple, une boîte de dialogue peut être destinée à fournir des informations temporaires pouvant facilement être supprimées, sans perdre de vue les tâches à exécuter. Vous pouvez alors utiliser la classe PopupDialog pour implémenter la boîte de dialogue. La présentation d'une classe PopupDialog est différente d'une classe Dialog à différents égards. Cette boîte de dialogue ne comporte pas de boutons sur sa partie inférieure, ne dispose pas d'une barre de titre standard et ses bordures, espacement et polices sont plus petits et plus compacts.

Bien que la conception d'une boîte de dialogue en incrustation soit très différente d'une boîte de dialogue classique, le code présent dans la sous-classe de votre plug-in qui définit le contenu de la boîte de dialogue est presque identique. Vous devez toujours implémenter la méthode createDialogArea pour créer les commandes SWT de la boîte de dialogue. La principale différence dans le code d'application réside dans le fait que le constructeur qui crée la boîte de dialogue possède plus de paramètres que la classe Dialog normale. Par exemple, SectionsDialog peut être converti en PopupDialog simplement en changeant la superclasse de la boîte de dialogue et en la configurant dans le constructeur :

   public class SectionsDialog extends PopupDialog {
      protected IAdaptable input;

      /**
      * Crée une nouvelle 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;
      }
      ...