/*******************************************************************************
* Copyright (c) 2006 Vlad Dumitrescu 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:
* Vlad Dumitrescu
*******************************************************************************/
package org.erlide.ui.wizards;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
class MessageDialogPage extends DialogPage {
static class MessageRegion {
private Text messageText;
private Label messageImageLabel;
private Composite messageComposite;
private String lastMessageText = "";//$NON-NLS-1$
private int lastMessageType;
/**
* Create a new instance of the receiver.
*/
public MessageRegion() {
// No initial behavior
}
/**
* Create the contents for the receiver.
*
* @param parent
* the Composite that the children will be created in
*/
public void createContents(final Composite parent) {
messageComposite = new Composite(parent, SWT.NONE);
final GridLayout messageLayout = new GridLayout();
messageLayout.numColumns = 2;
messageLayout.marginWidth = 0;
messageLayout.marginHeight = 0;
messageLayout.makeColumnsEqualWidth = false;
messageComposite.setLayout(messageLayout);
messageImageLabel = new Label(messageComposite, SWT.NONE);
final GridData imageData = new GridData(GridData.VERTICAL_ALIGN_CENTER);
final Image sizingImage = JFaceResources
.getImage(Dialog.DLG_IMG_MESSAGE_ERROR);
Rectangle imageBounds;
if (sizingImage == null) {
imageBounds = new Rectangle(0, 0, IDialogConstants.VERTICAL_MARGIN * 2,
IDialogConstants.VERTICAL_MARGIN * 2);
} else {
imageBounds = sizingImage.getBounds();
}
imageData.heightHint = imageBounds.height + IDialogConstants.VERTICAL_SPACING;
imageData.widthHint = imageBounds.width + IDialogConstants.HORIZONTAL_SPACING;
messageImageLabel.setLayoutData(imageData);
messageText = new Text(messageComposite, SWT.NONE);
messageText.setEditable(false);
messageText.setBackground(
parent.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
final GridData textData = new GridData(GridData.GRAB_HORIZONTAL
| GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER);
messageText.setLayoutData(textData);
hideRegion();
}
/**
* Set the layoutData for the messageArea. In most cases this will be a
* copy of the layoutData used in setTitleLayoutData.
*
* @param layoutData
* the layoutData for the message area composite.
*/
public void setMessageLayoutData(final Object layoutData) {
messageComposite.setLayoutData(layoutData);
}
/**
* Show the new message in the message text and update the image. Base
* the background color on whether or not there are errors.
*
* @param newMessage
* The new value for the message
* @param newType
* One of the IMessageProvider constants. If newType is
* IMessageProvider.NONE show the title.
* @see IMessageProvider
*/
public void updateText(final String newMessage, final int newType) {
Image newImage = null;
boolean showingError = false;
switch (newType) {
case IMessageProvider.NONE:
hideRegion();
return;
case IMessageProvider.INFORMATION:
newImage = JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO);
break;
case IMessageProvider.WARNING:
newImage = JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING);
break;
case IMessageProvider.ERROR:
newImage = JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR);
showingError = true;
break;
}
if (newMessage == null) {// No message so clear the area
hideRegion();
return;
}
showRegion();
// Any more updates required
if (newMessage.equals(messageText.getText())
&& newImage == messageImageLabel.getImage()) {
return;
}
messageImageLabel.setImage(newImage);
messageText.setText(newMessage);
if (showingError) {
setMessageColors(
JFaceColors.getErrorBackground(messageComposite.getDisplay()));
} else {
lastMessageText = newMessage;
setMessageColors(
JFaceColors.getBannerBackground(messageComposite.getDisplay()));
}
}
/**
* Show and enable the widgets in the message region
*/
private void showRegion() {
messageComposite.setVisible(true);
}
/**
* Hide the message region and clear out the caches.
*/
private void hideRegion() {
messageComposite.setVisible(false);
lastMessageText = null;
lastMessageType = IMessageProvider.NONE;
}
/**
* Set the colors of the message area.
*
* @param color
* The color to be use in the message area.
*/
private void setMessageColors(final Color color) {
messageText.setBackground(color);
messageComposite.setBackground(color);
messageImageLabel.setBackground(color);
}
/**
* Clear the error message. Restore the previously displayed message if
* there is one, if not restore the title label.
*
*/
public void clearErrorMessage() {
updateText(lastMessageText, lastMessageType);
}
}
MessageRegion fMessageRegion;
public MessageDialogPage(final Composite parent) {
createControl(parent);
}
@Override
public void createControl(final Composite parent) {
final Composite composite1 = new Composite(parent, SWT.NONE);
final GridLayout layout = new GridLayout();
layout.marginWidth = 0;
layout.marginHeight = 0;
composite1.setLayout(layout);
fMessageRegion = new MessageRegion();
fMessageRegion.createContents(composite1);
final GridData messageData = new GridData(
GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
fMessageRegion.setMessageLayoutData(messageData);
setControl(composite1);
}
@Override
public void setMessage(final String newMessage, final int newType) {
super.setMessage(newMessage, newType);
fMessageRegion.updateText(newMessage, newType);
}
@Override
public void setErrorMessage(final String newMessage) {
super.setErrorMessage(newMessage);
fMessageRegion.updateText(newMessage, IMessageProvider.ERROR);
}
}