blob: e5b4cd11068ca29e822d278a125c92e819056c1f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jface.dialogs;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
/**
* 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 extends IconAndMessageDialog {
/**
* Constant for a dialog with no image (value 0).
*/
public final static int NONE = 0;
/**
* Constant for a dialog with an error image (value 1).
*/
public final static int ERROR = 1;
/**
* Constant for a dialog with an info image (value 2).
*/
public final static int INFORMATION = 2;
/**
* Constant for a dialog with a question image (value 3).
*/
public final static int QUESTION = 3;
/**
* Constant for a dialog with a warning image (value 4).
*/
public final 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 MessageDialog(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 = getImage(DLG_IMG_ERROR);
break;
}
case INFORMATION : {
this.image = getImage(DLG_IMG_INFO);
break;
}
case QUESTION : {
this.image = getImage(DLG_IMG_QUESTION);
break;
}
case WARNING : {
this.image = getImage(DLG_IMG_WARNING);
break;
}
}
this.buttonLabels = dialogButtonLabels;
this.defaultButtonIndex = defaultIndex;
}
/* (non-Javadoc)
* Method declared on Dialog.
*/
protected void buttonPressed(int buttonId) {
setReturnCode(buttonId);
close();
}
/* (non-Javadoc)
* Method declared in Window.
*/
protected void configureShell(Shell shell) {
super.configureShell(shell);
if (title != null)
shell.setText(title);
if (titleImage != 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 == 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 the 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, SWT.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);
composite.setFont(parent.getFont());
// allow subclasses to add custom controls
customArea = createCustomArea(composite);
//If it is null create a dummy label for spacing purposes
if(customArea == null)
customArea = new Label(composite,SWT.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);
}
/* (non-Javadoc)
* Method declared on Dialog.
* Sets a return code of -1 since none of the dialog buttons were pressed to close the dialog.
*/
protected void handleShellCloseEvent() {
super.handleShellCloseEvent();
setReturnCode(-1);
}
/**
* 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 boolean openConfirm(Shell parent, String title, String message) {
MessageDialog dialog = new MessageDialog(
parent,
title,
null, // accept the default window icon
message,
QUESTION,
new String[] {IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL},
0); // OK is the default
return dialog.open() == 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,
new String[] {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, new String[] { 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 boolean openQuestion(Shell parent, String title, String message) {
MessageDialog dialog = new MessageDialog(
parent,
title,
null, // accept the default window icon
message,
QUESTION,
new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL},
0); // yes is the default
return dialog.open() == 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,
new String[] {IDialogConstants.OK_LABEL},
0); // ok is the default
dialog.open();
return;
}
/*
* @see org.eclipse.jface.dialogs.Dialog#createButton(org.eclipse.swt.widgets.Composite, int, java.lang.String, boolean)
*/
protected Button createButton(Composite parent,int id,String label,boolean 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 boolean
*/
protected boolean customShouldTakeFocus() {
if(customArea instanceof Label)
return false;
if(customArea instanceof CLabel)
return (customArea.getStyle() & SWT.NO_FOCUS) > 0;
return true;
}
/*
* @see IconAndMessageDialog#getImage()
*/
public Image getImage() {
return image;
}
}