/*******************************************************************************
* Copyright (c) 2007, 2014 compeople AG 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:
* compeople AG - initial API and implementation
*******************************************************************************/
package org.eclipse.riena.ui.swt;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.LayoutConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.riena.ui.swt.facades.DialogConstantsFacade;
import org.eclipse.riena.ui.swt.lnf.LnFUpdater;
import org.eclipse.riena.ui.swt.lnf.LnfKeyConstants;
import org.eclipse.riena.ui.swt.lnf.LnfManager;
/**
* A dialog for showing messages and with an own renderer for the border and the title bar.
*/
public class RienaMessageDialog extends MessageDialog {
private final LnFUpdater lnfUpdater = LnFUpdater.getInstance();
// --- start - code from JFace MessageDialog.java ---
/**
* Convenience method to open a simple themed dialog as specified by the <code>kind</code> flag.
*
* @param kind
* the kind of dialog to open, one of {@link #ERROR}, {@link #INFORMATION}, {@link #QUESTION}, {@link #WARNING}, {@link #CONFIRM}, or
* {@link #QUESTION_WITH_CANCEL}.
* @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
* @param style
* {@link SWT#NONE} for a default dialog, or {@link SWT#SHEET} for a dialog with sheet behavior
* @return <code>true</code> if the user presses the OK or Yes button, <code>false</code> otherwise
* @since 3.0
*/
public static boolean open(final int kind, final Shell parent, final String title, final String message, int style) {
final RienaMessageDialog dialog = new RienaMessageDialog(parent, title, null, message, kind, getButtonLabels(kind), 0);
style &= SWT.SHEET;
dialog.setShellStyle(dialog.getShellStyle() | style);
return dialog.open() == 0;
}
/**
* Convenience method to open a themed 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
* @since 3.0
*/
public static boolean openConfirm(final Shell parent, final String title, final String message) {
return open(CONFIRM, parent, title, message, SWT.NONE);
}
/**
* Convenience method to open a themed 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
* @since 3.0
*/
public static void openError(final Shell parent, final String title, final String message) {
open(ERROR, parent, title, message, SWT.NONE);
}
/**
* Convenience method to open a themed 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
* @since 3.0
*/
public static void openInformation(final Shell parent, final String title, final String message) {
open(INFORMATION, parent, title, message, SWT.NONE);
}
/**
* Convenience method to open a themed 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 Yes button, <code>false</code> otherwise
* @since 3.0
*/
public static boolean openQuestion(final Shell parent, final String title, final String message) {
return open(QUESTION, parent, title, message, SWT.NONE);
}
/**
* Convenience method to open a themed 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
* @since 3.0
*/
public static void openWarning(final Shell parent, final String title, final String message) {
open(WARNING, parent, title, message, SWT.NONE);
}
private static String[] getButtonLabels(final int kind) {
final DialogConstantsFacade facade = DialogConstantsFacade.getDefault();
switch (kind) {
case ERROR:
case INFORMATION:
case WARNING:
return new String[] { facade.getOkLabel() };
case CONFIRM:
return new String[] { facade.getOkLabel(), facade.getCancelLabel() };
case QUESTION:
return new String[] { facade.getYesLabel(), facade.getNoLabel() };
case QUESTION_WITH_CANCEL:
return new String[] { facade.getYesLabel(), facade.getNoLabel(), facade.getCancelLabel() };
default:
throw new IllegalArgumentException("Illegal value for kind in MessageDialog.open()"); //$NON-NLS-1$
}
}
// --- end - code from JFace MessageDialog.java ---
private final RienaWindowRenderer dlgRenderer;
/**
* Creates a Riena message dialog.
*
* @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
*
* @see {@link MessageDialog#MessageDialog(Shell, String, Image, String, int, String[], int)}
*/
public RienaMessageDialog(final Shell parentShell, final String dialogTitle, final Image dialogTitleImage, final String dialogMessage,
final int dialogImageType, final String[] dialogButtonLabels, final int defaultIndex) {
super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels, defaultIndex);
dlgRenderer = new RienaWindowRenderer(this);
}
/**
* Create the dialog area and the button bar for the receiver.
*
* @param parent
*/
@Override
protected void createDialogAndButtonArea(final Composite parent) {
// create the contents area
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 1;
gridLayout.horizontalSpacing = 0;
gridLayout.verticalSpacing = 0;
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
parent.setLayout(gridLayout);
dlgRenderer.createContents(parent);
// create the dialog area and button bar
final Composite centerComposite = dlgRenderer.getCenterComposite();
gridLayout = new GridLayout();
gridLayout.numColumns = 2;
gridLayout.horizontalSpacing = LayoutConstants.getSpacing().x * 2;
gridLayout.verticalSpacing = LayoutConstants.getSpacing().y;
gridLayout.marginWidth = LayoutConstants.getMargins().x;
gridLayout.marginHeight = LayoutConstants.getMargins().y;
centerComposite.setLayout(gridLayout);
dialogArea = createDialogArea(centerComposite);
buttonBar = createButtonBar(centerComposite);
lnfUpdater.updateUIControls(parent, true);
}
@Override
public void create() {
// compute the 'styled' shell style, before creating the shell
setShellStyle(dlgRenderer.computeShellStyle());
super.create();
}
/**
* {@inheritDoc}
* <p>
* If an error image in the Riena Look&Feel is defined, the LnF image will be returned; otherwise the standard SWT error image for a message box well be
* returned.
*/
@Override
public Image getErrorImage() {
Image image = getLnfImage(LnfKeyConstants.MESSAGE_BOX_ERROR_ICON);
if (image == null) {
image = super.getErrorImage();
}
return image;
}
/**
* {@inheritDoc}
* <p>
* If an warning image in the Riena Look&Feel is defined, the LnF image will be returned; otherwise the standard SWT warning image for a message box well be
* returned.
*/
@Override
public Image getWarningImage() {
Image image = getLnfImage(LnfKeyConstants.MESSAGE_BOX_WARNING_ICON);
if (image == null) {
image = super.getWarningImage();
}
return image;
}
/**
* {@inheritDoc}
* <p>
* If an information image in the Riena Look&Feel is defined, the LnF image will be returned; otherwise the standard SWT information image for a message box
* well be returned.
*/
@Override
public Image getInfoImage() {
Image image = getLnfImage(LnfKeyConstants.MESSAGE_BOX_INFO_ICON);
if (image == null) {
image = super.getInfoImage();
}
return image;
}
/**
* {@inheritDoc}
* <p>
* If an question image in the Riena Look&Feel is defined, the LnF image will be returned; otherwise the standard SWT question image for a message box well
* be returned.
*/
@Override
public Image getQuestionImage() {
Image image = getLnfImage(LnfKeyConstants.MESSAGE_BOX_QUESTION_ICON);
if (image == null) {
image = super.getQuestionImage();
}
return image;
}
private Image getLnfImage(final String lnfKey) {
return LnfManager.getLnf().getImage(lnfKey);
}
}