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