Project: Bio-PEPA
/*******************************************************************************
 * 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(3false); 
  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[0instanceof 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
 
 
}