Merge branch 'README' into ui-activities-1.5
diff --git a/pom.xml b/pom.xml
index 1325359..ec63c34 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
 	<parent>
 		<groupId>net.sf.taverna.t2</groupId>
 		<artifactId>ui-activities</artifactId>
-		<version>1.3-SNAPSHOT</version>
+		<version>1.5</version>
 	</parent>
 	<groupId>net.sf.taverna.t2.ui-activities</groupId>
 	<artifactId>dataflow-activity-ui</artifactId>
@@ -47,7 +47,7 @@
 		</dependency>		<dependency>
 			<groupId>javax.help</groupId>
 			<artifactId>javahelp</artifactId>
-			<version>2.0.02</version>
+			<version>${javahelp.version}</version>
 		</dependency>
 
 		<!--  testing dependencies -->
diff --git a/src/main/java/net/sf/taverna/t2/activities/dataflow/actions/EditNestedDataflowAction.java b/src/main/java/net/sf/taverna/t2/activities/dataflow/actions/EditNestedDataflowAction.java
index cb13e83..d3be3da 100644
--- a/src/main/java/net/sf/taverna/t2/activities/dataflow/actions/EditNestedDataflowAction.java
+++ b/src/main/java/net/sf/taverna/t2/activities/dataflow/actions/EditNestedDataflowAction.java
@@ -10,11 +10,12 @@
 import javax.swing.JOptionPane;
 
 import net.sf.taverna.t2.activities.dataflow.DataflowActivity;
-import net.sf.taverna.t2.activities.dataflow.filemanager.NestedDataflowSource;
+import net.sf.taverna.t2.activities.dataflow.filemanager.NestedDataflowActivitySource;
 import net.sf.taverna.t2.workbench.file.FileManager;
 import net.sf.taverna.t2.workbench.file.exceptions.OpenException;
 import net.sf.taverna.t2.workbench.file.impl.T2FlowFileType;
 import net.sf.taverna.t2.workflowmodel.Dataflow;
+import net.sf.taverna.t2.workflowmodel.processor.activity.NestedDataflowSource;
 
 import org.apache.log4j.Logger;
 
@@ -42,7 +43,7 @@
 	}
 
 	public void openNestedWorkflow(final Component parentComponent) {
-		NestedDataflowSource nestedDataflowSource = new NestedDataflowSource(
+		NestedDataflowSource nestedDataflowSource = new NestedDataflowActivitySource(
 				getFileManager().getCurrentDataflow(), dataflowActivity);
 
 		Dataflow alreadyOpen = getFileManager()
diff --git a/src/main/java/net/sf/taverna/t2/activities/dataflow/filemanager/NestedDataflowSource.java b/src/main/java/net/sf/taverna/t2/activities/dataflow/filemanager/NestedDataflowActivitySource.java
similarity index 87%
rename from src/main/java/net/sf/taverna/t2/activities/dataflow/filemanager/NestedDataflowSource.java
rename to src/main/java/net/sf/taverna/t2/activities/dataflow/filemanager/NestedDataflowActivitySource.java
index 0d22aca..2985b88 100644
--- a/src/main/java/net/sf/taverna/t2/activities/dataflow/filemanager/NestedDataflowSource.java
+++ b/src/main/java/net/sf/taverna/t2/activities/dataflow/filemanager/NestedDataflowActivitySource.java
@@ -29,6 +29,7 @@
 import net.sf.taverna.t2.workbench.file.FileManager;
 import net.sf.taverna.t2.workflowmodel.Dataflow;
 import net.sf.taverna.t2.workflowmodel.Processor;
+import net.sf.taverna.t2.workflowmodel.processor.activity.NestedDataflowSource;
 import net.sf.taverna.t2.workflowmodel.utils.Tools;
 
 /**
@@ -39,19 +40,19 @@
  * @author Stian Soiland-Reyes
  * 
  */
-public class NestedDataflowSource {
+public class NestedDataflowActivitySource implements NestedDataflowSource<DataflowActivity> {
 
-	private final DataflowActivity dataflowActivity;
+	public final DataflowActivity dataflowActivity;
 
-	private final Dataflow parentDataflow;
+	public final Dataflow parentDataflow;
 
-	public NestedDataflowSource(Dataflow parentDataflow,
+	public NestedDataflowActivitySource(Dataflow parentDataflow,
 			DataflowActivity dataflowActivity) {
 		this.parentDataflow = parentDataflow;
 		this.dataflowActivity = dataflowActivity;
 	}
 
-	public DataflowActivity getDataflowActivity() {
+	public DataflowActivity getNestedDataflow() {
 		return dataflowActivity;
 	}
 
@@ -75,7 +76,7 @@
 			return false;
 		if (getClass() != obj.getClass())
 			return false;
-		final NestedDataflowSource other = (NestedDataflowSource) obj;
+		final NestedDataflowActivitySource other = (NestedDataflowActivitySource) obj;
 		if (dataflowActivity == null) {
 			if (other.dataflowActivity != null)
 				return false;
@@ -99,7 +100,7 @@
 		//sb.append("Nested workflow");
 		
 		Collection<Processor> processors = Tools.getProcessorsWithActivity(getParentDataflow(),
-				getDataflowActivity());
+				getNestedDataflow());
 		if (! processors.isEmpty()) {
 			Processor processor = processors.iterator().next();
 			//sb.append(' ');
diff --git a/src/main/java/net/sf/taverna/t2/activities/dataflow/filemanager/NestedDataflowPersistenceHandler.java b/src/main/java/net/sf/taverna/t2/activities/dataflow/filemanager/NestedDataflowPersistenceHandler.java
index 1e83819..a920491 100644
--- a/src/main/java/net/sf/taverna/t2/activities/dataflow/filemanager/NestedDataflowPersistenceHandler.java
+++ b/src/main/java/net/sf/taverna/t2/activities/dataflow/filemanager/NestedDataflowPersistenceHandler.java
@@ -36,11 +36,13 @@
 import net.sf.taverna.t2.workbench.file.impl.T2FlowFileType;
 import net.sf.taverna.t2.workflowmodel.CompoundEdit;
 import net.sf.taverna.t2.workflowmodel.Dataflow;
+import net.sf.taverna.t2.workflowmodel.DataflowValidationReport;
 import net.sf.taverna.t2.workflowmodel.Edit;
 import net.sf.taverna.t2.workflowmodel.EditException;
 import net.sf.taverna.t2.workflowmodel.Edits;
 import net.sf.taverna.t2.workflowmodel.Processor;
 import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
+import net.sf.taverna.t2.workflowmodel.processor.activity.NestedDataflowSource;
 import net.sf.taverna.t2.workflowmodel.serialization.DeserializationException;
 import net.sf.taverna.t2.workflowmodel.serialization.SerializationException;
 import net.sf.taverna.t2.workflowmodel.serialization.xml.XMLDeserializer;
@@ -52,7 +54,7 @@
 
 /**
  * Allow opening/saving of a nested workflow sourced from a
- * {@link DataflowActivity} - described by a {@link NestedDataflowSource}.
+ * {@link DataflowActivity} - described by a {@link NestedDataflowActivitySource}.
  * 
  * @author Stian Soiland-Reyes
  * 
@@ -74,12 +76,12 @@
 
 	@Override
 	public List<Class<?>> getOpenSourceTypes() {
-		return Arrays.<Class<?>> asList(NestedDataflowSource.class);
+		return Arrays.<Class<?>> asList(NestedDataflowActivitySource.class);
 	}
 
 	@Override
 	public List<Class<?>> getSaveDestinationTypes() {
-		return Arrays.<Class<?>> asList(NestedDataflowSource.class);
+		return Arrays.<Class<?>> asList(NestedDataflowActivitySource.class);
 	}
 
 	@Override
@@ -95,13 +97,13 @@
 			throw new IllegalArgumentException("Unsupported file type "
 					+ fileType);
 		}
-		if (!(source instanceof NestedDataflowSource)) {
+		if (!(source instanceof NestedDataflowActivitySource)) {
 			throw new IllegalArgumentException("Unsupported source " + source);
 		}
 
-		NestedDataflowSource nestedDataflowSource = (NestedDataflowSource) source;
+		NestedDataflowActivitySource nestedDataflowSource = (NestedDataflowActivitySource) source;
 		DataflowActivity dataflowActivity = nestedDataflowSource
-				.getDataflowActivity();
+				.getNestedDataflow();
 		Dataflow dataflow = dataflowActivity.getConfiguration();
 		if (dataflow == null) {
 			throw new OpenException("Workflow was null");
@@ -130,11 +132,15 @@
 			throw new IllegalArgumentException("Unsupported file type "
 					+ fileType);
 		}
-		if (!(destination instanceof NestedDataflowSource)) {
+		if (!(destination instanceof NestedDataflowActivitySource)) {
 			throw new IllegalArgumentException("Unsupported source "
 					+ destination);
 		}
-		NestedDataflowSource nestedDataflowDestination = (NestedDataflowSource) destination;
+		
+		DataflowValidationReport dvr = dataflow.checkValidity();
+		// Saving an invalid dataflow is OK. Validity check is done to get predicted depth for output (if possible)
+
+		NestedDataflowActivitySource nestedDataflowDestination = (NestedDataflowActivitySource) destination;
 		Dataflow parentDataflow = nestedDataflowDestination.getParentDataflow();
 		if (! FileManager.getInstance().isDataflowOpen(parentDataflow)) {
 			throw new SaveException("Can't save to parent workflow, it's no longer open");
@@ -142,7 +148,7 @@
 			
 		
 		DataflowActivity dataflowActivity = nestedDataflowDestination
-				.getDataflowActivity();
+				.getNestedDataflow();
 
 		Dataflow dataflowCopy;
 		try {
diff --git a/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/actions/ReplaceNestedWorkflowAction.java b/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/actions/ReplaceNestedWorkflowAction.java
index 69b9077..0542f31 100644
--- a/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/actions/ReplaceNestedWorkflowAction.java
+++ b/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/actions/ReplaceNestedWorkflowAction.java
@@ -2,6 +2,8 @@
 

 import java.awt.Component;

 import java.awt.event.ActionEvent;

+import java.util.ArrayList;

+import java.util.List;

 

 import net.sf.taverna.t2.activities.dataflow.DataflowActivity;

 import net.sf.taverna.t2.workbench.edits.EditManager;

@@ -9,9 +11,13 @@
 import net.sf.taverna.t2.workbench.file.importworkflow.gui.ImportWorkflowWizard;

 import net.sf.taverna.t2.workbench.ui.Utils;

 import net.sf.taverna.t2.workbench.ui.actions.activity.ActivityConfigurationAction;

+import net.sf.taverna.t2.workflowmodel.CompoundEdit;

 import net.sf.taverna.t2.workflowmodel.Dataflow;

 import net.sf.taverna.t2.workflowmodel.Edit;

 import net.sf.taverna.t2.workflowmodel.Edits;

+import net.sf.taverna.t2.workflowmodel.EditsRegistry;

+import net.sf.taverna.t2.workflowmodel.Processor;

+import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;

 

 public class ReplaceNestedWorkflowAction extends

 		ActivityConfigurationAction<DataflowActivity, Dataflow> {

@@ -40,8 +46,17 @@
 			@Override

 			protected Edit<?> makeInsertNestedWorkflowEdit(Dataflow nestedFlow,

 					String name) {

-				return edits

-						.getConfigureActivityEdit(getActivity(), nestedFlow);

+				Edits edits = EditsRegistry.getEdits();

+				Edit<?> configureActivityEdit = edits.getConfigureActivityEdit(getActivity(), nestedFlow);

+

+					List<Edit<?>> editList = new ArrayList<Edit<?>>();

+					editList.add(configureActivityEdit);

+					Processor p = findProcessor(fileManager.getCurrentDataflow(), getActivity());

+					if (p != null && p.getActivityList().size() == 1) {

+						editList.add(edits.getMapProcessorPortsForActivityEdit(p));

+					}

+

+				return new CompoundEdit(editList);

 			}

 

 			@Override

@@ -56,5 +71,15 @@
 		wizard.setDestinationEnabled(false);

 		wizard.setVisible(true);

 	}

+	

+	protected static Processor findProcessor(Dataflow df, Activity activity) {

+		for (Processor processor : df.getProcessors()) {

+			if (processor.getActivityList().contains(activity))

+				return processor;

+		}

+		return null;

+	}

+

+

 

 }

diff --git a/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/gui/ImportWorkflowWizard.java b/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/gui/ImportWorkflowWizard.java
index 34120a2..075a0ff 100644
--- a/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/gui/ImportWorkflowWizard.java
+++ b/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/gui/ImportWorkflowWizard.java
@@ -257,26 +257,23 @@
 	 * @throws InterruptedException

 	 */

 	protected void updateWorkflowGraphic(final JSVGCanvas svgCanvas,

-			Dataflow dataflow) {

-		invokeAndWait(new Runnable() {

-			public void run() {

-				// Set it to blank while reloading

-				svgCanvas.setSVGDocument(null);

-			}

-		});

-		if (dataflow == null) {

-			// Already set to blank

-			return;

+			final Dataflow dataflow) {

+		try {

+			SwingUtilities.invokeAndWait(new Runnable() {

+				public void run() {

+					// Set it to blank while reloading

+					svgCanvas.setSVGDocument(null);

+					if (dataflow != null) {

+						SVGGraphController currentWfGraphController = new SVGGraphController(

+								dataflow, false, svgCanvas);

+					}

+				}

+			});

+		} catch (InterruptedException e) {

+//			logger.error(e);

+		} catch (InvocationTargetException e) {

+//			logger.error(e);

 		}

-		SVGGraphController currentWfGraphController = new SVGGraphController(

-				dataflow, false, svgCanvas);

-		//final SVGDocument generateSVGDocument = currentWfGraphController

-			//	.getSVGDocument();

-//		invokeAndWait(new Runnable() {

-	//		public void run() {

-		//		svgCanvas.setDocument(generateSVGDocument);

-		//	}

-		//});

 	}

 

 	/**

@@ -512,6 +509,15 @@
 

 		gbc.gridy = 4;

 		gbc.fill = GridBagConstraints.NONE;

+		gbc.gridwidth = 1;

+		JButton cancelButton = new JButton(new AbstractAction("Cancel") {

+

+			@Override

+			public void actionPerformed(ActionEvent e) {

+				ImportWorkflowWizard.this.setVisible(false);

+			}});

+		j.add(cancelButton, gbc);

+		gbc.gridx = 1;

 		JButton comp = new JButton(new ImportWorkflowAction());

 		j.add(comp, gbc);

 		return j;

diff --git a/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/menu/AddNestedWorkflowMenuAction.java b/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/menu/AddNestedWorkflowMenuAction.java
index 66229fb..3551c7e 100644
--- a/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/menu/AddNestedWorkflowMenuAction.java
+++ b/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/menu/AddNestedWorkflowMenuAction.java
@@ -57,7 +57,7 @@
 			.getLogger(AddNestedWorkflowMenuAction.class);
 
 	public AddNestedWorkflowMenuAction() {
-		super(InsertMenu.INSERT, 21, ADD_NESTED_WORKFLOW_URI);
+		super(InsertMenu.INSERT, 400, ADD_NESTED_WORKFLOW_URI);
 	}
 
 	@Override
diff --git a/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/menu/ImportWorkflowMenuAction.java b/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/menu/ImportWorkflowMenuAction.java
index 4dcee1c..aa4daab 100644
--- a/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/menu/ImportWorkflowMenuAction.java
+++ b/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/menu/ImportWorkflowMenuAction.java
@@ -48,7 +48,7 @@
 			.getLogger(ImportWorkflowMenuAction.class);
 
 	public ImportWorkflowMenuAction() {
-		super(insertSection, 40);
+		super(insertSection, 400);
 	}
 
 	@Override
@@ -61,7 +61,7 @@
 	protected Action createAction() {
 		ImportWorkflowAction myAction = new ImportWorkflowAction();
 		// Just "Workflow" as we go under the "Insert" menu
-		myAction.putValue(Action.NAME, "Workflow");
+		myAction.putValue(Action.NAME, "Nested workflow");
 		return myAction;
 	}
 
diff --git a/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/menu/MergeWorkflowMenuAction.java b/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/menu/MergeWorkflowMenuAction.java
index 611afc7..b34fcbf 100644
--- a/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/menu/MergeWorkflowMenuAction.java
+++ b/src/main/java/net/sf/taverna/t2/workbench/file/importworkflow/menu/MergeWorkflowMenuAction.java
@@ -16,7 +16,7 @@
 			.create("http://taverna.sf.net/2008/t2workbench/menu#insert");

 

 	public MergeWorkflowMenuAction() {

-		super(INSERT_URI, 40, IMPORT_URI);

+		super(INSERT_URI, 2000, IMPORT_URI);

 	}

 

 	@Override

diff --git a/src/test/java/net/sf/taverna/t2/activities/dataflow/filemanager/TestNestedDataflowPersistenceHandler.java b/src/test/java/net/sf/taverna/t2/activities/dataflow/filemanager/TestNestedDataflowPersistenceHandler.java
index 732d421..b0b1c9e 100644
--- a/src/test/java/net/sf/taverna/t2/activities/dataflow/filemanager/TestNestedDataflowPersistenceHandler.java
+++ b/src/test/java/net/sf/taverna/t2/activities/dataflow/filemanager/TestNestedDataflowPersistenceHandler.java
@@ -44,6 +44,7 @@
 import net.sf.taverna.t2.workflowmodel.EditException;
 import net.sf.taverna.t2.workflowmodel.Edits;
 import net.sf.taverna.t2.workflowmodel.Processor;
+import net.sf.taverna.t2.workflowmodel.processor.activity.NestedDataflowSource;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -193,7 +194,7 @@
 	}
 
 	private Dataflow openNested() throws OpenException {
-		NestedDataflowSource nestedDataflowSource = new NestedDataflowSource(
+		NestedDataflowSource nestedDataflowSource = new NestedDataflowActivitySource(
 				dataflow, nestedDataflowActivity);
 		Dataflow openedNested = fileManager.openDataflow(T2_FLOW_FILE_TYPE,
 				nestedDataflowSource);