/*******************************************************************************
* 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 java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.layout.RowLayoutFactory;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jubula.client.core.model.IProjectPO;
import org.eclipse.jubula.client.ui.constants.Constants;
import org.eclipse.jubula.client.ui.rcp.Plugin;
import org.eclipse.jubula.client.ui.rcp.businessprocess.ProjectUIBP;
import org.eclipse.jubula.client.ui.rcp.i18n.Messages;
import org.eclipse.jubula.client.ui.rcp.provider.ControlDecorator;
import org.eclipse.jubula.client.ui.utils.DialogUtils;
import org.eclipse.jubula.client.ui.utils.LayoutUtil;
import org.eclipse.jubula.client.ui.widgets.DirectCombo;
import org.eclipse.jubula.tools.internal.constants.StringConstants;
import org.eclipse.jubula.tools.internal.i18n.I18n;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Dialog containing all information necessary to uniquely identify a project.
*
* @author BREDEX GmbH
* @created Jun 21, 2007
*/
public class ProjectDialog extends TitleAreaDialog {
/** standard logging */
private static Logger log = LoggerFactory.getLogger(TitleAreaDialog.class);
/** number of columns = 1 */
private static final int NUM_COLUMNS_1 = 1;
/** number of columns = 4 */
private static final int NUM_COLUMNS_4 = 4;
/** vertical spacing = 2 */
private static final int VERTICAL_SPACING = 2;
/** margin width = 0 */
private static final int MARGIN_WIDTH = 10;
/** margin height = 2 */
private static final int MARGIN_HEIGHT = 10;
/** width hint = 300 */
private static final int WIDTH_HINT = 300;
/** horizontal span = 3 */
private static final int HORIZONTAL_SPAN = 3;
/** The message m_text */
private String m_message;
/** the name textfield */
private DirectCombo<String> m_nameComboBox;
/** the version textfield */
private DirectCombo<String> m_versionComboBox;
/**
* Mapping from project GUIDs to project versions
*/
private Map<String, List<String>> m_guidToVersionMap;
/**
* Mapping from project data to project
*/
private Map<ProjectData, IProjectPO> m_projectMap;
/** List of project GUIDs */
private List<String> m_guidList;
/** List of project names */
private List<String> m_nameList;
/** Current list of versions */
private List<String> m_versionList;
/** result of dialog, null if nothing was selected */
private ProjectData m_selection;
/**
* <code>m_title</code> title
*/
private String m_title;
/**
* <code>m_image</code> associated image
*/
private Image m_image;
/**
* <code>m_shellTitle</code> the shell title
*/
private String m_shellTitle;
/**
* check box to select a default project and project version
*/
private Button m_defaultProject;
/**
* <code>m_isDeleteOperation</code> true if dialog is "delete project"-dialog
*/
private boolean m_isDeleteOperation = false;
/**
* check box to define if test result summary should not be deleted, when project is deleted
*/
private Button m_keepTestresultSummaryButton;
/**
* true if test result summary should not be deleted, when project is deleted
*/
private boolean m_keepTestresultSummary = false;
/**
* Value class to hold name and version info for a project.
* @author BREDEX GmbH
* @created Jun 21, 2007
*/
public static class ProjectData {
/** project guid */
private String m_guid;
/** project version */
private String m_versionString;
/**
* Constructor
* @param guid project's GUID
* @param versionString project version string
*/
public ProjectData(String guid, String versionString) {
m_guid = guid;
m_versionString = versionString;
}
/**
*
* @return version string
*/
public String getVersionString() {
return m_versionString;
}
/**
* sets the project version
* @param version the project version
*/
public void setVersionString(String version) {
m_versionString = version;
}
/**
*
* @return GUID
*/
public String getGUID() {
return m_guid;
}
/**
* sets the project name
* @param guid the projects GUID
*/
public void setGUID(String guid) {
m_guid = guid;
}
/**
*
* {@inheritDoc}
*/
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof ProjectData)) {
return false;
}
ProjectData otherData = (ProjectData)obj;
return new EqualsBuilder().append(getGUID(), otherData.getGUID())
.append(getVersionString(), otherData.getVersionString())
.isEquals();
}
/**
*
* {@inheritDoc}
*/
public int hashCode() {
return new HashCodeBuilder().append(getGUID())
.append(getVersionString())
.toHashCode();
}
}
/**
* @param parentShell The parent shell.
* @param projectList list of available projects
* @param message message m_text
* @param title title
* @param image name of image
* @param shellTitle shell title
* @param isDeleteAction true if dialog is "delete project"-dialog
*/
public ProjectDialog(
Shell parentShell, List<IProjectPO> projectList, String message,
String title, Image image, String shellTitle, boolean isDeleteAction) {
super(parentShell);
m_guidToVersionMap =
new HashMap<String, List<String>>();
m_projectMap = new HashMap<ProjectData, IProjectPO>();
m_guidList = new ArrayList<String>();
m_nameList = new ArrayList<String>();
m_versionList = new ArrayList<String>();
for (IProjectPO proj : projectList) {
String projGUID = proj.getGuid();
String projVersion = proj.getVersionString();
if ((projGUID != null) && (projVersion != null)) { // protect
// against racing
// conditions in
// DB
if (!m_guidToVersionMap.containsKey(projGUID)) {
m_nameList.add(proj.getName());
m_guidList.add(projGUID);
m_guidToVersionMap.put(projGUID, new ArrayList<String>());
}
m_guidToVersionMap.get(projGUID).add(projVersion);
m_projectMap.put(new ProjectData(projGUID, projVersion), proj);
} else {
log.warn(Messages.ProjectWithGUID + StringConstants.SPACE
+ proj.getGuid() + StringConstants.SPACE
+ Messages.HasNoName + StringConstants.DOT);
}
}
m_message = message;
m_title = title;
m_image = image;
m_shellTitle = shellTitle;
m_isDeleteOperation = isDeleteAction;
}
/**
* {@inheritDoc}
*/
protected Control createDialogArea(Composite parent) {
setMessage(m_message);
setTitle(m_title);
setTitleImage(m_image);
getShell().setText(m_shellTitle);
// new Composite as container
final GridLayout gridLayoutParent = new GridLayout();
gridLayoutParent.numColumns = NUM_COLUMNS_1;
gridLayoutParent.verticalSpacing = VERTICAL_SPACING;
gridLayoutParent.marginWidth = MARGIN_WIDTH;
gridLayoutParent.marginHeight = MARGIN_HEIGHT;
parent.setLayout(gridLayoutParent);
LayoutUtil.createSeparator(parent);
Composite area = new Composite(parent, SWT.NONE);
final GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = NUM_COLUMNS_4;
area.setLayout(gridLayout);
GridData gridData = new GridData();
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
gridData.horizontalAlignment = GridData.FILL;
gridData.verticalAlignment = GridData.FILL;
gridData.widthHint = WIDTH_HINT;
area.setLayoutData(gridData);
createComboBoxes(area);
createDefaultProjectCheckbox(area);
if (m_isDeleteOperation) {
createDeleteTestresultsCheckbox(area);
}
LayoutUtil.createSeparator(parent);
return area;
}
/**
* @param composite the parent composite
*/
private void createDeleteTestresultsCheckbox(Composite composite) {
m_keepTestresultSummaryButton = new Button(composite, SWT.CHECK);
m_keepTestresultSummaryButton.setText(
Messages.DeleteProjectActionKeepTestresultSummaryCheckbox);
m_keepTestresultSummaryButton.setSelection(false);
GridData data = new GridData();
data.horizontalSpan = HORIZONTAL_SPAN;
m_keepTestresultSummaryButton.setLayoutData(data);
ControlDecorator.createInfo(m_keepTestresultSummaryButton,
I18n.getString("ControlDecorator.KeepTestresultSummary"), false); //$NON-NLS-1$
}
/**
* @param parent
* The parent composite.
*/
private void createComboBoxes(Composite parent) {
createEmptyLabel(parent);
new Label(parent, SWT.NONE).setText(Messages.OpenProjectActionLabel);
m_nameComboBox = new DirectCombo<String>(parent, SWT.SINGLE | SWT.BORDER
| SWT.READ_ONLY, m_guidList, m_nameList, false, true);
GridData gridData = newGridData();
LayoutUtil.addToolTipAndMaxWidth(gridData, m_nameComboBox);
m_nameComboBox.setLayoutData(gridData);
m_nameComboBox.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
m_versionList = m_guidToVersionMap.get(
m_nameComboBox.getSelectedObject());
m_versionComboBox.setItems(m_versionList, m_versionList);
m_versionComboBox.select(m_versionComboBox.getItemCount() - 1);
enableOKButton();
}
public void widgetDefaultSelected(SelectionEvent e) {
// do nothing
}
});
if (m_nameComboBox.getItemCount() > 0) {
m_nameComboBox.select(0);
}
m_versionList = m_guidToVersionMap.get(
m_nameComboBox.getSelectedObject());
createEmptyLabel(parent);
new Label(parent, SWT.NONE).setText(Messages.OpenProjectActionLabel2);
m_versionComboBox =
new DirectCombo<String>(parent, SWT.SINGLE | SWT.BORDER
| SWT.READ_ONLY, m_versionList, m_versionList, false,
new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
gridData = new GridData();
gridData.grabExcessHorizontalSpace = false;
gridData.horizontalAlignment = GridData.FILL;
gridData.horizontalSpan = HORIZONTAL_SPAN;
m_versionComboBox.setLayoutData(gridData);
m_versionComboBox.select(m_versionComboBox.getItemCount() - 1);
m_versionComboBox.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
enableOKButton();
}
public void widgetDefaultSelected(SelectionEvent e) {
// do nothing
}
});
}
/**
* Creates the check box to select a default project and project version
*
* @param composite the parent composite
*/
private void createDefaultProjectCheckbox(Composite composite) {
if (!m_isDeleteOperation) {
createEmptyLabel(composite);
new Label(composite, SWT.NONE).setLayoutData(new GridData(
GridData.FILL, GridData.CENTER, false, false,
HORIZONTAL_SPAN, 1));
IPreferenceStore prefs = Plugin.getDefault().getPreferenceStore();
Composite checkLinkComposite = new Composite(composite, SWT.NONE);
checkLinkComposite.setLayout(RowLayoutFactory.fillDefaults()
.spacing(0).create());
m_defaultProject = new Button(checkLinkComposite, SWT.CHECK);
m_defaultProject.setSelection(prefs.getBoolean(
Constants.PERFORM_AUTO_PROJECT_LOAD_KEY));
DialogUtils.createLinkToSecureStoragePreferencePage(
checkLinkComposite,
Messages.OpenProjectDialogDefaultProjectCheckbox);
}
}
/**
* @param composite
* the parent composite to use
*/
private void createEmptyLabel(Composite composite) {
new Label(composite, SWT.NONE).setLayoutData(new GridData(
GridData.FILL, GridData.CENTER, false, false,
HORIZONTAL_SPAN + 1, 1));
}
/**
* enables the OK button
*/
public void enableOKButton() {
if (getButton(IDialogConstants.OK_ID) != null) {
getButton(IDialogConstants.OK_ID).setEnabled(true);
}
setMessage(m_message);
}
/**
* This method is called, when the OK button was pressed
*/
protected void okPressed() {
m_selection = new ProjectData(m_nameComboBox.getSelectedObject(),
m_versionComboBox.getSelectedObject());
final ProjectUIBP defaultProject = ProjectUIBP.getInstance();
if (m_isDeleteOperation) {
m_keepTestresultSummary = m_keepTestresultSummaryButton
.getSelection();
} else if (m_defaultProject.getSelection()) {
defaultProject.saveMostRecentProjectData(m_selection);
}
setReturnCode(OK);
close();
}
/**
* Creates a new GridData.
* @return grid data
*/
private GridData newGridData() {
GridData gridData = new GridData();
gridData.grabExcessHorizontalSpace = true;
gridData.horizontalAlignment = GridData.FILL;
gridData.horizontalSpan = HORIZONTAL_SPAN;
return gridData;
}
/**
* @return Returns the selection.
*/
public ProjectData getSelection() {
return m_selection;
}
/**
* @return Returns true, if test result summary should not be deleted.
*/
public boolean keepTestresultSummary() {
return m_keepTestresultSummary;
}
}