Java tutorial
/******************************************************************************* * Copyright (c) 2008, 2013 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.jface.resource.ResourceManager; import org.eclipse.jpt.common.utility.node.Node; 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 its superclass, {@link Dialog}, 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. */ public abstract class ValidatingDialog<T extends Node> extends Dialog<T> { /** * Construct a dialog with the specified resource manager and no title. */ public ValidatingDialog(Shell parentShell, ResourceManager resourceManager) { super(parentShell, resourceManager); } /** * Construct a dialog with the specified resource manager and title. */ public ValidatingDialog(Shell parentShell, ResourceManager resourceManager, String title) { super(parentShell, resourceManager, title); } @Override final Node.Validator buildValidator() { return new Node.Validator() { public void pause() { // NOP } public void resume() { // NOP } 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<Node.Problem> problems = getSubject().branchProblems(); problems.hasNext();) { Node.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<Node.Problem> problems = getSubject().branchProblems(); problems.hasNext();) { Node.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. */ /* CU private */ void validate() { getSubject().validateBranch(); updateMessage(); getButton(OK).setEnabled(!containsErrorMessage()); } }