/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.editor;
import java.io.File;
import java.util.Arrays;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TreeItem;
import de.rcenvironment.core.gui.utils.incubator.AlphanumericalTextContraintListener;
/**
* This page handles the association of a new workflow with a project. The
* workflow can be placed in an existing project or in a project that is created
* on the fly.
*
* @author Oliver Seebach
*/
final class ProjectSelectionPage extends WizardPage {
private static final char[] FORBIDDEN_CHARS = new char[] { '/', '\\', ':',
'*', '?', '\"', '>', '<', '|' };
private static final int TEXT_WIDTH = 100;
private static final int TREE_HEIGHT = 200;
private static final int TREE_WIDTH = 100;
private static final int LIST_HEIGHT = 200;
private static final int PANEL_HEIGHT = 250;
private static final int DIALOGWINDOWIDTH = 500;
private static final int BORDERSIZE = 5;
private ProjectUsages usage;
private TreeViewer projectTreeViewer;
private IStructuredSelection selection;
private Text projectNameTextField;
private Button newProjectRadioButton;
private Button existingProjectRadioButton;
private Button useDefaultNameButton;
private String workflowName;
ProjectSelectionPage(final NewWorkflowProjectWizard parentWizard,
final IStructuredSelection selection) {
super("Project");
this.selection = selection;
setTitle("Project");
setDescription("Place the workflow in a project");
}
private void dialogChanged() {
final String newProjectName = getProjectNameTextField().getText();
if (newProjectName.length() == 0
&& newProjectRadioButton.getSelection()) {
updateStatus("Please chose a name for the new project");
return;
}
if (newProjectName.length() > 0) {
IProject existingProject = ResourcesPlugin.getWorkspace().getRoot()
.getProject(newProjectName);
if (existingProject != null && existingProject.exists()
&& newProjectRadioButton.getSelection()) {
updateStatus("This project name is already in use");
return;
}
}
updateStatus(null);
}
private void updateStatus(String message) {
setErrorMessage(message);
if (message == null) {
NewWorkflowProjectWizard.allowFinish();
} else {
NewWorkflowProjectWizard.preventFinish();
}
setPageComplete(message == null);
}
private void createExistingProjectPanel(Composite parent) {
// ------------------
// EXISTING PROJECT STUFF
// ------------------
GridLayout existingGrid = new GridLayout(1, false);
// composite
GridData existingGridDataComp = new GridData();
existingGridDataComp.widthHint = (DIALOGWINDOWIDTH / 2) - BORDERSIZE;
existingGridDataComp.heightHint = PANEL_HEIGHT;
existingGridDataComp.verticalAlignment = GridData.BEGINNING;
existingGridDataComp.horizontalAlignment = GridData.BEGINNING;
existingGridDataComp.grabExcessVerticalSpace = true;
// radiobutton
GridData existingGridDataRadio = new GridData();
existingGridDataRadio.widthHint = (DIALOGWINDOWIDTH / 2) - 2
* BORDERSIZE;
existingGridDataRadio.verticalAlignment = GridData.BEGINNING;
existingGridDataRadio.horizontalAlignment = GridData.BEGINNING;
existingGridDataRadio.grabExcessVerticalSpace = true;
// list
GridData existingGridDataList = new GridData();
existingGridDataList.widthHint = (DIALOGWINDOWIDTH / 2) - 7
* BORDERSIZE;
existingGridDataList.heightHint = LIST_HEIGHT;
existingGridDataList.verticalAlignment = GridData.BEGINNING;
existingGridDataList.horizontalAlignment = GridData.BEGINNING;
existingGridDataList.grabExcessVerticalSpace = true;
existingGridDataList.grabExcessHorizontalSpace = true;
Composite existingProjectComposite = new Composite(parent, SWT.BORDER);
existingProjectComposite.setLayout(existingGrid);
existingProjectComposite.setLayoutData(existingGridDataComp);
setExistingProjectRadioButton(new Button(existingProjectComposite,
SWT.RADIO));
getExistingProjectRadioButton().setText("Place in existing project");
getExistingProjectRadioButton().setVisible(true);
getExistingProjectRadioButton().setLayoutData(existingGridDataRadio);
projectTreeViewer = new TreeViewer(existingProjectComposite, SWT.SINGLE
| SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
projectTreeViewer.setContentProvider(new ProjectTreeContentProvider());
projectTreeViewer.setLabelProvider(new ProjectTreeLabelProvider());
projectTreeViewer.setInput(File.listRoots());
projectTreeViewer.getTree().setSize(TREE_WIDTH, TREE_HEIGHT);
projectTreeViewer.getTree().setLayoutData(existingGridDataList);
setControl(existingProjectComposite);
}
private void createNewProjectPanel(Composite parent) {
// ------------------
// NEW PROJECT STUFF
// ------------------
GridLayout newGrid = new GridLayout(1, false);
GridData newGridDataComp = new GridData();
newGridDataComp.widthHint = (DIALOGWINDOWIDTH / 2) - BORDERSIZE;
newGridDataComp.heightHint = PANEL_HEIGHT;
newGridDataComp.verticalAlignment = GridData.BEGINNING;
newGridDataComp.horizontalAlignment = GridData.BEGINNING;
newGridDataComp.grabExcessVerticalSpace = false;
GridData newGridDataRadio = new GridData();
newGridDataRadio.widthHint = (DIALOGWINDOWIDTH / 2) - BORDERSIZE;
newGridDataRadio.verticalAlignment = GridData.BEGINNING;
newGridDataRadio.horizontalAlignment = GridData.BEGINNING;
GridData newGridDataCheck = new GridData();
newGridDataCheck.widthHint = (DIALOGWINDOWIDTH / 2) - BORDERSIZE;
newGridDataCheck.verticalAlignment = GridData.BEGINNING;
newGridDataCheck.horizontalAlignment = GridData.BEGINNING;
GridData newGridDataLabel = new GridData();
newGridDataLabel.widthHint = (DIALOGWINDOWIDTH / 2) - BORDERSIZE;
newGridDataLabel.verticalAlignment = GridData.BEGINNING;
newGridDataLabel.horizontalAlignment = GridData.BEGINNING;
GridData newGridDataText = new GridData();
newGridDataText.widthHint = (DIALOGWINDOWIDTH / 2) - 10 * BORDERSIZE;
newGridDataText.minimumWidth = TEXT_WIDTH;
newGridDataText.verticalAlignment = GridData.BEGINNING;
newGridDataText.horizontalAlignment = GridData.BEGINNING;
newGridDataText.grabExcessHorizontalSpace = true;
Composite newProjectComposite = new Composite(parent, SWT.BORDER);
newProjectComposite.setLayout(newGrid);
newProjectComposite.setLayoutData(newGridDataComp);
setNewProjectRadioButton(new Button(newProjectComposite, SWT.RADIO));
getNewProjectRadioButton().setText("Place in new project");
getNewProjectRadioButton().setLayoutData(newGridDataRadio);
getNewProjectRadioButton().setVisible(true);
if (ResourcesPlugin.getWorkspace().getRoot().getProjects().length > 0) {
getNewProjectRadioButton().setSelection(false);
getExistingProjectRadioButton().setSelection(true);
setUsage(ProjectUsages.EXISTING);
} else {
getNewProjectRadioButton().setSelection(true);
getExistingProjectRadioButton().setSelection(false);
setUsage(ProjectUsages.NEW);
}
useDefaultNameButton = new Button(newProjectComposite, SWT.CHECK);
useDefaultNameButton.setSelection(true);
useDefaultNameButton.setText("Use default project name");
useDefaultNameButton.setEnabled(getNewProjectRadioButton()
.getSelection());
useDefaultNameButton.setVisible(true);
useDefaultNameButton.setLayoutData(newGridDataCheck);
Label projectNameLabel = new Label(newProjectComposite, SWT.NONE);
projectNameLabel.setText("Project name: ");
projectNameLabel.setVisible(true);
projectNameLabel.setLayoutData(newGridDataLabel);
setProjectNameTextField(new Text(newProjectComposite, SWT.SINGLE
| SWT.BORDER));
projectNameTextField.setEnabled(false);
projectNameTextField.setVisible(true);
projectNameTextField.setLayoutData(newGridDataText);
projectNameTextField.addListener(SWT.Verify, new AlphanumericalTextContraintListener(false, true));
projectNameTextField.addListener(SWT.Verify, new AlphanumericalTextContraintListener(FORBIDDEN_CHARS));
projectNameTextField.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent arg0) {
dialogChanged();
}
});
if (NewWorkflowProjectWizard.sharedWorkflowName != null){
projectNameTextField.setText(NewWorkflowProjectWizard.sharedWorkflowName);
}
setControl(newProjectComposite);
}
@Override
public void createControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
comp.setLayout(new GridLayout(2, false));
// create gui and register listeners
createExistingProjectPanel(comp);
createNewProjectPanel(comp);
registerListeners();
handleInitialTreeSelection();
}
private void handleInitialTreeSelection() {
boolean useExistingProject = false;
if (this.selection != null) {
useExistingProject = true;
if (this.selection.getFirstElement() != null) {
useExistingProject = true;
} else {
useExistingProject = false;
}
}
if (useExistingProject) {
if (this.selection.size() == 1
&& this.selection.getFirstElement() instanceof IProject) {
// (a) Project selected
projectTreeViewer.setSelection(selection);
getExistingProjectRadioButton().setSelection(true);
getNewProjectRadioButton().setSelection(false);
} else if (this.selection.size() == 1
&& this.selection.getFirstElement() instanceof IFolder) {
// (b) Folder selected
IFolder folder = (IFolder) this.selection.getFirstElement();
String pathToExpand2 = folder.getFullPath().toOSString()
.substring(1);
java.util.List<String> pathToExpand = Arrays
.asList(pathToExpand2.split("\\\\"));
TreeItem[] currentCandidates = projectTreeViewer.getTree()
.getItems();
TreeItem lastItem = null;
for (String segment : pathToExpand) {
TreeItem matchedItem = null;
for (TreeItem item : currentCandidates) {
if (item.getText().equals(segment)) {
item.setExpanded(true);
matchedItem = item;
projectTreeViewer.refresh();
break;
}
}
if (matchedItem != null) {
currentCandidates = matchedItem.getItems();
lastItem = matchedItem;
}
}
if (lastItem != null) {
projectTreeViewer.getTree().setSelection(lastItem);
}
projectTreeViewer.refresh();
getExistingProjectRadioButton().setSelection(true);
getNewProjectRadioButton().setSelection(false);
} else if (this.selection.size() == 1
&& this.selection.getFirstElement() instanceof IFile) {
// (c) File selected
IFile file = (IFile) this.selection.getFirstElement();
IStructuredSelection iss = new StructuredSelection(
file.getProject());
projectTreeViewer.setSelection(iss);
getExistingProjectRadioButton().setSelection(true);
getNewProjectRadioButton().setSelection(false);
} else {
// None of this selected, but selection not null (e.g.
// WorkflowPart counts as not null)
activateExistingProjectPart();
}
} else {
// Selection null (e.g. Focus on ProjectExplorer counts as selection
// null)
activateExistingProjectPart();
}
// in case workspace contains no projects so far
if (projectTreeViewer.getTree().getItemCount() == 0) {
getExistingProjectRadioButton().setEnabled(false);
projectTreeViewer.getTree().setEnabled(false);
getNewProjectRadioButton().setSelection(true);
}
}
private void registerListeners() {
newProjectRadioButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
if (getNewProjectRadioButton().getSelection()) {
if (NewWorkflowProjectWizard.sharedWorkflowName != null){
getProjectNameTextField().setText(NewWorkflowProjectWizard.sharedWorkflowName);
}
useDefaultNameButton.setEnabled(true);
getExistingProjectRadioButton().setSelection(false);
projectTreeViewer.getTree().setEnabled(false);
setUsage(ProjectUsages.NEW);
dialogChanged();
}
}
});
existingProjectRadioButton.addSelectionListener(
new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
getNewProjectRadioButton().setSelection(false);
useDefaultNameButton.setEnabled(false);
projectTreeViewer.getTree().setEnabled(true);
if (projectTreeViewer.getTree().getSelection().length == 0) {
projectTreeViewer.getTree().setSelection(
projectTreeViewer.getTree().getItem(0));
}
NewWorkflowProjectWizard.setWorkbenchSelection(new StructuredSelection(
projectTreeViewer.getSelection()));
setUsage(ProjectUsages.EXISTING);
dialogChanged();
}
});
useDefaultNameButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
// if checked -> enabled+editable , else -> disable+non-editable
boolean selectionState = useDefaultNameButton.getSelection();
getProjectNameTextField().setEditable(!selectionState);
getProjectNameTextField().setEnabled(!selectionState);
}
});
projectTreeViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
NewWorkflowProjectWizard.setWorkbenchSelection((IStructuredSelection) event.getSelection());
}
});
}
private void activateExistingProjectPart() {
getNewProjectRadioButton().setSelection(true);
getExistingProjectRadioButton().setSelection(false);
if (workflowName != null){
getProjectNameTextField().setText(workflowName);
}
}
public Text getProjectNameTextField() {
return projectNameTextField;
}
public void setProjectNameTextField(Text projectNameTextField) {
this.projectNameTextField = projectNameTextField;
}
public ProjectUsages getUsage() {
return usage;
}
public void setUsage(ProjectUsages usage) {
this.usage = usage;
}
public Button getNewProjectRadioButton() {
return newProjectRadioButton;
}
public void setNewProjectRadioButton(Button newProjectRadioButton) {
this.newProjectRadioButton = newProjectRadioButton;
}
public Button getExistingProjectRadioButton() {
return existingProjectRadioButton;
}
public void setExistingProjectRadioButton(Button existingProjectRadioButton) {
this.existingProjectRadioButton = existingProjectRadioButton;
}
}