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/03/06 23:34:36 UTC

[40/50] [abbrv] incubator-taverna-workbench git commit: taverna-*

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/JTreeTable.java
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/JTreeTable.java b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/JTreeTable.java
new file mode 100644
index 0000000..85d3577
--- /dev/null
+++ b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/JTreeTable.java
@@ -0,0 +1,657 @@
+/*
+ * @(#)JTreeTable.java	1.2 98/10/27
+ *
+ * Copyright 1997, 1998 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ */
+package net.sf.taverna.t2.lang.ui.treetable;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.EventObject;
+
+import javax.swing.DefaultCellEditor;
+import javax.swing.Icon;
+import javax.swing.JLabel;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.JTree;
+import javax.swing.ListSelectionModel;
+import javax.swing.LookAndFeel;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.tree.DefaultTreeCellRenderer;
+import javax.swing.tree.DefaultTreeSelectionModel;
+import javax.swing.tree.TreeCellRenderer;
+import javax.swing.tree.TreeModel;
+import javax.swing.tree.TreePath;
+import javax.swing.tree.TreeSelectionModel;
+
+/**
+ * This example shows how to create a simple JTreeTable component, by using a
+ * JTree as a renderer (and editor) for the cells in a particular column in the
+ * JTable.
+ * 
+ * @version 1.2 10/27/98
+ * 
+ * @author Philip Milne
+ * @author Scott Violet
+ * @author Tom Oinn
+ */
+@SuppressWarnings("serial")
+public class JTreeTable extends JTable {
+	/** A subclass of JTree. */
+	protected TreeTableCellRenderer tree;
+
+
+	private static SimpleDateFormat ISO_8601_FORMAT = new SimpleDateFormat(
+			"yyyy-MM-dd HH:mm:ss");
+	private static SimpleDateFormat TIME_FORMAT = new SimpleDateFormat(
+			"HH:mm:ss");
+
+	
+	public JTreeTable() {
+		super();
+	}
+
+	public JTreeTable(TreeTableModel treeTableModel) {
+		super();
+		setModel(treeTableModel);
+	}
+
+	public void setModel(TreeTableModel model) {
+		tree = new TreeTableCellRenderer(model);
+		super.setModel(new TreeTableModelAdapter(model, tree));
+		
+		ListToTreeSelectionModelWrapper selectionWrapper = new ListToTreeSelectionModelWrapper();
+		tree.setSelectionModel(selectionWrapper);
+		setSelectionModel(selectionWrapper.getListSelectionModel());
+		
+		// Install the tree editor renderer and editor.
+		setDefaultRenderer(TreeTableModel.class, tree);
+		setDefaultRenderer(Date.class, new DateCellRenderer());
+		setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor());
+		
+		// Show grid but only if Look and Feel is not Java 6's Nimbus
+		if (!UIManager.getLookAndFeel().getName().equals("Nimbus")){
+			setShowGrid(true);
+			setGridColor(Color.LIGHT_GRAY);
+		}
+		else{
+			setShowGrid(false);
+		}
+
+		// No intercell spacing
+		setIntercellSpacing(new Dimension(0, 0));
+
+		// Add a mouse listener to forward events on to the tree.
+		// We need this as on MAC only double clicks seem to expand the tree.
+		addMouseListener(new MouseAdapter() {
+			public void mousePressed(MouseEvent e) {
+
+				for (int counter = getColumnCount() - 1; counter >= 0; counter--) {
+					if (getColumnClass(counter) == TreeTableModel.class) {
+						MouseEvent me = (MouseEvent) e;
+						MouseEvent newME = new MouseEvent(tree, me.getID(), me
+								.getWhen(), me.getModifiers(), me.getX()
+								- getCellRect(0, counter, true).x, me.getY(),
+								me.getClickCount(), me.isPopupTrigger());
+						if (me.getClickCount() == 1) {
+							tree.dispatchEvent(newME);
+						}
+					}
+					else{
+						
+					}
+				}
+			}
+		});
+
+		// And update the height of the trees row to match that of
+		// the table.
+
+		if (tree.getRowHeight() < 1) {
+			// Metal looks better like this.
+			setRowHeight(18);
+		}
+
+	}
+
+	/**
+	 * Overridden to message super and forward the method to the tree. Since the
+	 * tree is not actually in the component hierarchy it will never receive this
+	 * unless we forward it in this manner.
+	 */
+	public void updateUI() {
+		super.updateUI();
+		if (tree != null) {
+			tree.updateUI();
+		}
+		// Use the tree's default foreground and background colors in the
+		// table.
+		LookAndFeel.installColorsAndFont(this, "Tree.background",
+				"Tree.foreground", "Tree.font");
+	}
+
+	/*
+	 * Workaround for BasicTableUI anomaly. Make sure the UI never tries to
+	 * paint the editor. The UI currently uses different techniques to paint the
+	 * renderers and editors and overriding setBounds() below is not the right
+	 * thing to do for an editor. Returning -1 for the editing row in this case,
+	 * ensures the editor is never painted.
+	 */
+	public int getEditingRow() {
+		return (getColumnClass(editingColumn) == TreeTableModel.class) ? -1
+				: editingRow;
+	}
+
+	/**
+	 * Returns the actual row that is editing as <code>getEditingRow</code> will
+	 * always return -1.
+	 */
+	private int realEditingRow() {
+		return editingRow;
+	}
+
+	/**
+	 * This is overridden to invoke super's implementation, and then, if the
+	 * receiver is editing a Tree column, the editor's bounds is reset. The
+	 * reason we have to do this is because JTable doesn't think the table is
+	 * being edited, as <code>getEditingRow</code> returns -1, and therefore
+	 * doesn't automatically resize the editor for us.
+	 */
+	public void sizeColumnsToFit(int resizingColumn) {
+		super.sizeColumnsToFit(resizingColumn);
+		if (getEditingColumn() != -1
+				&& getColumnClass(editingColumn) == TreeTableModel.class) {
+			Rectangle cellRect = getCellRect(realEditingRow(),
+					getEditingColumn(), false);
+			Component component = getEditorComponent();
+			component.setBounds(cellRect);
+			component.validate();
+		}
+	}
+
+	/**
+	 * Overridden to pass the new rowHeight to the tree.
+	 */
+	public void setRowHeight(int rowHeight) {
+		super.setRowHeight(rowHeight);
+		if (tree != null && tree.getRowHeight() != rowHeight) {
+			tree.setRowHeight(getRowHeight());
+		}
+	}
+
+	/**
+	 * Returns the tree that is being shared between the model.
+	 */
+	public JTree getTree() {
+		return tree;
+	}
+
+	/**
+	 * Overridden to invoke repaint for the particular location if the column
+	 * contains the tree. This is done as the tree editor does not fill the
+	 * bounds of the cell, we need the renderer to paint the tree in the
+	 * background, and then draw the editor over it.
+	 */
+	public boolean editCellAt(int row, int column, EventObject e) {
+		boolean retValue = super.editCellAt(row, column, e);
+		if (retValue && getColumnClass(column) == TreeTableModel.class) {
+			repaint(getCellRect(row, column, false));
+		}
+		return retValue;
+	}
+
+	/**
+	 * A TreeCellRenderer that displays a JTree.
+	 */
+	public class TreeTableCellRenderer extends JTree implements
+			TableCellRenderer {
+		/** Last table/tree row asked to renderer. */
+		protected int visibleRow;
+		protected Border highlightBorder;
+
+		public TreeTableCellRenderer(TreeModel model) {
+			super(model);
+		}
+
+		/**
+		 * updateUI is overridden to set the colors of the Tree's renderer to
+		 * match that of the table.
+		 */
+		public void updateUI() {
+			super.updateUI();
+			// Make the tree's cell renderer use the table's cell selection
+			// colors.
+			TreeCellRenderer tcr = getCellRenderer();
+			if (tcr instanceof DefaultTreeCellRenderer) {
+				//DefaultTreeCellRenderer dtcr = ((DefaultTreeCellRenderer) tcr);
+				// For 1.1 uncomment this, 1.2 has a bug that will cause an
+				// exception to be thrown if the border selection color is
+				// null.
+				// dtcr.setBorderSelectionColor(null);
+				// dtcr.setTextSelectionColor(UIManager.getColor
+				// ("Table.selectionForeground"));
+				// dtcr.setBackgroundSelectionColor(UIManager.getColor
+				// ("Table.selectionBackground"));
+			}
+		}
+
+		/**
+		 * Sets the row height of the tree, and forwards the row height to the
+		 * table.
+		 */
+		public void setRowHeight(int rowHeight) {
+			if (rowHeight > 0) {
+				super.setRowHeight(rowHeight);
+				if (JTreeTable.this != null
+						&& JTreeTable.this.getRowHeight() != rowHeight) {
+					JTreeTable.this.setRowHeight(getRowHeight());
+				}
+			}
+		}
+
+		/**
+		 * This is overridden to set the height to match that of the JTable.
+		 */
+		public void setBounds(int x, int y, int w, int h) {
+			super.setBounds(x, 0, w, JTreeTable.this.getHeight());
+		}
+
+		/**
+		 * Subclassed to translate the graphics such that the last visible row
+		 * will be drawn at 0,0.
+		 */
+		public void paint(Graphics g) {
+			g.translate(0, -visibleRow * getRowHeight());
+			super.paint(g);
+			// Draw the Table border if we have focus.
+			if (highlightBorder != null) {
+				highlightBorder.paintBorder(this, g, 0, visibleRow
+						* getRowHeight(), getWidth(), getRowHeight());
+			}
+			else{			
+				// Tree cell renderer get rid of the grid lines for some 
+				// reason so we draw them here but only if Look and Feel
+				// is different from Java 6's Nimbus LaF
+				// as it completely ignores the grid lines
+				if (!UIManager.getLookAndFeel().getName().equals("Nimbus")){
+					LinesBorder linesBorder = new LinesBorder(getGridColor(),
+							new Insets(0, 0, 1, 1));
+					linesBorder
+					.paintBorder(this, g, 0, visibleRow * getRowHeight(),
+							getWidth(), getRowHeight());
+				}
+			}
+		}
+
+		/**
+		 * TreeCellRenderer method. Overridden to update the visible row.
+		 */
+		public Component getTableCellRendererComponent(JTable table,
+				Object value, boolean isSelected, boolean hasFocus, int row,
+				int column) {
+			Color background;
+			Color foreground;
+
+			if (isSelected) {
+				background = table.getSelectionBackground();
+				foreground = table.getSelectionForeground();
+			} else {
+				background = table.getBackground();
+				foreground = table.getForeground();
+			}
+			highlightBorder = null;
+			if (realEditingRow() == row && getEditingColumn() == column) {
+				// background = UIManager.getColor("Table.focusCellBackground");
+				// foreground = UIManager.getColor("Table.focusCellForeground");
+			} else if (hasFocus) {		
+				if (isSelected) {
+						highlightBorder = UIManager.getBorder("Table.focusSelectedCellHighlightBorder");
+				}
+				else{
+					highlightBorder = UIManager.getBorder("Table.focusCellHighlightBorder");
+				}				
+				if (isCellEditable(row, column)) {
+					// background = UIManager.getColor
+					// ("Table.focusCellBackground");
+					background = table.getSelectionBackground();
+					foreground = table.getSelectionForeground();
+				}
+			}
+
+			visibleRow = row;
+			setBackground(background);
+
+			TreeCellRenderer tcr = getCellRenderer();
+			if (tcr instanceof DefaultTreeCellRenderer) {
+				DefaultTreeCellRenderer dtcr = ((DefaultTreeCellRenderer) tcr);
+				if (isSelected) {
+					dtcr.setTextSelectionColor(foreground);
+					dtcr.setBackgroundSelectionColor(background);
+				} else {
+					dtcr.setTextNonSelectionColor(foreground);
+					dtcr.setBackgroundNonSelectionColor(background);
+				}
+			}		
+			return this;
+		}
+
+	}
+
+	public static String formatDate(Date date) {
+		final Date midnight = new Date();
+		midnight.setHours(0);
+		midnight.setMinutes(0);
+		midnight.setSeconds(0);
+		SimpleDateFormat format;
+		if (date.before(midnight)) {
+			// FULL DATE
+			format = ISO_8601_FORMAT;
+		} else {
+			format = TIME_FORMAT; 
+		}
+		final String formatted = format.format(date);
+		return formatted;
+	}
+	
+	/**
+	 * A TreeCellRenderer that displays a date in a "yyyy-MM-dd HH:mm:ss"
+	 * format.
+	 */
+	public class DateCellRenderer extends DefaultTableCellRenderer {
+		/** Last table/tree row asked to renderer. */
+		protected int visibleRow;
+		protected Border highlightBorder;
+
+		public DateCellRenderer() {
+			setOpaque(true);
+		}
+
+		public Component getTableCellRendererComponent(JTable table,
+				Object value, boolean isSelected, boolean hasFocus, int row,
+				int column) {
+			super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+			
+			if (isSelected) {
+//				this.setBackground(table.getSelectionBackground());
+//				this.setForeground(table.getSelectionForeground());
+			} else {
+				/*this.setBackground(table.getBackground());
+				this.setForeground(table.getForeground());*/
+			}
+			
+		
+			//dtcr.setBorderSelectionColor(null);
+			// dtcr.setTextSelectionColor(UIManager.getColor
+			// ("Table.selectionForeground"));
+			// dtcr.setBackgroundSelectionColor(UIManager.getColor
+			// ("Table.selectionBackground"));
+					
+
+			
+			Date date = (Date) ((TreeTableModelAdapter) getModel()).getValueAt(
+					row, column);
+			if (date != null) {				
+				setText(formatDate(date));
+			} else {
+				setText(null);
+			}
+			return this;
+		}
+
+	}
+
+	/**
+	 * TreeTableCellEditor implementation. Component returned is the JTree.
+	 */
+	public class TreeTableCellEditor extends DefaultCellEditor {
+		public TreeTableCellEditor() {
+			super(new TreeTableTextField());
+		}
+
+		public Component getTableCellEditorComponent(JTable table,
+				Object value, boolean isSelected, int r, int c) {
+			Component component = super.getTableCellEditorComponent(table,
+					value, isSelected, r, c);
+			JTree t = getTree();
+			boolean rv = t.isRootVisible();
+			int offsetRow = rv ? r : r - 1;
+			Rectangle bounds = t.getRowBounds(offsetRow);
+			int offset = bounds.x;
+			TreeCellRenderer tcr = t.getCellRenderer();
+			if (tcr instanceof DefaultTreeCellRenderer) {
+				Object node = t.getPathForRow(offsetRow).getLastPathComponent();
+				boolean isExpanded = t.isExpanded(t.getPathForRow(offsetRow));
+				boolean isLeaf = t.getModel().isLeaf(node);
+				Component renderer = tcr.getTreeCellRendererComponent(t, node,
+						true, isExpanded, isLeaf, offsetRow, true);
+				Icon icon = ((JLabel) renderer).getIcon();
+				// if (t.getModel().isLeaf(node))
+				// icon = ((DefaultTreeCellRenderer)tcr).getLeafIcon();
+				// else if (tree.isExpanded(offsetRow))
+				// icon = ((DefaultTreeCellRenderer)tcr).getOpenIcon();
+				// else
+				// icon = ((DefaultTreeCellRenderer)tcr).getClosedIcon();
+				if (icon != null) {
+					offset += ((DefaultTreeCellRenderer) tcr).getIconTextGap()
+							+ icon.getIconWidth();
+				}
+			}
+			((TreeTableTextField) getComponent()).offset = offset;
+			return component;
+		}
+
+		// /**
+		// * This is overridden to forward the event to the tree. This will
+		// return
+		// * true if the click count >= 3, or the event is null.
+		// */
+		// public boolean isCellEditable(EventObject e) {
+		// /**
+		// * if (e instanceof MouseEvent) { for (int counter =
+		// * getColumnCount() - 1; counter >= 0; counter--) { if
+		// * (getColumnClass(counter) == TreeTableModel.class) { MouseEvent me
+		// * = (MouseEvent)e; MouseEvent newME = new MouseEvent(tree,
+		// * me.getID(), me.getWhen(), me.getModifiers(), me.getX() -
+		// * getCellRect(0, counter, true).x, me.getY(), me.getClickCount(),
+		// * me.isPopupTrigger()); System.out.println(newME);
+		// * tree.dispatchEvent(newME); break; } } }
+		// */
+		// if (e instanceof MouseEvent) {
+		// MouseEvent me = (MouseEvent) e;
+		// if (me.getClickCount() >= 3) {
+		// return true;
+		// }
+		// }
+		// if (e == null) {
+		// return true;
+		// }
+		// return false;
+		// }
+
+		/**
+		 * This is overridden to forward the event to the tree. This will return
+		 * true if the click count >= 3, or the event is null.
+		 */
+		public boolean isCellEditable(EventObject e) {
+			// Edit on double click rather than the default triple
+			if (e instanceof MouseEvent) {
+				
+				MouseEvent me = (MouseEvent) e;
+				if (me.getClickCount() == 1
+						&& System.getProperty("os.name").equals("Mac OS X")) {
+					// Workaround for buggy tree table on OS X. Open/close the
+					// path
+					// on any click on the column (not just on the > icon)
+					for (int counter = getColumnCount() - 1; counter >= 0; counter--) {
+						if (getColumnClass(counter) == TreeTableModel.class) {
+							MouseEvent newME = new MouseEvent(tree, me.getID(),
+									me.getWhen(), me.getModifiers(), me.getX()
+											- getCellRect(0, counter, true).x,
+									me.getY(), me.getClickCount(), me
+											.isPopupTrigger());
+							tree.dispatchEvent(newME);
+
+							Point p = new Point(me.getX(), me.getY());
+							int row = rowAtPoint(p);
+							int column = columnAtPoint(p);
+							if (column == 0) {
+								boolean isExpanded = tree.isExpanded(tree
+										.getPathForRow(row));
+								if (isExpanded == false) {
+									tree.expandPath(tree.getPathForRow(row));
+								} else {
+									tree.collapsePath(tree.getPathForRow(row));
+								}
+							}
+
+							break;
+						}
+					}
+
+				}
+				/*
+				 * if (me.getClickCount() >= 3) { return true; }
+				 */// tree is no editable
+			}
+			if (e == null) {
+				return true;
+			}
+			return false;
+		}
+
+	}
+
+	/**
+	 * Component used by TreeTableCellEditor. The only thing this does is to
+	 * override the <code>reshape</code> method, and to ALWAYS make the x
+	 * location be <code>offset</code>.
+	 */
+	public static class TreeTableTextField extends JTextField {
+		public int offset;
+
+		public void setBounds(int x, int y, int w, int h) {
+			int newX = Math.max(x, offset);
+			super.setBounds(newX, y, w - (newX - x), h);
+		}
+	}
+
+	/**
+	 * ListToTreeSelectionModelWrapper extends DefaultTreeSelectionModel to
+	 * listen for changes in the ListSelectionModel it maintains. Once a change
+	 * in the ListSelectionModel happens, the paths are updated in the
+	 * DefaultTreeSelectionModel.
+	 */
+	class ListToTreeSelectionModelWrapper extends DefaultTreeSelectionModel {
+		/** Set to true when we are updating the ListSelectionModel. */
+		protected boolean updatingListSelectionModel;
+
+		public ListToTreeSelectionModelWrapper() {
+			super();
+			setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
+			getListSelectionModel().addListSelectionListener(
+					createListSelectionListener());
+		}
+
+		/**
+		 * Returns the list selection model. ListToTreeSelectionModelWrapper
+		 * listens for changes to this model and updates the selected paths
+		 * accordingly.
+		 */
+		ListSelectionModel getListSelectionModel() {
+			return listSelectionModel;
+		}
+
+		/**
+		 * This is overridden to set <code>updatingListSelectionModel</code> and
+		 * message super. This is the only place DefaultTreeSelectionModel
+		 * alters the ListSelectionModel.
+		 */
+		public void resetRowSelection() {
+			if (!updatingListSelectionModel) {
+				updatingListSelectionModel = true;
+				try {
+					super.resetRowSelection();
+				} finally {
+					updatingListSelectionModel = false;
+				}
+			}
+			// Notice how we don't message super if
+			// updatingListSelectionModel is true. If
+			// updatingListSelectionModel is true, it implies the
+			// ListSelectionModel has already been updated and the
+			// paths are the only thing that needs to be updated.
+		}
+
+		/**
+		 * Creates and returns an instance of ListSelectionHandler.
+		 */
+		protected ListSelectionListener createListSelectionListener() {
+			return new ListSelectionHandler();
+		}
+
+		/**
+		 * If <code>updatingListSelectionModel</code> is false, this will reset
+		 * the selected paths from the selected rows in the list selection
+		 * model.
+		 */
+		protected void updateSelectedPathsFromSelectedRows() {
+			if (!updatingListSelectionModel) {
+				updatingListSelectionModel = true;
+				try {
+					// This is way expensive, ListSelectionModel needs an
+					// enumerator for iterating.
+					int min = listSelectionModel.getMinSelectionIndex();
+					int max = listSelectionModel.getMaxSelectionIndex();
+
+					clearSelection();
+					if (min != -1 && max != -1) {
+						for (int counter = min; counter <= max; counter++) {
+							if (listSelectionModel.isSelectedIndex(counter)) {
+								TreePath selPath = tree.getPathForRow(counter);
+
+								if (selPath != null) {
+									addSelectionPath(selPath);
+								}
+							}
+						}
+					}
+				} finally {
+					updatingListSelectionModel = false;
+				}
+			}
+		}
+
+		/**
+		 * Class responsible for calling updateSelectedPathsFromSelectedRows
+		 * when the selection of the list change.
+		 */
+		class ListSelectionHandler implements ListSelectionListener {
+			public void valueChanged(ListSelectionEvent e) {
+				updateSelectedPathsFromSelectedRows();
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/LinesBorder.java
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/LinesBorder.java b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/LinesBorder.java
new file mode 100644
index 0000000..45ac3bb
--- /dev/null
+++ b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/LinesBorder.java
@@ -0,0 +1,178 @@
+/**
+ * Example from http://www.java2s.com/Code/Java/Swing-Components/CellBorderTableExample.htm
+ */
+package net.sf.taverna.t2.lang.ui.treetable;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Insets;
+
+import javax.swing.SwingConstants;
+import javax.swing.border.AbstractBorder;
+
+/**
+ * 
+ * Line border that lets you control the colour and thickness of all four edges. Needed to fix the tree cell
+ * renderer in the JTreeTable that looked a bit 'naff' on Windows (i.e. Windows draws lines around table 
+ * cells when default Look and Feel is in use and the tree cell renderer was not drawing lines.)
+ *
+ */
+@SuppressWarnings("serial")
+public class LinesBorder extends AbstractBorder implements SwingConstants {
+	  protected int northThickness;
+
+	  protected int southThickness;
+
+	  protected int eastThickness;
+
+	  protected int westThickness;
+
+	  protected Color northColor;
+
+	  protected Color southColor;
+
+	  protected Color eastColor;
+
+	  protected Color westColor;
+
+	  public LinesBorder(Color color) {
+	    this(color, 1);
+	  }
+
+	  public LinesBorder(Color color, int thickness) {
+	    setColor(color);
+	    setThickness(thickness);
+	  }
+
+	  public LinesBorder(Color color, Insets insets) {
+	    setColor(color);
+	    setThickness(insets);
+	  }
+
+	  public void paintBorder(Component c, Graphics g, int x, int y, int width,
+	      int height) {
+	    Color oldColor = g.getColor();
+
+	    g.setColor(northColor);
+	    for (int i = 0; i < northThickness; i++) {
+	      g.drawLine(x, y + i, x + width - 1, y + i);
+	    }
+	    g.setColor(southColor);
+	    for (int i = 0; i < southThickness; i++) {
+	      g
+	          .drawLine(x, y + height - i - 1, x + width - 1, y + height
+	              - i - 1);
+	    }
+	    g.setColor(eastColor);
+	    for (int i = 0; i < westThickness; i++) {
+	      g.drawLine(x + i, y, x + i, y + height - 1);
+	    }
+	    g.setColor(westColor);
+	    for (int i = 0; i < eastThickness; i++) {
+	      g.drawLine(x + width - i - 1, y, x + width - i - 1, y + height - 1);
+	    }
+
+	    g.setColor(oldColor);
+	  }
+
+	  public Insets getBorderInsets(Component c) {
+	    return new Insets(northThickness, westThickness, southThickness,
+	        eastThickness);
+	  }
+
+	  public Insets getBorderInsets(Component c, Insets insets) {
+	    return new Insets(northThickness, westThickness, southThickness,
+	        eastThickness);
+	  }
+
+	  public boolean isBorderOpaque() {
+	    return true;
+	  }
+
+	  public void setColor(Color c) {
+	    northColor = c;
+	    southColor = c;
+	    eastColor = c;
+	    westColor = c;
+	  }
+
+	  public void setColor(Color c, int direction) {
+	    switch (direction) {
+	    case NORTH:
+	      northColor = c;
+	      break;
+	    case SOUTH:
+	      southColor = c;
+	      break;
+	    case EAST:
+	      eastColor = c;
+	      break;
+	    case WEST:
+	      westColor = c;
+	      break;
+	    default:
+	    }
+	  }
+
+	  public void setThickness(int n) {
+	    northThickness = n;
+	    southThickness = n;
+	    eastThickness = n;
+	    westThickness = n;
+	  }
+
+	  public void setThickness(Insets insets) {
+	    northThickness = insets.top;
+	    southThickness = insets.bottom;
+	    eastThickness = insets.right;
+	    westThickness = insets.left;
+	  }
+
+	  public void setThickness(int n, int direction) {
+	    switch (direction) {
+	    case NORTH:
+	      northThickness = n;
+	      break;
+	    case SOUTH:
+	      southThickness = n;
+	      break;
+	    case EAST:
+	      eastThickness = n;
+	      break;
+	    case WEST:
+	      westThickness = n;
+	      break;
+	    default:
+	    }
+	  }
+
+	  public void append(LinesBorder b, boolean isReplace) {
+	    if (isReplace) {
+	      northThickness = b.northThickness;
+	      southThickness = b.southThickness;
+	      eastThickness = b.eastThickness;
+	      westThickness = b.westThickness;
+	    } else {
+	      northThickness = Math.max(northThickness, b.northThickness);
+	      southThickness = Math.max(southThickness, b.southThickness);
+	      eastThickness = Math.max(eastThickness, b.eastThickness);
+	      westThickness = Math.max(westThickness, b.westThickness);
+	    }
+	  }
+
+	  public void append(Insets insets, boolean isReplace) {
+	    if (isReplace) {
+	      northThickness = insets.top;
+	      southThickness = insets.bottom;
+	      eastThickness = insets.right;
+	      westThickness = insets.left;
+	    } else {
+	      northThickness = Math.max(northThickness, insets.top);
+	      southThickness = Math.max(southThickness, insets.bottom);
+	      eastThickness = Math.max(eastThickness, insets.right);
+	      westThickness = Math.max(westThickness, insets.left);
+	    }
+	  }
+
+	}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModel.java
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModel.java b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModel.java
new file mode 100644
index 0000000..36fa4fe
--- /dev/null
+++ b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModel.java
@@ -0,0 +1,69 @@
+/*
+ * TreeTableModel.java
+ *
+ * Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * This software is the confidential and proprietary information of Sun
+ * Microsystems, Inc. ("Confidential Information").  You shall not
+ * disclose such Confidential Information and shall use it only in
+ * accordance with the terms of the license agreement you entered into
+ * with Sun.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+package net.sf.taverna.t2.lang.ui.treetable;
+
+import javax.swing.tree.TreeModel;
+
+/**
+ * TreeTableModel is the model used by a JTreeTable. It extends TreeModel
+ * to add methods for getting inforamtion about the set of columns each 
+ * node in the TreeTableModel may have. Each column, like a column in 
+ * a TableModel, has a name and a type associated with it. Each node in 
+ * the TreeTableModel can return a value for each of the columns and 
+ * set that value if isCellEditable() returns true. 
+ *
+ * @author Philip Milne 
+ * @author Scott Violet
+ */
+public interface TreeTableModel extends TreeModel
+{
+    /**
+     * Returns the number ofs availible column.
+     */
+    public int getColumnCount();
+
+    /**
+     * Returns the name for column number <code>column</code>.
+     */
+    public String getColumnName(int column);
+
+    /**
+     * Returns the type for column number <code>column</code>.
+     */
+    public Class getColumnClass(int column);
+
+    /**
+     * Returns the value to be displayed for node <code>node</code>, 
+     * at column number <code>column</code>.
+     */
+    public Object getValueAt(Object node, int column);
+
+    /**
+     * Indicates whether the the value for node <code>node</code>, 
+     * at column number <code>column</code> is editable.
+     */
+    public boolean isCellEditable(Object node, int column);
+
+    /**
+     * Sets the value for node <code>node</code>, 
+     * at column number <code>column</code>.
+     */
+    public void setValueAt(Object aValue, Object node, int column);
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModelAdapter.java
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModelAdapter.java b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModelAdapter.java
new file mode 100644
index 0000000..a6cdd24
--- /dev/null
+++ b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModelAdapter.java
@@ -0,0 +1,132 @@
+/*
+ * @(#)TreeTableModelAdapter.java	1.2 98/10/27
+ *
+ * Copyright 1997, 1998 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ */
+package net.sf.taverna.t2.lang.ui.treetable;
+
+import javax.swing.JTree;
+import javax.swing.SwingUtilities;
+import javax.swing.event.TreeExpansionEvent;
+import javax.swing.event.TreeExpansionListener;
+import javax.swing.event.TreeModelEvent;
+import javax.swing.event.TreeModelListener;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.tree.TreePath;
+
+/**
+ * This is a wrapper class takes a TreeTableModel and implements 
+ * the table model interface. The implementation is trivial, with 
+ * all of the event dispatching support provided by the superclass: 
+ * the AbstractTableModel. 
+ *
+ * @version 1.2 10/27/98
+ *
+ * @author Philip Milne
+ * @author Scott Violet
+ */
+@SuppressWarnings("serial")
+public class TreeTableModelAdapter extends AbstractTableModel
+{
+    JTree tree;
+    TreeTableModel treeTableModel;
+
+    public TreeTableModelAdapter(TreeTableModel treeTableModel, JTree tree) {
+        this.tree = tree;
+        this.treeTableModel = treeTableModel;
+
+	tree.addTreeExpansionListener(new TreeExpansionListener() {
+	    // Don't use fireTableRowsInserted() here; the selection model
+	    // would get updated twice. 
+	    public void treeExpanded(TreeExpansionEvent event) {  
+	      fireTableDataChanged(); 
+	    }
+            public void treeCollapsed(TreeExpansionEvent event) {  
+	      fireTableDataChanged(); 
+	    }
+	});
+
+	// Install a TreeModelListener that can update the table when
+	// tree changes. We use delayedFireTableDataChanged as we can
+	// not be guaranteed the tree will have finished processing
+	// the event before us.
+	treeTableModel.addTreeModelListener(new TreeModelListener() {
+	    public void treeNodesChanged(TreeModelEvent e) {
+		delayedFireTableDataChanged();
+	    }
+
+	    public void treeNodesInserted(TreeModelEvent e) {
+		delayedFireTableDataChanged();
+	    }
+
+	    public void treeNodesRemoved(TreeModelEvent e) {
+		delayedFireTableDataChanged();
+	    }
+
+	    public void treeStructureChanged(TreeModelEvent e) {
+		delayedFireTableDataChanged();
+	    }
+	});
+    }
+
+    // Wrappers, implementing TableModel interface. 
+
+    public int getColumnCount() {
+	return treeTableModel.getColumnCount();
+    }
+
+    public String getColumnName(int column) {
+	return treeTableModel.getColumnName(column);
+    }
+
+    public Class getColumnClass(int column) {
+	return treeTableModel.getColumnClass(column);
+    }
+
+    public int getRowCount() {
+	return tree.getRowCount();
+    }
+
+    protected Object nodeForRow(int row) {
+    	TreePath treePath = tree.getPathForRow(row);
+    	if (treePath == null) {
+    		return null;
+    	}
+    	return treePath.getLastPathComponent();         
+    }
+
+    public Object getValueAt(int row, int column) {
+    	return treeTableModel.getValueAt(nodeForRow(row), column);
+    }
+
+    public boolean isCellEditable(int row, int column) {
+         return treeTableModel.isCellEditable(nodeForRow(row), column); 
+    }
+
+    public void setValueAt(Object value, int row, int column) {
+	treeTableModel.setValueAt(value, nodeForRow(row), column);
+    }
+
+    /**
+     * Invokes fireTableDataChanged after all the pending events have been
+     * processed. SwingUtilities.invokeLater is used to handle this.
+     */
+    protected void delayedFireTableDataChanged() {
+	SwingUtilities.invokeLater(new Runnable() {
+	    public void run() {
+	    TreePath[] selected = tree.getSelectionPaths();
+		fireTableDataChanged();
+		tree.setSelectionPaths(selected);
+	    }
+	});
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/ok.png
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/ok.png b/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/ok.png
new file mode 100644
index 0000000..ac479f2
Binary files /dev/null and b/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/ok.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/severe.png
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/severe.png b/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/severe.png
new file mode 100644
index 0000000..a69364d
Binary files /dev/null and b/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/severe.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/warning.png
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/warning.png b/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/warning.png
new file mode 100644
index 0000000..f09e60f
Binary files /dev/null and b/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/warning.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/pom.xml
----------------------------------------------------------------------
diff --git a/ui/pom.xml b/ui/pom.xml
deleted file mode 100644
index 6d42dc3..0000000
--- a/ui/pom.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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>lang</artifactId>
-		<version>2.0.1-SNAPSHOT</version>
-	</parent>
-	<groupId>net.sf.taverna.t2.lang</groupId>
-	<artifactId>ui</artifactId>
-	<packaging>bundle</packaging>
-	<name>User interface (Swing) utility classes</name>
-	<dependencies>
-		<dependency>
-			<groupId>net.sf.taverna.t2.lang</groupId>
-			<artifactId>observer</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>net.sf.taverna.jedit</groupId>
-			<artifactId>jedit-syntax</artifactId>
-			<version>${jedit.syntax.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-			<version>${commons.io.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.log4j</groupId>
-			<artifactId>com.springsource.org.apache.log4j</artifactId>
-			<version>${log4j.version}</version>
-		</dependency>
-	</dependencies>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/CArrowImage.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/CArrowImage.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/CArrowImage.java
deleted file mode 100644
index 6a258de..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/CArrowImage.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * 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.lang.ui;
-
-import java.awt.Color;
-import java.awt.GradientPaint;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.SystemColor;
-import java.awt.RenderingHints.Key;
-import java.awt.geom.GeneralPath;
-import java.awt.geom.Line2D;
-import java.awt.image.BufferedImage;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A BufferedImage of one of four types of arrow (up, down, left or right) drawn
- * to the size specified on the constructor.
- */
-public class CArrowImage extends BufferedImage {
-	// Constants...
-	public static final int ARROW_UP = 0;
-
-	public static final int ARROW_DOWN = 1;
-
-	public static final int ARROW_LEFT = 2;
-
-	public static final int ARROW_RIGHT = 3;
-
-	// Member variables...
-	private GeneralPath _pathArrow = new GeneralPath();
-
-	// Constructor...
-	public CArrowImage(int nArrowDirection) {
-		this(15, 9, nArrowDirection);
-	}
-
-	public CArrowImage(int nWidth, int nHeight, int nArrowDirection) {
-		super(nWidth, nHeight, TYPE_INT_ARGB_PRE); // Set the width, height and
-		// image type
-
-		Map<Key, Object> map = new HashMap<Key, Object>();
-		map.put(RenderingHints.KEY_ANTIALIASING,
-				RenderingHints.VALUE_ANTIALIAS_ON);
-		map.put(RenderingHints.KEY_RENDERING,
-				RenderingHints.VALUE_RENDER_QUALITY);
-		RenderingHints hints = new RenderingHints(map);
-
-		Graphics2D g2 = this.createGraphics(); // Create a graphics context for
-		// this buffered image
-		g2.setRenderingHints(hints);
-
-		float h = getHeight();
-		float w = getWidth();
-		float w13 = w / 3;
-		float w12 = w / 2;
-		float w23 = w * 2 / 3;
-		float h13 = h / 3;
-		float h12 = h / 2;
-		float h23 = h * 2 / 3;
-
-		switch (nArrowDirection) {
-		case ARROW_UP:
-			_pathArrow.moveTo(w12, h12);
-			_pathArrow.lineTo(w12, 0);
-			_pathArrow.lineTo(w, h - 1);
-			_pathArrow.lineTo(0, h - 1);
-			_pathArrow.closePath();
-			g2.setPaint(new GradientPaint(w13, h13,
-					SystemColor.controlLtHighlight, w, h - 1,
-					SystemColor.controlShadow));
-
-			g2.fill(_pathArrow);
-
-			g2.setColor(SystemColor.controlDkShadow);
-			g2.draw(new Line2D.Float(0, h - 1, w, h - 1));
-			g2.setColor(SystemColor.controlShadow);
-			g2.draw(new Line2D.Float(w12, 0, w, h - 1));
-			g2.setColor(SystemColor.controlLtHighlight);
-			g2.draw(new Line2D.Float(0, h - 1, w12, 0));
-			break;
-
-		case ARROW_DOWN:
-			_pathArrow.moveTo(w12, h12);
-			_pathArrow.lineTo(w, 0);
-			_pathArrow.lineTo(w12, h - 1);
-			_pathArrow.closePath();
-			g2.setPaint(new GradientPaint(0, 0, SystemColor.controlLtHighlight,
-					w23, h23, SystemColor.controlShadow));
-			g2.fill(_pathArrow);
-
-			g2.setColor(SystemColor.controlDkShadow);
-			g2.draw(new Line2D.Float(w, 0, w12, h - 1));
-			g2.setColor(SystemColor.controlShadow);
-			g2.draw(new Line2D.Float(w12, h - 1, 0, 0));
-			g2.setColor(SystemColor.controlLtHighlight);
-			g2.draw(new Line2D.Float(0, 0, w, 0));
-			break;
-
-		case ARROW_LEFT:
-			_pathArrow.moveTo(w - 1, h13);
-			_pathArrow.lineTo(w13, h13);
-			_pathArrow.lineTo(w13, 0);
-			_pathArrow.lineTo(0, h12);
-			_pathArrow.lineTo(w13, h - 1);
-			_pathArrow.lineTo(w13, h23);
-			_pathArrow.lineTo(w - 1, h23);
-			_pathArrow.closePath();
-			g2.setPaint(new GradientPaint(0, 0, Color.white, // SystemColor.
-																// controlLtHighlight
-																// ,
-					0, h, SystemColor.controlShadow));
-			g2.fill(_pathArrow);
-
-			_pathArrow.reset();
-			_pathArrow.moveTo(w13, 0);
-			_pathArrow.lineTo(w13, h13);
-			_pathArrow.moveTo(w - 1, h13);
-			_pathArrow.lineTo(w - 1, h23);
-			_pathArrow.lineTo(w13, h23);
-			_pathArrow.lineTo(w13, h - 1);
-			g2.setColor(SystemColor.controlDkShadow);
-			g2.draw(_pathArrow);
-
-			g2.setColor(SystemColor.controlShadow);
-			g2.draw(new Line2D.Float(0, h12, w13, h - 1));
-
-			_pathArrow.reset();
-			_pathArrow.moveTo(0, h12);
-			_pathArrow.lineTo(w13, 0);
-			_pathArrow.moveTo(w13, h13);
-			_pathArrow.lineTo(w - 1, h13);
-			g2.setColor(SystemColor.controlLtHighlight);
-			g2.draw(_pathArrow);
-			break;
-
-		case ARROW_RIGHT:
-		default: {
-			_pathArrow.moveTo(0, h13);
-			_pathArrow.lineTo(w23, h13);
-			_pathArrow.lineTo(w23, 0);
-			_pathArrow.lineTo(w - 1, h12);
-			_pathArrow.lineTo(w23, h - 1);
-			_pathArrow.lineTo(w23, h23);
-			_pathArrow.lineTo(0, h23);
-			_pathArrow.closePath();
-			g2.setPaint(new GradientPaint(0, 0, Color.white, // SystemColor.
-																// controlLtHighlight
-																// ,
-					0, h, SystemColor.controlShadow));
-			g2.fill(_pathArrow);
-
-			_pathArrow.reset();
-			_pathArrow.moveTo(0, h23);
-			_pathArrow.lineTo(w23, h23);
-			_pathArrow.moveTo(w23, h - 1);
-			_pathArrow.lineTo(w - 1, h12);
-			g2.setColor(SystemColor.controlDkShadow);
-			g2.draw(_pathArrow);
-
-			g2.setColor(SystemColor.controlShadow);
-			g2.draw(new Line2D.Float(w - 1, h12, w23, 0));
-
-			_pathArrow.reset();
-			_pathArrow.moveTo(w23, 0);
-			_pathArrow.lineTo(w23, h13);
-			_pathArrow.lineTo(0, h13);
-			_pathArrow.lineTo(0, h23);
-			_pathArrow.moveTo(w23, h23);
-			_pathArrow.lineTo(w23, h - 1);
-			g2.setColor(SystemColor.controlLtHighlight);
-			g2.draw(_pathArrow);
-			break;
-		}
-		}
-
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/CTransferableTreePath.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/CTransferableTreePath.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/CTransferableTreePath.java
deleted file mode 100644
index 2d85203..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/CTransferableTreePath.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * 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.lang.ui;
-
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
-
-import javax.swing.tree.TreePath;
-
-/**
- * This represents a TreePath (a node in a JTree) that can be transferred
- * between a drag source and a drop target.
- */
-public class CTransferableTreePath implements Transferable {
-	// The type of DnD object being dragged...
-	public static final DataFlavor TREEPATH_FLAVOR = new DataFlavor(
-			DataFlavor.javaJVMLocalObjectMimeType, "TreePath");
-
-	private TreePath _path;
-
-	private DataFlavor[] _flavors = { TREEPATH_FLAVOR };
-
-	/**
-	 * Constructs a transferrable tree path object for the specified path.
-	 */
-	public CTransferableTreePath(TreePath path) {
-		_path = path;
-	}
-
-	// Transferable interface methods...
-	public DataFlavor[] getTransferDataFlavors() {
-		return _flavors;
-	}
-
-	public boolean isDataFlavorSupported(DataFlavor flavor) {
-		return java.util.Arrays.asList(_flavors).contains(flavor);
-	}
-
-	public synchronized Object getTransferData(DataFlavor flavor)
-			throws UnsupportedFlavorException {
-		if (flavor.isMimeTypeEqual(TREEPATH_FLAVOR.getMimeType())) // DataFlavor.javaJVMLocalObjectMimeType))
-			return _path;
-		else
-			throw new UnsupportedFlavorException(flavor);
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/DeselectingButton.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/DeselectingButton.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/DeselectingButton.java
deleted file mode 100644
index ea29adb..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/DeselectingButton.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.JButton;
-
-/**
- * @author alanrw
- *
- */
-public class DeselectingButton extends JButton {
-	
-	public DeselectingButton(String name, final ActionListener action, String toolTip) {
-		super();
-		this.setAction(new AbstractAction() {
-
-			public void actionPerformed(ActionEvent e) {
-				Component parent = DeselectingButton.this.getParent();
-				action.actionPerformed(e);
-				parent.requestFocusInWindow();
-			}		
-		});
-		this.setText(name);
-		this.setToolTipText(toolTip);
-	}
-
-	public DeselectingButton(String name, final ActionListener action) {
-		this(name, action, null);
-	}
-	
-	public DeselectingButton(final Action action, String toolTip) {
-		this((String) action.getValue(Action.NAME), action, toolTip);
-	}
-
-	public DeselectingButton(final Action action) {
-		this(action, null);
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/DialogTextArea.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/DialogTextArea.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/DialogTextArea.java
deleted file mode 100644
index faf2643..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/DialogTextArea.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.Font;
-
-import javax.swing.JTextArea;
-import javax.swing.text.Document;
-
-/**
- * @author alanrw
- *
- */
-public class DialogTextArea extends JTextArea {
-
-	private static Font newFont = Font.decode("Dialog");
-	
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 2329063139827993252L;
-
-	/**
-	 * 
-	 */
-	public DialogTextArea() {
-		updateFont();
-	}
-
-	/**
-	 * @param text
-	 */
-	public DialogTextArea(String text) {
-		super(text);
-		updateFont();
-	}
-
-	/**
-	 * @param doc
-	 */
-	public DialogTextArea(Document doc) {
-		super(doc);
-		updateFont();
-	}
-
-	/**
-	 * @param rows
-	 * @param columns
-	 */
-	public DialogTextArea(int rows, int columns) {
-		super(rows, columns);
-		updateFont();
-	}
-
-	/**
-	 * @param text
-	 * @param rows
-	 * @param columns
-	 */
-	public DialogTextArea(String text, int rows, int columns) {
-		super(text, rows, columns);
-		updateFont();
-	}
-
-	/**
-	 * @param doc
-	 * @param text
-	 * @param rows
-	 * @param columns
-	 */
-	public DialogTextArea(Document doc, String text, int rows, int columns) {
-		super(doc, text, rows, columns);
-		updateFont();
-	}
-	
-	private void updateFont() {
-		if (newFont != null) {
-			this.setFont(newFont);
-		}
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/EdgeLineBorder.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/EdgeLineBorder.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/EdgeLineBorder.java
deleted file mode 100644
index f49faa1..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/EdgeLineBorder.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2013 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.lang.ui;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Graphics;
-import java.awt.Insets;
-
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.border.Border;
-import javax.swing.border.LineBorder;
-
-/**
- *
- *
- * @author David Withers
- */
-public class EdgeLineBorder implements Border {
-
-	public static final int TOP = 1;
-	public static final int BOTTOM = 2;
-	public static final int LEFT = 3;
-	public static final int RIGHT = 4;
-	private final int edge;
-	private final Color color;
-
-	public EdgeLineBorder(int edge, Color color) {
-		this.edge = edge;
-		this.color = color;
-	}
-
-	@Override
-	public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
-		Color oldColor = g.getColor();
-		g.setColor(color);
-		switch (edge) {
-		case TOP:
-			g.drawLine(x, y, x+width, y);
-			break;
-		case BOTTOM:
-			g.drawLine(x, y+height-2, x+width, y+height-2);
-			break;
-		case LEFT:
-			g.drawLine(x, y, x+width, y+height);
-			break;
-		case RIGHT:
-			g.drawLine(x+width, y, x+width, y+height);
-			break;
-		}
-		g.setColor(oldColor);
-	}
-
-	@Override
-	public Insets getBorderInsets(Component c) {
-		return new Insets(0, 0, 0, 0);
-	}
-
-	@Override
-	public boolean isBorderOpaque() {
-		return false;
-	}
-
-	public static void main(String[] args) {
-		JFrame frame = new JFrame();
-		frame.setSize(500, 500);
-		JPanel panel = new JPanel();
-		panel.setBorder(new EdgeLineBorder(TOP, Color.GRAY));
-		frame.add(panel);
-		frame.setVisible(true);
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/EditorKeySetUtil.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/EditorKeySetUtil.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/EditorKeySetUtil.java
deleted file mode 100644
index 0e8d908..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/EditorKeySetUtil.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2009 Ingo Wassink of University of Twente, Netherlands and
- * 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
- ******************************************************************************/
-
-/**
- * @author Ingo Wassink
- * @author Ian Dunlop
- * @author Alan R Williams
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.apache.log4j.Logger;
-
-/**
- * Manager for reading key set file
- * 
- * @author WassinkI
- * @author alanrw
- * 
- */
-public class EditorKeySetUtil {
-	
-	private static Logger logger = Logger.getLogger(EditorKeySetUtil.class);
-
-
-	public static Set<String> loadKeySet(InputStream stream) {
-		Set<String> result = new TreeSet<String>();
-				try {
-			BufferedReader reader = new BufferedReader(
-					new InputStreamReader(stream));
-			                                                     
-			String line;
-			while ((line = reader.readLine()) != null) {
-				result.add(line.trim());
-			}
-			reader.close();
-		} catch (Exception e) {
-			logger.error(e);
-		}
-		return result;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/ExtensionFileFilter.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/ExtensionFileFilter.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/ExtensionFileFilter.java
deleted file mode 100644
index 35e2417..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/ExtensionFileFilter.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * 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
- ******************************************************************************/
-/**
- * This file is a component of the Taverna project,
- * and is licensed under the GNU LGPL.
- * Copyright Tom Oinn, EMBL-EBI
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.swing.filechooser.FileFilter;
-
-/**
- * A FileFilter implementation that can be configured to show only specific file
- * suffixes.
- * 
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- */
-public class ExtensionFileFilter extends FileFilter {
-	List<String> allowedExtensions;
-
-	public ExtensionFileFilter(List<String> extensions) {
-	    setAllowedExtensions(extensions);
-	}
-
-	public ExtensionFileFilter(String[] allowedExtensions) {
-	    setAllowedExtensions(Arrays.asList(allowedExtensions));
-	}
-
-    private void setAllowedExtensions(List<String> extensions) {
-	    this.allowedExtensions = new ArrayList<String>();
-            for (String e : extensions) {
-		if (e.startsWith(".")) {
-                    if (e.length() > 1) {
-			allowedExtensions.add(e.substring(1));
-		    }
-		}
-		else {
-		    allowedExtensions.add(e);
-		}
-	    }
-    }
-
-	@Override
-	public boolean accept(File f) {
-		if (f.isDirectory()) {
-			return true;
-		}
-		String extension = getExtension(f);
-		if (extension != null) {
-			for (String allowedExtension : allowedExtensions) {
-				if (extension.equalsIgnoreCase(allowedExtension)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	String getExtension(File f) {
-		String ext = null;
-		String s = f.getName();
-		int i = s.lastIndexOf('.');
-		if (i > 0 && i < s.length() - 1) {
-			ext = s.substring(i + 1).toLowerCase();
-		}
-		return ext;
-	}
-
-	@Override
-	public String getDescription() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("Filter for extensions : " );
-		for (int i = 0; i < allowedExtensions.size(); i++) {
-			sb.append(allowedExtensions.get(i));
-			if (i < allowedExtensions.size() - 1) {
-				sb.append(", ");
-			}
-		}
-		return sb.toString();
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/FileTools.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/FileTools.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/FileTools.java
deleted file mode 100644
index 4aa5bb2..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/FileTools.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.Component;
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.prefs.Preferences;
-
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.log4j.Logger;
-
-/**
- * @author alanrw
- *
- */
-public class FileTools {
-	
-	private static Logger logger = Logger.getLogger(FileTools.class);
-	
-	
-
-	public static boolean saveStringToFile(Component parent, String dialogTitle, String extension, String content) {
-		JFileChooser fileChooser = new JFileChooser();
-		fileChooser.setDialogTitle(dialogTitle);
-
-		fileChooser.resetChoosableFileFilters();
-		fileChooser.setAcceptAllFileFilterUsed(true);
-		
-		fileChooser.setFileFilter(new ExtensionFileFilter(new String[] { extension }));
-
-		Preferences prefs = Preferences.userNodeForPackage(FileTools.class);
-		String curDir = prefs
-				.get("currentDir", System.getProperty("user.home"));
-		fileChooser.setCurrentDirectory(new File(curDir));
-
-		boolean tryAgain = true;
-		while (tryAgain) {
-			tryAgain = false;
-			int returnVal = fileChooser.showSaveDialog(parent);
-			if (returnVal == JFileChooser.APPROVE_OPTION) {
-				prefs.put("currentDir", fileChooser.getCurrentDirectory()
-						.toString());
-				File file = fileChooser.getSelectedFile();
-				if (!file.getName().contains(".")) {
-					String newName = file.getName() + extension;
-					file = new File(file.getParentFile(), newName);
-				}
-
-				// TODO: Open in separate thread to avoid hanging UI
-				try {
-					if (file.exists()) {
-						logger.info("File already exists: " + file);
-						String msg = "Are you sure you want to overwrite existing file "
-								+ file + "?";
-						int ret = JOptionPane.showConfirmDialog(
-								parent, msg, "File already exists",
-								JOptionPane.YES_NO_CANCEL_OPTION);
-						if (ret == JOptionPane.YES_OPTION) {
-							
-						} else if (ret == JOptionPane.NO_OPTION) {
-							tryAgain = true;
-							continue;
-						} else {
-							logger.info("Aborted overwrite of " + file);
-							return false;
-						}
-					}
-					FileUtils.writeStringToFile(file, content, StandardCharsets.UTF_8.name());
-					logger.info("Saved content by overwriting " + file);
-					return true;
-				} catch (IOException ex) {
-					logger.warn("Could not save content to " + file, ex);
-					JOptionPane.showMessageDialog(parent,
-							"Could not save to " + file + ": \n\n"
-									+ ex.getMessage(), "Warning",
-							JOptionPane.WARNING_MESSAGE);
-					return false;
-				}
-			}
-		}
-		return false;
-	}
-	
-    public static String readStringFromFile(Component parent, String dialogTitle, String extension) {
-		JFileChooser fileChooser = new JFileChooser();
-		fileChooser.setDialogTitle(dialogTitle);
-		fileChooser.resetChoosableFileFilters();
-		fileChooser.setAcceptAllFileFilterUsed(true);
-		
-		fileChooser.setFileFilter(new ExtensionFileFilter(new String[] { extension }));
-		
-		Preferences prefs = Preferences.userNodeForPackage(FileTools.class);
-		String curDir = prefs
-				.get("currentDir", System.getProperty("user.home"));
-		fileChooser.setCurrentDirectory(new File(curDir));
-
-		if (fileChooser.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION) {
-			File selectedFile = fileChooser.getSelectedFile();
-			
-			try {
-				return FileUtils.readFileToString(selectedFile, StandardCharsets.UTF_8.name());
-			} catch (IOException ioe) {
-				JOptionPane.showMessageDialog(parent, "Can not read file '"
-						+ selectedFile.getName() + "'", "Can not read file",
-						JOptionPane.ERROR_MESSAGE);
-			}
-
-		}
-		return null;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/HtmlUtils.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/HtmlUtils.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/HtmlUtils.java
deleted file mode 100644
index a30d36f..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/HtmlUtils.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.lang.ui;
-
-import static org.apache.log4j.Logger.getLogger;
-
-import java.awt.BorderLayout;
-import java.awt.Desktop;
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.swing.JEditorPane;
-import javax.swing.JPanel;
-import javax.swing.event.HyperlinkEvent;
-import javax.swing.event.HyperlinkListener;
-
-import org.apache.log4j.Logger;
-
-/**
- * @author alanrw
- *
- */
-public class HtmlUtils {
-	
-	private static Logger logger = getLogger(HtmlUtils.class);
-
-
-	
-	public static JEditorPane createEditorPane(String html) {
-		JEditorPane result = new JEditorPane("text/html", html);
-		result.addHyperlinkListener(new HyperlinkListener() {
-
-			@Override
-			public void hyperlinkUpdate(HyperlinkEvent arg0) {
-				if (HyperlinkEvent.EventType.ACTIVATED == arg0.getEventType()) {
-	                try {
-	                    Desktop.getDesktop().browse(arg0.getURL().toURI());
-	                } catch (IOException | URISyntaxException e1) {
-	                    logger.error(e1);
-	                }
-	            }
-			}});
-		result.setEditable(false);
-		return result;
-	}
-	
-	public static JPanel panelForHtml(JEditorPane editorPane) {
-		JPanel result = new JPanel();
-
-		result.setLayout(new BorderLayout());
-
-		result.add(editorPane, BorderLayout.CENTER);
-		return result;
-	}
-
-	public static String getStyle(String backgroundColour) {
-		String style = "<style type='text/css'>";
-		style += "table {align:center; border:solid black 1px; background-color:"
-				+ backgroundColour
-				+ ";width:100%; height:100%; overflow:auto;}";
-		style += "</style>";
-		return style;
-	}
-	
-	public static String buildTableOpeningTag() {
-		String result = "<table ";
-		Map<String, String> props = getTableProperties();
-		for (String key : props.keySet()) {
-			result += key + "=\"" + props.get(key) + "\" ";
-		}
-		result += ">";
-		return result;
-	}
-
-	public static Map<String, String> getTableProperties() {
-		Map<String, String> result = new HashMap<String, String>();
-		result.put("border", "1");
-		return result;
-	}
-
-	public static String getHtmlHead(String backgroundColour) {
-		return "<html><head>" + getStyle(backgroundColour) + "</head><body>";
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/JSplitPaneExt.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/JSplitPaneExt.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/JSplitPaneExt.java
deleted file mode 100644
index e656c36..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/JSplitPaneExt.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.Graphics;
-
-import javax.swing.JSplitPane;
-
-/**
- * Copied from code found on http://www.jguru.com
- *
- */
-public class JSplitPaneExt extends JSplitPane {
-	
-	protected boolean m_fIsPainted = false;
-	protected double m_dProportionalLocation = -1;
-
-	public JSplitPaneExt() {
-		super();
-	}
-
-	public JSplitPaneExt(int iOrientation) {
-		super(iOrientation);
-	}
-
-	protected boolean hasProportionalLocation() {
-		return (m_dProportionalLocation != -1);
-	}
-
-	public void cancelDividerProportionalLocation() {
-		m_dProportionalLocation = -1;
-	}
-
-	public void setDividerLocation(double dProportionalLocation) {
-		if (dProportionalLocation < 0 || dProportionalLocation > 1) {
-			throw new IllegalArgumentException(
-					"Illegal value for divider location: "
-							+ dProportionalLocation);
-		}
-		m_dProportionalLocation = dProportionalLocation;
-		if (m_fIsPainted) {
-			super.setDividerLocation(m_dProportionalLocation);
-		}
-	}
-
-	public void paint(Graphics g) {
-		super.paint(g);
-		if (hasProportionalLocation()) {
-			super.setDividerLocation(m_dProportionalLocation);
-		}
-		m_fIsPainted=true; 
-
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/KeywordDocument.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/KeywordDocument.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/KeywordDocument.java
deleted file mode 100644
index e8fae14..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/KeywordDocument.java
+++ /dev/null
@@ -1,568 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2009 Ingo Wassink of University of Twente, Netherlands and
- * 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
- ******************************************************************************/
-
-/**
- * @author Ingo Wassink
- * @author Ian Dunlop
- * @author Alan R Williams
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.Color;
-import java.util.Set;
-
-import javax.swing.text.AttributeSet;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.DefaultEditorKit;
-import javax.swing.text.DefaultStyledDocument;
-import javax.swing.text.Element;
-import javax.swing.text.MutableAttributeSet;
-import javax.swing.text.SimpleAttributeSet;
-import javax.swing.text.StyleConstants;
-
-import org.apache.log4j.Logger;
-
-public class KeywordDocument extends DefaultStyledDocument {
-
-	private static Logger logger = Logger
-	.getLogger(KeywordDocument.class);
-
-	private DefaultStyledDocument doc;
-	private Element rootElement;
-
-	private boolean multiLineComment;
-	private MutableAttributeSet normal;
-	private MutableAttributeSet keyword;
-	private MutableAttributeSet comment;
-	private MutableAttributeSet quote;
-	private MutableAttributeSet port;
-
-	private Set<String> keywords;
-
-	private Set<String> ports;
-
-
-
-	public KeywordDocument(Set<String> keywords, Set<String> ports) {
-		doc = this;
-		rootElement = doc.getDefaultRootElement();
-		putProperty(DefaultEditorKit.EndOfLineStringProperty, "\n");
-
-		normal = new SimpleAttributeSet();
-		StyleConstants.setForeground(normal, Color.black);
-
-		comment = new SimpleAttributeSet();
-		StyleConstants.setForeground(comment, new Color(0, 139, 69, 255));
-		StyleConstants.setItalic(comment, true);
-
-		keyword = new SimpleAttributeSet();
-		StyleConstants.setForeground(keyword, Color.blue);
-		StyleConstants.setBold(keyword, true);
-
-
-		port = new SimpleAttributeSet();
-		StyleConstants.setForeground(port, Color.magenta);
-
-		quote = new SimpleAttributeSet();
-		StyleConstants.setForeground(quote, Color.red);
-
-		this.keywords = keywords;
-		this.ports = ports;
-	}
-
-	/**
-	* Method for adding an port
-	* @param name the name of the  port
-	*/
-	public void addPort(String name){
-	  ports.add(name);
-	  updateText();
-	}
-
-	/**
-	 * Method for removing an  port
-	 * @param name the name of the  port
-	 */
-	public void removePort(String name){
-	  ports.remove(name);
-	  updateText();
-	}
-
-	/**
-	 * Method for checking whether the name represents an input port
-	 * @param name the name of the  port
-	 * @return true if true
-	 */
-	private boolean isPort(String name){
-	  return ports.contains(name);
-	}
-
-
-	/**
-	 * Method for updating the whole text
-	 */
-	private void updateText(){
-	  try{
-	    processChangedLines(0, getLength() );
-	  } catch(Exception e){
-		  logger.error("Unable to update text", e);
-	  }
-	}
-
-	/*
-	 * Override to apply syntax highlighting after the document has been updated
-	 */
-	public void insertString(int offset, String str, AttributeSet a)
-			throws BadLocationException {
-		if (str.equals("{"))
-			str = addMatchingBrace(offset);
-
-		super.insertString(offset, str, a);
-		processChangedLines(offset, str.length());
-	}
-
-	/*
-	 * Override to apply syntax highlighting after the document has been updated
-	 */
-	public void remove(int offset, int length) throws BadLocationException {
-		super.remove(offset, length);
-		processChangedLines(offset, 0);
-	}
-
-	/*
-	 * Determine how many lines have been changed, then apply highlighting to
-	 * each line
-	 */
-	public void processChangedLines(int offset, int length)
-			throws BadLocationException {
-		String content = doc.getText(0, doc.getLength());
-
-		// The lines affected by the latest document update
-
-		int startLine = rootElement.getElementIndex(offset);
-		int endLine = rootElement.getElementIndex(offset + length);
-
-		// Make sure all comment lines prior to the start line are commented
-		// and determine if the start line is still in a multi line comment
-
-		setMultiLineComment(commentLinesBefore(content, startLine));
-
-		// Do the actual highlighting
-
-		for (int i = startLine; i <= endLine; i++) {
-			applyHighlighting(content, i);
-		}
-
-		// Resolve highlighting to the next end multi line delimiter
-
-		if (isMultiLineComment())
-			commentLinesAfter(content, endLine);
-		else
-			highlightLinesAfter(content, endLine);
-	}
-
-	/*
-	 * Highlight lines when a multi line comment is still 'open' (ie. matching
-	 * end delimiter has not yet been encountered)
-	 */
-	private boolean commentLinesBefore(String content, int line) {
-		int offset = rootElement.getElement(line).getStartOffset();
-
-		// Start of comment not found, nothing to do
-
-		int startDelimiter = lastIndexOf(content, getStartDelimiter(),
-				offset - 2);
-
-		if (startDelimiter < 0)
-			return false;
-
-		// Matching start/end of comment found, nothing to do
-
-		int endDelimiter = indexOf(content, getEndDelimiter(), startDelimiter);
-
-		if (endDelimiter < offset & endDelimiter != -1)
-			return false;
-
-		// End of comment not found, highlight the lines
-
-		doc.setCharacterAttributes(startDelimiter, offset - startDelimiter + 1,
-				comment, false);
-		return true;
-	}
-
-	/*
-	 * Highlight comment lines to matching end delimiter
-	 */
-	private void commentLinesAfter(String content, int line) {
-		int offset = rootElement.getElement(line).getEndOffset();
-
-		// End of comment not found, nothing to do
-
-		int endDelimiter = indexOf(content, getEndDelimiter(), offset);
-
-		if (endDelimiter < 0)
-			return;
-
-		// Matching start/end of comment found, comment the lines
-
-		int startDelimiter = lastIndexOf(content, getStartDelimiter(),
-				endDelimiter);
-
-		if (startDelimiter < 0 || startDelimiter <= offset) {
-			doc.setCharacterAttributes(offset, endDelimiter - offset + 1,
-					comment, false);
-		}
-	}
-
-	/*
-	 * Highlight lines to start or end delimiter
-	 */
-	private void highlightLinesAfter(String content, int line)
-			throws BadLocationException {
-		int offset = rootElement.getElement(line).getEndOffset();
-
-		// Start/End delimiter not found, nothing to do
-
-		int startDelimiter = indexOf(content, getStartDelimiter(), offset);
-		int endDelimiter = indexOf(content, getEndDelimiter(), offset);
-
-		if (startDelimiter < 0)
-			startDelimiter = content.length();
-
-		if (endDelimiter < 0)
-			endDelimiter = content.length();
-
-		int delimiter = Math.min(startDelimiter, endDelimiter);
-
-		if (delimiter < offset)
-			return;
-
-		// Start/End delimiter found, reapply highlighting
-
-		int endLine = rootElement.getElementIndex(delimiter);
-
-		for (int i = line + 1; i < endLine; i++) {
-			Element branch = rootElement.getElement(i);
-			Element leaf = doc.getCharacterElement(branch.getStartOffset());
-			AttributeSet as = leaf.getAttributes();
-
-			if (as.isEqual(comment))
-				applyHighlighting(content, i);
-		}
-	}
-
-	/*
-	 * Parse the line to determine the appropriate highlighting
-	 */
-	private void applyHighlighting(String content, int line)
-			throws BadLocationException {
-		int startOffset = rootElement.getElement(line).getStartOffset();
-		int endOffset = rootElement.getElement(line).getEndOffset() - 1;
-
-		int lineLength = endOffset - startOffset;
-		int contentLength = content.length();
-
-		if (endOffset >= contentLength)
-			endOffset = contentLength - 1;
-
-		// check for multi line comments
-		// (always set the comment attribute for the entire line)
-
-		if (endingMultiLineComment(content, startOffset, endOffset)
-				|| isMultiLineComment()
-				|| startingMultiLineComment(content, startOffset, endOffset)) {
-			doc.setCharacterAttributes(startOffset,
-					endOffset - startOffset + 1, comment, false);
-			return;
-		}
-
-		// set normal attributes for the line
-
-		doc.setCharacterAttributes(startOffset, lineLength, normal, true);
-
-		// check for single line comment
-
-		int index = content.indexOf(getSingleLineDelimiter(), startOffset);
-
-		if ((index > -1) && (index < endOffset)) {
-			doc.setCharacterAttributes(index, endOffset - index + 1, comment,
-					false);
-			endOffset = index - 1;
-		}
-
-		// check for tokens
-
-		checkForTokens(content, startOffset, endOffset);
-	}
-
-	/*
-	 * Does this line contain the start delimiter
-	 */
-	private boolean startingMultiLineComment(String content, int startOffset,
-			int endOffset) throws BadLocationException {
-		int index = indexOf(content, getStartDelimiter(), startOffset);
-
-		if ((index < 0) || (index > endOffset))
-			return false;
-		else {
-			setMultiLineComment(true);
-			return true;
-		}
-	}
-
-	/*
-	 * Does this line contain the end delimiter
-	 */
-	private boolean endingMultiLineComment(String content, int startOffset,
-			int endOffset) throws BadLocationException {
-		int index = indexOf(content, getEndDelimiter(), startOffset);
-
-		if ((index < 0) || (index > endOffset))
-			return false;
-		else {
-			setMultiLineComment(false);
-			return true;
-		}
-	}
-
-	/*
-	 * We have found a start delimiter and are still searching for the end
-	 * delimiter
-	 */
-	private boolean isMultiLineComment() {
-		return false;//multiLineComment;
-	}
-
-	private void setMultiLineComment(boolean value) {
-		multiLineComment = value;
-	}
-
-	/*
-	 * Parse the line for tokens to highlight
-	 */
-	private void checkForTokens(String content, int startOffset, int endOffset) {
-		while (startOffset <= endOffset) {
-			// skip the delimiters to find the start of a new token
-
-			while (isDelimiter(content.substring(startOffset, startOffset + 1))) {
-				if (startOffset < endOffset)
-					startOffset++;
-				else
-					return;
-			}
-
-			// Extract and process the entire token
-
-			if (isQuoteDelimiter(content
-					.substring(startOffset, startOffset + 1)))
-				startOffset = getQuoteToken(content, startOffset, endOffset);
-			else
-				startOffset = getOtherToken(content, startOffset, endOffset);
-		}
-	}
-
-	/*
-	 *
-	 */
-	private int getQuoteToken(String content, int startOffset, int endOffset) {
-		String quoteDelimiter = content.substring(startOffset, startOffset + 1);
-		String escapeString = getEscapeString(quoteDelimiter);
-
-		int index;
-		int endOfQuote = startOffset;
-
-		// skip over the escape quotes in this quote
-
-		index = content.indexOf(escapeString, endOfQuote + 1);
-
-		while ((index > -1) && (index < endOffset)) {
-			endOfQuote = index + 1;
-			index = content.indexOf(escapeString, endOfQuote);
-		}
-
-		// now find the matching delimiter
-
-		index = content.indexOf(quoteDelimiter, endOfQuote + 1);
-
-		if ((index < 0) || (index > endOffset))
-			endOfQuote = endOffset;
-		else
-			endOfQuote = index;
-
-		doc.setCharacterAttributes(startOffset, endOfQuote - startOffset + 1,
-				quote, false);
-
-		return endOfQuote + 1;
-	}
-
-	/*
-	 *
-	 */
-	private int getOtherToken(String content, int startOffset, int endOffset) {
-		int endOfToken = startOffset + 1;
-
-		while (endOfToken <= endOffset) {
-			if (isDelimiter(content.substring(endOfToken, endOfToken + 1)))
-				break;
-
-			endOfToken++;
-		}
-
-		String token = content.substring(startOffset, endOfToken);
-
-		if (isKeyword(token)) {
-			doc.setCharacterAttributes(startOffset, endOfToken - startOffset,
-					keyword, false);
-		} else if(isPort(token)){
-			doc.setCharacterAttributes(startOffset, endOfToken - startOffset,
-			        port, false);
-		}
-
-		return endOfToken + 1;
-	}
-
-	/*
-	 * Assume the needle will the found at the start/end of the line
-	 */
-	private int indexOf(String content, String needle, int offset) {
-		int index;
-
-		while ((index = content.indexOf(needle, offset)) != -1) {
-			String text = getLine(content, index).trim();
-
-			if (text.startsWith(needle) || text.endsWith(needle))
-				break;
-			else
-				offset = index + 1;
-		}
-
-		return index;
-	}
-
-	/*
-	 * Assume the needle will the found at the start/end of the line
-	 */
-	private int lastIndexOf(String content, String needle, int offset) {
-		int index;
-
-		while ((index = content.lastIndexOf(needle, offset)) != -1) {
-			String text = getLine(content, index).trim();
-
-			if (text.startsWith(needle) || text.endsWith(needle))
-				break;
-			else
-				offset = index - 1;
-		}
-
-		return index;
-	}
-
-	private String getLine(String content, int offset) {
-		int line = rootElement.getElementIndex(offset);
-		Element lineElement = rootElement.getElement(line);
-		int start = lineElement.getStartOffset();
-		int end = lineElement.getEndOffset();
-		return content.substring(start, end - 1);
-	}
-
-	/*
-	 * Override for other languages
-	 */
-	protected boolean isDelimiter(String character) {
-		String operands = ";:{}()[]+-/%<=>!&|^~*,.";
-
-		if (Character.isWhitespace(character.charAt(0))
-				|| operands.indexOf(character) != -1)
-			return true;
-		else
-			return false;
-	}
-
-	/*
-	 * Override for other languages
-	 */
-	protected boolean isQuoteDelimiter(String character) {
-		String quoteDelimiters = "\"'";
-
-		if (quoteDelimiters.indexOf(character) < 0)
-			return false;
-		else
-			return true;
-	}
-
-	/*
-	 * Override for other languages
-	 */
-	protected boolean isKeyword(String token) {
-		return keywords.contains(token);
-	}
-
-	/*
-	 * Override for other languages
-	 */
-	protected String getStartDelimiter() {
-		return "/*";
-	}
-
-	/*
-	 * Override for other languages
-	 */
-	protected String getEndDelimiter() {
-		return "*/";
-	}
-
-	/*
-	 * Override for other languages
-	 */
-	protected String getSingleLineDelimiter() {
-		return "#";
-	}
-
-	/*
-	 * Override for other languages
-	 */
-	protected String getEscapeString(String quoteDelimiter) {
-		return "\\" + quoteDelimiter;
-	}
-
-	/*
-	 *
-	 */
-	protected String addMatchingBrace(int offset) throws BadLocationException {
-		StringBuffer whiteSpace = new StringBuffer();
-		int line = rootElement.getElementIndex(offset);
-		int i = rootElement.getElement(line).getStartOffset();
-
-		while (true) {
-			String temp = doc.getText(i, 1);
-
-			if (temp.equals(" ") || temp.equals("\t")) {
-				whiteSpace.append(temp);
-				i++;
-			} else
-				break;
-		}
-
-		return "{\n" + whiteSpace.toString() + "\t\n" + whiteSpace.toString()
-				+ "}";
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/LineEnabledTextPanel.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/LineEnabledTextPanel.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/LineEnabledTextPanel.java
deleted file mode 100644
index 389b9b3..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/LineEnabledTextPanel.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * 
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.BorderLayout;
-import java.awt.Event;
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-
-import javax.swing.AbstractAction;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.KeyStroke;
-import javax.swing.event.CaretEvent;
-import javax.swing.event.CaretListener;
-import javax.swing.text.Document;
-import javax.swing.text.Element;
-import javax.swing.text.JTextComponent;
-
-
-/**
- * @author alanrw
- *
- */
-public class LineEnabledTextPanel extends JPanel {
-	
-	private JTextComponent textComponent = null;
-	private Document document;
-	private GotoLineAction gotoLineAction = null;
-
-	public LineEnabledTextPanel(final JTextComponent component) {
-		
-		this.setLayout(new BorderLayout());
-		textComponent = component;
-		updateDocument();
-		
-		JScrollPane scrollPane = new JScrollPane(textComponent );
-		scrollPane.setPreferredSize(textComponent.getPreferredSize() );
-
-		this.add(scrollPane, BorderLayout.CENTER);;
-		
-		final JLabel caretLabel = new JLabel("Line: 1 Column: 0");
-		
-		setCaretListener(new CaretListener() {
-
-			public void caretUpdate(CaretEvent e) {
-				int caretPosition = getCaretPosition();
-				Element root = document.getRootElements()[0];
-				int elementIndex = root.getElementIndex(caretPosition);
-				int relativeOffset = caretPosition - root.getElement(elementIndex).getStartOffset();
-		        caretLabel.setText("Line: " + (elementIndex + 1) + " Column: " + relativeOffset);
-
-			}});
-		this.add(caretLabel, BorderLayout.SOUTH);
-
-		KeyStroke gotoLineKeystroke = KeyStroke.getKeyStroke(KeyEvent.VK_L, Event.META_MASK);
-
-		gotoLineAction = new GotoLineAction();
-		textComponent.getInputMap().put(gotoLineKeystroke, "gotoLineKeystroke");
-		textComponent.getActionMap().put("gotoLineKeystroke", gotoLineAction);
-
-	}
-	
-	private void updateDocument() {
-	    document = ((JTextComponent) textComponent).getDocument();
-	}
-	
-	private void setCaretListener(CaretListener listener) {
-	    ((JTextComponent) textComponent).addCaretListener(listener);
-	}
-	
-	private int getCaretPosition() {
-	    return ((JTextComponent) textComponent).getCaretPosition();
-	}
-	
-	private void setCaretPosition(int position) {
-	    ((JTextComponent) textComponent).setCaretPosition(position);
-	    textComponent.requestFocus();
-	}
-	
-	class GotoLineAction extends AbstractAction
-	{
-
-		public GotoLineAction() {	
-		}
-
-		public void actionPerformed(ActionEvent e) {
-			String inputString = JOptionPane.showInputDialog(null, "Enter line number", "Line number", JOptionPane.QUESTION_MESSAGE);
-			if (inputString != null) {
-				try {
-					int lineNumber = Integer.parseInt(inputString);
-					Element root = document.getDefaultRootElement();
-					lineNumber = Math.max(lineNumber, 1);
-					lineNumber = Math.min(lineNumber, root.getElementCount());
-					setCaretPosition( root.getElement( lineNumber - 1 ).getStartOffset() );
-
-				} catch (NumberFormatException e1){
-					// do nothing
-				}
-			}
-		}
-	}
-}