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