You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2015/03/06 23:34:36 UTC
[40/50] [abbrv] incubator-taverna-workbench git commit: taverna-*
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/JTreeTable.java
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/JTreeTable.java b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/JTreeTable.java
new file mode 100644
index 0000000..85d3577
--- /dev/null
+++ b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/JTreeTable.java
@@ -0,0 +1,657 @@
+/*
+ * @(#)JTreeTable.java 1.2 98/10/27
+ *
+ * Copyright 1997, 1998 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information"). You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ */
+package net.sf.taverna.t2.lang.ui.treetable;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.EventObject;
+
+import javax.swing.DefaultCellEditor;
+import javax.swing.Icon;
+import javax.swing.JLabel;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.JTree;
+import javax.swing.ListSelectionModel;
+import javax.swing.LookAndFeel;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.tree.DefaultTreeCellRenderer;
+import javax.swing.tree.DefaultTreeSelectionModel;
+import javax.swing.tree.TreeCellRenderer;
+import javax.swing.tree.TreeModel;
+import javax.swing.tree.TreePath;
+import javax.swing.tree.TreeSelectionModel;
+
+/**
+ * This example shows how to create a simple JTreeTable component, by using a
+ * JTree as a renderer (and editor) for the cells in a particular column in the
+ * JTable.
+ *
+ * @version 1.2 10/27/98
+ *
+ * @author Philip Milne
+ * @author Scott Violet
+ * @author Tom Oinn
+ */
+@SuppressWarnings("serial")
+public class JTreeTable extends JTable {
+ /** A subclass of JTree. */
+ protected TreeTableCellRenderer tree;
+
+
+ private static SimpleDateFormat ISO_8601_FORMAT = new SimpleDateFormat(
+ "yyyy-MM-dd HH:mm:ss");
+ private static SimpleDateFormat TIME_FORMAT = new SimpleDateFormat(
+ "HH:mm:ss");
+
+
+ public JTreeTable() {
+ super();
+ }
+
+ public JTreeTable(TreeTableModel treeTableModel) {
+ super();
+ setModel(treeTableModel);
+ }
+
+ public void setModel(TreeTableModel model) {
+ tree = new TreeTableCellRenderer(model);
+ super.setModel(new TreeTableModelAdapter(model, tree));
+
+ ListToTreeSelectionModelWrapper selectionWrapper = new ListToTreeSelectionModelWrapper();
+ tree.setSelectionModel(selectionWrapper);
+ setSelectionModel(selectionWrapper.getListSelectionModel());
+
+ // Install the tree editor renderer and editor.
+ setDefaultRenderer(TreeTableModel.class, tree);
+ setDefaultRenderer(Date.class, new DateCellRenderer());
+ setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor());
+
+ // Show grid but only if Look and Feel is not Java 6's Nimbus
+ if (!UIManager.getLookAndFeel().getName().equals("Nimbus")){
+ setShowGrid(true);
+ setGridColor(Color.LIGHT_GRAY);
+ }
+ else{
+ setShowGrid(false);
+ }
+
+ // No intercell spacing
+ setIntercellSpacing(new Dimension(0, 0));
+
+ // Add a mouse listener to forward events on to the tree.
+ // We need this as on MAC only double clicks seem to expand the tree.
+ addMouseListener(new MouseAdapter() {
+ public void mousePressed(MouseEvent e) {
+
+ for (int counter = getColumnCount() - 1; counter >= 0; counter--) {
+ if (getColumnClass(counter) == TreeTableModel.class) {
+ MouseEvent me = (MouseEvent) e;
+ MouseEvent newME = new MouseEvent(tree, me.getID(), me
+ .getWhen(), me.getModifiers(), me.getX()
+ - getCellRect(0, counter, true).x, me.getY(),
+ me.getClickCount(), me.isPopupTrigger());
+ if (me.getClickCount() == 1) {
+ tree.dispatchEvent(newME);
+ }
+ }
+ else{
+
+ }
+ }
+ }
+ });
+
+ // And update the height of the trees row to match that of
+ // the table.
+
+ if (tree.getRowHeight() < 1) {
+ // Metal looks better like this.
+ setRowHeight(18);
+ }
+
+ }
+
+ /**
+ * Overridden to message super and forward the method to the tree. Since the
+ * tree is not actually in the component hierarchy it will never receive this
+ * unless we forward it in this manner.
+ */
+ public void updateUI() {
+ super.updateUI();
+ if (tree != null) {
+ tree.updateUI();
+ }
+ // Use the tree's default foreground and background colors in the
+ // table.
+ LookAndFeel.installColorsAndFont(this, "Tree.background",
+ "Tree.foreground", "Tree.font");
+ }
+
+ /*
+ * Workaround for BasicTableUI anomaly. Make sure the UI never tries to
+ * paint the editor. The UI currently uses different techniques to paint the
+ * renderers and editors and overriding setBounds() below is not the right
+ * thing to do for an editor. Returning -1 for the editing row in this case,
+ * ensures the editor is never painted.
+ */
+ public int getEditingRow() {
+ return (getColumnClass(editingColumn) == TreeTableModel.class) ? -1
+ : editingRow;
+ }
+
+ /**
+ * Returns the actual row that is editing as <code>getEditingRow</code> will
+ * always return -1.
+ */
+ private int realEditingRow() {
+ return editingRow;
+ }
+
+ /**
+ * This is overridden to invoke super's implementation, and then, if the
+ * receiver is editing a Tree column, the editor's bounds is reset. The
+ * reason we have to do this is because JTable doesn't think the table is
+ * being edited, as <code>getEditingRow</code> returns -1, and therefore
+ * doesn't automatically resize the editor for us.
+ */
+ public void sizeColumnsToFit(int resizingColumn) {
+ super.sizeColumnsToFit(resizingColumn);
+ if (getEditingColumn() != -1
+ && getColumnClass(editingColumn) == TreeTableModel.class) {
+ Rectangle cellRect = getCellRect(realEditingRow(),
+ getEditingColumn(), false);
+ Component component = getEditorComponent();
+ component.setBounds(cellRect);
+ component.validate();
+ }
+ }
+
+ /**
+ * Overridden to pass the new rowHeight to the tree.
+ */
+ public void setRowHeight(int rowHeight) {
+ super.setRowHeight(rowHeight);
+ if (tree != null && tree.getRowHeight() != rowHeight) {
+ tree.setRowHeight(getRowHeight());
+ }
+ }
+
+ /**
+ * Returns the tree that is being shared between the model.
+ */
+ public JTree getTree() {
+ return tree;
+ }
+
+ /**
+ * Overridden to invoke repaint for the particular location if the column
+ * contains the tree. This is done as the tree editor does not fill the
+ * bounds of the cell, we need the renderer to paint the tree in the
+ * background, and then draw the editor over it.
+ */
+ public boolean editCellAt(int row, int column, EventObject e) {
+ boolean retValue = super.editCellAt(row, column, e);
+ if (retValue && getColumnClass(column) == TreeTableModel.class) {
+ repaint(getCellRect(row, column, false));
+ }
+ return retValue;
+ }
+
+ /**
+ * A TreeCellRenderer that displays a JTree.
+ */
+ public class TreeTableCellRenderer extends JTree implements
+ TableCellRenderer {
+ /** Last table/tree row asked to renderer. */
+ protected int visibleRow;
+ protected Border highlightBorder;
+
+ public TreeTableCellRenderer(TreeModel model) {
+ super(model);
+ }
+
+ /**
+ * updateUI is overridden to set the colors of the Tree's renderer to
+ * match that of the table.
+ */
+ public void updateUI() {
+ super.updateUI();
+ // Make the tree's cell renderer use the table's cell selection
+ // colors.
+ TreeCellRenderer tcr = getCellRenderer();
+ if (tcr instanceof DefaultTreeCellRenderer) {
+ //DefaultTreeCellRenderer dtcr = ((DefaultTreeCellRenderer) tcr);
+ // For 1.1 uncomment this, 1.2 has a bug that will cause an
+ // exception to be thrown if the border selection color is
+ // null.
+ // dtcr.setBorderSelectionColor(null);
+ // dtcr.setTextSelectionColor(UIManager.getColor
+ // ("Table.selectionForeground"));
+ // dtcr.setBackgroundSelectionColor(UIManager.getColor
+ // ("Table.selectionBackground"));
+ }
+ }
+
+ /**
+ * Sets the row height of the tree, and forwards the row height to the
+ * table.
+ */
+ public void setRowHeight(int rowHeight) {
+ if (rowHeight > 0) {
+ super.setRowHeight(rowHeight);
+ if (JTreeTable.this != null
+ && JTreeTable.this.getRowHeight() != rowHeight) {
+ JTreeTable.this.setRowHeight(getRowHeight());
+ }
+ }
+ }
+
+ /**
+ * This is overridden to set the height to match that of the JTable.
+ */
+ public void setBounds(int x, int y, int w, int h) {
+ super.setBounds(x, 0, w, JTreeTable.this.getHeight());
+ }
+
+ /**
+ * Subclassed to translate the graphics such that the last visible row
+ * will be drawn at 0,0.
+ */
+ public void paint(Graphics g) {
+ g.translate(0, -visibleRow * getRowHeight());
+ super.paint(g);
+ // Draw the Table border if we have focus.
+ if (highlightBorder != null) {
+ highlightBorder.paintBorder(this, g, 0, visibleRow
+ * getRowHeight(), getWidth(), getRowHeight());
+ }
+ else{
+ // Tree cell renderer get rid of the grid lines for some
+ // reason so we draw them here but only if Look and Feel
+ // is different from Java 6's Nimbus LaF
+ // as it completely ignores the grid lines
+ if (!UIManager.getLookAndFeel().getName().equals("Nimbus")){
+ LinesBorder linesBorder = new LinesBorder(getGridColor(),
+ new Insets(0, 0, 1, 1));
+ linesBorder
+ .paintBorder(this, g, 0, visibleRow * getRowHeight(),
+ getWidth(), getRowHeight());
+ }
+ }
+ }
+
+ /**
+ * TreeCellRenderer method. Overridden to update the visible row.
+ */
+ public Component getTableCellRendererComponent(JTable table,
+ Object value, boolean isSelected, boolean hasFocus, int row,
+ int column) {
+ Color background;
+ Color foreground;
+
+ if (isSelected) {
+ background = table.getSelectionBackground();
+ foreground = table.getSelectionForeground();
+ } else {
+ background = table.getBackground();
+ foreground = table.getForeground();
+ }
+ highlightBorder = null;
+ if (realEditingRow() == row && getEditingColumn() == column) {
+ // background = UIManager.getColor("Table.focusCellBackground");
+ // foreground = UIManager.getColor("Table.focusCellForeground");
+ } else if (hasFocus) {
+ if (isSelected) {
+ highlightBorder = UIManager.getBorder("Table.focusSelectedCellHighlightBorder");
+ }
+ else{
+ highlightBorder = UIManager.getBorder("Table.focusCellHighlightBorder");
+ }
+ if (isCellEditable(row, column)) {
+ // background = UIManager.getColor
+ // ("Table.focusCellBackground");
+ background = table.getSelectionBackground();
+ foreground = table.getSelectionForeground();
+ }
+ }
+
+ visibleRow = row;
+ setBackground(background);
+
+ TreeCellRenderer tcr = getCellRenderer();
+ if (tcr instanceof DefaultTreeCellRenderer) {
+ DefaultTreeCellRenderer dtcr = ((DefaultTreeCellRenderer) tcr);
+ if (isSelected) {
+ dtcr.setTextSelectionColor(foreground);
+ dtcr.setBackgroundSelectionColor(background);
+ } else {
+ dtcr.setTextNonSelectionColor(foreground);
+ dtcr.setBackgroundNonSelectionColor(background);
+ }
+ }
+ return this;
+ }
+
+ }
+
+ public static String formatDate(Date date) {
+ final Date midnight = new Date();
+ midnight.setHours(0);
+ midnight.setMinutes(0);
+ midnight.setSeconds(0);
+ SimpleDateFormat format;
+ if (date.before(midnight)) {
+ // FULL DATE
+ format = ISO_8601_FORMAT;
+ } else {
+ format = TIME_FORMAT;
+ }
+ final String formatted = format.format(date);
+ return formatted;
+ }
+
+ /**
+ * A TreeCellRenderer that displays a date in a "yyyy-MM-dd HH:mm:ss"
+ * format.
+ */
+ public class DateCellRenderer extends DefaultTableCellRenderer {
+ /** Last table/tree row asked to renderer. */
+ protected int visibleRow;
+ protected Border highlightBorder;
+
+ public DateCellRenderer() {
+ setOpaque(true);
+ }
+
+ public Component getTableCellRendererComponent(JTable table,
+ Object value, boolean isSelected, boolean hasFocus, int row,
+ int column) {
+ super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+
+ if (isSelected) {
+// this.setBackground(table.getSelectionBackground());
+// this.setForeground(table.getSelectionForeground());
+ } else {
+ /*this.setBackground(table.getBackground());
+ this.setForeground(table.getForeground());*/
+ }
+
+
+ //dtcr.setBorderSelectionColor(null);
+ // dtcr.setTextSelectionColor(UIManager.getColor
+ // ("Table.selectionForeground"));
+ // dtcr.setBackgroundSelectionColor(UIManager.getColor
+ // ("Table.selectionBackground"));
+
+
+
+ Date date = (Date) ((TreeTableModelAdapter) getModel()).getValueAt(
+ row, column);
+ if (date != null) {
+ setText(formatDate(date));
+ } else {
+ setText(null);
+ }
+ return this;
+ }
+
+ }
+
+ /**
+ * TreeTableCellEditor implementation. Component returned is the JTree.
+ */
+ public class TreeTableCellEditor extends DefaultCellEditor {
+ public TreeTableCellEditor() {
+ super(new TreeTableTextField());
+ }
+
+ public Component getTableCellEditorComponent(JTable table,
+ Object value, boolean isSelected, int r, int c) {
+ Component component = super.getTableCellEditorComponent(table,
+ value, isSelected, r, c);
+ JTree t = getTree();
+ boolean rv = t.isRootVisible();
+ int offsetRow = rv ? r : r - 1;
+ Rectangle bounds = t.getRowBounds(offsetRow);
+ int offset = bounds.x;
+ TreeCellRenderer tcr = t.getCellRenderer();
+ if (tcr instanceof DefaultTreeCellRenderer) {
+ Object node = t.getPathForRow(offsetRow).getLastPathComponent();
+ boolean isExpanded = t.isExpanded(t.getPathForRow(offsetRow));
+ boolean isLeaf = t.getModel().isLeaf(node);
+ Component renderer = tcr.getTreeCellRendererComponent(t, node,
+ true, isExpanded, isLeaf, offsetRow, true);
+ Icon icon = ((JLabel) renderer).getIcon();
+ // if (t.getModel().isLeaf(node))
+ // icon = ((DefaultTreeCellRenderer)tcr).getLeafIcon();
+ // else if (tree.isExpanded(offsetRow))
+ // icon = ((DefaultTreeCellRenderer)tcr).getOpenIcon();
+ // else
+ // icon = ((DefaultTreeCellRenderer)tcr).getClosedIcon();
+ if (icon != null) {
+ offset += ((DefaultTreeCellRenderer) tcr).getIconTextGap()
+ + icon.getIconWidth();
+ }
+ }
+ ((TreeTableTextField) getComponent()).offset = offset;
+ return component;
+ }
+
+ // /**
+ // * This is overridden to forward the event to the tree. This will
+ // return
+ // * true if the click count >= 3, or the event is null.
+ // */
+ // public boolean isCellEditable(EventObject e) {
+ // /**
+ // * if (e instanceof MouseEvent) { for (int counter =
+ // * getColumnCount() - 1; counter >= 0; counter--) { if
+ // * (getColumnClass(counter) == TreeTableModel.class) { MouseEvent me
+ // * = (MouseEvent)e; MouseEvent newME = new MouseEvent(tree,
+ // * me.getID(), me.getWhen(), me.getModifiers(), me.getX() -
+ // * getCellRect(0, counter, true).x, me.getY(), me.getClickCount(),
+ // * me.isPopupTrigger()); System.out.println(newME);
+ // * tree.dispatchEvent(newME); break; } } }
+ // */
+ // if (e instanceof MouseEvent) {
+ // MouseEvent me = (MouseEvent) e;
+ // if (me.getClickCount() >= 3) {
+ // return true;
+ // }
+ // }
+ // if (e == null) {
+ // return true;
+ // }
+ // return false;
+ // }
+
+ /**
+ * This is overridden to forward the event to the tree. This will return
+ * true if the click count >= 3, or the event is null.
+ */
+ public boolean isCellEditable(EventObject e) {
+ // Edit on double click rather than the default triple
+ if (e instanceof MouseEvent) {
+
+ MouseEvent me = (MouseEvent) e;
+ if (me.getClickCount() == 1
+ && System.getProperty("os.name").equals("Mac OS X")) {
+ // Workaround for buggy tree table on OS X. Open/close the
+ // path
+ // on any click on the column (not just on the > icon)
+ for (int counter = getColumnCount() - 1; counter >= 0; counter--) {
+ if (getColumnClass(counter) == TreeTableModel.class) {
+ MouseEvent newME = new MouseEvent(tree, me.getID(),
+ me.getWhen(), me.getModifiers(), me.getX()
+ - getCellRect(0, counter, true).x,
+ me.getY(), me.getClickCount(), me
+ .isPopupTrigger());
+ tree.dispatchEvent(newME);
+
+ Point p = new Point(me.getX(), me.getY());
+ int row = rowAtPoint(p);
+ int column = columnAtPoint(p);
+ if (column == 0) {
+ boolean isExpanded = tree.isExpanded(tree
+ .getPathForRow(row));
+ if (isExpanded == false) {
+ tree.expandPath(tree.getPathForRow(row));
+ } else {
+ tree.collapsePath(tree.getPathForRow(row));
+ }
+ }
+
+ break;
+ }
+ }
+
+ }
+ /*
+ * if (me.getClickCount() >= 3) { return true; }
+ */// tree is no editable
+ }
+ if (e == null) {
+ return true;
+ }
+ return false;
+ }
+
+ }
+
+ /**
+ * Component used by TreeTableCellEditor. The only thing this does is to
+ * override the <code>reshape</code> method, and to ALWAYS make the x
+ * location be <code>offset</code>.
+ */
+ public static class TreeTableTextField extends JTextField {
+ public int offset;
+
+ public void setBounds(int x, int y, int w, int h) {
+ int newX = Math.max(x, offset);
+ super.setBounds(newX, y, w - (newX - x), h);
+ }
+ }
+
+ /**
+ * ListToTreeSelectionModelWrapper extends DefaultTreeSelectionModel to
+ * listen for changes in the ListSelectionModel it maintains. Once a change
+ * in the ListSelectionModel happens, the paths are updated in the
+ * DefaultTreeSelectionModel.
+ */
+ class ListToTreeSelectionModelWrapper extends DefaultTreeSelectionModel {
+ /** Set to true when we are updating the ListSelectionModel. */
+ protected boolean updatingListSelectionModel;
+
+ public ListToTreeSelectionModelWrapper() {
+ super();
+ setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
+ getListSelectionModel().addListSelectionListener(
+ createListSelectionListener());
+ }
+
+ /**
+ * Returns the list selection model. ListToTreeSelectionModelWrapper
+ * listens for changes to this model and updates the selected paths
+ * accordingly.
+ */
+ ListSelectionModel getListSelectionModel() {
+ return listSelectionModel;
+ }
+
+ /**
+ * This is overridden to set <code>updatingListSelectionModel</code> and
+ * message super. This is the only place DefaultTreeSelectionModel
+ * alters the ListSelectionModel.
+ */
+ public void resetRowSelection() {
+ if (!updatingListSelectionModel) {
+ updatingListSelectionModel = true;
+ try {
+ super.resetRowSelection();
+ } finally {
+ updatingListSelectionModel = false;
+ }
+ }
+ // Notice how we don't message super if
+ // updatingListSelectionModel is true. If
+ // updatingListSelectionModel is true, it implies the
+ // ListSelectionModel has already been updated and the
+ // paths are the only thing that needs to be updated.
+ }
+
+ /**
+ * Creates and returns an instance of ListSelectionHandler.
+ */
+ protected ListSelectionListener createListSelectionListener() {
+ return new ListSelectionHandler();
+ }
+
+ /**
+ * If <code>updatingListSelectionModel</code> is false, this will reset
+ * the selected paths from the selected rows in the list selection
+ * model.
+ */
+ protected void updateSelectedPathsFromSelectedRows() {
+ if (!updatingListSelectionModel) {
+ updatingListSelectionModel = true;
+ try {
+ // This is way expensive, ListSelectionModel needs an
+ // enumerator for iterating.
+ int min = listSelectionModel.getMinSelectionIndex();
+ int max = listSelectionModel.getMaxSelectionIndex();
+
+ clearSelection();
+ if (min != -1 && max != -1) {
+ for (int counter = min; counter <= max; counter++) {
+ if (listSelectionModel.isSelectedIndex(counter)) {
+ TreePath selPath = tree.getPathForRow(counter);
+
+ if (selPath != null) {
+ addSelectionPath(selPath);
+ }
+ }
+ }
+ }
+ } finally {
+ updatingListSelectionModel = false;
+ }
+ }
+ }
+
+ /**
+ * Class responsible for calling updateSelectedPathsFromSelectedRows
+ * when the selection of the list change.
+ */
+ class ListSelectionHandler implements ListSelectionListener {
+ public void valueChanged(ListSelectionEvent e) {
+ updateSelectedPathsFromSelectedRows();
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/LinesBorder.java
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/LinesBorder.java b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/LinesBorder.java
new file mode 100644
index 0000000..45ac3bb
--- /dev/null
+++ b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/LinesBorder.java
@@ -0,0 +1,178 @@
+/**
+ * Example from http://www.java2s.com/Code/Java/Swing-Components/CellBorderTableExample.htm
+ */
+package net.sf.taverna.t2.lang.ui.treetable;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Insets;
+
+import javax.swing.SwingConstants;
+import javax.swing.border.AbstractBorder;
+
+/**
+ *
+ * Line border that lets you control the colour and thickness of all four edges. Needed to fix the tree cell
+ * renderer in the JTreeTable that looked a bit 'naff' on Windows (i.e. Windows draws lines around table
+ * cells when default Look and Feel is in use and the tree cell renderer was not drawing lines.)
+ *
+ */
+@SuppressWarnings("serial")
+public class LinesBorder extends AbstractBorder implements SwingConstants {
+ protected int northThickness;
+
+ protected int southThickness;
+
+ protected int eastThickness;
+
+ protected int westThickness;
+
+ protected Color northColor;
+
+ protected Color southColor;
+
+ protected Color eastColor;
+
+ protected Color westColor;
+
+ public LinesBorder(Color color) {
+ this(color, 1);
+ }
+
+ public LinesBorder(Color color, int thickness) {
+ setColor(color);
+ setThickness(thickness);
+ }
+
+ public LinesBorder(Color color, Insets insets) {
+ setColor(color);
+ setThickness(insets);
+ }
+
+ public void paintBorder(Component c, Graphics g, int x, int y, int width,
+ int height) {
+ Color oldColor = g.getColor();
+
+ g.setColor(northColor);
+ for (int i = 0; i < northThickness; i++) {
+ g.drawLine(x, y + i, x + width - 1, y + i);
+ }
+ g.setColor(southColor);
+ for (int i = 0; i < southThickness; i++) {
+ g
+ .drawLine(x, y + height - i - 1, x + width - 1, y + height
+ - i - 1);
+ }
+ g.setColor(eastColor);
+ for (int i = 0; i < westThickness; i++) {
+ g.drawLine(x + i, y, x + i, y + height - 1);
+ }
+ g.setColor(westColor);
+ for (int i = 0; i < eastThickness; i++) {
+ g.drawLine(x + width - i - 1, y, x + width - i - 1, y + height - 1);
+ }
+
+ g.setColor(oldColor);
+ }
+
+ public Insets getBorderInsets(Component c) {
+ return new Insets(northThickness, westThickness, southThickness,
+ eastThickness);
+ }
+
+ public Insets getBorderInsets(Component c, Insets insets) {
+ return new Insets(northThickness, westThickness, southThickness,
+ eastThickness);
+ }
+
+ public boolean isBorderOpaque() {
+ return true;
+ }
+
+ public void setColor(Color c) {
+ northColor = c;
+ southColor = c;
+ eastColor = c;
+ westColor = c;
+ }
+
+ public void setColor(Color c, int direction) {
+ switch (direction) {
+ case NORTH:
+ northColor = c;
+ break;
+ case SOUTH:
+ southColor = c;
+ break;
+ case EAST:
+ eastColor = c;
+ break;
+ case WEST:
+ westColor = c;
+ break;
+ default:
+ }
+ }
+
+ public void setThickness(int n) {
+ northThickness = n;
+ southThickness = n;
+ eastThickness = n;
+ westThickness = n;
+ }
+
+ public void setThickness(Insets insets) {
+ northThickness = insets.top;
+ southThickness = insets.bottom;
+ eastThickness = insets.right;
+ westThickness = insets.left;
+ }
+
+ public void setThickness(int n, int direction) {
+ switch (direction) {
+ case NORTH:
+ northThickness = n;
+ break;
+ case SOUTH:
+ southThickness = n;
+ break;
+ case EAST:
+ eastThickness = n;
+ break;
+ case WEST:
+ westThickness = n;
+ break;
+ default:
+ }
+ }
+
+ public void append(LinesBorder b, boolean isReplace) {
+ if (isReplace) {
+ northThickness = b.northThickness;
+ southThickness = b.southThickness;
+ eastThickness = b.eastThickness;
+ westThickness = b.westThickness;
+ } else {
+ northThickness = Math.max(northThickness, b.northThickness);
+ southThickness = Math.max(southThickness, b.southThickness);
+ eastThickness = Math.max(eastThickness, b.eastThickness);
+ westThickness = Math.max(westThickness, b.westThickness);
+ }
+ }
+
+ public void append(Insets insets, boolean isReplace) {
+ if (isReplace) {
+ northThickness = insets.top;
+ southThickness = insets.bottom;
+ eastThickness = insets.right;
+ westThickness = insets.left;
+ } else {
+ northThickness = Math.max(northThickness, insets.top);
+ southThickness = Math.max(southThickness, insets.bottom);
+ eastThickness = Math.max(eastThickness, insets.right);
+ westThickness = Math.max(westThickness, insets.left);
+ }
+ }
+
+ }
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModel.java
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModel.java b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModel.java
new file mode 100644
index 0000000..36fa4fe
--- /dev/null
+++ b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModel.java
@@ -0,0 +1,69 @@
+/*
+ * TreeTableModel.java
+ *
+ * Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * This software is the confidential and proprietary information of Sun
+ * Microsystems, Inc. ("Confidential Information"). You shall not
+ * disclose such Confidential Information and shall use it only in
+ * accordance with the terms of the license agreement you entered into
+ * with Sun.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+package net.sf.taverna.t2.lang.ui.treetable;
+
+import javax.swing.tree.TreeModel;
+
+/**
+ * TreeTableModel is the model used by a JTreeTable. It extends TreeModel
+ * to add methods for getting inforamtion about the set of columns each
+ * node in the TreeTableModel may have. Each column, like a column in
+ * a TableModel, has a name and a type associated with it. Each node in
+ * the TreeTableModel can return a value for each of the columns and
+ * set that value if isCellEditable() returns true.
+ *
+ * @author Philip Milne
+ * @author Scott Violet
+ */
+public interface TreeTableModel extends TreeModel
+{
+ /**
+ * Returns the number ofs availible column.
+ */
+ public int getColumnCount();
+
+ /**
+ * Returns the name for column number <code>column</code>.
+ */
+ public String getColumnName(int column);
+
+ /**
+ * Returns the type for column number <code>column</code>.
+ */
+ public Class getColumnClass(int column);
+
+ /**
+ * Returns the value to be displayed for node <code>node</code>,
+ * at column number <code>column</code>.
+ */
+ public Object getValueAt(Object node, int column);
+
+ /**
+ * Indicates whether the the value for node <code>node</code>,
+ * at column number <code>column</code> is editable.
+ */
+ public boolean isCellEditable(Object node, int column);
+
+ /**
+ * Sets the value for node <code>node</code>,
+ * at column number <code>column</code>.
+ */
+ public void setValueAt(Object aValue, Object node, int column);
+}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModelAdapter.java
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModelAdapter.java b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModelAdapter.java
new file mode 100644
index 0000000..a6cdd24
--- /dev/null
+++ b/taverna-ui/src/main/java/net/sf/taverna/t2/lang/ui/treetable/TreeTableModelAdapter.java
@@ -0,0 +1,132 @@
+/*
+ * @(#)TreeTableModelAdapter.java 1.2 98/10/27
+ *
+ * Copyright 1997, 1998 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information"). You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ */
+package net.sf.taverna.t2.lang.ui.treetable;
+
+import javax.swing.JTree;
+import javax.swing.SwingUtilities;
+import javax.swing.event.TreeExpansionEvent;
+import javax.swing.event.TreeExpansionListener;
+import javax.swing.event.TreeModelEvent;
+import javax.swing.event.TreeModelListener;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.tree.TreePath;
+
+/**
+ * This is a wrapper class takes a TreeTableModel and implements
+ * the table model interface. The implementation is trivial, with
+ * all of the event dispatching support provided by the superclass:
+ * the AbstractTableModel.
+ *
+ * @version 1.2 10/27/98
+ *
+ * @author Philip Milne
+ * @author Scott Violet
+ */
+@SuppressWarnings("serial")
+public class TreeTableModelAdapter extends AbstractTableModel
+{
+ JTree tree;
+ TreeTableModel treeTableModel;
+
+ public TreeTableModelAdapter(TreeTableModel treeTableModel, JTree tree) {
+ this.tree = tree;
+ this.treeTableModel = treeTableModel;
+
+ tree.addTreeExpansionListener(new TreeExpansionListener() {
+ // Don't use fireTableRowsInserted() here; the selection model
+ // would get updated twice.
+ public void treeExpanded(TreeExpansionEvent event) {
+ fireTableDataChanged();
+ }
+ public void treeCollapsed(TreeExpansionEvent event) {
+ fireTableDataChanged();
+ }
+ });
+
+ // Install a TreeModelListener that can update the table when
+ // tree changes. We use delayedFireTableDataChanged as we can
+ // not be guaranteed the tree will have finished processing
+ // the event before us.
+ treeTableModel.addTreeModelListener(new TreeModelListener() {
+ public void treeNodesChanged(TreeModelEvent e) {
+ delayedFireTableDataChanged();
+ }
+
+ public void treeNodesInserted(TreeModelEvent e) {
+ delayedFireTableDataChanged();
+ }
+
+ public void treeNodesRemoved(TreeModelEvent e) {
+ delayedFireTableDataChanged();
+ }
+
+ public void treeStructureChanged(TreeModelEvent e) {
+ delayedFireTableDataChanged();
+ }
+ });
+ }
+
+ // Wrappers, implementing TableModel interface.
+
+ public int getColumnCount() {
+ return treeTableModel.getColumnCount();
+ }
+
+ public String getColumnName(int column) {
+ return treeTableModel.getColumnName(column);
+ }
+
+ public Class getColumnClass(int column) {
+ return treeTableModel.getColumnClass(column);
+ }
+
+ public int getRowCount() {
+ return tree.getRowCount();
+ }
+
+ protected Object nodeForRow(int row) {
+ TreePath treePath = tree.getPathForRow(row);
+ if (treePath == null) {
+ return null;
+ }
+ return treePath.getLastPathComponent();
+ }
+
+ public Object getValueAt(int row, int column) {
+ return treeTableModel.getValueAt(nodeForRow(row), column);
+ }
+
+ public boolean isCellEditable(int row, int column) {
+ return treeTableModel.isCellEditable(nodeForRow(row), column);
+ }
+
+ public void setValueAt(Object value, int row, int column) {
+ treeTableModel.setValueAt(value, nodeForRow(row), column);
+ }
+
+ /**
+ * Invokes fireTableDataChanged after all the pending events have been
+ * processed. SwingUtilities.invokeLater is used to handle this.
+ */
+ protected void delayedFireTableDataChanged() {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ TreePath[] selected = tree.getSelectionPaths();
+ fireTableDataChanged();
+ tree.setSelectionPaths(selected);
+ }
+ });
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/ok.png
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/ok.png b/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/ok.png
new file mode 100644
index 0000000..ac479f2
Binary files /dev/null and b/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/ok.png differ
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/severe.png
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/severe.png b/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/severe.png
new file mode 100644
index 0000000..a69364d
Binary files /dev/null and b/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/severe.png differ
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/warning.png
----------------------------------------------------------------------
diff --git a/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/warning.png b/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/warning.png
new file mode 100644
index 0000000..f09e60f
Binary files /dev/null and b/taverna-ui/src/main/resources/net/sf/taverna/t2/lang/ui/icons/warning.png differ
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/pom.xml
----------------------------------------------------------------------
diff --git a/ui/pom.xml b/ui/pom.xml
deleted file mode 100644
index 6d42dc3..0000000
--- a/ui/pom.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>net.sf.taverna.t2</groupId>
- <artifactId>lang</artifactId>
- <version>2.0.1-SNAPSHOT</version>
- </parent>
- <groupId>net.sf.taverna.t2.lang</groupId>
- <artifactId>ui</artifactId>
- <packaging>bundle</packaging>
- <name>User interface (Swing) utility classes</name>
- <dependencies>
- <dependency>
- <groupId>net.sf.taverna.t2.lang</groupId>
- <artifactId>observer</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>net.sf.taverna.jedit</groupId>
- <artifactId>jedit-syntax</artifactId>
- <version>${jedit.syntax.version}</version>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>${commons.io.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.log4j</groupId>
- <artifactId>com.springsource.org.apache.log4j</artifactId>
- <version>${log4j.version}</version>
- </dependency>
- </dependencies>
-</project>
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/CArrowImage.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/CArrowImage.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/CArrowImage.java
deleted file mode 100644
index 6a258de..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/CArrowImage.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester
- *
- * Modifications to the initial code base are copyright of their
- * respective authors, or their employers as appropriate.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.Color;
-import java.awt.GradientPaint;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.SystemColor;
-import java.awt.RenderingHints.Key;
-import java.awt.geom.GeneralPath;
-import java.awt.geom.Line2D;
-import java.awt.image.BufferedImage;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A BufferedImage of one of four types of arrow (up, down, left or right) drawn
- * to the size specified on the constructor.
- */
-public class CArrowImage extends BufferedImage {
- // Constants...
- public static final int ARROW_UP = 0;
-
- public static final int ARROW_DOWN = 1;
-
- public static final int ARROW_LEFT = 2;
-
- public static final int ARROW_RIGHT = 3;
-
- // Member variables...
- private GeneralPath _pathArrow = new GeneralPath();
-
- // Constructor...
- public CArrowImage(int nArrowDirection) {
- this(15, 9, nArrowDirection);
- }
-
- public CArrowImage(int nWidth, int nHeight, int nArrowDirection) {
- super(nWidth, nHeight, TYPE_INT_ARGB_PRE); // Set the width, height and
- // image type
-
- Map<Key, Object> map = new HashMap<Key, Object>();
- map.put(RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_ON);
- map.put(RenderingHints.KEY_RENDERING,
- RenderingHints.VALUE_RENDER_QUALITY);
- RenderingHints hints = new RenderingHints(map);
-
- Graphics2D g2 = this.createGraphics(); // Create a graphics context for
- // this buffered image
- g2.setRenderingHints(hints);
-
- float h = getHeight();
- float w = getWidth();
- float w13 = w / 3;
- float w12 = w / 2;
- float w23 = w * 2 / 3;
- float h13 = h / 3;
- float h12 = h / 2;
- float h23 = h * 2 / 3;
-
- switch (nArrowDirection) {
- case ARROW_UP:
- _pathArrow.moveTo(w12, h12);
- _pathArrow.lineTo(w12, 0);
- _pathArrow.lineTo(w, h - 1);
- _pathArrow.lineTo(0, h - 1);
- _pathArrow.closePath();
- g2.setPaint(new GradientPaint(w13, h13,
- SystemColor.controlLtHighlight, w, h - 1,
- SystemColor.controlShadow));
-
- g2.fill(_pathArrow);
-
- g2.setColor(SystemColor.controlDkShadow);
- g2.draw(new Line2D.Float(0, h - 1, w, h - 1));
- g2.setColor(SystemColor.controlShadow);
- g2.draw(new Line2D.Float(w12, 0, w, h - 1));
- g2.setColor(SystemColor.controlLtHighlight);
- g2.draw(new Line2D.Float(0, h - 1, w12, 0));
- break;
-
- case ARROW_DOWN:
- _pathArrow.moveTo(w12, h12);
- _pathArrow.lineTo(w, 0);
- _pathArrow.lineTo(w12, h - 1);
- _pathArrow.closePath();
- g2.setPaint(new GradientPaint(0, 0, SystemColor.controlLtHighlight,
- w23, h23, SystemColor.controlShadow));
- g2.fill(_pathArrow);
-
- g2.setColor(SystemColor.controlDkShadow);
- g2.draw(new Line2D.Float(w, 0, w12, h - 1));
- g2.setColor(SystemColor.controlShadow);
- g2.draw(new Line2D.Float(w12, h - 1, 0, 0));
- g2.setColor(SystemColor.controlLtHighlight);
- g2.draw(new Line2D.Float(0, 0, w, 0));
- break;
-
- case ARROW_LEFT:
- _pathArrow.moveTo(w - 1, h13);
- _pathArrow.lineTo(w13, h13);
- _pathArrow.lineTo(w13, 0);
- _pathArrow.lineTo(0, h12);
- _pathArrow.lineTo(w13, h - 1);
- _pathArrow.lineTo(w13, h23);
- _pathArrow.lineTo(w - 1, h23);
- _pathArrow.closePath();
- g2.setPaint(new GradientPaint(0, 0, Color.white, // SystemColor.
- // controlLtHighlight
- // ,
- 0, h, SystemColor.controlShadow));
- g2.fill(_pathArrow);
-
- _pathArrow.reset();
- _pathArrow.moveTo(w13, 0);
- _pathArrow.lineTo(w13, h13);
- _pathArrow.moveTo(w - 1, h13);
- _pathArrow.lineTo(w - 1, h23);
- _pathArrow.lineTo(w13, h23);
- _pathArrow.lineTo(w13, h - 1);
- g2.setColor(SystemColor.controlDkShadow);
- g2.draw(_pathArrow);
-
- g2.setColor(SystemColor.controlShadow);
- g2.draw(new Line2D.Float(0, h12, w13, h - 1));
-
- _pathArrow.reset();
- _pathArrow.moveTo(0, h12);
- _pathArrow.lineTo(w13, 0);
- _pathArrow.moveTo(w13, h13);
- _pathArrow.lineTo(w - 1, h13);
- g2.setColor(SystemColor.controlLtHighlight);
- g2.draw(_pathArrow);
- break;
-
- case ARROW_RIGHT:
- default: {
- _pathArrow.moveTo(0, h13);
- _pathArrow.lineTo(w23, h13);
- _pathArrow.lineTo(w23, 0);
- _pathArrow.lineTo(w - 1, h12);
- _pathArrow.lineTo(w23, h - 1);
- _pathArrow.lineTo(w23, h23);
- _pathArrow.lineTo(0, h23);
- _pathArrow.closePath();
- g2.setPaint(new GradientPaint(0, 0, Color.white, // SystemColor.
- // controlLtHighlight
- // ,
- 0, h, SystemColor.controlShadow));
- g2.fill(_pathArrow);
-
- _pathArrow.reset();
- _pathArrow.moveTo(0, h23);
- _pathArrow.lineTo(w23, h23);
- _pathArrow.moveTo(w23, h - 1);
- _pathArrow.lineTo(w - 1, h12);
- g2.setColor(SystemColor.controlDkShadow);
- g2.draw(_pathArrow);
-
- g2.setColor(SystemColor.controlShadow);
- g2.draw(new Line2D.Float(w - 1, h12, w23, 0));
-
- _pathArrow.reset();
- _pathArrow.moveTo(w23, 0);
- _pathArrow.lineTo(w23, h13);
- _pathArrow.lineTo(0, h13);
- _pathArrow.lineTo(0, h23);
- _pathArrow.moveTo(w23, h23);
- _pathArrow.lineTo(w23, h - 1);
- g2.setColor(SystemColor.controlLtHighlight);
- g2.draw(_pathArrow);
- break;
- }
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/CTransferableTreePath.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/CTransferableTreePath.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/CTransferableTreePath.java
deleted file mode 100644
index 2d85203..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/CTransferableTreePath.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester
- *
- * Modifications to the initial code base are copyright of their
- * respective authors, or their employers as appropriate.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
-
-import javax.swing.tree.TreePath;
-
-/**
- * This represents a TreePath (a node in a JTree) that can be transferred
- * between a drag source and a drop target.
- */
-public class CTransferableTreePath implements Transferable {
- // The type of DnD object being dragged...
- public static final DataFlavor TREEPATH_FLAVOR = new DataFlavor(
- DataFlavor.javaJVMLocalObjectMimeType, "TreePath");
-
- private TreePath _path;
-
- private DataFlavor[] _flavors = { TREEPATH_FLAVOR };
-
- /**
- * Constructs a transferrable tree path object for the specified path.
- */
- public CTransferableTreePath(TreePath path) {
- _path = path;
- }
-
- // Transferable interface methods...
- public DataFlavor[] getTransferDataFlavors() {
- return _flavors;
- }
-
- public boolean isDataFlavorSupported(DataFlavor flavor) {
- return java.util.Arrays.asList(_flavors).contains(flavor);
- }
-
- public synchronized Object getTransferData(DataFlavor flavor)
- throws UnsupportedFlavorException {
- if (flavor.isMimeTypeEqual(TREEPATH_FLAVOR.getMimeType())) // DataFlavor.javaJVMLocalObjectMimeType))
- return _path;
- else
- throw new UnsupportedFlavorException(flavor);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/DeselectingButton.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/DeselectingButton.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/DeselectingButton.java
deleted file mode 100644
index ea29adb..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/DeselectingButton.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- *
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.JButton;
-
-/**
- * @author alanrw
- *
- */
-public class DeselectingButton extends JButton {
-
- public DeselectingButton(String name, final ActionListener action, String toolTip) {
- super();
- this.setAction(new AbstractAction() {
-
- public void actionPerformed(ActionEvent e) {
- Component parent = DeselectingButton.this.getParent();
- action.actionPerformed(e);
- parent.requestFocusInWindow();
- }
- });
- this.setText(name);
- this.setToolTipText(toolTip);
- }
-
- public DeselectingButton(String name, final ActionListener action) {
- this(name, action, null);
- }
-
- public DeselectingButton(final Action action, String toolTip) {
- this((String) action.getValue(Action.NAME), action, toolTip);
- }
-
- public DeselectingButton(final Action action) {
- this(action, null);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/DialogTextArea.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/DialogTextArea.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/DialogTextArea.java
deleted file mode 100644
index faf2643..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/DialogTextArea.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- *
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.Font;
-
-import javax.swing.JTextArea;
-import javax.swing.text.Document;
-
-/**
- * @author alanrw
- *
- */
-public class DialogTextArea extends JTextArea {
-
- private static Font newFont = Font.decode("Dialog");
-
- /**
- *
- */
- private static final long serialVersionUID = 2329063139827993252L;
-
- /**
- *
- */
- public DialogTextArea() {
- updateFont();
- }
-
- /**
- * @param text
- */
- public DialogTextArea(String text) {
- super(text);
- updateFont();
- }
-
- /**
- * @param doc
- */
- public DialogTextArea(Document doc) {
- super(doc);
- updateFont();
- }
-
- /**
- * @param rows
- * @param columns
- */
- public DialogTextArea(int rows, int columns) {
- super(rows, columns);
- updateFont();
- }
-
- /**
- * @param text
- * @param rows
- * @param columns
- */
- public DialogTextArea(String text, int rows, int columns) {
- super(text, rows, columns);
- updateFont();
- }
-
- /**
- * @param doc
- * @param text
- * @param rows
- * @param columns
- */
- public DialogTextArea(Document doc, String text, int rows, int columns) {
- super(doc, text, rows, columns);
- updateFont();
- }
-
- private void updateFont() {
- if (newFont != null) {
- this.setFont(newFont);
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/EdgeLineBorder.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/EdgeLineBorder.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/EdgeLineBorder.java
deleted file mode 100644
index f49faa1..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/EdgeLineBorder.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2013 The University of Manchester
- *
- * Modifications to the initial code base are copyright of their
- * respective authors, or their employers as appropriate.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Graphics;
-import java.awt.Insets;
-
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.border.Border;
-import javax.swing.border.LineBorder;
-
-/**
- *
- *
- * @author David Withers
- */
-public class EdgeLineBorder implements Border {
-
- public static final int TOP = 1;
- public static final int BOTTOM = 2;
- public static final int LEFT = 3;
- public static final int RIGHT = 4;
- private final int edge;
- private final Color color;
-
- public EdgeLineBorder(int edge, Color color) {
- this.edge = edge;
- this.color = color;
- }
-
- @Override
- public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
- Color oldColor = g.getColor();
- g.setColor(color);
- switch (edge) {
- case TOP:
- g.drawLine(x, y, x+width, y);
- break;
- case BOTTOM:
- g.drawLine(x, y+height-2, x+width, y+height-2);
- break;
- case LEFT:
- g.drawLine(x, y, x+width, y+height);
- break;
- case RIGHT:
- g.drawLine(x+width, y, x+width, y+height);
- break;
- }
- g.setColor(oldColor);
- }
-
- @Override
- public Insets getBorderInsets(Component c) {
- return new Insets(0, 0, 0, 0);
- }
-
- @Override
- public boolean isBorderOpaque() {
- return false;
- }
-
- public static void main(String[] args) {
- JFrame frame = new JFrame();
- frame.setSize(500, 500);
- JPanel panel = new JPanel();
- panel.setBorder(new EdgeLineBorder(TOP, Color.GRAY));
- frame.add(panel);
- frame.setVisible(true);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/EditorKeySetUtil.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/EditorKeySetUtil.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/EditorKeySetUtil.java
deleted file mode 100644
index 0e8d908..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/EditorKeySetUtil.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2009 Ingo Wassink of University of Twente, Netherlands and
- * The University of Manchester
- *
- * Modifications to the initial code base are copyright of their
- * respective authors, or their employers as appropriate.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-
-/**
- * @author Ingo Wassink
- * @author Ian Dunlop
- * @author Alan R Williams
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.apache.log4j.Logger;
-
-/**
- * Manager for reading key set file
- *
- * @author WassinkI
- * @author alanrw
- *
- */
-public class EditorKeySetUtil {
-
- private static Logger logger = Logger.getLogger(EditorKeySetUtil.class);
-
-
- public static Set<String> loadKeySet(InputStream stream) {
- Set<String> result = new TreeSet<String>();
- try {
- BufferedReader reader = new BufferedReader(
- new InputStreamReader(stream));
-
- String line;
- while ((line = reader.readLine()) != null) {
- result.add(line.trim());
- }
- reader.close();
- } catch (Exception e) {
- logger.error(e);
- }
- return result;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/ExtensionFileFilter.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/ExtensionFileFilter.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/ExtensionFileFilter.java
deleted file mode 100644
index 35e2417..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/ExtensionFileFilter.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester
- *
- * Modifications to the initial code base are copyright of their
- * respective authors, or their employers as appropriate.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-/**
- * This file is a component of the Taverna project,
- * and is licensed under the GNU LGPL.
- * Copyright Tom Oinn, EMBL-EBI
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.swing.filechooser.FileFilter;
-
-/**
- * A FileFilter implementation that can be configured to show only specific file
- * suffixes.
- *
- * @author Tom Oinn
- * @author Stian Soiland-Reyes
- */
-public class ExtensionFileFilter extends FileFilter {
- List<String> allowedExtensions;
-
- public ExtensionFileFilter(List<String> extensions) {
- setAllowedExtensions(extensions);
- }
-
- public ExtensionFileFilter(String[] allowedExtensions) {
- setAllowedExtensions(Arrays.asList(allowedExtensions));
- }
-
- private void setAllowedExtensions(List<String> extensions) {
- this.allowedExtensions = new ArrayList<String>();
- for (String e : extensions) {
- if (e.startsWith(".")) {
- if (e.length() > 1) {
- allowedExtensions.add(e.substring(1));
- }
- }
- else {
- allowedExtensions.add(e);
- }
- }
- }
-
- @Override
- public boolean accept(File f) {
- if (f.isDirectory()) {
- return true;
- }
- String extension = getExtension(f);
- if (extension != null) {
- for (String allowedExtension : allowedExtensions) {
- if (extension.equalsIgnoreCase(allowedExtension)) {
- return true;
- }
- }
- }
- return false;
- }
-
- String getExtension(File f) {
- String ext = null;
- String s = f.getName();
- int i = s.lastIndexOf('.');
- if (i > 0 && i < s.length() - 1) {
- ext = s.substring(i + 1).toLowerCase();
- }
- return ext;
- }
-
- @Override
- public String getDescription() {
- StringBuffer sb = new StringBuffer();
- sb.append("Filter for extensions : " );
- for (int i = 0; i < allowedExtensions.size(); i++) {
- sb.append(allowedExtensions.get(i));
- if (i < allowedExtensions.size() - 1) {
- sb.append(", ");
- }
- }
- return sb.toString();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/FileTools.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/FileTools.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/FileTools.java
deleted file mode 100644
index 4aa5bb2..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/FileTools.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- *
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.Component;
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.prefs.Preferences;
-
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.log4j.Logger;
-
-/**
- * @author alanrw
- *
- */
-public class FileTools {
-
- private static Logger logger = Logger.getLogger(FileTools.class);
-
-
-
- public static boolean saveStringToFile(Component parent, String dialogTitle, String extension, String content) {
- JFileChooser fileChooser = new JFileChooser();
- fileChooser.setDialogTitle(dialogTitle);
-
- fileChooser.resetChoosableFileFilters();
- fileChooser.setAcceptAllFileFilterUsed(true);
-
- fileChooser.setFileFilter(new ExtensionFileFilter(new String[] { extension }));
-
- Preferences prefs = Preferences.userNodeForPackage(FileTools.class);
- String curDir = prefs
- .get("currentDir", System.getProperty("user.home"));
- fileChooser.setCurrentDirectory(new File(curDir));
-
- boolean tryAgain = true;
- while (tryAgain) {
- tryAgain = false;
- int returnVal = fileChooser.showSaveDialog(parent);
- if (returnVal == JFileChooser.APPROVE_OPTION) {
- prefs.put("currentDir", fileChooser.getCurrentDirectory()
- .toString());
- File file = fileChooser.getSelectedFile();
- if (!file.getName().contains(".")) {
- String newName = file.getName() + extension;
- file = new File(file.getParentFile(), newName);
- }
-
- // TODO: Open in separate thread to avoid hanging UI
- try {
- if (file.exists()) {
- logger.info("File already exists: " + file);
- String msg = "Are you sure you want to overwrite existing file "
- + file + "?";
- int ret = JOptionPane.showConfirmDialog(
- parent, msg, "File already exists",
- JOptionPane.YES_NO_CANCEL_OPTION);
- if (ret == JOptionPane.YES_OPTION) {
-
- } else if (ret == JOptionPane.NO_OPTION) {
- tryAgain = true;
- continue;
- } else {
- logger.info("Aborted overwrite of " + file);
- return false;
- }
- }
- FileUtils.writeStringToFile(file, content, StandardCharsets.UTF_8.name());
- logger.info("Saved content by overwriting " + file);
- return true;
- } catch (IOException ex) {
- logger.warn("Could not save content to " + file, ex);
- JOptionPane.showMessageDialog(parent,
- "Could not save to " + file + ": \n\n"
- + ex.getMessage(), "Warning",
- JOptionPane.WARNING_MESSAGE);
- return false;
- }
- }
- }
- return false;
- }
-
- public static String readStringFromFile(Component parent, String dialogTitle, String extension) {
- JFileChooser fileChooser = new JFileChooser();
- fileChooser.setDialogTitle(dialogTitle);
- fileChooser.resetChoosableFileFilters();
- fileChooser.setAcceptAllFileFilterUsed(true);
-
- fileChooser.setFileFilter(new ExtensionFileFilter(new String[] { extension }));
-
- Preferences prefs = Preferences.userNodeForPackage(FileTools.class);
- String curDir = prefs
- .get("currentDir", System.getProperty("user.home"));
- fileChooser.setCurrentDirectory(new File(curDir));
-
- if (fileChooser.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION) {
- File selectedFile = fileChooser.getSelectedFile();
-
- try {
- return FileUtils.readFileToString(selectedFile, StandardCharsets.UTF_8.name());
- } catch (IOException ioe) {
- JOptionPane.showMessageDialog(parent, "Can not read file '"
- + selectedFile.getName() + "'", "Can not read file",
- JOptionPane.ERROR_MESSAGE);
- }
-
- }
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/HtmlUtils.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/HtmlUtils.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/HtmlUtils.java
deleted file mode 100644
index a30d36f..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/HtmlUtils.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- *
- */
-package net.sf.taverna.t2.lang.ui;
-
-import static org.apache.log4j.Logger.getLogger;
-
-import java.awt.BorderLayout;
-import java.awt.Desktop;
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.swing.JEditorPane;
-import javax.swing.JPanel;
-import javax.swing.event.HyperlinkEvent;
-import javax.swing.event.HyperlinkListener;
-
-import org.apache.log4j.Logger;
-
-/**
- * @author alanrw
- *
- */
-public class HtmlUtils {
-
- private static Logger logger = getLogger(HtmlUtils.class);
-
-
-
- public static JEditorPane createEditorPane(String html) {
- JEditorPane result = new JEditorPane("text/html", html);
- result.addHyperlinkListener(new HyperlinkListener() {
-
- @Override
- public void hyperlinkUpdate(HyperlinkEvent arg0) {
- if (HyperlinkEvent.EventType.ACTIVATED == arg0.getEventType()) {
- try {
- Desktop.getDesktop().browse(arg0.getURL().toURI());
- } catch (IOException | URISyntaxException e1) {
- logger.error(e1);
- }
- }
- }});
- result.setEditable(false);
- return result;
- }
-
- public static JPanel panelForHtml(JEditorPane editorPane) {
- JPanel result = new JPanel();
-
- result.setLayout(new BorderLayout());
-
- result.add(editorPane, BorderLayout.CENTER);
- return result;
- }
-
- public static String getStyle(String backgroundColour) {
- String style = "<style type='text/css'>";
- style += "table {align:center; border:solid black 1px; background-color:"
- + backgroundColour
- + ";width:100%; height:100%; overflow:auto;}";
- style += "</style>";
- return style;
- }
-
- public static String buildTableOpeningTag() {
- String result = "<table ";
- Map<String, String> props = getTableProperties();
- for (String key : props.keySet()) {
- result += key + "=\"" + props.get(key) + "\" ";
- }
- result += ">";
- return result;
- }
-
- public static Map<String, String> getTableProperties() {
- Map<String, String> result = new HashMap<String, String>();
- result.put("border", "1");
- return result;
- }
-
- public static String getHtmlHead(String backgroundColour) {
- return "<html><head>" + getStyle(backgroundColour) + "</head><body>";
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/JSplitPaneExt.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/JSplitPaneExt.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/JSplitPaneExt.java
deleted file mode 100644
index e656c36..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/JSplitPaneExt.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- *
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.Graphics;
-
-import javax.swing.JSplitPane;
-
-/**
- * Copied from code found on http://www.jguru.com
- *
- */
-public class JSplitPaneExt extends JSplitPane {
-
- protected boolean m_fIsPainted = false;
- protected double m_dProportionalLocation = -1;
-
- public JSplitPaneExt() {
- super();
- }
-
- public JSplitPaneExt(int iOrientation) {
- super(iOrientation);
- }
-
- protected boolean hasProportionalLocation() {
- return (m_dProportionalLocation != -1);
- }
-
- public void cancelDividerProportionalLocation() {
- m_dProportionalLocation = -1;
- }
-
- public void setDividerLocation(double dProportionalLocation) {
- if (dProportionalLocation < 0 || dProportionalLocation > 1) {
- throw new IllegalArgumentException(
- "Illegal value for divider location: "
- + dProportionalLocation);
- }
- m_dProportionalLocation = dProportionalLocation;
- if (m_fIsPainted) {
- super.setDividerLocation(m_dProportionalLocation);
- }
- }
-
- public void paint(Graphics g) {
- super.paint(g);
- if (hasProportionalLocation()) {
- super.setDividerLocation(m_dProportionalLocation);
- }
- m_fIsPainted=true;
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/KeywordDocument.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/KeywordDocument.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/KeywordDocument.java
deleted file mode 100644
index e8fae14..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/KeywordDocument.java
+++ /dev/null
@@ -1,568 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2009 Ingo Wassink of University of Twente, Netherlands and
- * The University of Manchester
- *
- * Modifications to the initial code base are copyright of their
- * respective authors, or their employers as appropriate.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-
-/**
- * @author Ingo Wassink
- * @author Ian Dunlop
- * @author Alan R Williams
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.Color;
-import java.util.Set;
-
-import javax.swing.text.AttributeSet;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.DefaultEditorKit;
-import javax.swing.text.DefaultStyledDocument;
-import javax.swing.text.Element;
-import javax.swing.text.MutableAttributeSet;
-import javax.swing.text.SimpleAttributeSet;
-import javax.swing.text.StyleConstants;
-
-import org.apache.log4j.Logger;
-
-public class KeywordDocument extends DefaultStyledDocument {
-
- private static Logger logger = Logger
- .getLogger(KeywordDocument.class);
-
- private DefaultStyledDocument doc;
- private Element rootElement;
-
- private boolean multiLineComment;
- private MutableAttributeSet normal;
- private MutableAttributeSet keyword;
- private MutableAttributeSet comment;
- private MutableAttributeSet quote;
- private MutableAttributeSet port;
-
- private Set<String> keywords;
-
- private Set<String> ports;
-
-
-
- public KeywordDocument(Set<String> keywords, Set<String> ports) {
- doc = this;
- rootElement = doc.getDefaultRootElement();
- putProperty(DefaultEditorKit.EndOfLineStringProperty, "\n");
-
- normal = new SimpleAttributeSet();
- StyleConstants.setForeground(normal, Color.black);
-
- comment = new SimpleAttributeSet();
- StyleConstants.setForeground(comment, new Color(0, 139, 69, 255));
- StyleConstants.setItalic(comment, true);
-
- keyword = new SimpleAttributeSet();
- StyleConstants.setForeground(keyword, Color.blue);
- StyleConstants.setBold(keyword, true);
-
-
- port = new SimpleAttributeSet();
- StyleConstants.setForeground(port, Color.magenta);
-
- quote = new SimpleAttributeSet();
- StyleConstants.setForeground(quote, Color.red);
-
- this.keywords = keywords;
- this.ports = ports;
- }
-
- /**
- * Method for adding an port
- * @param name the name of the port
- */
- public void addPort(String name){
- ports.add(name);
- updateText();
- }
-
- /**
- * Method for removing an port
- * @param name the name of the port
- */
- public void removePort(String name){
- ports.remove(name);
- updateText();
- }
-
- /**
- * Method for checking whether the name represents an input port
- * @param name the name of the port
- * @return true if true
- */
- private boolean isPort(String name){
- return ports.contains(name);
- }
-
-
- /**
- * Method for updating the whole text
- */
- private void updateText(){
- try{
- processChangedLines(0, getLength() );
- } catch(Exception e){
- logger.error("Unable to update text", e);
- }
- }
-
- /*
- * Override to apply syntax highlighting after the document has been updated
- */
- public void insertString(int offset, String str, AttributeSet a)
- throws BadLocationException {
- if (str.equals("{"))
- str = addMatchingBrace(offset);
-
- super.insertString(offset, str, a);
- processChangedLines(offset, str.length());
- }
-
- /*
- * Override to apply syntax highlighting after the document has been updated
- */
- public void remove(int offset, int length) throws BadLocationException {
- super.remove(offset, length);
- processChangedLines(offset, 0);
- }
-
- /*
- * Determine how many lines have been changed, then apply highlighting to
- * each line
- */
- public void processChangedLines(int offset, int length)
- throws BadLocationException {
- String content = doc.getText(0, doc.getLength());
-
- // The lines affected by the latest document update
-
- int startLine = rootElement.getElementIndex(offset);
- int endLine = rootElement.getElementIndex(offset + length);
-
- // Make sure all comment lines prior to the start line are commented
- // and determine if the start line is still in a multi line comment
-
- setMultiLineComment(commentLinesBefore(content, startLine));
-
- // Do the actual highlighting
-
- for (int i = startLine; i <= endLine; i++) {
- applyHighlighting(content, i);
- }
-
- // Resolve highlighting to the next end multi line delimiter
-
- if (isMultiLineComment())
- commentLinesAfter(content, endLine);
- else
- highlightLinesAfter(content, endLine);
- }
-
- /*
- * Highlight lines when a multi line comment is still 'open' (ie. matching
- * end delimiter has not yet been encountered)
- */
- private boolean commentLinesBefore(String content, int line) {
- int offset = rootElement.getElement(line).getStartOffset();
-
- // Start of comment not found, nothing to do
-
- int startDelimiter = lastIndexOf(content, getStartDelimiter(),
- offset - 2);
-
- if (startDelimiter < 0)
- return false;
-
- // Matching start/end of comment found, nothing to do
-
- int endDelimiter = indexOf(content, getEndDelimiter(), startDelimiter);
-
- if (endDelimiter < offset & endDelimiter != -1)
- return false;
-
- // End of comment not found, highlight the lines
-
- doc.setCharacterAttributes(startDelimiter, offset - startDelimiter + 1,
- comment, false);
- return true;
- }
-
- /*
- * Highlight comment lines to matching end delimiter
- */
- private void commentLinesAfter(String content, int line) {
- int offset = rootElement.getElement(line).getEndOffset();
-
- // End of comment not found, nothing to do
-
- int endDelimiter = indexOf(content, getEndDelimiter(), offset);
-
- if (endDelimiter < 0)
- return;
-
- // Matching start/end of comment found, comment the lines
-
- int startDelimiter = lastIndexOf(content, getStartDelimiter(),
- endDelimiter);
-
- if (startDelimiter < 0 || startDelimiter <= offset) {
- doc.setCharacterAttributes(offset, endDelimiter - offset + 1,
- comment, false);
- }
- }
-
- /*
- * Highlight lines to start or end delimiter
- */
- private void highlightLinesAfter(String content, int line)
- throws BadLocationException {
- int offset = rootElement.getElement(line).getEndOffset();
-
- // Start/End delimiter not found, nothing to do
-
- int startDelimiter = indexOf(content, getStartDelimiter(), offset);
- int endDelimiter = indexOf(content, getEndDelimiter(), offset);
-
- if (startDelimiter < 0)
- startDelimiter = content.length();
-
- if (endDelimiter < 0)
- endDelimiter = content.length();
-
- int delimiter = Math.min(startDelimiter, endDelimiter);
-
- if (delimiter < offset)
- return;
-
- // Start/End delimiter found, reapply highlighting
-
- int endLine = rootElement.getElementIndex(delimiter);
-
- for (int i = line + 1; i < endLine; i++) {
- Element branch = rootElement.getElement(i);
- Element leaf = doc.getCharacterElement(branch.getStartOffset());
- AttributeSet as = leaf.getAttributes();
-
- if (as.isEqual(comment))
- applyHighlighting(content, i);
- }
- }
-
- /*
- * Parse the line to determine the appropriate highlighting
- */
- private void applyHighlighting(String content, int line)
- throws BadLocationException {
- int startOffset = rootElement.getElement(line).getStartOffset();
- int endOffset = rootElement.getElement(line).getEndOffset() - 1;
-
- int lineLength = endOffset - startOffset;
- int contentLength = content.length();
-
- if (endOffset >= contentLength)
- endOffset = contentLength - 1;
-
- // check for multi line comments
- // (always set the comment attribute for the entire line)
-
- if (endingMultiLineComment(content, startOffset, endOffset)
- || isMultiLineComment()
- || startingMultiLineComment(content, startOffset, endOffset)) {
- doc.setCharacterAttributes(startOffset,
- endOffset - startOffset + 1, comment, false);
- return;
- }
-
- // set normal attributes for the line
-
- doc.setCharacterAttributes(startOffset, lineLength, normal, true);
-
- // check for single line comment
-
- int index = content.indexOf(getSingleLineDelimiter(), startOffset);
-
- if ((index > -1) && (index < endOffset)) {
- doc.setCharacterAttributes(index, endOffset - index + 1, comment,
- false);
- endOffset = index - 1;
- }
-
- // check for tokens
-
- checkForTokens(content, startOffset, endOffset);
- }
-
- /*
- * Does this line contain the start delimiter
- */
- private boolean startingMultiLineComment(String content, int startOffset,
- int endOffset) throws BadLocationException {
- int index = indexOf(content, getStartDelimiter(), startOffset);
-
- if ((index < 0) || (index > endOffset))
- return false;
- else {
- setMultiLineComment(true);
- return true;
- }
- }
-
- /*
- * Does this line contain the end delimiter
- */
- private boolean endingMultiLineComment(String content, int startOffset,
- int endOffset) throws BadLocationException {
- int index = indexOf(content, getEndDelimiter(), startOffset);
-
- if ((index < 0) || (index > endOffset))
- return false;
- else {
- setMultiLineComment(false);
- return true;
- }
- }
-
- /*
- * We have found a start delimiter and are still searching for the end
- * delimiter
- */
- private boolean isMultiLineComment() {
- return false;//multiLineComment;
- }
-
- private void setMultiLineComment(boolean value) {
- multiLineComment = value;
- }
-
- /*
- * Parse the line for tokens to highlight
- */
- private void checkForTokens(String content, int startOffset, int endOffset) {
- while (startOffset <= endOffset) {
- // skip the delimiters to find the start of a new token
-
- while (isDelimiter(content.substring(startOffset, startOffset + 1))) {
- if (startOffset < endOffset)
- startOffset++;
- else
- return;
- }
-
- // Extract and process the entire token
-
- if (isQuoteDelimiter(content
- .substring(startOffset, startOffset + 1)))
- startOffset = getQuoteToken(content, startOffset, endOffset);
- else
- startOffset = getOtherToken(content, startOffset, endOffset);
- }
- }
-
- /*
- *
- */
- private int getQuoteToken(String content, int startOffset, int endOffset) {
- String quoteDelimiter = content.substring(startOffset, startOffset + 1);
- String escapeString = getEscapeString(quoteDelimiter);
-
- int index;
- int endOfQuote = startOffset;
-
- // skip over the escape quotes in this quote
-
- index = content.indexOf(escapeString, endOfQuote + 1);
-
- while ((index > -1) && (index < endOffset)) {
- endOfQuote = index + 1;
- index = content.indexOf(escapeString, endOfQuote);
- }
-
- // now find the matching delimiter
-
- index = content.indexOf(quoteDelimiter, endOfQuote + 1);
-
- if ((index < 0) || (index > endOffset))
- endOfQuote = endOffset;
- else
- endOfQuote = index;
-
- doc.setCharacterAttributes(startOffset, endOfQuote - startOffset + 1,
- quote, false);
-
- return endOfQuote + 1;
- }
-
- /*
- *
- */
- private int getOtherToken(String content, int startOffset, int endOffset) {
- int endOfToken = startOffset + 1;
-
- while (endOfToken <= endOffset) {
- if (isDelimiter(content.substring(endOfToken, endOfToken + 1)))
- break;
-
- endOfToken++;
- }
-
- String token = content.substring(startOffset, endOfToken);
-
- if (isKeyword(token)) {
- doc.setCharacterAttributes(startOffset, endOfToken - startOffset,
- keyword, false);
- } else if(isPort(token)){
- doc.setCharacterAttributes(startOffset, endOfToken - startOffset,
- port, false);
- }
-
- return endOfToken + 1;
- }
-
- /*
- * Assume the needle will the found at the start/end of the line
- */
- private int indexOf(String content, String needle, int offset) {
- int index;
-
- while ((index = content.indexOf(needle, offset)) != -1) {
- String text = getLine(content, index).trim();
-
- if (text.startsWith(needle) || text.endsWith(needle))
- break;
- else
- offset = index + 1;
- }
-
- return index;
- }
-
- /*
- * Assume the needle will the found at the start/end of the line
- */
- private int lastIndexOf(String content, String needle, int offset) {
- int index;
-
- while ((index = content.lastIndexOf(needle, offset)) != -1) {
- String text = getLine(content, index).trim();
-
- if (text.startsWith(needle) || text.endsWith(needle))
- break;
- else
- offset = index - 1;
- }
-
- return index;
- }
-
- private String getLine(String content, int offset) {
- int line = rootElement.getElementIndex(offset);
- Element lineElement = rootElement.getElement(line);
- int start = lineElement.getStartOffset();
- int end = lineElement.getEndOffset();
- return content.substring(start, end - 1);
- }
-
- /*
- * Override for other languages
- */
- protected boolean isDelimiter(String character) {
- String operands = ";:{}()[]+-/%<=>!&|^~*,.";
-
- if (Character.isWhitespace(character.charAt(0))
- || operands.indexOf(character) != -1)
- return true;
- else
- return false;
- }
-
- /*
- * Override for other languages
- */
- protected boolean isQuoteDelimiter(String character) {
- String quoteDelimiters = "\"'";
-
- if (quoteDelimiters.indexOf(character) < 0)
- return false;
- else
- return true;
- }
-
- /*
- * Override for other languages
- */
- protected boolean isKeyword(String token) {
- return keywords.contains(token);
- }
-
- /*
- * Override for other languages
- */
- protected String getStartDelimiter() {
- return "/*";
- }
-
- /*
- * Override for other languages
- */
- protected String getEndDelimiter() {
- return "*/";
- }
-
- /*
- * Override for other languages
- */
- protected String getSingleLineDelimiter() {
- return "#";
- }
-
- /*
- * Override for other languages
- */
- protected String getEscapeString(String quoteDelimiter) {
- return "\\" + quoteDelimiter;
- }
-
- /*
- *
- */
- protected String addMatchingBrace(int offset) throws BadLocationException {
- StringBuffer whiteSpace = new StringBuffer();
- int line = rootElement.getElementIndex(offset);
- int i = rootElement.getElement(line).getStartOffset();
-
- while (true) {
- String temp = doc.getText(i, 1);
-
- if (temp.equals(" ") || temp.equals("\t")) {
- whiteSpace.append(temp);
- i++;
- } else
- break;
- }
-
- return "{\n" + whiteSpace.toString() + "\t\n" + whiteSpace.toString()
- + "}";
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/f676ef35/ui/src/main/java/net/sf/taverna/t2/lang/ui/LineEnabledTextPanel.java
----------------------------------------------------------------------
diff --git a/ui/src/main/java/net/sf/taverna/t2/lang/ui/LineEnabledTextPanel.java b/ui/src/main/java/net/sf/taverna/t2/lang/ui/LineEnabledTextPanel.java
deleted file mode 100644
index 389b9b3..0000000
--- a/ui/src/main/java/net/sf/taverna/t2/lang/ui/LineEnabledTextPanel.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- *
- */
-package net.sf.taverna.t2.lang.ui;
-
-import java.awt.BorderLayout;
-import java.awt.Event;
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-
-import javax.swing.AbstractAction;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.KeyStroke;
-import javax.swing.event.CaretEvent;
-import javax.swing.event.CaretListener;
-import javax.swing.text.Document;
-import javax.swing.text.Element;
-import javax.swing.text.JTextComponent;
-
-
-/**
- * @author alanrw
- *
- */
-public class LineEnabledTextPanel extends JPanel {
-
- private JTextComponent textComponent = null;
- private Document document;
- private GotoLineAction gotoLineAction = null;
-
- public LineEnabledTextPanel(final JTextComponent component) {
-
- this.setLayout(new BorderLayout());
- textComponent = component;
- updateDocument();
-
- JScrollPane scrollPane = new JScrollPane(textComponent );
- scrollPane.setPreferredSize(textComponent.getPreferredSize() );
-
- this.add(scrollPane, BorderLayout.CENTER);;
-
- final JLabel caretLabel = new JLabel("Line: 1 Column: 0");
-
- setCaretListener(new CaretListener() {
-
- public void caretUpdate(CaretEvent e) {
- int caretPosition = getCaretPosition();
- Element root = document.getRootElements()[0];
- int elementIndex = root.getElementIndex(caretPosition);
- int relativeOffset = caretPosition - root.getElement(elementIndex).getStartOffset();
- caretLabel.setText("Line: " + (elementIndex + 1) + " Column: " + relativeOffset);
-
- }});
- this.add(caretLabel, BorderLayout.SOUTH);
-
- KeyStroke gotoLineKeystroke = KeyStroke.getKeyStroke(KeyEvent.VK_L, Event.META_MASK);
-
- gotoLineAction = new GotoLineAction();
- textComponent.getInputMap().put(gotoLineKeystroke, "gotoLineKeystroke");
- textComponent.getActionMap().put("gotoLineKeystroke", gotoLineAction);
-
- }
-
- private void updateDocument() {
- document = ((JTextComponent) textComponent).getDocument();
- }
-
- private void setCaretListener(CaretListener listener) {
- ((JTextComponent) textComponent).addCaretListener(listener);
- }
-
- private int getCaretPosition() {
- return ((JTextComponent) textComponent).getCaretPosition();
- }
-
- private void setCaretPosition(int position) {
- ((JTextComponent) textComponent).setCaretPosition(position);
- textComponent.requestFocus();
- }
-
- class GotoLineAction extends AbstractAction
- {
-
- public GotoLineAction() {
- }
-
- public void actionPerformed(ActionEvent e) {
- String inputString = JOptionPane.showInputDialog(null, "Enter line number", "Line number", JOptionPane.QUESTION_MESSAGE);
- if (inputString != null) {
- try {
- int lineNumber = Integer.parseInt(inputString);
- Element root = document.getDefaultRootElement();
- lineNumber = Math.max(lineNumber, 1);
- lineNumber = Math.min(lineNumber, root.getElementCount());
- setCaretPosition( root.getElement( lineNumber - 1 ).getStartOffset() );
-
- } catch (NumberFormatException e1){
- // do nothing
- }
- }
- }
- }
-}