You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2015/02/23 11:22:47 UTC

[24/51] [partial] incubator-taverna-workbench git commit: Revert "temporarily empty repository"

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-graph-view/src/main/java/net/sf/taverna/t2/workbench/views/graph/toolbar/GraphDeleteToolbarSection.java
----------------------------------------------------------------------
diff --git a/taverna-workbench-graph-view/src/main/java/net/sf/taverna/t2/workbench/views/graph/toolbar/GraphDeleteToolbarSection.java b/taverna-workbench-graph-view/src/main/java/net/sf/taverna/t2/workbench/views/graph/toolbar/GraphDeleteToolbarSection.java
new file mode 100644
index 0000000..794cf1f
--- /dev/null
+++ b/taverna-workbench-graph-view/src/main/java/net/sf/taverna/t2/workbench/views/graph/toolbar/GraphDeleteToolbarSection.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester   
+ * 
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ * 
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *    
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *    
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.workbench.views.graph.toolbar;
+
+import static net.sf.taverna.t2.ui.menu.DefaultToolBar.DEFAULT_TOOL_BAR;
+
+import java.net.URI;
+
+import net.sf.taverna.t2.ui.menu.AbstractMenuSection;
+
+/**
+ * @author Alex Nenadic
+ */
+public class GraphDeleteToolbarSection extends AbstractMenuSection {
+	public static final URI GRAPH_DELETE_TOOLBAR_SECTION = URI
+			.create("http://taverna.sf.net/2008/t2workbench/menu#graphDeleteToolbarSection");
+
+	public GraphDeleteToolbarSection() {
+		super(DEFAULT_TOOL_BAR, 80, GRAPH_DELETE_TOOLBAR_SECTION);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-graph-view/src/main/java/net/sf/taverna/t2/workbench/views/graph/toolbar/GraphEditToolbarSection.java
----------------------------------------------------------------------
diff --git a/taverna-workbench-graph-view/src/main/java/net/sf/taverna/t2/workbench/views/graph/toolbar/GraphEditToolbarSection.java b/taverna-workbench-graph-view/src/main/java/net/sf/taverna/t2/workbench/views/graph/toolbar/GraphEditToolbarSection.java
new file mode 100644
index 0000000..a61259a
--- /dev/null
+++ b/taverna-workbench-graph-view/src/main/java/net/sf/taverna/t2/workbench/views/graph/toolbar/GraphEditToolbarSection.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester   
+ * 
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ * 
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *    
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *    
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.workbench.views.graph.toolbar;
+
+import static net.sf.taverna.t2.ui.menu.DefaultToolBar.DEFAULT_TOOL_BAR;
+
+import java.net.URI;
+
+import net.sf.taverna.t2.ui.menu.AbstractMenuSection;
+
+/**
+ * @author Alex Nenadic
+ */
+public class GraphEditToolbarSection extends AbstractMenuSection {
+	public static final URI GRAPH_EDIT_TOOLBAR_SECTION = URI
+			.create("http://taverna.sf.net/2008/t2workbench/menu#graphEditToolbarSection");
+
+	public GraphEditToolbarSection() {
+		super(DEFAULT_TOOL_BAR, 30, GRAPH_EDIT_TOOLBAR_SECTION);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-graph-view/src/main/java/net/sf/taverna/t2/workbench/views/graph/toolbar/RenameWFInputOutputProcessorToolbarAction.java
----------------------------------------------------------------------
diff --git a/taverna-workbench-graph-view/src/main/java/net/sf/taverna/t2/workbench/views/graph/toolbar/RenameWFInputOutputProcessorToolbarAction.java b/taverna-workbench-graph-view/src/main/java/net/sf/taverna/t2/workbench/views/graph/toolbar/RenameWFInputOutputProcessorToolbarAction.java
new file mode 100644
index 0000000..1794e8f
--- /dev/null
+++ b/taverna-workbench-graph-view/src/main/java/net/sf/taverna/t2/workbench/views/graph/toolbar/RenameWFInputOutputProcessorToolbarAction.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.workbench.views.graph.toolbar;
+
+import static net.sf.taverna.t2.workbench.views.graph.toolbar.GraphEditToolbarSection.GRAPH_EDIT_TOOLBAR_SECTION;
+
+import java.net.URI;
+
+import javax.swing.Action;
+
+import net.sf.taverna.t2.ui.menu.AbstractMenuAction;
+import net.sf.taverna.t2.workbench.edits.EditManager;
+import net.sf.taverna.t2.workbench.selection.SelectionManager;
+import net.sf.taverna.t2.workbench.views.graph.actions.RenameWFInputOutputProcessorAction;
+
+/**
+ * @author Alex Nenadic
+ */
+public class RenameWFInputOutputProcessorToolbarAction extends
+		AbstractMenuAction {
+	private static final URI RENAME_WF_INPUT_OUTPUT_PROCESSOR_URI = URI
+			.create("http://taverna.sf.net/2008/t2workbench/menu#graphToolbarRenameWFInputOutputProcessor");
+
+	private EditManager editManager;
+	private SelectionManager selectionManager;
+
+	public RenameWFInputOutputProcessorToolbarAction() {
+		super(GRAPH_EDIT_TOOLBAR_SECTION, 30,
+				RENAME_WF_INPUT_OUTPUT_PROCESSOR_URI);
+	}
+
+	@Override
+	protected Action createAction() {
+		return new RenameWFInputOutputProcessorAction(editManager,
+				selectionManager);
+	}
+
+	public void setEditManager(EditManager editManager) {
+		this.editManager = editManager;
+	}
+
+	public void setSelectionManager(SelectionManager selectionManager) {
+		this.selectionManager = selectionManager;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.ui.menu.MenuComponent
----------------------------------------------------------------------
diff --git a/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.ui.menu.MenuComponent b/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.ui.menu.MenuComponent
new file mode 100644
index 0000000..226078d
--- /dev/null
+++ b/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.ui.menu.MenuComponent
@@ -0,0 +1,29 @@
+net.sf.taverna.t2.workbench.views.graph.toolbar.GraphEditToolbarSection
+net.sf.taverna.t2.workbench.views.graph.toolbar.GraphDeleteToolbarSection
+net.sf.taverna.t2.workbench.views.graph.toolbar.GraphSaveToolbarSection
+net.sf.taverna.t2.workbench.views.graph.toolbar.AddWFInputToolbarAction
+net.sf.taverna.t2.workbench.views.graph.toolbar.AddWFOutputToolbarAction
+net.sf.taverna.t2.workbench.views.graph.toolbar.RenameWFInputOutputProcessorToolbarAction
+net.sf.taverna.t2.workbench.views.graph.toolbar.DeleteGraphComponentToolbarAction
+net.sf.taverna.t2.workbench.views.graph.toolbar.SaveGraphImageToolbarAction
+
+net.sf.taverna.t2.workbench.views.graph.menu.DiagramMenu
+net.sf.taverna.t2.workbench.views.graph.menu.DiagramSaveMenuSection
+net.sf.taverna.t2.workbench.views.graph.menu.DiagramZoomMenuSection
+
+net.sf.taverna.t2.workbench.views.graph.menu.GraphMenuSection
+net.sf.taverna.t2.workbench.views.graph.menu.GraphCopyMenuSection
+net.sf.taverna.t2.workbench.views.graph.menu.GraphEditMenuSection
+net.sf.taverna.t2.workbench.views.graph.menu.GraphDeleteMenuSection
+net.sf.taverna.t2.workbench.views.graph.menu.GraphDetailsMenuSection
+
+net.sf.taverna.t2.workbench.views.graph.menu.InsertMenu
+
+net.sf.taverna.t2.workbench.views.graph.menu.AddWFInputMenuAction
+net.sf.taverna.t2.workbench.views.graph.menu.AddWFOutputMenuAction
+net.sf.taverna.t2.workbench.views.graph.menu.RenameWFInputOutputProcessorMenuAction
+net.sf.taverna.t2.workbench.views.graph.menu.DeleteGraphComponentMenuAction
+net.sf.taverna.t2.workbench.views.graph.menu.SaveGraphImageSubMenu
+net.sf.taverna.t2.workbench.views.graph.menu.ZoomInMenuAction
+net.sf.taverna.t2.workbench.views.graph.menu.ZoomOutMenuAction
+net.sf.taverna.t2.workbench.views.graph.menu.ResetDiagramMenuAction
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory
----------------------------------------------------------------------
diff --git a/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory b/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory
new file mode 100644
index 0000000..70830ec
--- /dev/null
+++ b/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.configuration.ConfigurationUIFactory
@@ -0,0 +1 @@
+net.sf.taverna.t2.workbench.views.graph.config.GraphViewConfigurationUIFactory

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ui.zaria.UIComponentFactorySPI
----------------------------------------------------------------------
diff --git a/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ui.zaria.UIComponentFactorySPI b/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ui.zaria.UIComponentFactorySPI
new file mode 100644
index 0000000..8086a8d
--- /dev/null
+++ b/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ui.zaria.UIComponentFactorySPI
@@ -0,0 +1 @@
+net.sf.taverna.t2.workbench.views.graph.GraphViewComponentFactory
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ui.zaria.UIComponentSPI
----------------------------------------------------------------------
diff --git a/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ui.zaria.UIComponentSPI b/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ui.zaria.UIComponentSPI
new file mode 100644
index 0000000..563c21d
--- /dev/null
+++ b/taverna-workbench-graph-view/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.ui.zaria.UIComponentSPI
@@ -0,0 +1 @@
+net.sf.taverna.t2.workbench.views.graph.GraphViewComponent

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-graph-view/src/main/resources/META-INF/spring/graph-view-context-osgi.xml
----------------------------------------------------------------------
diff --git a/taverna-workbench-graph-view/src/main/resources/META-INF/spring/graph-view-context-osgi.xml b/taverna-workbench-graph-view/src/main/resources/META-INF/spring/graph-view-context-osgi.xml
new file mode 100644
index 0000000..c7adec0
--- /dev/null
+++ b/taverna-workbench-graph-view/src/main/resources/META-INF/spring/graph-view-context-osgi.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans
+                      http://www.springframework.org/schema/beans/spring-beans.xsd
+                      http://www.springframework.org/schema/osgi
+                      http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+	<service ref="GraphViewConfigurationUIFactory" interface="uk.org.taverna.configuration.ConfigurationUIFactory" />
+
+	<service ref="GraphViewComponentFactory" interface="net.sf.taverna.t2.workbench.ui.zaria.UIComponentFactorySPI" />
+
+	<service ref="GraphEditToolbarSection" auto-export="interfaces" />
+	<service ref="GraphDeleteToolbarSection" auto-export="interfaces" />
+	<service ref="AddWFInputToolbarAction" auto-export="interfaces" />
+	<service ref="AddWFOutputToolbarAction" auto-export="interfaces" />
+	<service ref="RenameWFInputOutputProcessorToolbarAction" auto-export="interfaces" />
+	<service ref="DeleteGraphComponentToolbarAction" auto-export="interfaces" />
+	<service ref="DiagramMenu" auto-export="interfaces" />
+	<service ref="DiagramSaveMenuSection" auto-export="interfaces" />
+	<service ref="DiagramZoomMenuSection" auto-export="interfaces" />
+	<service ref="GraphMenuSection" auto-export="interfaces" />
+	<service ref="GraphCopyMenuSection" auto-export="interfaces" />
+	<service ref="GraphEditMenuSection" auto-export="interfaces" />
+	<service ref="GraphDeleteMenuSection" auto-export="interfaces" />
+	<service ref="GraphDetailsMenuSection" auto-export="interfaces" />
+	<service ref="InsertMenu" auto-export="interfaces" />
+	<service ref="AddWFInputMenuAction" auto-export="interfaces" />
+	<service ref="AddWFOutputMenuAction" auto-export="interfaces" />
+	<service ref="RenameWFInputOutputProcessorMenuAction" auto-export="interfaces" />
+	<service ref="DeleteGraphComponentMenuAction" auto-export="interfaces" />
+	<!-- <service ref="SaveGraphImageSubMenu" auto-export="interfaces" /> -->
+	<service ref="ZoomInMenuAction" auto-export="interfaces" />
+	<service ref="ZoomOutMenuAction" auto-export="interfaces" />
+	<service ref="ResetDiagramMenuAction" auto-export="interfaces" />
+
+	<reference id="editManager" interface="net.sf.taverna.t2.workbench.edits.EditManager" />
+	<reference id="fileManager" interface="net.sf.taverna.t2.workbench.file.FileManager" />
+	<reference id="menuManager" interface="net.sf.taverna.t2.ui.menu.MenuManager" />
+	<reference id="selectionManager" interface="net.sf.taverna.t2.workbench.selection.SelectionManager" />
+	<reference id="colourManager" interface="net.sf.taverna.t2.workbench.configuration.colour.ColourManager" />
+	<reference id="workbenchConfiguration" interface="net.sf.taverna.t2.workbench.configuration.workbench.WorkbenchConfiguration" />
+	<reference id="configurationManager" interface="uk.org.taverna.configuration.ConfigurationManager" />
+	<reference id="serviceRegistry" interface="uk.org.taverna.commons.services.ServiceRegistry" />
+
+</beans:beans>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-graph-view/src/main/resources/META-INF/spring/graph-view-context.xml
----------------------------------------------------------------------
diff --git a/taverna-workbench-graph-view/src/main/resources/META-INF/spring/graph-view-context.xml b/taverna-workbench-graph-view/src/main/resources/META-INF/spring/graph-view-context.xml
new file mode 100644
index 0000000..9968805
--- /dev/null
+++ b/taverna-workbench-graph-view/src/main/resources/META-INF/spring/graph-view-context.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans
+                      http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+	<bean id="graphViewConfiguration"
+		class="net.sf.taverna.t2.workbench.views.graph.config.GraphViewConfiguration">
+		<constructor-arg name="configurationManager" ref="configurationManager" />
+	</bean>
+
+	<bean id="GraphViewConfigurationUIFactory"
+		class="net.sf.taverna.t2.workbench.views.graph.config.GraphViewConfigurationUIFactory">
+		<property name="graphViewConfiguration">
+			<ref local="graphViewConfiguration" />
+		</property>
+	</bean>
+
+	<bean id="GraphViewComponentFactory" class="net.sf.taverna.t2.workbench.views.graph.GraphViewComponentFactory">
+		<property name="colourManager" ref="colourManager" />
+		<property name="editManager" ref="editManager" />
+		<property name="menuManager" ref="menuManager" />
+		<property name="graphViewConfiguration">
+			<ref local="graphViewConfiguration" />
+		</property>
+		<property name="workbenchConfiguration" ref="workbenchConfiguration" />
+		<property name="selectionManager" ref="selectionManager" />
+		<property name="fileManager" ref="fileManager" />
+		<property name="serviceRegistry" ref="serviceRegistry" />
+	</bean>
+
+	<bean id="GraphEditToolbarSection"
+		class="net.sf.taverna.t2.workbench.views.graph.toolbar.GraphEditToolbarSection" />
+	<bean id="GraphDeleteToolbarSection"
+		class="net.sf.taverna.t2.workbench.views.graph.toolbar.GraphDeleteToolbarSection" />
+	<bean id="AddWFInputToolbarAction"
+		class="net.sf.taverna.t2.workbench.views.graph.toolbar.AddWFInputToolbarAction">
+		<property name="editManager" ref="editManager" />
+		<property name="selectionManager" ref="selectionManager" />
+	</bean>
+	<bean id="AddWFOutputToolbarAction"
+		class="net.sf.taverna.t2.workbench.views.graph.toolbar.AddWFOutputToolbarAction">
+		<property name="editManager" ref="editManager" />
+		<property name="selectionManager" ref="selectionManager" />
+	</bean>
+	<bean id="RenameWFInputOutputProcessorToolbarAction"
+		class="net.sf.taverna.t2.workbench.views.graph.toolbar.RenameWFInputOutputProcessorToolbarAction">
+		<property name="editManager" ref="editManager" />
+		<property name="selectionManager" ref="selectionManager" />
+	</bean>
+	<bean id="DeleteGraphComponentToolbarAction"
+		class="net.sf.taverna.t2.workbench.views.graph.toolbar.DeleteGraphComponentToolbarAction">
+		<property name="editManager" ref="editManager" />
+		<property name="selectionManager" ref="selectionManager" />
+	</bean>
+	<bean id="DiagramMenu"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.DiagramMenu" />
+	<bean id="DiagramSaveMenuSection"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.DiagramSaveMenuSection" />
+	<bean id="DiagramZoomMenuSection"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.DiagramZoomMenuSection" />
+	<bean id="GraphMenuSection"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.GraphMenuSection" />
+	<bean id="GraphCopyMenuSection"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.GraphCopyMenuSection" />
+	<bean id="GraphEditMenuSection"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.GraphEditMenuSection" />
+	<bean id="GraphDeleteMenuSection"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.GraphDeleteMenuSection" />
+	<bean id="GraphDetailsMenuSection"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.GraphDetailsMenuSection" />
+	<bean id="InsertMenu" class="net.sf.taverna.t2.workbench.views.graph.menu.InsertMenu" />
+	<bean id="AddWFInputMenuAction"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.AddWFInputMenuAction">
+		<property name="editManager" ref="editManager" />
+		<property name="selectionManager" ref="selectionManager" />
+	</bean>
+	<bean id="AddWFOutputMenuAction"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.AddWFOutputMenuAction">
+		<property name="editManager" ref="editManager" />
+		<property name="selectionManager" ref="selectionManager" />
+	</bean>
+	<bean id="RenameWFInputOutputProcessorMenuAction"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.RenameWFInputOutputProcessorMenuAction">
+		<property name="editManager" ref="editManager" />
+		<property name="selectionManager" ref="selectionManager" />
+	</bean>
+	<bean id="DeleteGraphComponentMenuAction"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.DeleteGraphComponentMenuAction">
+		<property name="editManager" ref="editManager" />
+		<property name="selectionManager" ref="selectionManager" />
+	</bean>
+	<!-- <bean id="SaveGraphImageSubMenu"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.SaveGraphImageSubMenu">
+		<property name="fileManager" ref="fileManager" />
+		<property name="workbenchConfiguration" ref="workbenchConfiguration" />
+		<property name="selectionManager" ref="selectionManager" />
+		<property name="graphViewComponent" ref="GraphViewComponent" />
+	</bean> -->
+	<bean id="ZoomInMenuAction"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.ZoomInMenuAction" />
+	<bean id="ZoomOutMenuAction"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.ZoomOutMenuAction" />
+	<bean id="ResetDiagramMenuAction"
+		class="net.sf.taverna.t2.workbench.views.graph.menu.ResetDiagramMenuAction" />
+
+</beans>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-graph-view/src/test/resources/nested_iteration.t2flow
----------------------------------------------------------------------
diff --git a/taverna-workbench-graph-view/src/test/resources/nested_iteration.t2flow b/taverna-workbench-graph-view/src/test/resources/nested_iteration.t2flow
new file mode 100644
index 0000000..9b50c7f
--- /dev/null
+++ b/taverna-workbench-graph-view/src/test/resources/nested_iteration.t2flow
@@ -0,0 +1,111 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow"><dataflow id="23f84bb1-4a04-47fa-8150-7063310db697" role="top"><name>nested_iteration</name><inputPorts /><outputPorts><port><name>concat</name></port><port><name>list</name></port><port><name>constant</name></port></outputPorts><processors><processor><name>constant</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2</group><artifact>stringconstant-activity</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">
+  <value>constant</value>
+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">
+  <maxJobs>1</maxJobs>
+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryCo
 nfig xmlns="">
+  <backoffFactor>1.0</backoffFactor>
+  <initialDelay>0</initialDelay>
+  <maxDelay>0</maxDelay>
+  <maxRetries>0</maxRetries>
+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross /></strategy></iteration></iterationStrategyStack></processor><processor><name>generate_list</name><inputPorts><port><name>prefix</name><depth>0</depth></port></inputPorts><outputPorts><port><name>list</name><depth>1</depth><granularDepth>1</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2</group><artifact>beanshell-activity</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="prefix" to="prefi
 x" /></inputMap><outputMap><map from="list" to="list" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">
+  <script>list = new ArrayList();
+for (int i = 0; i &lt; 20; i++) {
+ list.add(prefix + i);
+}</script>
+  <dependencies />
+  <inputs>
+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>
+      <handledReferenceSchemes />
+      <translatedElementType>java.lang.String</translatedElementType>
+      <allowsLiteralValues>true</allowsLiteralValues>
+      <name>prefix</name>
+      <depth>0</depth>
+      <mimeTypes>
+        <string>'text/plain'</string>
+      </mimeTypes>
+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>
+  </inputs>
+  <outputs>
+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>
+      <granularDepth>1</granularDepth>
+      <name>list</name>
+      <depth>1</depth>
+      <mimeTypes>
+        <string>l('text/plain')</string>
+      </mimeTypes>
+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>
+  </outputs>
+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">
+  <maxJobs>1</maxJobs>
+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryCo
 nfig xmlns="">
+  <backoffFactor>1.0</backoffFactor>
+  <initialDelay>0</initialDelay>
+  <maxDelay>0</maxDelay>
+  <maxRetries>0</maxRetries>
+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><port name="prefix" depth="0" /></strategy></iteration></iterationStrategyStack></processor><processor><name>merge</name><inputPorts><port><name>in1</name><depth>0</depth></port><port><name>in2</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2</group><artifact>dataflow-activity</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.dataflow.DataflowA
 ctivity</class><inputMap><map from="in2" to="in2" /><map from="in1" to="in1" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="dataflow"><dataflow ref="79ad4092-abcb-42bf-ac98-d66dfac67dff" /></configBean></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">
+  <maxJobs>1</maxJobs>
+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryCo
 nfig xmlns="">
+  <backoffFactor>1.0</backoffFactor>
+  <initialDelay>0</initialDelay>
+  <maxDelay>0</maxDelay>
+  <maxRetries>0</maxRetries>
+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in1" depth="0" /><port name="in2" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>generate_list_prefix_defaultValue</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2</group><artifact>stringconstant-activity</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</cla
 ss><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">
+  <value>prefix</value>
+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">
+  <maxJobs>1</maxJobs>
+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryCo
 nfig xmlns="">
+  <backoffFactor>1.0</backoffFactor>
+  <initialDelay>0</initialDelay>
+  <maxDelay>0</maxDelay>
+  <maxRetries>0</maxRetries>
+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross /></strategy></iteration></iterationStrategyStack></processor></processors><conditions><condition control="generate_list" target="constant" /></conditions><datalinks><datalink><sink type="processor"><processor>generate_list</processor><port>prefix</port></sink><source type="processor"><processor>generate_list_prefix_defaultValue</processor><port>value</port></source></datalink><datalink><sink type="processor"><processor>merge</processor><port>in1</port></sink><source type="processor"><processor>constant</processor><port>value</port></
 source></datalink><datalink><sink type="merge"><processor>merge</processor><port>in2</port></sink><source type="processor"><processor>generate_list</processor><port>list</port></source></datalink><datalink><sink type="merge"><processor>merge</processor><port>in2</port></sink><source type="processor"><processor>generate_list</processor><port>list</port></source></datalink><datalink><sink type="dataflow"><port>concat</port></sink><source type="processor"><processor>merge</processor><port>out</port></source></datalink><datalink><sink type="dataflow"><port>list</port></sink><source type="processor"><processor>generate_list</processor><port>list</port></source></datalink><datalink><sink type="dataflow"><port>constant</port></sink><source type="processor"><processor>constant</processor><port>value</port></source></datalink></datalinks></dataflow><dataflow id="79ad4092-abcb-42bf-ac98-d66dfac67dff" role="nested"><name>Untitled workflow #24</name><inputPorts><port><name>in1</name><depth>0</d
 epth><granularDepth>0</granularDepth></port><port><name>in2</name><depth>0</depth><granularDepth>0</granularDepth></port></inputPorts><outputPorts><port><name>out</name></port></outputPorts><processors><processor><name>Nested_Workflow</name><inputPorts><port><name>in2</name><depth>0</depth></port><port><name>in1</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2</group><artifact>dataflow-activity</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.dataflow.DataflowActivity</class><inputMap><map from="in2" to="in2" /><map from="in1" to="in1" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="dataflow"><dataflow ref="ebd93027-c046-4a04-befa-c5715e8ba3da" /></configBean></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2</gro
 up><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">
+  <maxJobs>1</maxJobs>
+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryCo
 nfig xmlns="">
+  <backoffFactor>1.0</backoffFactor>
+  <initialDelay>0</initialDelay>
+  <maxDelay>0</maxDelay>
+  <maxRetries>0</maxRetries>
+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in1" depth="0" /><port name="in2" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>Nested_Workflow</processor><port>in2</port></sink><source type="dataflow"><port>in2</port></source></datalink><datalink><sink type="processor"><processor>Nested_Workflow</processor><port>in1</port></sink><source type="dataflow"><port>in1</port></source></datalink><datalink><sink type="dataflow"><port>out</port></sink><source type=
 "processor"><processor>Nested_Workflow</processor><port>out</port></source></datalink></datalinks></dataflow><dataflow id="ebd93027-c046-4a04-befa-c5715e8ba3da" role="nested"><name>Untitled workflow #36</name><inputPorts><port><name>in1</name><depth>0</depth><granularDepth>0</granularDepth></port><port><name>in2</name><depth>0</depth><granularDepth>0</granularDepth></port></inputPorts><outputPorts><port><name>out</name></port></outputPorts><processors><processor><name>concat</name><inputPorts><port><name>in1</name><depth>0</depth></port><port><name>in2</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2</group><artifact>beanshell-activity</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="in2" to="in2" /><map from="in1" to="in1" /></i
 nputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">
+  <script>Thread.sleep(200);
+out = in1 + in2;</script>
+  <dependencies />
+  <inputs>
+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>
+      <handledReferenceSchemes />
+      <translatedElementType>java.lang.String</translatedElementType>
+      <allowsLiteralValues>true</allowsLiteralValues>
+      <name>in1</name>
+      <depth>0</depth>
+      <mimeTypes>
+        <string>'text/plain'</string>
+      </mimeTypes>
+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>
+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>
+      <handledReferenceSchemes />
+      <translatedElementType>java.lang.String</translatedElementType>
+      <allowsLiteralValues>true</allowsLiteralValues>
+      <name>in2</name>
+      <depth>0</depth>
+      <mimeTypes>
+        <string>'text/plain'</string>
+      </mimeTypes>
+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>
+  </inputs>
+  <outputs>
+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>
+      <granularDepth>0</granularDepth>
+      <name>out</name>
+      <depth>0</depth>
+      <mimeTypes>
+        <string>'text/plain'</string>
+      </mimeTypes>
+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>
+  </outputs>
+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">
+  <maxJobs>1</maxJobs>
+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryCo
 nfig xmlns="">
+  <backoffFactor>1.0</backoffFactor>
+  <initialDelay>0</initialDelay>
+  <maxDelay>0</maxDelay>
+  <maxRetries>0</maxRetries>
+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2</group><artifact>workflowmodel-impl</artifact><version>0.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in1" depth="0" /><port name="in2" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>concat</processor><port>in1</port></sink><source type="dataflow"><port>in1</port></source></datalink><datalink><sink type="processor"><processor>concat</processor><port>in2</port></sink><source type="dataflow"><port>in2</port></source></datalink><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><proce
 ssor>concat</processor><port>out</port></source></datalink></datalinks></dataflow></workflow>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-graph-view/src/test/resources/nested_iteration.xml
----------------------------------------------------------------------
diff --git a/taverna-workbench-graph-view/src/test/resources/nested_iteration.xml b/taverna-workbench-graph-view/src/test/resources/nested_iteration.xml
new file mode 100644
index 0000000..3a547bb
--- /dev/null
+++ b/taverna-workbench-graph-view/src/test/resources/nested_iteration.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<s:scufl xmlns:s="http://org.embl.ebi.escience/xscufl/0.1alpha" version="0.2" log="0">
+  <s:workflowdescription lsid="urn:lsid:net.sf.taverna:wfDefinition:c7016fc0-c2f4-4171-b6f1-430f408f4822" author="" title="nested_iteration" />
+  <s:processor name="generate_list">
+    <s:defaults>
+      <s:default name="prefix">prefix</s:default>
+    </s:defaults>
+    <s:beanshell>
+      <s:scriptvalue>list = new ArrayList();
+for (int i = 0; i &lt; 20; i++) {
+ list.add(prefix + i);
+}</s:scriptvalue>
+      <s:beanshellinputlist>
+        <s:beanshellinput s:syntactictype="'text/plain'">prefix</s:beanshellinput>
+      </s:beanshellinputlist>
+      <s:beanshelloutputlist>
+        <s:beanshelloutput s:syntactictype="l('text/plain')">list</s:beanshelloutput>
+      </s:beanshelloutputlist>
+      <s:dependencies s:classloader="iteration" />
+    </s:beanshell>
+  </s:processor>
+  <s:processor name="constant" boring="true">
+    <s:stringconstant>constant</s:stringconstant>
+  </s:processor>
+  <s:processor name="merge">
+    <s:workflow>
+      <s:scufl version="0.2" log="0">
+        <s:workflowdescription lsid="urn:lsid:net.sf.taverna:wfDefinition:3368fb8d-ecc7-4fcd-b511-6ace84b13c81" author="" title="Untitled workflow #24" />
+        <s:processor name="Nested_Workflow">
+          <s:workflow>
+            <s:scufl version="0.2" log="0">
+              <s:workflowdescription lsid="urn:lsid:net.sf.taverna:wfDefinition:75b99c76-7a76-4d3c-8d39-8c48df3355ad" author="" title="Untitled workflow #36" />
+              <s:processor name="concat">
+                <s:beanshell>
+                  <s:scriptvalue>Thread.sleep(200);
+out = in1 + in2;</s:scriptvalue>
+                  <s:beanshellinputlist>
+                    <s:beanshellinput s:syntactictype="'text/plain'">in1</s:beanshellinput>
+                    <s:beanshellinput s:syntactictype="'text/plain'">in2</s:beanshellinput>
+                  </s:beanshellinputlist>
+                  <s:beanshelloutputlist>
+                    <s:beanshelloutput s:syntactictype="'text/plain'">out</s:beanshelloutput>
+                  </s:beanshelloutputlist>
+                  <s:dependencies s:classloader="iteration" />
+                </s:beanshell>
+              </s:processor>
+              <s:link source="in1" sink="concat:in1" />
+              <s:link source="in2" sink="concat:in2" />
+              <s:link source="concat:out" sink="out" />
+              <s:source name="in1" />
+              <s:source name="in2" />
+              <s:sink name="out" />
+            </s:scufl>
+          </s:workflow>
+        </s:processor>
+        <s:link source="in1" sink="Nested_Workflow:in1" />
+        <s:link source="in2" sink="Nested_Workflow:in2" />
+        <s:link source="Nested_Workflow:out" sink="out" />
+        <s:source name="in1" />
+        <s:source name="in2" />
+        <s:sink name="out" />
+      </s:scufl>
+    </s:workflow>
+    <s:mergemode input="in2" mode="merge" />
+  </s:processor>
+  <s:link source="constant:value" sink="merge:in1" />
+  <s:link source="generate_list:list" sink="merge:in2" />
+  <s:link source="generate_list:list" sink="merge:in2" />
+  <s:link source="constant:value" sink="constant" />
+  <s:link source="generate_list:list" sink="list" />
+  <s:link source="merge:out" sink="concat" />
+  <s:sink name="concat">
+    <s:metadata>
+      <s:mimeTypes>
+        <s:mimeType>'text/plain'</s:mimeType>
+      </s:mimeTypes>
+    </s:metadata>
+  </s:sink>
+  <s:sink name="list">
+    <s:metadata>
+      <s:mimeTypes>
+        <s:mimeType>l('text/plain')</s:mimeType>
+      </s:mimeTypes>
+    </s:metadata>
+  </s:sink>
+  <s:sink name="constant">
+    <s:metadata>
+      <s:mimeTypes>
+        <s:mimeType>'text/plain'</s:mimeType>
+      </s:mimeTypes>
+    </s:metadata>
+  </s:sink>
+  <s:coordination name="constant_BLOCKON_generate_list">
+    <s:condition>
+      <s:state>Completed</s:state>
+      <s:target>generate_list</s:target>
+    </s:condition>
+    <s:action>
+      <s:target>constant</s:target>
+      <s:statechange>
+        <s:from>Scheduled</s:from>
+        <s:to>Running</s:to>
+      </s:statechange>
+    </s:action>
+  </s:coordination>
+  <s:coordination name="merge_BLOCKON_generate_list">
+    <s:condition>
+      <s:state>Completed</s:state>
+      <s:target>generate_list</s:target>
+    </s:condition>
+    <s:action>
+      <s:target>merge</s:target>
+      <s:statechange>
+        <s:from>Scheduled</s:from>
+        <s:to>Running</s:to>
+      </s:statechange>
+    </s:action>
+  </s:coordination>
+</s:scufl>
+

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-helper-api/pom.xml
----------------------------------------------------------------------
diff --git a/taverna-workbench-helper-api/pom.xml b/taverna-workbench-helper-api/pom.xml
new file mode 100644
index 0000000..9f3945f
--- /dev/null
+++ b/taverna-workbench-helper-api/pom.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>net.sf.taverna.t2</groupId>
+		<artifactId>ui-api</artifactId>
+		<version>2.0-SNAPSHOT</version>
+	</parent>
+	<groupId>net.sf.taverna.t2.ui-api</groupId>
+	<artifactId>helper-api</artifactId>
+	<packaging>bundle</packaging>
+	<name>Help System</name>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<configuration>
+					<instructions>
+						<Embed-Dependency>javahelp</Embed-Dependency>
+						<Import-Package>org.jdesktop.jdic.browser;resolution:=optional,*</Import-Package>
+					</instructions>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	<dependencies>
+		<dependency>
+			<groupId>net.sf.taverna.t2.ui-api</groupId>
+			<artifactId>workbench-api</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>javax.help</groupId>
+			<artifactId>javahelp</artifactId>
+			<scope>provided</scope>
+		</dependency>
+		<!-- Required by javahelp -->
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>com.springsource.javax.servlet</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>com.springsource.javax.servlet.jsp</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>javax.el</groupId>
+			<artifactId>com.springsource.javax.el</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.log4j</groupId>
+			<artifactId>com.springsource.org.apache.log4j</artifactId>
+		</dependency>
+	</dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/HelpCollator.java
----------------------------------------------------------------------
diff --git a/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/HelpCollator.java b/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/HelpCollator.java
new file mode 100644
index 0000000..8b19b69
--- /dev/null
+++ b/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/HelpCollator.java
@@ -0,0 +1,307 @@
+package net.sf.taverna.t2.workbench.helper;
+
+import java.awt.Component;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.help.BadIDException;
+import javax.help.HelpSet;
+import javax.help.HelpSetException;
+import javax.help.Map.ID;
+import javax.help.TryMap;
+import javax.swing.JTree;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.TreePath;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This class loads the {@link HelpSet} and also deals with the registration of
+ * ids and the decoding from a {@link Component} to the corresponding id. These
+ * two sets of functionality should possibly be separated.
+ * 
+ * @author alanrw
+ */
+// TODO Convert to a bean
+public final class HelpCollator {
+	private static Logger logger = Logger.getLogger(HelpCollator.class);
+	/**
+	 * The HelpSet that is being used.
+	 */
+	private static HelpSet hs = null;
+	/**
+	 * The mapping from components to ids. This is used because of problems with
+	 * CSH throwing exceptions because it tried to use ids that were not in the
+	 * map.
+	 */
+	private static Map<Component, String> idMap;
+	/**
+	 * Indicates whether the HelpCollator has been initialized.
+	 */
+	private static boolean initialized = false;
+	/**
+	 * A Pattern for normalizing the ids.
+	 */
+	private static Pattern nonAlphanumeric;
+	/**
+	 * The emptyHelp is set if the HelpCollator was unable to read the
+	 */
+	private static boolean emptyHelp = true;
+	private static int TIMEOUT = 5000;
+
+	private static String externalHelpSetURL = "http://www.mygrid.org.uk/taverna/helpset/"
+			+ version() + "/helpset.hs";
+
+	// private static Profile profile = ProfileFactory.getInstance().getProfile();
+	private static String version() {
+		return "NO-VERSION";//profile.getVersion();
+		// TODO find a better way to find the version
+	}
+
+	/**
+	 * Attempt to read the up-to-date HelpSet from the web
+	 */
+	private static void readExternalHelpSet() {
+		try {
+			URL url = new URL(externalHelpSetURL);
+			checkConnection(url);
+			hs = new HelpSet(null, url);
+			if (hs.getLocalMap() == null) {
+			    hs = null;
+				logger.error("Helpset from " + externalHelpSetURL
+						+ " local map was null");
+			} else
+				logger.info("Read external help set from " + externalHelpSetURL);
+		} catch (MissingResourceException e) {
+		    logger.error("No external HelpSet URL specified", e);
+		} catch (MalformedURLException e) {
+		    logger.error("External HelpSet URL is malformed", e);
+		} catch (HelpSetException e) {
+		    logger.error("External HelpSet could not be read", e);
+		} catch (IOException e) {
+			logger.error("IOException reading External HelpSet", e);
+		}
+	}
+
+	private static void checkConnection(URL url) throws IOException {
+		if (!url.getProtocol().startsWith("http"))
+			return;
+		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+		connection.setReadTimeout(TIMEOUT);
+		connection.setConnectTimeout(TIMEOUT);
+		connection.setRequestMethod("HEAD");
+		connection.getInputStream().close();
+		connection.disconnect();
+	}
+
+	/**
+	 * This methods creates a HelpSet based upon, in priority, the external
+	 * HelpSet, then a newly created empty HelpSet.
+	 */
+	private static void initialize() {
+		if (initialized)
+			return;
+		readExternalHelpSet();
+		if (hs == null) {
+			hs = new HelpSet();
+			hs.setLocalMap(new TryMap());
+		} else {
+			logger.trace("EmptyHelp set to false");
+			emptyHelp = false;
+		}
+		idMap = new HashMap<>();
+		nonAlphanumeric = Pattern.compile("[^a-z0-9\\.]");
+		initialized = true;
+	}
+
+	/**
+	 * Indicates if an empty HelpSet is being used
+	 *
+	 * @return
+	 */
+	public static boolean isEmptyHelp() {
+		return emptyHelp;
+	}
+
+	public static URL getURLFromID(String id) throws BadIDException,
+			MalformedURLException {
+		initialize();
+		logger.trace("Looking for id: " + id);
+		ID theId = ID.create(id, hs);
+		if (theId == null)
+			return null;
+		return hs.getCombinedMap().getURLFromID(theId);
+	}
+
+	/**
+	 * Register a component under the specified id. The method checks that the
+	 * id is known to the HelpSet's map.
+	 * 
+	 * @param component
+	 * @param id
+	 */
+	public static void registerComponent(Component component, String id) {
+		logger.trace("Attempting to register " + id);
+		initialize();
+		String normalizedId = normalizeString(id.toLowerCase());
+		if (idMap.containsKey(component)) {
+			logger.info("Registered " + normalizedId);
+			return;
+		}
+
+		/*
+		 * If Workbench is started up while there is no network connection -
+		 * hs.getLocalMap() is null for some reason
+		 */
+		if (hs != null && hs.getLocalMap() != null
+				&& hs.getLocalMap().isValidID(normalizedId, hs)) {
+			idMap.put(component, normalizedId);
+			logger.info("Registered " + normalizedId);
+		} else
+			logger.warn("Refused to register component as " + normalizedId
+					+ " not in map");
+	}
+
+	/**
+	 * Register a component. Since no id is specified, the HelpCollator takes
+	 * the canonical name of the component's class. This is useful when an
+	 * explicit hierarchy-based approach has been taken.
+	 *
+	 * @param component
+	 */
+	public static void registerComponent(Component component) {
+		String canonicalName = component.getClass().getCanonicalName();
+		if (canonicalName != null)
+			registerComponent(component, canonicalName);
+	}
+
+	/**
+	 * Register a component based upon its parent's class and a suffix
+	 * indicating the component's purpose in the parent.
+	 *
+	 * @param component
+	 * @param parent
+	 * @param suffix
+	 */
+	public static void registerComponent(Component component, Object parent,
+			String suffix) {
+		String canonicalName = parent.getClass().getCanonicalName();
+		if (canonicalName != null)
+			registerComponent(component, canonicalName + "-" + suffix);
+	}
+
+	/**
+	 * Try to find an id for the Component. This code should be re-written when
+	 * we have more experience in how to couple the UI and HelpSets.
+	 *
+	 * @param c
+	 * @return
+	 */
+	static String getHelpID(Component c) {
+		initialize();
+		boolean found = false;
+		String result = null;
+		if (c instanceof JTree) {
+			String idInTree = getHelpIDInTree((JTree) c);
+			if (idInTree != null) {
+				found = true;
+				result = idInTree;
+			}
+		}
+		Component working = c;
+		if (c != null)
+			logger.trace("Starting at a " + working.getClass());
+		while (!found && (working != null)) {
+			if (idMap.containsKey(working)) {
+				result = idMap.get(working);
+				found = true;
+				logger.trace("Found component id " + result);
+			} else {
+				String className = working.getClass().getCanonicalName();
+				if (hs.getLocalMap().isValidID(className, hs)) {
+					result = className;
+					found = true;
+					logger.trace("Found class name " + result);
+				}
+			}
+			if (!found) {
+				working = working.getParent();
+				if (working != null)
+					logger.trace("Moved up to a " + working.getClass());
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Change the input String into an id that contains only alphanumeric
+	 * characters or hyphens.
+	 *
+	 * @param input
+	 * @return
+	 */
+	private static String normalizeString(String input) {
+		Matcher m = nonAlphanumeric.matcher(input);
+		return m.replaceAll("-");
+	}
+
+	/**
+	 * If help is sought on part of a JTree, then this method attempts to find a
+	 * node of the tree that can be mapped to an id. The possibilities are ad
+	 * hoc and should be re-examined when more experience is gained.
+	 * 
+	 * @param c
+	 * @return
+	 */
+	private static String getHelpIDInTree(JTree c) {
+		initialize();
+
+		TreePath tp = c.getSelectionPath();
+		if (tp == null)
+			return null;
+
+		Object o = tp.getLastPathComponent();
+		if (o == null)
+			return null;
+
+		if (o instanceof DefaultMutableTreeNode) {
+			DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode) o;
+			if (dmtn.getUserObject() != null)
+				o = dmtn.getUserObject();
+		}
+
+		String className = o.getClass().getCanonicalName();
+
+		logger.trace("Tree node as a string is " + o);
+
+		String possibility = normalizeString(o.toString().toLowerCase());
+
+		logger.trace("Normalized is " + possibility);
+		logger.trace("Tree node class name is " + className);
+
+		possibility = className + "-" + possibility;
+
+		logger.trace("Possibility is " + possibility);
+
+		String result;
+		if (hs.getLocalMap().isValidID(possibility, hs)) {
+			result = possibility;
+			logger.trace("Accepted tree node " + result);
+		} else if (hs.getLocalMap().isValidID(className, hs)) {
+			result = className;
+			logger.trace("Found tree node class name " + result);
+		} else {
+			result = null;
+		}
+
+		logger.debug("Tree node is a " + o.getClass());
+		return result;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/HelpEnabledDialog.java
----------------------------------------------------------------------
diff --git a/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/HelpEnabledDialog.java b/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/HelpEnabledDialog.java
new file mode 100644
index 0000000..ec17171
--- /dev/null
+++ b/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/HelpEnabledDialog.java
@@ -0,0 +1,101 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.workbench.helper;
+
+import static net.sf.taverna.t2.workbench.MainWindow.getMainWindow;
+import static net.sf.taverna.t2.workbench.helper.HelpCollator.registerComponent;
+import static net.sf.taverna.t2.workbench.helper.Helper.setKeyCatcher;
+
+import java.awt.Dialog;
+import java.awt.Frame;
+import java.awt.HeadlessException;
+
+import javax.swing.JDialog;
+
+/**
+ * This class extends JDialog to register the dialog and also attach a key
+ * catcher so that F1 is interpreted as help
+ *
+ * @author alanrw
+ */
+public class HelpEnabledDialog extends JDialog {
+	private static final long serialVersionUID = -5068807887477419800L;
+
+	/**
+	 * Create a HelpEnabledDialog, register it (if possible) with the
+	 * HelpCollator and attach a keycatcher.
+	 *
+	 * @param owner
+	 * @param title
+	 * @param modal
+	 * @param id
+	 * @throws HeadlessException
+	 */
+	public HelpEnabledDialog(Frame owner, String title, boolean modal, String id)
+			throws HeadlessException {
+		super(owner == null ? getMainWindow() : owner, title, modal);
+
+		if (id != null)
+			registerComponent(this, id);
+		else if (owner != null)
+			registerComponent(this, owner.getClass().getCanonicalName()
+					+ "-dialog");
+		else if (title != null && !title.isEmpty())
+			registerComponent(this, title);
+		setKeyCatcher(this);
+	}
+
+	/**
+	 * Create a HelpEnabledDialog, register it (if possible) with the
+	 * HelpCollator and attach a keycatcher.
+	 *
+	 * @param owner
+	 * @param title
+	 * @param modal
+	 * @param id
+	 * @throws HeadlessException
+	 */
+	public HelpEnabledDialog(Dialog owner, String title, boolean modal,
+			String id) throws HeadlessException {
+		super(owner, title, modal);
+		if (id != null)
+			registerComponent(this, id);
+		else if (owner != null)
+			registerComponent(this, owner.getClass().getCanonicalName()
+					+ "-dialog");
+		setKeyCatcher(this);
+	}
+
+	/**
+	 * Create a HelpEnabledDialog, register it (if possible) with the
+	 * HelpCollator and attach a keycatcher.
+	 *
+	 * @param owner
+	 * @param title
+	 * @param modal
+	 * @throws HeadlessException
+	 */
+	public HelpEnabledDialog(Frame parent, String title, boolean modal) {
+		this(parent, title, modal, null);
+	}
+
+	/**
+	 * Create a HelpEnabledDialog, register it (if possible) with the
+	 * HelpCollator and attach a keycatcher.
+	 *
+	 * @param owner
+	 * @param title
+	 * @param modal
+	 * @throws HeadlessException
+	 */
+	public HelpEnabledDialog(Dialog parent, String title, boolean modal) {
+		this(parent, title, modal, null);
+	}
+
+	@Override
+	public void setVisible(boolean b) {
+		setLocationRelativeTo(getParent());
+		super.setVisible(b);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/Helper.java
----------------------------------------------------------------------
diff --git a/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/Helper.java b/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/Helper.java
new file mode 100644
index 0000000..21b0f75
--- /dev/null
+++ b/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/Helper.java
@@ -0,0 +1,187 @@
+/**
+ *
+ */
+package net.sf.taverna.t2.workbench.helper;
+
+import static java.awt.Desktop.getDesktop;
+import static java.awt.MouseInfo.getPointerInfo;
+import static javax.swing.JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT;
+import static javax.swing.KeyStroke.getKeyStroke;
+import static net.sf.taverna.t2.workbench.helper.HelpCollator.getHelpID;
+import static net.sf.taverna.t2.workbench.helper.HelpCollator.getURLFromID;
+
+import java.awt.AWTEvent;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import javax.help.BadIDException;
+import javax.swing.AbstractAction;
+import javax.swing.ActionMap;
+import javax.swing.InputMap;
+import javax.swing.JComponent;
+import javax.swing.JRootPane;
+import javax.swing.RootPaneContainer;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This class creates the dialogs for the presentation of the HelpSet held by
+ * the HelpCollator.
+ *
+ * @author alanrw
+ */
+public final class Helper {
+	private static Helper instance;
+	private static Logger logger = Logger.getLogger(Helper.class);
+
+	/**
+	 * Create a Helper and initialize the static variables.
+	 */
+	private Helper() {
+	}
+
+	/**
+	 * Get the singleton instance of Helper. In theory there could be more than
+	 * one.
+	 *
+	 * @return
+	 */
+	private static Helper getInstance() {
+		if (instance == null)
+			instance = new Helper();
+		return instance;
+	}
+
+	/**
+	 * Show in the current dialog the entry (if any) corresponding to the
+	 * specified id.
+	 *
+	 * @param id
+	 */
+	private static void showID(String id) {
+		getInstance();
+		try {
+			URL result = getURLFromID(id);
+			if (result == null)
+				result = getURLFromID("home");
+			getDesktop().browse(result.toURI());
+		} catch (BadIDException | IOException | URISyntaxException e) {
+			logger.error(e);
+		}
+	}
+
+	/**
+	 * Show the most suitable help for the specified component.
+	 *
+	 * @param c
+	 */
+	public static void showHelp(Component c) {
+		showID(getHelpID(c));
+	}
+
+	/**
+	 * Display the default home page help.
+	 *
+	 * @param e
+	 */
+	public static void displayDefaultHelp(AWTEvent e) {
+		showID("home");
+	}
+
+	public static void displayFieldLevelHelp(ActionEvent e) {
+		//
+	}
+
+	private static final String HELP_KEY = "F1";
+
+	/**
+	 * Associated the specified action with key presses in the specified
+	 * component.
+	 * 
+	 * @param component
+	 * @param theAction
+	 */
+	public static void setKeyCatcher(final JComponent component,
+			final AbstractAction theAction) {
+		InputMap oldInputMap = component
+				.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
+		InputMap newInputMap = new InputMap();
+		newInputMap.setParent(oldInputMap);
+		newInputMap.put(getKeyStroke(HELP_KEY), "doSomething");
+		component.setInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, newInputMap);
+		ActionMap oldActionMap = component.getActionMap();
+		ActionMap newActionMap = new ActionMap();
+		newActionMap.setParent(oldActionMap);
+		newActionMap.put("doSomething", theAction);
+		component.setActionMap(newActionMap);
+	}
+
+	/**
+	 * Set up a key-press catcher for the specified component such that when F1
+	 * is pressed it should help for the component where the cursor is.
+	 *
+	 * @param rootpanecontainer
+	 */
+	public static void setKeyCatcher(final RootPaneContainer rootpanecontainer) {
+		@SuppressWarnings("serial")
+		AbstractAction theAction = new AbstractAction() {
+			@Override
+			public void actionPerformed(ActionEvent evt) {
+				Component component = (Component) rootpanecontainer;
+				Container container = (Container) rootpanecontainer;
+				logger.info("frame action F1 pressed with source "
+						+ evt.getSource().getClass().getName());
+				Point mousePosition = getPointerInfo().getLocation();
+				Point framePosition = component.getLocation();
+				Point relativePosition = (Point) mousePosition.clone();
+				relativePosition.translate(-framePosition.x, -framePosition.y);
+				Component c = container.findComponentAt(relativePosition);
+				if (c != null)
+					logger.info("F1 pressed in a " + c.getClass().getName());
+				showHelpWithinContainer(rootpanecontainer, c);
+			}
+		};
+
+		JRootPane pane = rootpanecontainer.getRootPane();
+		setKeyCatcher(pane, theAction);
+	}
+
+	/**
+	 * Show the help most associated with the specific component within the container.
+	 *
+	 * @param root
+	 * @param c
+	 */
+	static void showHelpWithinContainer(RootPaneContainer root, Component c) {
+		getInstance();
+		showHelp(c);
+	}
+
+	/**
+	 * Register a component with the {@link HelpCollator} under the specified
+	 * id.
+	 * 
+	 * @param component
+	 * @param id
+	 */
+	public static void registerComponent(Component component, final String id) {
+		HelpCollator.registerComponent(component, id);
+	}
+
+	/**
+	 * Register a component with the {@link HelpCollator}.
+	 *
+	 * @param component
+	 * @param parent
+	 * @param suffix
+	 */
+	public static void registerComponent(Component component, Object parent,
+			String suffix) {
+		HelpCollator.registerComponent(component, parent, suffix);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/NonBlockedHelpEnabledDialog.java
----------------------------------------------------------------------
diff --git a/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/NonBlockedHelpEnabledDialog.java b/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/NonBlockedHelpEnabledDialog.java
new file mode 100644
index 0000000..67e6bc5
--- /dev/null
+++ b/taverna-workbench-helper-api/src/main/java/net/sf/taverna/t2/workbench/helper/NonBlockedHelpEnabledDialog.java
@@ -0,0 +1,40 @@
+/**
+ * 
+ */
+package net.sf.taverna.t2.workbench.helper;
+
+import static java.awt.Dialog.ModalExclusionType.APPLICATION_EXCLUDE;
+
+import java.awt.Dialog;
+import java.awt.Frame;
+import java.awt.HeadlessException;
+
+/**
+ * @author alanrw
+ */
+public class NonBlockedHelpEnabledDialog extends HelpEnabledDialog {
+	private static final long serialVersionUID = -2455471377333940417L;
+
+	public NonBlockedHelpEnabledDialog(Dialog owner, String title,
+			boolean modal, String id) throws HeadlessException {
+		super(owner, title, modal, id);
+		this.setModalExclusionType(APPLICATION_EXCLUDE);
+	}
+
+	public NonBlockedHelpEnabledDialog(Frame owner, String title,
+			boolean modal, String id) throws HeadlessException {
+		super(owner, title, modal, id);
+		this.setModalExclusionType(APPLICATION_EXCLUDE);
+	}
+
+	public NonBlockedHelpEnabledDialog(Frame parent, String title, boolean modal) {
+		super(parent, title, modal, null);
+		this.setModalExclusionType(APPLICATION_EXCLUDE);
+	}
+
+	public NonBlockedHelpEnabledDialog(Dialog parent, String title,
+			boolean modal) {
+		super(parent, title, modal, null);
+		this.setModalExclusionType(APPLICATION_EXCLUDE);
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-helper/pom.xml
----------------------------------------------------------------------
diff --git a/taverna-workbench-helper/pom.xml b/taverna-workbench-helper/pom.xml
new file mode 100644
index 0000000..70c0621
--- /dev/null
+++ b/taverna-workbench-helper/pom.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>net.sf.taverna.t2</groupId>
+		<artifactId>ui-impl</artifactId>
+		<version>2.0-SNAPSHOT</version>
+	</parent>
+	<groupId>net.sf.taverna.t2.ui-impl</groupId>
+	<artifactId>helper</artifactId>
+	<name>Help System (legacy dependency)</name>
+	<dependencies>
+		<dependency>
+            <groupId>net.sf.taverna.t2.ui-api</groupId>
+            <artifactId>helper-api</artifactId>
+            <version>${t2.ui.api.version}</version>
+		</dependency>
+	</dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/8c4b365e/taverna-workbench-httpproxy-config/pom.xml
----------------------------------------------------------------------
diff --git a/taverna-workbench-httpproxy-config/pom.xml b/taverna-workbench-httpproxy-config/pom.xml
new file mode 100644
index 0000000..f1a8328
--- /dev/null
+++ b/taverna-workbench-httpproxy-config/pom.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>net.sf.taverna.t2</groupId>
+		<artifactId>ui-impl</artifactId>
+		<version>2.0-SNAPSHOT</version>
+	</parent>
+	<groupId>net.sf.taverna.t2.ui-impl</groupId>
+	<artifactId>httpproxy-config</artifactId>
+	<packaging>bundle</packaging>
+	<name>HTTP Proxy configuration</name>
+	<dependencies>
+		<dependency>
+			<groupId>net.sf.taverna.t2.lang</groupId>
+			<artifactId>ui</artifactId>
+			<version>${t2.lang.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>uk.org.taverna.configuration</groupId>
+			<artifactId>taverna-configuration-api</artifactId>
+			<version>${taverna.configuration.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>net.sf.taverna.t2.ui-api</groupId>
+			<artifactId>helper-api</artifactId>
+			<version>${t2.ui.api.version}</version>
+		</dependency>
+ 	</dependencies>
+</project>