blob: b4b6cdf73e129009613be0a9796b007e9ff91738 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 Oracle. 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:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.common.ui.internal.widgets;
import java.util.ListIterator;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jpt.common.utility.internal.node.Node;
import org.eclipse.jpt.common.utility.internal.node.Problem;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
/**
* This dialog is similar to it superclass, <code>Dialog</code>, with
* the added value of an error message label below the main panel. A subclass
* can set this error message as needed so that it can inform the user something
* incorrect has been entered.
* <p>
* If there is an error message, it will be shown. If there is a warning
* message, it will only be shown if there is no error message. Warning messages
* have a different icon than error messages.
*
* @version 2.0
* @since 2.0
*/
public abstract class ValidatingDialog<T extends Node> extends Dialog<T> {
/**
* Creates a new <code>ValidatingDialog</code>.
*
* @param parent The parent shell
*/
public ValidatingDialog(Shell parent) {
super(parent);
}
/**
* Creates a new <code>ValidatingDialog</code>.
*
* @param parent The parent shell
* @param title The dialog's title
*/
public ValidatingDialog(Shell parent, String title) {
super(parent, title);
}
/*
* (non-Javadoc)
*/
@Override
final Node.Validator buildValidator() {
return new Node.Validator() {
public void pause() {
}
public void resume() {
}
public void validate() {
ValidatingDialog.this.validate();
}
};
}
/**
* Clears the messages from the description pane
*/
protected final void clearMessage(){
setMessage(getDescription());
}
/**
* Clears the error message from the description pane.
*/
protected final void clearErrorMessage() {
setErrorMessage(null);
}
/**
* Returns the description shown in the description pane.
*
* @return The description under the description's title
*/
protected String getDescription() {
return null;
}
/**
* Returns the image shown in the description pane.
*
* @return The image of the description pane or <code>null</code> if none is
* required
*/
protected Image getDescriptionImage() {
return null;
}
/**
* Returns the title of the description pane.
*
* @return The title shown in the description pane
*/
protected String getDescriptionTitle() {
return null;
}
/*
* (non-Javadoc)
*/
@Override
protected Point getInitialSize() {
Point result = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);
Point paneSize = getPane().getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT);
int width = convertHorizontalDLUsToPixels(400);
result.x = Math.max(width, paneSize.x);
return result;
}
/*
* (non-Javadoc)
*/
@Override
protected final boolean hasTitleArea() {
return true;
}
/*
* (non-Javadoc)
*/
@Override
protected void initializeUI() {
super.initializeUI();
// Update the description title
String descriptionTitle = getDescriptionTitle();
if (descriptionTitle != null) {
setTitle(descriptionTitle);
}
// Update the description title
String description = getDescription();
if (description != null) {
setMessage(description);
}
// Update the description image
Image image = getDescriptionImage();
if (image != null) {
setTitleImage(image);
}
}
/**
* Updates the description pane by showing the given error message and format
* the text with the given list of arguments if any exists.
*
* @param errorMessage The error message to show in the description pane
* @param arguments The list of arguments used to format the error message
*/
protected final void setErrorMessage(String errorMessage, Object... arguments) {
setErrorMessage(NLS.bind(errorMessage, arguments));
}
/**
* Updates the description pane by showing the given warning message and format
* the text with the given list of arguments if any exists.
*
* @param warningMessage The warning message to show in the description pane
* @param arguments The list of arguments used to format the error message
*/
protected final void setWarningMessage(String warningMessage, Object... arguments) {
setMessage(NLS.bind(warningMessage, arguments), IMessageProvider.WARNING);
}
/**
* Updates the error message, either shows the first error problem or hides
* the error pane. If the progress bar is shown, then the error message will
* not be shown.
*/
private void updateMessage() {
if (getSubject().branchProblemsSize() == 0) {
clearMessage();
} else {
for (ListIterator<Problem> problems = getSubject().branchProblems(); problems.hasNext();){
Problem problem = problems.next();
if (problem.messageType() == IMessageProvider.ERROR){
this.setErrorMessage(problem.messageKey(), problem.messageArguments());
}
else if (problem.messageType() == IMessageProvider.WARNING){
this.setWarningMessage(problem.messageKey(), problem.messageArguments());
}
}
}
if (!this.containsErrorMessage()){
clearErrorMessage();
}
}
public final boolean containsErrorMessage(){
boolean error = false;
for (ListIterator<Problem> problems = getSubject().branchProblems(); problems.hasNext();){
Problem problem = problems.next();
if (problem.messageType() ==IMessageProvider.ERROR){
error = true;
}
}
return error;
}
/**
* Validates the state object and based on its status, update the description
* pane to show the first error if any exists and update the enablement of
* the OK button.
*/
private void validate() {
getSubject().validateBranch();
updateMessage();
getButton(OK).setEnabled(!containsErrorMessage());
}
}