/*******************************************************************************
* Copyright (c) 2006, 2009 University of Edinburgh.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the BSD Licence, which
* accompanies this feature and can be downloaded from
* http://groups.inf.ed.ac.uk/pepa/update/licence.txt
*******************************************************************************/
package uk.ac.ed.inf.common.ui.wizards.internal;
import java.util.Map;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizard;
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.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.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;
import uk.ac.ed.inf.common.launching.ILaunchingConstants;
import uk.ac.ed.inf.common.ui.wizards.PassageTimeAnalysisWizard;
public class FileLocationPage extends WizardPage implements IUpdatable {
private Map<String, String> optionMap = null;
private Text outputFolderWorkspaceLoc = null;
public FileLocationPage(String pageName) {
super(pageName);
setTitle("Output Settings");
setDescription("Select location for intermediate PEPA models.");
}
public void setWizard(IWizard wizard) {
super.setWizard(wizard);
/* change current option map */
optionMap = ((PassageTimeAnalysisWizard) wizard).getOptionMap();
}
/* Updates the option map with the new key,values pairs */
public void update() {
if (!isControlCreated())
return;
optionMap.put(ILaunchingConstants.SRMC_OUTPUT_DIR, ResourcesPlugin
.getWorkspace().getRoot().getFolder(
new Path(outputFolderWorkspaceLoc.getText()))
.getLocation().toOSString());
}
public void createControl(Composite parent) {
Composite main = new Composite(parent, SWT.NONE);
GridLayout selectionLayout = new GridLayout();
selectionLayout.numColumns = 1;
selectionLayout.makeColumnsEqualWidth = false;
main.setLayout(selectionLayout);
setControl(main);
ModifyListener listener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
updatePage();
}
};
/*
* OTHER FILES LOCATION
*/
Group dataGroup = new Group(main, SWT.SHADOW_OUT);
dataGroup.setText("Output Files");
dataGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
GridLayout dataLayout = new GridLayout(3, false);
dataGroup.setLayout(dataLayout);
/*
* OUTPUT LOCATION
*/
outputFolderWorkspaceLoc = new Text(dataGroup, SWT.BORDER);
outputFolderWorkspaceLoc.setLayoutData(new GridData(
GridData.FILL_HORIZONTAL));
outputFolderWorkspaceLoc.addModifyListener(listener);
Button browseWorkspaceFolder = new Button(dataGroup, SWT.PUSH);
browseWorkspaceFolder.setText("Workspace...");
browseWorkspaceFolder.setLayoutData(new GridData());
browseWorkspaceFolder.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
ContainerSelectionDialog d = new ContainerSelectionDialog(
outputFolderWorkspaceLoc.getShell(), ResourcesPlugin
.getWorkspace().getRoot(), false,
"Select directory to save output files to");
if (d.open() == Window.OK) {
Object[] resultArray = d.getResult();
if (resultArray.length > 0) {
if (resultArray[0] instanceof Path) {
String fileLoc = ((Path) resultArray[0]).toString();
outputFolderWorkspaceLoc.setText(fileLoc);
}
}
}
}
});
initialiseComponents();
}
/*
* Called after they're created, initialise with the current optionMap.
*/
private void initialiseComponents() {
String currentPath = (String) optionMap
.get(ILaunchingConstants.SRMC_OUTPUT_DIR);
if (currentPath == null)
outputFolderWorkspaceLoc
.setText(((PassageTimeAnalysisWizard) getWizard())
.getInputFile().getParent().getFullPath().append(
"tmp").toString());
else {
IContainer container = ResourcesPlugin.getWorkspace().getRoot()
.getContainerForLocation(new Path(currentPath));
if (container != null && container instanceof IFolder)
outputFolderWorkspaceLoc.setText(container.getFullPath()
.toString());
else {
setErrorMessage("Please select output folder");
setPageComplete(false);
return;
}
}
updatePage();
}
private void updatePage() {
String message = validate();
setErrorMessage(message);
if (message == null) {
setPageComplete(true);
} else {
setPageComplete(false);
}
}
/*
* Validate fields, OK is string is null, otherwise string contains an error
* message to be shown to user.
*/
private String validate() {
setMessage(null);
String t = outputFolderWorkspaceLoc.getText();
if (t == null) {
return "Please specify folder";
}
Path path = new Path(t);
if (!path.isValidPath(t) || path.segmentCount() < 2) {
return "Please specify folder";
}
IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(
path);
if (!folder.exists()) {
setMessage("Folder does not exist and will be created",
DialogPage.WARNING);
} else {
IResource[] members = null;
try {
members = folder.members(true);
} catch (CoreException e) {
return "Unable to retrieve this folder's state."
+ "Please check that the folder exists and is empty.";
}
if (members.length > 0) {
setMessage(
"Folder is not empty. Folder members will be deleted.",
DialogPage.WARNING);
}
}
return null;
}
}