Mercurial > projects > dwt-addons
changeset 21:cb935a3f6e90
MessageDialog
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Thu, 03 Apr 2008 00:37:05 +0200 |
parents | d1f4edab3f34 |
children | 7e823642932b |
files | dwtx/jface/dialogs/MessageDialog.d |
diffstat | 1 files changed, 489 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dwtx/jface/dialogs/MessageDialog.d Thu Apr 03 00:37:05 2008 +0200 @@ -0,0 +1,489 @@ +/******************************************************************************* + * Copyright (c) 2000, 2007 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * Port to the D programming language: + * Frank Benoit <benoit@tionex.de> + *******************************************************************************/ +module dwtx.jface.dialogs.MessageDialog; + +import dwtx.jface.dialogs.IconAndMessageDialog; +import dwtx.jface.dialogs.IDialogConstants; + +import dwt.DWT; +import dwt.custom.CLabel; +import dwt.graphics.Image; +import dwt.layout.GridData; +import dwt.layout.GridLayout; +import dwt.widgets.Button; +import dwt.widgets.Composite; +import dwt.widgets.Control; +import dwt.widgets.Label; +import dwt.widgets.Shell; + +import dwt.dwthelper.utils; + +/** + * A dialog for showing messages to the user. + * <p> + * This concrete dialog class can be instantiated as is, or further subclassed + * as required. + * </p> + */ +public class MessageDialog : IconAndMessageDialog { + /** + * Constant for a dialog with no image (value 0). + */ + public const static int NONE = 0; + + /** + * Constant for a dialog with an error image (value 1). + */ + public const static int ERROR = 1; + + /** + * Constant for a dialog with an info image (value 2). + */ + public const static int INFORMATION = 2; + + /** + * Constant for a dialog with a question image (value 3). + */ + public const static int QUESTION = 3; + + /** + * Constant for a dialog with a warning image (value 4). + */ + public const static int WARNING = 4; + + /** + * Labels for buttons in the button bar (localized strings). + */ + private String[] buttonLabels; + + /** + * The buttons. Parallels <code>buttonLabels</code>. + */ + private Button[] buttons; + + /** + * Index into <code>buttonLabels</code> of the default button. + */ + private int defaultButtonIndex; + + /** + * Dialog title (a localized string). + */ + private String title; + + /** + * Dialog title image. + */ + private Image titleImage; + + /** + * Image, or <code>null</code> if none. + */ + private Image image = null; + + /** + * The custom dialog area. + */ + private Control customArea; + + /** + * Create a message dialog. Note that the dialog will have no visual + * representation (no widgets) until it is told to open. + * <p> + * The labels of the buttons to appear in the button bar are supplied in + * this constructor as an array. The <code>open</code> method will return + * the index of the label in this array corresponding to the button that was + * pressed to close the dialog. If the dialog was dismissed without pressing + * a button (ESC, etc.) then -1 is returned. Note that the <code>open</code> + * method blocks. + * </p> + * + * @param parentShell + * the parent shell + * @param dialogTitle + * the dialog title, or <code>null</code> if none + * @param dialogTitleImage + * the dialog title image, or <code>null</code> if none + * @param dialogMessage + * the dialog message + * @param dialogImageType + * one of the following values: + * <ul> + * <li><code>MessageDialog.NONE</code> for a dialog with no + * image</li> + * <li><code>MessageDialog.ERROR</code> for a dialog with an + * error image</li> + * <li><code>MessageDialog.INFORMATION</code> for a dialog + * with an information image</li> + * <li><code>MessageDialog.QUESTION </code> for a dialog with a + * question image</li> + * <li><code>MessageDialog.WARNING</code> for a dialog with a + * warning image</li> + * </ul> + * @param dialogButtonLabels + * an array of labels for the buttons in the button bar + * @param defaultIndex + * the index in the button label array of the default button + */ + public this(Shell parentShell, String dialogTitle, + Image dialogTitleImage, String dialogMessage, int dialogImageType, + String[] dialogButtonLabels, int defaultIndex) { + super(parentShell); + this.title = dialogTitle; + this.titleImage = dialogTitleImage; + this.message = dialogMessage; + + switch (dialogImageType) { + case ERROR: { + this.image = getErrorImage(); + break; + } + case INFORMATION: { + this.image = getInfoImage(); + break; + } + case QUESTION: { + this.image = getQuestionImage(); + break; + } + case WARNING: { + this.image = getWarningImage(); + break; + } + } + this.buttonLabels = dialogButtonLabels; + this.defaultButtonIndex = defaultIndex; + } + + /* + * (non-Javadoc) + * @see dwtx.jface.dialogs.Dialog#buttonPressed(int) + */ + protected void buttonPressed(int buttonId) { + setReturnCode(buttonId); + close(); + } + + /* + * (non-Javadoc) + * @see dwtx.jface.window.Window#configureShell(dwt.widgets.Shell) + */ + protected void configureShell(Shell shell) { + super.configureShell(shell); + if (title !is null) { + shell.setText(title); + } + if (titleImage !is null) { + shell.setImage(titleImage); + } + } + + /* + * (non-Javadoc) Method declared on Dialog. + */ + protected void createButtonsForButtonBar(Composite parent) { + buttons = new Button[buttonLabels.length]; + for (int i = 0; i < buttonLabels.length; i++) { + String label = buttonLabels[i]; + Button button = createButton(parent, i, label, + defaultButtonIndex is i); + buttons[i] = button; + } + } + + /** + * Creates and returns the contents of an area of the dialog which appears + * below the message and above the button bar. + * <p> + * The default implementation of this framework method returns + * <code>null</code>. Subclasses may override. + * </p> + * + * @param parent + * parent composite to contain the custom area + * @return the custom area control, or <code>null</code> + */ + protected Control createCustomArea(Composite parent) { + return null; + } + + /** + * This implementation of the <code>Dialog</code> framework method creates + * and lays out a composite and calls <code>createMessageArea</code> and + * <code>createCustomArea</code> to populate it. Subclasses should + * override <code>createCustomArea</code> to add contents below the + * message. + */ + protected Control createDialogArea(Composite parent) { + // create message area + createMessageArea(parent); + // create the top level composite for the dialog area + Composite composite = new Composite(parent, DWT.NONE); + GridLayout layout = new GridLayout(); + layout.marginHeight = 0; + layout.marginWidth = 0; + composite.setLayout(layout); + GridData data = new GridData(GridData.FILL_BOTH); + data.horizontalSpan = 2; + composite.setLayoutData(data); + // allow subclasses to add custom controls + customArea = createCustomArea(composite); + //If it is null create a dummy label for spacing purposes + if (customArea is null) { + customArea = new Label(composite, DWT.NULL); + } + return composite; + } + + /** + * Gets a button in this dialog's button bar. + * + * @param index + * the index of the button in the dialog's button bar + * @return a button in the dialog's button bar + */ + protected Button getButton(int index) { + return buttons[index]; + } + + /** + * Returns the minimum message area width in pixels This determines the + * minimum width of the dialog. + * <p> + * Subclasses may override. + * </p> + * + * @return the minimum message area width (in pixels) + */ + protected int getMinimumMessageWidth() { + return convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH); + } + + /** + * Handle the shell close. Set the return code to <code>DWT.DEFAULT</code> + * as there has been no explicit close by the user. + * + * @see dwtx.jface.window.Window#handleShellCloseEvent() + */ + protected void handleShellCloseEvent() { + //Sets a return code of DWT.DEFAULT since none of the dialog buttons + // were pressed to close the dialog. + super.handleShellCloseEvent(); + setReturnCode(DWT.DEFAULT); + } + + /** + * Convenience method to open a simple confirm (OK/Cancel) dialog. + * + * @param parent + * the parent shell of the dialog, or <code>null</code> if none + * @param title + * the dialog's title, or <code>null</code> if none + * @param message + * the message + * @return <code>true</code> if the user presses the OK button, + * <code>false</code> otherwise + */ + public static bool openConfirm(Shell parent, String title, String message) { + MessageDialog dialog = new MessageDialog(parent, title, null, // accept + // the + // default + // window + // icon + message, QUESTION, [ IDialogConstants.OK_LABEL, + IDialogConstants.CANCEL_LABEL ], 0); // OK is the + // default + return dialog.open() is 0; + } + + /** + * Convenience method to open a standard error dialog. + * + * @param parent + * the parent shell of the dialog, or <code>null</code> if none + * @param title + * the dialog's title, or <code>null</code> if none + * @param message + * the message + */ + public static void openError(Shell parent, String title, String message) { + MessageDialog dialog = new MessageDialog(parent, title, null, // accept + // the + // default + // window + // icon + message, ERROR, [ IDialogConstants.OK_LABEL ], 0); // ok + // is + // the + // default + dialog.open(); + return; + } + + /** + * Convenience method to open a standard information dialog. + * + * @param parent + * the parent shell of the dialog, or <code>null</code> if none + * @param title + * the dialog's title, or <code>null</code> if none + * @param message + * the message + */ + public static void openInformation(Shell parent, String title, + String message) { + MessageDialog dialog = new MessageDialog(parent, title, null, // accept + // the + // default + // window + // icon + message, INFORMATION, + [ IDialogConstants.OK_LABEL ], 0); + // ok is the default + dialog.open(); + return; + } + + /** + * Convenience method to open a simple Yes/No question dialog. + * + * @param parent + * the parent shell of the dialog, or <code>null</code> if none + * @param title + * the dialog's title, or <code>null</code> if none + * @param message + * the message + * @return <code>true</code> if the user presses the OK button, + * <code>false</code> otherwise + */ + public static bool openQuestion(Shell parent, String title, + String message) { + MessageDialog dialog = new MessageDialog(parent, title, null, // accept + // the + // default + // window + // icon + message, QUESTION, [ IDialogConstants.YES_LABEL, + IDialogConstants.NO_LABEL ], 0); // yes is the default + return dialog.open() is 0; + } + + /** + * Convenience method to open a standard warning dialog. + * + * @param parent + * the parent shell of the dialog, or <code>null</code> if none + * @param title + * the dialog's title, or <code>null</code> if none + * @param message + * the message + */ + public static void openWarning(Shell parent, String title, String message) { + MessageDialog dialog = new MessageDialog(parent, title, null, // accept + // the + // default + // window + // icon + message, WARNING, [ IDialogConstants.OK_LABEL ], 0); // ok + // is + // the + // default + dialog.open(); + return; + } + + /* + * @see dwtx.jface.dialogs.Dialog#createButton(dwt.widgets.Composite, + * int, java.lang.String, bool) + */ + protected Button createButton(Composite parent, int id, String label, + bool defaultButton) { + Button button = super.createButton(parent, id, label, defaultButton); + //Be sure to set the focus if the custom area cannot so as not + //to lose the defaultButton. + if (defaultButton && !customShouldTakeFocus()) { + button.setFocus(); + } + return button; + } + + /** + * Return whether or not we should apply the workaround where we take focus + * for the default button or if that should be determined by the dialog. By + * default only return true if the custom area is a label or CLabel that + * cannot take focus. + * + * @return bool + */ + protected bool customShouldTakeFocus() { + if (cast(Label) customArea ) { + return false; + } + if (cast(CLabel) customArea ) { + return (customArea.getStyle() & DWT.NO_FOCUS) > 0; + } + return true; + } + + /* + * (non-Javadoc) + * @see dwtx.jface.dialogs.IconAndMessageDialog#getImage() + */ + public Image getImage() { + return image; + } + + /** + * An accessor for the labels to use on the buttons. + * + * @return The button labels to used; never <code>null</code>. + */ + protected String[] getButtonLabels() { + return buttonLabels; + } + + /** + * An accessor for the index of the default button in the button array. + * + * @return The default button index. + */ + protected int getDefaultButtonIndex() { + return defaultButtonIndex; + } + + /** + * A mutator for the array of buttons in the button bar. + * + * @param buttons + * The buttons in the button bar; must not be <code>null</code>. + */ + protected void setButtons(Button[] buttons) { + if (buttons is null) { + throw new NullPointerException( + "The array of buttons cannot be null.");} //$NON-NLS-1$ + this.buttons = buttons; + } + + /** + * A mutator for the button labels. + * + * @param buttonLabels + * The button labels to use; must not be <code>null</code>. + */ + protected void setButtonLabels(String[] buttonLabels) { + if (buttonLabels is null) { + throw new NullPointerException( + "The array of button labels cannot be null.");} //$NON-NLS-1$ + this.buttonLabels = buttonLabels; + } +}