org.eclipse.jubula.client.ui.rcp.dialogs.VersionComposite.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jubula.client.ui.rcp.dialogs.VersionComposite.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2010 BREDEX GmbH.
 * 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:
 *     BREDEX GmbH - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.jubula.client.ui.rcp.dialogs;

import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jubula.client.core.model.ProjectVersion;
import org.eclipse.jubula.client.ui.rcp.i18n.Messages;
import org.eclipse.jubula.client.ui.rcp.widgets.CheckedIntText;
import org.eclipse.jubula.client.ui.rcp.widgets.CheckedProjectNameText;
import org.eclipse.jubula.client.ui.utils.LayoutUtil;
import org.eclipse.jubula.tools.internal.constants.StringConstants;
import org.eclipse.jubula.tools.internal.constants.SwtToolkitConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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;

/**
 * 
 * @author BREDEX GmbH
 *
 */
public abstract class VersionComposite extends Composite {

    /** TextField for the project name */
    private Text m_projectNameField;
    /** TextField for the project version qualifier */
    private Text m_versionQualifierField;
    /** TextField for the project major version */
    private Text m_majorVersionField;
    /** TextField for the project minor version */
    private Text m_minorVersionField;
    /** TextField for the project micro version */
    private Text m_microVersionField;

    /** is everything right? */
    private boolean m_okAllowed = false;
    /** max length*/
    private int m_length = 255;

    /**
     * 
     * @param parent parent
     * @param style swt style
     * @param version the {@link ProjectVersion} which should be used as initial input
     */
    public VersionComposite(Composite parent, int style, ProjectVersion version) {
        this(parent, style, version, false);
    }

    /**
     * 
     * @param parent parent
     * @param style swt style
     * @param version the {@link ProjectVersion} which should be used as initial input
     * @param withNameField should there be the project name field?
     */
    public VersionComposite(Composite parent, int style, ProjectVersion version, boolean withNameField) {
        super(parent, style);
        final GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 4;
        this.setLayout(gridLayout);
        GridData gridData = new GridData();
        gridData.grabExcessHorizontalSpace = false;
        gridData.grabExcessVerticalSpace = true;
        gridData.horizontalAlignment = GridData.FILL;
        gridData.verticalAlignment = GridData.BEGINNING;
        this.setLayoutData(gridData);
        createNameField(this, withNameField);
        createVersionFields(this, version);
        checkIfVersionsAreCorrect();
        checkAndModifyEnablementOfFields();
    }

    /**
     * creates the project name field
     * @param composite parent
     * @param withName true if the name field should be created
     */
    private void createNameField(Composite composite, boolean withName) {
        if (!withName) {
            return;
        }
        GridData gridData = newGridData();
        new Label(composite, SWT.NONE).setText(Messages.SaveProjectAsActionLabel);
        m_projectNameField = new CheckedProjectNameText(composite, SWT.SINGLE | SWT.BORDER);
        gridData = newGridData();
        LayoutUtil.addToolTipAndMaxWidth(gridData, m_projectNameField);
        gridData.widthHint = 0;
        gridData.horizontalSpan = 3;
        gridData.horizontalAlignment = GridData.FILL;
        m_projectNameField.setLayoutData(gridData);
        m_projectNameField.setText(StringUtils.defaultString(null));
        m_projectNameField.setData(SwtToolkitConstants.WIDGET_NAME, "VersionComposite.ProjectNameField"); //$NON-NLS-1$
        LayoutUtil.setMaxChar(m_projectNameField, m_length);
        m_projectNameField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                modifyVersionFieldAction();
            }
        });

    }

    /**
     * @param area The composite. creates the text field to edit the TestSuite name.
     * @param version the inital version for the fields
     */
    private void createVersionFields(Composite area, ProjectVersion version) {
        new Label(area, SWT.NONE).setText(Messages.CreateNewProjectVersionActionVersionNumbers);
        m_majorVersionField = new CheckedIntText(area, SWT.SINGLE | SWT.BORDER, true, 0, Integer.MAX_VALUE);
        GridData gridData = newGridData();
        LayoutUtil.addToolTipAndMaxWidth(gridData, m_majorVersionField);
        gridData.widthHint = Dialog.convertWidthInCharsToPixels(LayoutUtil.getFontMetrics(m_majorVersionField), 10);
        m_majorVersionField.setLayoutData(gridData);
        m_majorVersionField.setText(version.getMajorNumber() != null ? String.valueOf(version.getMajorNumber())
                : StringConstants.EMPTY);
        LayoutUtil.setMaxChar(m_majorVersionField, m_length);
        m_majorVersionField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                modifyVersionFieldAction();
            }
        });
        m_majorVersionField.setData(SwtToolkitConstants.WIDGET_NAME, "VersionComposite.MajorVersionField"); //$NON-NLS-1$

        m_minorVersionField = new CheckedIntText(area, SWT.SINGLE | SWT.BORDER, true, 0, Integer.MAX_VALUE);
        gridData = newGridData();
        LayoutUtil.addToolTipAndMaxWidth(gridData, m_minorVersionField);
        gridData.widthHint = Dialog.convertWidthInCharsToPixels(LayoutUtil.getFontMetrics(m_minorVersionField), 10);
        m_minorVersionField.setLayoutData(gridData);
        m_minorVersionField.setText(version.getMinorNumber() != null ? String.valueOf(version.getMinorNumber())
                : StringConstants.EMPTY);
        LayoutUtil.setMaxChar(m_minorVersionField, m_length);
        m_minorVersionField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                modifyVersionFieldAction();
            }
        });
        m_minorVersionField.setData(SwtToolkitConstants.WIDGET_NAME, "VersionComposite.MinorVersionField"); //$NON-NLS-1$
        m_microVersionField = new CheckedIntText(area, SWT.SINGLE | SWT.BORDER, true, 0, Integer.MAX_VALUE);
        gridData = newGridData();
        LayoutUtil.addToolTipAndMaxWidth(gridData, m_microVersionField);
        gridData.widthHint = Dialog.convertWidthInCharsToPixels(LayoutUtil.getFontMetrics(m_microVersionField), 10);
        m_microVersionField.setLayoutData(gridData);
        m_microVersionField.setText(version.getMicroNumber() != null ? String.valueOf(version.getMicroNumber())
                : StringConstants.EMPTY);
        LayoutUtil.setMaxChar(m_microVersionField, m_length);
        m_microVersionField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                modifyVersionFieldAction();
            }
        });
        m_microVersionField.setData(SwtToolkitConstants.WIDGET_NAME, "VersionComposite.MicroVersionField"); //$NON-NLS-1$
        new Label(area, SWT.NONE).setText(Messages.CreateNewProjectVersionActionQualifierLabel);
        m_versionQualifierField = new Text(area, SWT.SINGLE | SWT.BORDER);
        gridData = newGridData();
        LayoutUtil.addToolTipAndMaxWidth(gridData, m_versionQualifierField);
        gridData.widthHint = 0;
        gridData.horizontalSpan = 3;
        gridData.horizontalAlignment = GridData.FILL;
        m_versionQualifierField.setLayoutData(gridData);
        m_versionQualifierField
                .setText(StringUtils.defaultIfBlank(version.getVersionQualifier(), StringConstants.EMPTY));
        LayoutUtil.setMaxChar(m_versionQualifierField, m_length);
        m_versionQualifierField.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                modifyVersionFieldAction();
            }
        });
        m_versionQualifierField.setData(SwtToolkitConstants.WIDGET_NAME, "VersionComposite.VersionQualifierField"); //$NON-NLS-1$
    }

    /**
     * Creates a new GridData.
     * @return grid data
     */
    private GridData newGridData() {
        GridData gridData = new GridData();
        gridData.grabExcessHorizontalSpace = false;
        gridData.horizontalAlignment = GridData.BEGINNING;
        gridData.horizontalSpan = 1;
        return gridData;
    }

    /**
     * Ask if this version is allowed as a change.
     * This method is also used to set the error message of the dialog
     * @return true if the chosen version can be created
     */
    public abstract Boolean isChangeAllowed();

    /**
     * sets the message of the dialog if it is necessary
     * @param string message
     */
    public abstract void setMessage(String string);

    /**
     * this is called after {@link #modifyVersionFieldAction()} to give the
     * implementing composite the change to react on changes
     */
    public abstract void modifiedAction();

    /**
     * the action of a version field
     * @return false, if one of the fields contains an error
     */
    public boolean modifyVersionFieldAction() {
        boolean isCorrect = checkIfVersionsAreCorrect();
        checkAndModifyEnablementOfFields();
        if (isCorrect) {
            m_okAllowed = true;
            if (!isChangeAllowed()) {
                m_okAllowed = false;
                isCorrect = false;
            }
        } else {
            m_okAllowed = false;
        }
        modifiedAction();
        return isCorrect;
    }

    /**
     * Enables and disables version number fields so that the number sequence is correct
     */
    private void checkAndModifyEnablementOfFields() {
        if (StringUtils.isBlank(m_majorVersionField.getText())) {
            m_minorVersionField.setEnabled(false);
            m_microVersionField.setEnabled(false);
        } else {
            m_minorVersionField.setEnabled(true);
        }
        if (StringUtils.isBlank(m_minorVersionField.getText()) || !m_minorVersionField.isEnabled()) {
            m_microVersionField.setEnabled(false);
        } else {
            m_microVersionField.setEnabled(true);
        }

    }

    /**
     * Checks for some conditions which are not correct
     * @return true if everything is okay
     */
    private boolean checkIfVersionsAreCorrect() {
        boolean isCorrect = false;
        try {
            isCorrect = (StringUtils.isNotBlank(m_majorVersionField.getText())
                    || StringUtils.isNotBlank(m_versionQualifierField.getText()));
            if (isCorrect && StringUtils.isNotBlank(m_minorVersionField.getText())) {
                isCorrect = StringUtils.isNotBlank(m_majorVersionField.getText());
            }
            if (isCorrect && StringUtils.isNotBlank(m_microVersionField.getText())) {
                isCorrect = StringUtils.isNotBlank(m_minorVersionField.getText())
                        && StringUtils.isNotBlank(m_majorVersionField.getText());
            }

        } catch (NumberFormatException nfe) {
            // Do nothing, the input is not correct and isCorrect remains false
        }
        if (!isCorrect) {
            setMessage(Messages.CreateNewProjectVersionActionInvalidVersion);
        }
        return isCorrect;
    }

    /**
     * @return Returns the text of the input field.
     */
    public Integer getMajorFieldValue() {
        Integer value = null;
        try {
            value = Integer.parseInt(m_majorVersionField.getText());
        } catch (NumberFormatException nfe) {
            // This must not be handled
        }
        return value;
    }

    /**
     * @return Returns the text of the input field.
     */
    public Integer getMinorFieldValue() {
        Integer value = null;
        try {
            if (m_minorVersionField.isEnabled()) {
                value = Integer.parseInt(m_minorVersionField.getText());
            }
        } catch (NumberFormatException nfe) {
            // This must not be handled
        }
        return value;
    }

    /**
     * @return Returns the text of the input field.
     */
    public Integer getMicroFieldValue() {
        Integer value = null;
        try {
            if (m_microVersionField.isEnabled()) {
                value = Integer.parseInt(m_microVersionField.getText());
            }
        } catch (NumberFormatException nfe) {
            // This must not be handled
        }
        return value;
    }

    /**
     * @return Returns the text of the input field.
     */
    public String getQualifierFieldValue() {
        if (StringUtils.isBlank(m_versionQualifierField.getText())) {
            return null;
        }
        return StringUtils.trim(m_versionQualifierField.getText());
    }

    /**
     * @return Returns the text of the project name field.
     */
    public String getProjectNameFieldValue() {
        if (m_projectNameField != null) {
            return m_projectNameField.getText();
        }
        return StringConstants.EMPTY;
    }

    /**
     * @return if the ok button should be active
     */
    public boolean isOKAllowed() {
        return m_okAllowed;
    }

    /**
     * @return the projectVersion generated from the field values
     */
    public ProjectVersion getVersion() {
        return new ProjectVersion(getMajorFieldValue(), getMinorFieldValue(), getMicroFieldValue(),
                getQualifierFieldValue());
    }
}