Eclipse Wizard Dialog

Eclipse : modifier les boutons d’un WizardDialog

Si vous développez des outils basés sur Eclipse, vous avez sûrement dû déjà utiliser les Wizard. Ces jeux de fenêtres successives sont très pratiques pour guider l’utilisateur dans la création ou la modification d’une ressource. Voyons comment nous pouvons les personnaliser un minimum…

L’implémentation par défaut du Wizard propose une fenêtre découpée en 3 parties :
 

  • Le header avec un titre, une description et une image
  • Le corps qui contient l’ensemble des pages du wizard
  • le footer qui comprend les différents boutons de navigation

 
En fonction des besoins métier, il est possible de devoir personnaliser les boutons présents dans le footer. Par défaut, le Wizard propose les boutons Back, Next, Cancel et Finish. Ces boutons sont définis dans la méthode createButtonsForButtonBar(Composite parent) de la classe WizardDialog. Pour modifier ces boutons et éventuellement en ajouter de nouveaux, il suffit de créer une classe qui va étendre WizardDialog et de surcharger cette méthode :

 

package customwizarddialog;

import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;

public class CustomWizardDialog extends WizardDialog {

	public CustomWizardDialog(Shell parentShell, IWizard newWizard) {
		super(parentShell, newWizard);
	}

	@Override
	protected void createButtonsForButtonBar(Composite parent) {
		super.createButtonsForButtonBar(parent);
	}

}

 
On rappelle simplement la méthode createButtonsForButtonsBar() de la classe WizardDialog pour instancier les boutons par défaut. Maintenant, imaginons que l’on souhaite ajouter de nouveaux boutons. Il faut faire appelle à la méthode createButtons() :
 

	@Override
	protected void createButtonsForButtonBar(Composite parent) {
		super.createButtonsForButtonBar(parent);

		// Add reject and validate buttons to the Wizard Dialog
		Button rejectButton = super.createButton(parent, REJECT_ID, REJECT_LABEL, false);
		setButtonLayoutData(rejectButton);
		Button acceptButton = super.createButton(parent, ACCEPT_ID, ACCEPT_LABEL, false);
		setButtonLayoutData(acceptButton);
	}

 
Pour positionner  ces nouveaux boutons par rapport à ceux déjà existant, on peut utiliser les méthodes moveAbove(Button button) et moveBelow(Button button). On récupère d’abord les boutons existant pour pouvoir les passer en paramètre de ces méthodes :
 

		// Get the existing Finish button
		Button finishButton = getButton(IDialogConstants.FINISH_ID);

		// Move created buttons above the Finish button
		acceptButton.moveAbove(finishButton);
		rejectButton.moveAbove(acceptButton);

 
On peut également modifier le texte des boutons en utilisant la méthode setText(String text).

La toute petite complication apparaît si l’on souhaite déplacer des boutons entre les deux boutons existant Back et Next. En fait ces deux boutons sont crées dans une méthode qui n’est pas surchargeable, appelée createPreviousAndNextButtons(Composite parent). Dans cette méthode, ces deux boutons sont placés dans leur propre composite, à l’intérieur du composite parent. Donc pour pouvoir les en déloger et les changer de place, il faut modifier leur parent :
 

		// Get the back and next buttons
		if (super.getWizard().needsPreviousAndNextButtons()) {
			Button backButton = getButton(IDialogConstants.BACK_ID);
			Button nextButton = getButton(IDialogConstants.NEXT_ID);

			backButton.setParent(parent);
			nextButton.setParent(parent);

			// increment the number of columns in the button bar to keep all the buttons on the same line
			((GridLayout) parent.getLayout()).numColumns = ((GridLayout) parent.getLayout()).numColumns + 2;

			acceptButton.moveAbove(nextButton);
		}

 
Si vous ajoutez plus de boutons, il faudra incrémenter le nombre de colonnes en conséquence.

Notre wizard dialog est maintenant personnalisé. D’autres modifications sont possibles comme désactiver le clic sur les boutons pré-existant en surchargeant des méthodes telles que cancelPressed(), nextPressed() et backPressed().

Pour ce petit exemple, voici le code source complet:
 


package customwizarddialog;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;

public class CustomWizardDialog extends WizardDialog {

	private static final int REJECT_ID = 9998;
	private static final String REJECT_LABEL = "Refuser";
	private static final int ACCEPT_ID = 9999;
	private static final String ACCEPT_LABEL = "Valider";

	public CustomWizardDialog(Shell parentShell, IWizard newWizard) {
		super(parentShell, newWizard);
	}

	@Override
	protected void createButtonsForButtonBar(Composite parent) {
		super.createButtonsForButtonBar(parent);

		// Add reject and validate buttons to the Wizard Dialog
		Button rejectButton = super.createButton(parent, REJECT_ID, REJECT_LABEL, false);
		setButtonLayoutData(rejectButton);
		Button acceptButton = super.createButton(parent, ACCEPT_ID, ACCEPT_LABEL, false);
		setButtonLayoutData(acceptButton);

		// Get the existing Finish button
		Button finishButton = getButton(IDialogConstants.FINISH_ID);

		// Move created buttons above the Finish button
		acceptButton.moveAbove(finishButton);
		rejectButton.moveAbove(acceptButton);

		// Get the back and next buttons
		if (super.getWizard().needsPreviousAndNextButtons()) {
			Button backButton = getButton(IDialogConstants.BACK_ID);
			Button nextButton = getButton(IDialogConstants.NEXT_ID);

			backButton.setParent(parent);
			nextButton.setParent(parent);

			// increment the number of columns in the button bar to keep all the buttons on the same line
			((GridLayout) parent.getLayout()).numColumns = ((GridLayout) parent.getLayout()).numColumns + 2;

			acceptButton.moveAbove(nextButton);
		}
	}
}

2 Comments

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *