org.eclipse.jpt.common.ui.internal.widgets.ValidatingDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jpt.common.ui.internal.widgets.ValidatingDialog.java

Source

/*******************************************************************************
 * 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());
    }
}