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 < 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 < 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>