Update of /cvsroot/babeldoc/babeldoc/modules/gui/src/com/babeldoc/gui/treetable
In directory sc8-pr-cvs1:/tmp/cvs-serv19450/com/babeldoc/gui/treetable
Modified Files:
AbstractTreeTableModel.java JTreeTable.java
TreeTableModel.java TreeTableModelAdapter.java
Log Message:
Lots of GUI loving! Been working on the pipeline builder tool
and getting into some shape. Now the pipeline stage configuration editing is looking a whole lot better.
Index: AbstractTreeTableModel.java
===================================================================
RCS file: /cvsroot/babeldoc/babeldoc/modules/gui/src/com/babeldoc/gui/treetable/AbstractTreeTableModel.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** AbstractTreeTableModel.java 12 Jun 2003 04:51:25 -0000 1.1
--- AbstractTreeTableModel.java 13 Sep 2003 15:33:11 -0000 1.2
***************
*** 1,4 ****
/*
! * @(#)AbstractTreeTableModel.java 1.2 98/10/27
*
* Copyright 1997, 1998 by Sun Microsystems, Inc.,
--- 1,6 ----
+ package com.babeldoc.gui.treetable;
+
/*
! * @(#)com.babeldoc.gui.treetable.AbstractTreeTableModel.java 1.2 98/10/27
*
* Copyright 1997, 1998 by Sun Microsystems, Inc.,
***************
*** 12,16 ****
* you entered into with Sun.
*/
- package com.babeldoc.gui.treetable;
import javax.swing.event.EventListenerList;
--- 14,17 ----
***************
*** 21,25 ****
/**
* @version 1.2 10/27/98
! * An abstract implementation of the TreeTableModel interface, handling the list
* of listeners.
* @author Philip Milne
--- 22,26 ----
/**
* @version 1.2 10/27/98
! * An abstract implementation of the com.babeldoc.gui.treetable.TreeTableModel interface, handling the list
* of listeners.
* @author Philip Milne
***************
*** 172,176 ****
//
! // Default impelmentations for methods in the TreeTableModel interface.
//
--- 173,177 ----
//
! // Default impelmentations for methods in the com.babeldoc.gui.treetable.TreeTableModel interface.
//
Index: JTreeTable.java
===================================================================
RCS file: /cvsroot/babeldoc/babeldoc/modules/gui/src/com/babeldoc/gui/treetable/JTreeTable.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** JTreeTable.java 12 Jun 2003 04:51:25 -0000 1.1
--- JTreeTable.java 13 Sep 2003 15:33:11 -0000 1.2
***************
*** 2,71 ****
/*
! * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
! *
! * Redistribution and use in source and binary forms, with or
! * without modification, are permitted provided that the following
! * conditions are met:
! *
! * - Redistributions of source code must retain the above copyright
! * notice, this list of conditions and the following disclaimer.
! *
! * - Redistribution in binary form must reproduce the above
! * copyright notice, this list of conditions and the following
! * disclaimer in the documentation and/or other materials
! * provided with the distribution.
! *
! * Neither the name of Sun Microsystems, Inc. or the names of
! * contributors may be used to endorse or promote products derived
! * from this software without specific prior written permission.
*
! * This software is provided "AS IS," without a warranty of any
! * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
! * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
! * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
! * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY
! * DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT OF OR
! * RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE OR
! * ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE
! * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT,
! * SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
! * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF
! * THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS
! * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
! * You acknowledge that this software is not designed, licensed or
! * intended for use in the design, construction, operation or
! * maintenance of any nuclear facility.
*/
- import com.babeldoc.gui.treetable.TreeTableModel;
- import com.babeldoc.gui.treetable.TreeTableModelAdapter;
-
import javax.swing.*;
- import javax.swing.border.Border;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableCellRenderer;
import javax.swing.tree.*;
import java.awt.*;
- import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.util.EventObject;
public class JTreeTable extends JTable {
/** A subclass of JTree. */
protected TreeTableCellRenderer tree;
-
public JTreeTable(TreeTableModel treeTableModel) {
super();
! // Creates the tree. It will be used as a renderer and editor.
tree = new TreeTableCellRenderer(treeTableModel);
! // Installs a tableModel representing the visible rows in the tree.
super.setModel(new TreeTableModelAdapter(treeTableModel, tree));
! // Forces the JTable and JTree to share their row selection models.
ListToTreeSelectionModelWrapper selectionWrapper = new
ListToTreeSelectionModelWrapper();
--- 2,52 ----
/*
! * @(#)com.babeldoc.gui.treetable.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.
*/
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
+ import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.util.EventObject;
+ /**
+ * This example shows how to create a simple com.babeldoc.gui.treetable.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
+ */
public class JTreeTable extends JTable {
/** A subclass of JTree. */
protected TreeTableCellRenderer tree;
public JTreeTable(TreeTableModel treeTableModel) {
super();
! // Create the tree. It will be used as a renderer and editor.
tree = new TreeTableCellRenderer(treeTableModel);
! // Install a tableModel representing the visible rows in the tree.
super.setModel(new TreeTableModelAdapter(treeTableModel, tree));
! // Force the JTable and JTree to share their row selection models.
ListToTreeSelectionModelWrapper selectionWrapper = new
ListToTreeSelectionModelWrapper();
***************
*** 73,77 ****
setSelectionModel(selectionWrapper.getListSelectionModel());
! // Installs the tree editor renderer and editor.
setDefaultRenderer(TreeTableModel.class, tree);
setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor());
--- 54,58 ----
setSelectionModel(selectionWrapper.getListSelectionModel());
! // Install the tree editor renderer and editor.
setDefaultRenderer(TreeTableModel.class, tree);
setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor());
***************
*** 87,97 ****
if (tree.getRowHeight() < 1) {
// Metal looks better like this.
! setRowHeight(20);
}
}
/**
* 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.
*/
--- 68,79 ----
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 hieachy it will
* never receive this unless we forward it in this manner.
*/
***************
*** 100,107 ****
if (tree != null) {
tree.updateUI();
- // Do this so that the editor is referencing the current renderer
- // from the tree. The renderer can potentially change each time
- // laf changes.
- setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor());
}
// Use the tree's default foreground and background colors in the
--- 82,85 ----
***************
*** 111,118 ****
}
! /**
! * Workaround for BasicTableUI anomaly. Make sure the UI never tries to
! * resize the editor. The UI currently uses different techniques to
! * paint the renderers and editors; 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.
--- 89,95 ----
}
! /* 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.
***************
*** 124,154 ****
/**
- * 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.
*/
--- 101,104 ----
***************
*** 168,185 ****
/**
- * 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.
*/
--- 118,121 ----
***************
*** 188,194 ****
/** Last table/tree row asked to renderer. */
protected int visibleRow;
- /** Border to draw around the tree, if this is non-null, it will
- * be painted. */
- protected Border highlightBorder;
public TreeTableCellRenderer(TreeModel model) {
--- 124,127 ----
***************
*** 246,255 ****
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());
- }
}
--- 179,182 ----
***************
*** 262,304 ****
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) {
! highlightBorder = UIManager.getBorder
! ("Table.focusCellHighlightBorder");
! if (isCellEditable(row, column)) {
! background = UIManager.getColor
! ("Table.focusCellBackground");
! foreground = UIManager.getColor
! ("Table.focusCellForeground");
! }
! }
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;
}
--- 189,198 ----
boolean hasFocus,
int row, int column) {
! if (isSelected)
! setBackground(table.getSelectionBackground());
! else
! setBackground(table.getBackground());
visibleRow = row;
return this;
}
***************
*** 307,425 ****
/**
! * An editor that can be used to edit the tree column. This extends
! * DefaultCellEditor and uses a JTextField (actually, TreeTableTextField)
! * to perform the actual editing.
! * <p>To support editing of the tree column we can not make the tree
! * editable. The reason this doesn't work is that you can not use
! * the same component for editing and renderering. The table may have
! * the need to paint cells, while a cell is being edited. If the same
! * component were used for the rendering and editing the component would
! * be moved around, and the contents would change. When editing, this
! * is undesirable, the contents of the text field must stay the same,
! * including the caret blinking, and selections persisting. For this
! * reason the editing is done via a TableCellEditor.
! * <p>Another interesting thing to be aware of is how tree positions
! * its render and editor. The render/editor is responsible for drawing the
! * icon indicating the type of node (leaf, branch...). The tree is
! * responsible for drawing any other indicators, perhaps an additional
! * +/- sign, or lines connecting the various nodes. So, the renderer
! * is positioned based on depth. On the other hand, table always makes
! * its editor fill the contents of the cell. To get the allusion
! * that the table cell editor is part of the tree, we don't want the
! * table cell editor to fill the cell bounds. We want it to be placed
! * in the same manner as tree places it editor, and have table message
! * the tree to paint any decorations the tree wants. Then, we would
! * only have to worry about the editing part. The approach taken
! * here is to determine where tree would place the editor, and to override
! * the <code>reshape</code> method in the JTextField component to
! * nudge the textfield to the location tree would place it. Since
! * JTreeTable will paint the tree behind the editor everything should
! * just work. So, that is what we are doing here. Determining of
! * the icon position will only work if the TreeCellRenderer is
! * an instance of DefaultTreeCellRenderer. If you need custom
! * TreeCellRenderers, that don't descend from DefaultTreeCellRenderer,
! * and you want to support editing in JTreeTable, you will have
! * to do something similiar.
*/
! public class TreeTableCellEditor extends DefaultCellEditor {
! public TreeTableCellEditor() {
! super(new TreeTableTextField());
! }
!
! /**
! * Overridden to determine an offset that tree would place the
! * editor at. The offset is determined from the
! * <code>getRowBounds</code> JTree method, and additionally
! * from the icon DefaultTreeCellRenderer will use.
! * <p>The offset is then set on the TreeTableTextField component
! * created in the constructor, and returned.
! */
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();
! Icon icon;
! 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) {
! MouseEvent me = (MouseEvent) e;
! // If the modifiers are not 0 (or the left mouse button),
! // tree may try and toggle the selection, and table
! // will then try and toggle, resulting in the
! // selection remaining the same. To avoid this, we
! // only dispatch when the modifiers are 0 (or the left mouse
! // button).
! if (me.getModifiers() == 0 ||
! me.getModifiers() == InputEvent.BUTTON1_MASK) {
! for (int counter = getColumnCount() - 1; counter >= 0;
! counter--) {
! if (getColumnClass(counter) == TreeTableModel.class) {
! MouseEvent newME = new MouseEvent
! (JTreeTable.this.tree, me.getID(),
! me.getWhen(), me.getModifiers(),
! me.getX() - getCellRect(0, counter, true).x,
! me.getY(), me.getClickCount(),
! me.isPopupTrigger());
! JTreeTable.this.tree.dispatchEvent(newME);
! break;
! }
}
}
- if (me.getClickCount() >= 3) {
- return true;
- }
- return false;
- }
- if (e == null) {
- return true;
}
return false;
--- 201,249 ----
/**
! * TreeTableCellEditor implementation. Component returned is the
! * JTree.
*/
! public class TreeTableCellEditor extends AbstractCellEditor implements
! TableCellEditor {
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int r, int c) {
! return tree;
}
/**
! * Overridden to return false, and if the event is a mouse event
! * it is forwarded to the tree.<p>
! * The behavior for this is debatable, and should really be offered
! * as a property. By returning false, all keyboard actions are
! * implemented in terms of the table. By returning true, the
! * tree would get a chance to do something with the keyboard
! * events. For the most part this is ok. But for certain keys,
! * such as left/right, the tree will expand/collapse where as
! * the table focus should really move to a different column. Page
! * up/down should also be implemented in terms of the table.
! * By returning false this also has the added benefit that clicking
! * outside of the bounds of the tree node, but still in the tree
! * column will select the row, whereas if this returned true
! * that wouldn't be the case.
! * <p>By returning false we are also enforcing the policy that
! * the tree will never be editable (at least by a key sequence).
*/
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());
! tree.dispatchEvent(newME);
! break;
}
}
}
return false;
***************
*** 429,447 ****
/**
- * 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>.
- */
- static class TreeTableTextField extends JTextField {
- public int offset;
-
- public void reshape(int x, int y, int w, int h) {
- int newX = Math.max(x, offset);
- super.reshape(newX, y, w - (newX - x), h);
- }
- }
-
-
- /**
* ListToTreeSelectionModelWrapper extends DefaultTreeSelectionModel
* to listen for changes in the ListSelectionModel it maintains. Once
--- 253,256 ----
***************
*** 540,543 ****
}
}
-
-
--- 349,350 ----
Index: TreeTableModel.java
===================================================================
RCS file: /cvsroot/babeldoc/babeldoc/modules/gui/src/com/babeldoc/gui/treetable/TreeTableModel.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** TreeTableModel.java 12 Jun 2003 04:51:25 -0000 1.1
--- TreeTableModel.java 13 Sep 2003 15:33:11 -0000 1.2
***************
*** 1,4 ****
/*
! * TreeTableModel.java
*
* Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
--- 1,6 ----
+ package com.babeldoc.gui.treetable;
+
/*
! * com.babeldoc.gui.treetable.TreeTableModel.java
*
* Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
***************
*** 18,31 ****
*
*/
- package com.babeldoc.gui.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.
*
--- 20,32 ----
*
*/
import javax.swing.tree.TreeModel;
/**
! * com.babeldoc.gui.treetable.TreeTableModel is the model used by a com.babeldoc.gui.treetable.JTreeTable. It extends TreeModel
* to add methods for getting inforamtion about the set of columns each
! * node in the com.babeldoc.gui.treetable.TreeTableModel may have. Each column, like a column in
* a TableModel, has a name and a type associated with it. Each node in
! * the com.babeldoc.gui.treetable.TreeTableModel can return a value for each of the columns and
* set that value if isCellEditable() returns true.
*
Index: TreeTableModelAdapter.java
===================================================================
RCS file: /cvsroot/babeldoc/babeldoc/modules/gui/src/com/babeldoc/gui/treetable/TreeTableModelAdapter.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** TreeTableModelAdapter.java 12 Jun 2003 04:51:25 -0000 1.1
--- TreeTableModelAdapter.java 13 Sep 2003 15:33:11 -0000 1.2
***************
*** 1,4 ****
/*
! * @(#)TreeTableModelAdapter.java 1.2 98/10/27
*
* Copyright 1997, 1998 by Sun Microsystems, Inc.,
--- 1,6 ----
+ package com.babeldoc.gui.treetable;
+
/*
! * @(#)com.babeldoc.gui.treetable.TreeTableModelAdapter.java 1.2 98/10/27
*
* Copyright 1997, 1998 by Sun Microsystems, Inc.,
***************
*** 13,18 ****
*/
- package com.babeldoc.gui.treetable;
-
import javax.swing.*;
import javax.swing.event.TreeExpansionEvent;
--- 15,18 ----
***************
*** 24,28 ****
/**
! * 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:
--- 24,28 ----
/**
! * This is a wrapper class takes a com.babeldoc.gui.treetable.TreeTableModel and implements
* the table model interface. The implementation is trivial, with
* all of the event dispatching support provided by the superclass:
***************
*** 95,99 ****
}
! public Object nodeForRow(int row) {
TreePath treePath = tree.getPathForRow(row);
return treePath.getLastPathComponent();
--- 95,99 ----
}
! protected Object nodeForRow(int row) {
TreePath treePath = tree.getPathForRow(row);
return treePath.getLastPathComponent();
|