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