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

Reply via email to