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 crée une liste SWT permettant d'afficher la liste des sections. Un afficheur JFace est utilisé pour remplir la liste. (Les afficheurs JFace sont abordés à la section Afficheurs.) Notez que la classe Dialog n'a pas besoin de créer de bouton pour la boîte de dialogue, car cette opération est effectuée par la superclasse.
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")); ... }
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.
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; } ...