[kaffe] CVS kaffe (robilad): Resynced with gnu classpath: swing, awt and xslt fixes

Kaffe CVS cvs-commits at kaffe.org
Wed Jul 6 19:26:16 PDT 2005


PatchSet 6712 
Date: 2005/07/07 02:18:56
Author: robilad
Branch: HEAD
Tag: (none) 
Log:
Resynced with gnu classpath: swing, awt and xslt fixes

Members: 
	ChangeLog:1.4236->1.4237 
	libraries/javalib/gnu/xml/transform/StreamSerializer.java:1.7->1.8 
	libraries/javalib/gnu/xml/xpath/EqualityExpr.java:1.5->1.6 
	libraries/javalib/javax/swing/AbstractButton.java:1.17->1.18 
	libraries/javalib/javax/swing/JTree.java:1.20->1.21 
	libraries/javalib/javax/swing/plaf/basic/BasicBorders.java:1.3->1.4 
	libraries/javalib/javax/swing/plaf/basic/BasicTreeUI.java:1.6->1.7 
	libraries/javalib/javax/swing/tree/DefaultTreeCellRenderer.java:1.6->1.7 
	libraries/javalib/javax/swing/tree/DefaultTreeSelectionModel.java:1.12->1.13 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4236 kaffe/ChangeLog:1.4237
--- kaffe/ChangeLog:1.4236	Thu Jul  7 00:40:11 2005
+++ kaffe/ChangeLog	Thu Jul  7 02:18:56 2005
@@ -1,5 +1,63 @@
 2005-07-07  Dalibor Topic  <robilad at kaffe.org>
 
+	Resynced with GNU classpath.
+
+	2005-07-06  David Gilbert  <david.gilbert at object-refinery.com>
+
+        * javax/swing/plaf/basic/BasicBorders.java: fixed API docs all over.
+
+	2005-07-06  Chris Burdess  <dog at gnu.org>
+
+        * gnu/xml/transform/StreamSerializer.java,
+        gnu/xml/xpath/EqualityExpr.java: XSLT conformance fixes.
+
+	2005-07-06  Lillian Angel  <langel at redhat.com>
+
+        * javax/swing/plaf/basic/BasicTreeUI.java
+        (getPathForRow): took out redundant code.
+
+	2005-07-06  Lillian Angel  <langel at redhat.com>
+
+        * javax/swing/plaf/basic/BasicTreeUI.java
+        (getNextVisibleNode): Implemented
+        (getPathForRow): Fixed so the next node retrieved is visible.
+
+	2005-07-06  Lillian Angel  <langel at redhat.com>
+
+        * javax/swing/JTree.java
+        Initialized the Hashtable.
+        (addSelectionPath): removed redundant code.
+        (doExpandParents): added in line so that state is
+        changed for current path. Changed while loop to if
+        statement, an infinite loop was occurring.
+        * javax/swing/plaf/basic/BasicTreeUI.java
+        (getPathForRow): Implemented to work with visibility.
+        (isLeaf): Implemented
+        (mouseClicked): add in check for expand/collapse.
+        Selection for DISCONTIGUOUS tree selection is
+        implemented.
+        (treeExpanded): called repaint, so the tree updates
+        visually when something is expanded.
+        (treeCollapse): Similar to treeExpanded.
+        (paintLeaf): changed to paint leaf only when visible.
+        (paintNonLeaf): paints only when visible.
+        (paintRecursive): lines for tree are only painted when
+        needed. checked for visibility of current object and
+        parent.
+        * javax/swing/tree/DefaultTreeCellRenderer.java
+        (getTreeCellRendererComponent): setting icons when
+        expanded.
+        * javax/swing/tree/DefaultTreeSelectionModel.java
+        (clearSelection): set leadPath to null because selection
+        should be completely reset.
+
+	2005-07-06  Roman Kennke  <roman at kennke.org>
+
+        * javax/swing/AbstractButton.java
+        (setContentAreaFilled): Set the opaque property here.
+
+2005-07-07  Dalibor Topic  <robilad at kaffe.org>
+
 	* FAQ/FAQ.classlibrary-compile: Updated URL for jikes.
 
 	Reported by:  Ito Kazumitsu  <kaz at maczuka.gcd.org>
Index: kaffe/libraries/javalib/gnu/xml/transform/StreamSerializer.java
diff -u kaffe/libraries/javalib/gnu/xml/transform/StreamSerializer.java:1.7 kaffe/libraries/javalib/gnu/xml/transform/StreamSerializer.java:1.8
--- kaffe/libraries/javalib/gnu/xml/transform/StreamSerializer.java:1.7	Mon Jul  4 00:05:57 2005
+++ kaffe/libraries/javalib/gnu/xml/transform/StreamSerializer.java	Thu Jul  7 02:19:01 2005
@@ -627,15 +627,30 @@
         text = buf.toString();
       }
     ByteBuffer encoded = encoder.encode(CharBuffer.wrap(text));
+    int len = encoded.limit() - encoded.position();
     if (encoded.hasArray())
       {
-        return encoded.array();
+        byte[] ret = encoded.array();
+        if (ret.length > len)
+          {
+            // Why?
+            byte[] ret2 = new byte[len];
+            System.arraycopy(ret, 0, ret2, 0, len);
+            ret = ret2;
+          }
+        return ret;
       }
     encoded.flip();
-    int len = encoded.limit() - encoded.position();
     byte[] ret = new byte[len];
     encoded.get(ret, 0, len);
     return ret;
+  }
+
+  String hex(byte[] b) {
+    StringBuffer buf = new StringBuffer();
+    for (int i = 0; i < b.length; i++)
+      buf.append(Integer.toHexString(b[i])).append(' ');
+    return buf.toString();
   }
 
   String encode(String text, boolean encodeCtl, boolean inAttr)
Index: kaffe/libraries/javalib/gnu/xml/xpath/EqualityExpr.java
diff -u kaffe/libraries/javalib/gnu/xml/xpath/EqualityExpr.java:1.5 kaffe/libraries/javalib/gnu/xml/xpath/EqualityExpr.java:1.6
--- kaffe/libraries/javalib/gnu/xml/xpath/EqualityExpr.java:1.5	Mon Jul  4 00:05:59 2005
+++ kaffe/libraries/javalib/gnu/xml/xpath/EqualityExpr.java	Thu Jul  7 02:19:01 2005
@@ -91,6 +91,10 @@
       {
         Collection lns = (Collection) left;
         Collection rns = (Collection) right;
+        if (lns.isEmpty())
+          {
+            return false;
+          }
         boolean all = true;
         for (Iterator i = lns.iterator(); i.hasNext(); )
           {
@@ -119,7 +123,7 @@
                   }
               }
           }
-        return false;
+        return all;
       }
     /* 
      * If one object to be compared is a node-set and the other is a number,
Index: kaffe/libraries/javalib/javax/swing/AbstractButton.java
diff -u kaffe/libraries/javalib/javax/swing/AbstractButton.java:1.17 kaffe/libraries/javalib/javax/swing/AbstractButton.java:1.18
--- kaffe/libraries/javalib/javax/swing/AbstractButton.java:1.17	Mon Jul  4 00:08:07 2005
+++ kaffe/libraries/javalib/javax/swing/AbstractButton.java	Thu Jul  7 02:19:02 2005
@@ -1881,8 +1881,9 @@
     boolean old = contentAreaFilled;
     contentAreaFilled = b;
     firePropertyChange(CONTENT_AREA_FILLED_CHANGED_PROPERTY, old, b);
-    revalidate();
-    repaint();
+    // The JDK sets the opaque property to the value of the contentAreaFilled
+    // property, so should we do.
+    setOpaque(b);
    }
 
   /**
Index: kaffe/libraries/javalib/javax/swing/JTree.java
diff -u kaffe/libraries/javalib/javax/swing/JTree.java:1.20 kaffe/libraries/javalib/javax/swing/JTree.java:1.21
--- kaffe/libraries/javalib/javax/swing/JTree.java:1.20	Wed Jul  6 02:01:15 2005
+++ kaffe/libraries/javalib/javax/swing/JTree.java	Thu Jul  7 02:19:02 2005
@@ -273,7 +273,7 @@
 	 * TreePath of a note to to its state. Valid states are EXPANDED and
 	 * COLLAPSED. Nodes not in this Hashtable are assumed state COLLAPSED.
 	 */
-	private Hashtable nodeStates;
+	private Hashtable nodeStates = new Hashtable();
 	protected transient TreeCellEditor cellEditor;
 	protected transient TreeCellRenderer cellRenderer;
 	protected boolean editable;
@@ -1079,13 +1079,6 @@
 
 		if (path != null)
 			selectionModel.addSelectionPath(path);
-		else
-		{
-			selectionModel.clearSelection();
-			// need to repaint because cant fire an event with 
-			// null selection.
-			repaint();
-		}
 	}
 
 	public void addSelectionRows(int[] rows)
@@ -1299,7 +1292,7 @@
 		// Don't expand if last path component is a leaf node.
 		if ((path == null) || (treeModel.isLeaf(path.getLastPathComponent())))
 			return;
-
+		
 		setExpandedState(path, true);
 	}
 
@@ -1519,9 +1512,12 @@
 	private void doExpandParents(TreePath path, boolean state)
 	{
 		TreePath parent = path.getParentPath();
-
+		
 		if (isExpanded(parent))
+		{
+			nodeStates.put(path, state ? EXPANDED : COLLAPSED);
 			return;
+		}
 
 		if (parent != null)
 			doExpandParents(parent, false);
@@ -1538,9 +1534,10 @@
 
 		try
 		{
-			while (parent != null)
+			if (parent != null)
 				checkExpandParents(parent);
-		} catch (ExpandVetoException e)
+		} 
+		catch (ExpandVetoException e)
 		{
 			// Expansion vetoed.
 			return;
Index: kaffe/libraries/javalib/javax/swing/plaf/basic/BasicBorders.java
diff -u kaffe/libraries/javalib/javax/swing/plaf/basic/BasicBorders.java:1.3 kaffe/libraries/javalib/javax/swing/plaf/basic/BasicBorders.java:1.4
--- kaffe/libraries/javalib/javax/swing/plaf/basic/BasicBorders.java:1.3	Mon Jul  4 00:08:33 2005
+++ kaffe/libraries/javalib/javax/swing/plaf/basic/BasicBorders.java	Thu Jul  7 02:19:02 2005
@@ -1,5 +1,5 @@
 /* BasicBorders.java --
-   Copyright (C) 2003, 2004  Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -89,9 +89,9 @@
    * height="170" alt="[A screen shot of the returned border]" />
    *
    * @return a {@link
-   *         javax.swing.plaf.BorderUIResource#CompoundBorderUIResource}
-   *         whose outer border is a {@link #ButtonBorder} and whose
-   *         inner border is a {@link #MarginBorder}.
+   *         javax.swing.plaf.BorderUIResource.CompoundBorderUIResource}
+   *         whose outer border is a {@link ButtonBorder} and whose
+   *         inner border is a {@link MarginBorder}.
    */
   public static Border getButtonBorder()
   {
@@ -139,9 +139,9 @@
    * height="135" alt="[A screen shot of the returned border]" />
    *
    * @return a {@link
-   *         javax.swing.plaf.BorderUIResource#CompoundBorderUIResource}
-   *         whose outer border is a {@link #RadioButtonBorder} and whose
-   *         inner border is a {@link #MarginBorder}.
+   *         javax.swing.plaf.BorderUIResource.CompoundBorderUIResource}
+   *         whose outer border is a {@link RadioButtonBorder} and whose
+   *         inner border is a {@link MarginBorder}.
    */
   public static Border getRadioButtonBorder()
   {
@@ -191,9 +191,9 @@
    * height="135" alt="[A screen shot of the returned border]" />
    *
    * @return a {@link
-   *         javax.swing.plaf.BorderUIResource#CompoundBorderUIResource}
-   *         whose outer border is a {@link #ToggleButtonBorder} and whose
-   *         inner border is a {@link #MarginBorder}.
+   *         javax.swing.plaf.BorderUIResource.CompoundBorderUIResource}
+   *         whose outer border is a {@link ToggleButtonBorder} and whose
+   *         inner border is a {@link MarginBorder}.
    */
   public static Border getToggleButtonBorder()
   {
@@ -241,7 +241,7 @@
    * <p><img src="doc-files/BasicBorders.MenuBarBorder-1.png" width="500"
    * height="140" alt="[A screen shot of a JMenuBar with this border]" />
    *
-   * @return a {@link #MenuBarBorder}.
+   * @return a {@link MenuBarBorder}.
    *
    * @see javax.swing.JMenuBar
    */
@@ -272,7 +272,7 @@
    * <p><img src="doc-files/BasicBorders.SplitPaneBorder-2.png" width="520"
    * height="200" alt="[A screen shot for JSplitPane.VERTICAL_SPLIT]" />
    *
-   * @return a {@link #SplitPaneBorder}.
+   * @return a {@link SplitPaneBorder}.
    *
    * @see javax.swing.JSplitPane
    * @see #getSplitPaneDividerBorder()
@@ -339,8 +339,7 @@
    * height="200" alt="[A screen shot of a border returned by
    * this method]" />
    *
-   * @return an instance of
-   * {@link javax.swing.plaf.basic.BasicBorders$FieldBorder}.
+   * @return an instance of {@link FieldBorder}.
    *
    * @see javax.swing.JTextField
    * @see javax.swing.text.JTextComponent
@@ -592,7 +591,7 @@
      *
      * @return the same object that was passed for <code>insets</code>.
      *
-     * @see #getBorderInsets()
+     * @see #getBorderInsets(Component)
      */
     public Insets getBorderInsets(Component c, Insets insets)
     {
@@ -756,7 +755,7 @@
      *
      * @return the same object that was passed for <code>insets</code>.
      *
-     * @see #getBorderInsets()
+     * @see #getBorderInsets(Component)
      */
     public Insets getBorderInsets(Component c, Insets insets)
     {
@@ -1020,7 +1019,7 @@
      *
      * @return the same object that was passed for <code>insets</code>.
      *
-     * @see #getBorderInsets()
+     * @see #getBorderInsets(Component)
      */
     public Insets getBorderInsets(Component c, Insets insets)
     {
@@ -1176,7 +1175,7 @@
      *
      * @return the same object that was passed for <code>insets</code>.
      *
-     * @see #getBorderInsets()
+     * @see #getBorderInsets(Component)
      */
     public Insets getBorderInsets(Component c, Insets insets)
     {
@@ -1230,7 +1229,7 @@
      * Paints the border around a rollover button.  If <code>c</code>
      * is not an {@link javax.swing.AbstractButton} whose model
      * returns <code>true</code> for {@link
-     * javax.swing.ButtonModel#isRollver}, nothing gets painted at
+     * javax.swing.ButtonModel#isRollover}, nothing gets painted at
      * all.
      *
      * @param c the button whose border is to be painted.
@@ -1309,8 +1308,8 @@
    * appearance of the Sun reference implementation. A bug report has
    * been filed with Sun (review ID 188774).
    *
-   * @see {@link #getSplitPaneBorder()}
-   * @see {@link #getSplitPaneDividerBorder()}
+   * @see #getSplitPaneBorder()
+   * @see #getSplitPaneDividerBorder()
    *
    * @author Sascha Brawer (brawer at dandelis.ch)
    */
@@ -1797,7 +1796,7 @@
      *
      * @return the same object that was passed for <code>insets</code>.
      *
-     * @see #getBorderInsets()
+     * @see #getBorderInsets(Component)
      */
     public Insets getBorderInsets(Component c, Insets insets)
     {
Index: kaffe/libraries/javalib/javax/swing/plaf/basic/BasicTreeUI.java
diff -u kaffe/libraries/javalib/javax/swing/plaf/basic/BasicTreeUI.java:1.6 kaffe/libraries/javalib/javax/swing/plaf/basic/BasicTreeUI.java:1.7
--- kaffe/libraries/javalib/javax/swing/plaf/basic/BasicTreeUI.java:1.6	Wed Jul  6 02:01:15 2005
+++ kaffe/libraries/javalib/javax/swing/plaf/basic/BasicTreeUI.java	Thu Jul  7 02:19:02 2005
@@ -597,19 +597,53 @@
 	 */
 	public TreePath getPathForRow(JTree tree, int row)
 	{
-		// FIXME: check visibility when expand/collapse is implemented
-		DefaultMutableTreeNode pathForRow = ((DefaultMutableTreeNode) (tree
+		DefaultMutableTreeNode node = ((DefaultMutableTreeNode) (tree
 				.getModel()).getRoot());
+		
 		for (int i = 0; i < row; i++)
-		{
-			if (pathForRow != null)
-				pathForRow = pathForRow.getNextNode();
-		}
-		if (pathForRow == null)
+			node = getNextVisibleNode(node);
+		
+		// in case nothing was found
+		if (node == null)
 			return null;
-		return new TreePath(pathForRow.getPath());
+		
+		// something was found
+		return new TreePath(node.getPath());
+			
 	}
 
+	/** 
+	 * Get next visible node in the tree.
+	 * 
+	 * @param the current node
+	 * @return the next visible node in the JTree. Return null if there
+	 * are no more.
+	 */
+	private DefaultMutableTreeNode getNextVisibleNode(DefaultMutableTreeNode node)
+	{
+		DefaultMutableTreeNode next = null;
+		TreePath current = null;
+		
+		if (node != null)
+			next = node.getNextNode();
+		
+		if (next != null)
+		{
+			current = new TreePath(next.getPath());
+			if (tree.isVisible(current))
+				return next;
+	
+			while (next != null && !tree.isVisible(current))
+			{
+				next = next.getNextNode();
+				
+				if (next != null)
+					current = new TreePath(next.getPath());
+			}
+		}
+		return next;
+	}
+	
 	/**
 	 * Returns the row that the last item identified in path is visible at. Will
 	 * return -1 if any of the elments in the path are not currently visible.
@@ -636,6 +670,7 @@
 	 */
 	public int getRowCount(JTree tree)
 	{
+		// FIXME: check visibility
 		return treeState.getRowCount();
 	}
 
@@ -1446,8 +1481,16 @@
 	 */
 	protected boolean isLeaf(int row)
 	{
-		return false;
-		// FIXME: not implemented
+		TreePath pathForRow = getPathForRow(tree, row);
+		if (pathForRow == null)
+			return true;
+		
+		Object node = pathForRow.getLastPathComponent();
+		
+		if (node instanceof TreeNode)
+			return ((TreeNode) node).isLeaf();
+		else
+			return true;
 	}
 
 	/* * INTERNAL CLASSES * */
@@ -1726,30 +1769,50 @@
 		{
 			Point click = e.getPoint();
 			int row = ((int) click.getY() / getRowHeight()) - 1;
-			
-			if (BasicTreeUI.this.tree.isRowSelected(row))
-				BasicTreeUI.this.tree.removeSelectionRow(row);
-			else if (BasicTreeUI.this.tree.getSelectionModel()
-					.getSelectionMode() == 
-						treeSelectionModel.SINGLE_TREE_SELECTION)
+			TreePath path = BasicTreeUI.this.tree.getPathForRow(row);
+
+			if (path == null)
 			{
-				// clear selection, since only able to select one row at a time.
+				// nothing should be selected if user clicks outside of tree
 				BasicTreeUI.this.tree.getSelectionModel().clearSelection();
-				BasicTreeUI.this.tree.addSelectionRow(row);
-			}
-			else if (BasicTreeUI.this.tree.getSelectionModel()
-					.getSelectionMode() == 
-						treeSelectionModel.CONTIGUOUS_TREE_SELECTION)
-			{
-				//TODO
+				BasicTreeUI.this.tree.repaint();
 			}
-			else
+			
+			if (BasicTreeUI.this.tree.isVisible(path))
 			{
-				BasicTreeUI.this.tree.getSelectionModel()
-				.setSelectionMode(
-						treeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
-				BasicTreeUI.this.tree.addSelectionRow(row);
-			}
+				if (BasicTreeUI.this.tree.isExpanded(path))
+				{
+					BasicTreeUI.this.tree.collapsePath(path);
+					BasicTreeUI.this.tree.fireTreeCollapsed(path);
+				}
+				else
+				{
+					BasicTreeUI.this.tree.expandPath(path);
+					BasicTreeUI.this.tree.fireTreeExpanded(path);
+				}
+				
+				if (BasicTreeUI.this.tree.isRowSelected(row))
+					BasicTreeUI.this.tree.removeSelectionRow(row);
+				else if (BasicTreeUI.this.tree.getSelectionModel()
+						.getSelectionMode() == treeSelectionModel
+						.SINGLE_TREE_SELECTION)
+				{
+					BasicTreeUI.this.tree.getSelectionModel().clearSelection();
+					BasicTreeUI.this.tree.addSelectionRow(row);
+				} 
+				else if (BasicTreeUI.this.tree.getSelectionModel()
+						.getSelectionMode() == treeSelectionModel
+						.CONTIGUOUS_TREE_SELECTION)
+				{
+					// TODO
+				} 
+				else
+				{
+					BasicTreeUI.this.tree.getSelectionModel().setSelectionMode(
+							treeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
+					BasicTreeUI.this.tree.addSelectionRow(row);
+				}
+			}		
 		}
 
 		/**
@@ -1969,6 +2032,7 @@
 		 */
 		public void treeExpanded(TreeExpansionEvent event)
 		{
+			BasicTreeUI.this.tree.repaint();
 		}
 
 		/**
@@ -1978,6 +2042,7 @@
 		 */
 		public void treeCollapsed(TreeExpansionEvent event)
 		{
+			BasicTreeUI.this.tree.repaint();
 		}
 	}// TreeExpansionHandler
 
@@ -2274,7 +2339,7 @@
 	} // TreeTraverseAction
 
 	/* * HELPER METHODS FOR PAINTING * */
-
+	
 	/**
 	 * Returns the cell bounds for painting selected cells
 	 * 
@@ -2293,7 +2358,7 @@
 		return new Rectangle(x, y, SwingUtilities.computeStringWidth(fm, s), fm
 				.getHeight());
 	}
-
+	
 	/**
 	 * Paints a leaf in the tree
 	 * 
@@ -2305,25 +2370,29 @@
 	 */
 	private void paintLeaf(Graphics g, int x, int y, JTree tree, Object leaf)
 	{
-		TreePath tp = new TreePath(((DefaultMutableTreeNode) leaf).getPath());
-		boolean selected = tree.isPathSelected(tp);
+		TreePath curr = new TreePath(((DefaultMutableTreeNode) leaf)
+				.getPath());
+		boolean selected = tree.isPathSelected(curr);
 
-		if (selected)
-		{
-			Component comp = tree.getCellRenderer()
-					.getTreeCellRendererComponent(tree, leaf, true, false,
-							true, 0, false);
-			rendererPane.paintComponent(g, comp, tree, getCellBounds(x, y, leaf));
-		}
-		else
-		{
-			Component c = tree.getCellRenderer().getTreeCellRendererComponent(tree,
-					leaf, false, false, true, 0, false);
-			
-			g.translate(x, y);
-			c.paint(g);
-			g.translate(-x, -y);
-		}
+		if (tree.isVisible(curr))
+			if (selected)
+			{
+				Component comp = tree.getCellRenderer()
+						.getTreeCellRendererComponent(tree, leaf, true, false,
+								true, 0, false);
+				rendererPane.paintComponent(g, comp, tree, 
+						getCellBounds(x, y, leaf));
+			}
+			else
+			{
+				Component c = tree.getCellRenderer()
+				.getTreeCellRendererComponent(tree,
+						leaf, false, false, true, 0, false);
+				
+				g.translate(x, y);
+				c.paint(g);
+				g.translate(-x, -y);
+			}
 	}
 
 	/**
@@ -2337,26 +2406,31 @@
 	 */
 	private void paintNonLeaf(Graphics g, int x, int y, JTree tree,
 			Object nonLeaf)
-	{
-		TreePath tp = new TreePath(((DefaultMutableTreeNode) nonLeaf).getPath());
-		boolean selected = tree.isPathSelected(tp);
-
-		if (selected)
-		{
-			Component comp = tree.getCellRenderer()
-					.getTreeCellRendererComponent(tree, nonLeaf, true, false,
-							true, 0, false);
-			rendererPane.paintComponent(g, comp, tree, getCellBounds(x, y, nonLeaf));
-		}
-		else
-		{
-			Component c = tree.getCellRenderer().getTreeCellRendererComponent(tree,
-					nonLeaf, false, false, false, 0, false);
-			
-			g.translate(x, y);
-			c.paint(g);
-			g.translate(-x, -y);
-		}
+	{	
+		TreePath curr = new TreePath(((DefaultMutableTreeNode) nonLeaf)
+								.getPath());
+		boolean selected = tree.isPathSelected(curr);
+		boolean expanded = tree.isExpanded(curr);
+		
+		if (tree.isVisible(curr))
+			if (selected)
+			{
+				Component comp = tree.getCellRenderer()
+						.getTreeCellRendererComponent(tree, nonLeaf, true, 
+								expanded, false, 0, false);
+				rendererPane.paintComponent(g, comp, tree, 
+						getCellBounds(x, y, nonLeaf));
+			}
+			else
+			{
+				Component c = tree.getCellRenderer()
+						.getTreeCellRendererComponent(tree,
+								nonLeaf, false, expanded, false, 0, false);
+				
+				g.translate(x, y);
+				c.paint(g);
+				g.translate(-x, -y);
+			}
 	}
 
 	/**
@@ -2389,7 +2463,8 @@
 		{
 			paintLeaf(g, indentation, descent, tree, curr);
 			descent += getRowHeight();
-		} else
+		} 
+		else
 		{
 			if (depth > 0 || tree.isRootVisible())
 			{
@@ -2398,25 +2473,30 @@
 				y0 += halfHeight;
 			}
 			int max = mod.getChildCount(curr);
-			for (int i = 0; i < max; ++i)
-			{
-				g.setColor(getHashColor());
-				g.drawLine(indentation + halfWidth, descent + halfHeight,
-						indentation + rightChildIndent, descent + halfHeight);
-				descent = paintRecursive(g, indentation + rightChildIndent,
-						descent, i, depth + 1, tree, mod, mod.getChild(curr, i));
-			}
+			if (tree.isExpanded(new TreePath(((DefaultMutableTreeNode) curr)
+														.getPath())))
+				for (int i = 0; i < max; ++i)
+				{
+					g.setColor(getHashColor());
+					g.drawLine(indentation + halfWidth, descent + halfHeight,
+							indentation + rightChildIndent, 
+							descent + halfHeight);
+					descent = paintRecursive(g, indentation + rightChildIndent,
+							descent, i, depth + 1, tree, mod, 
+							mod.getChild(curr, i));
+				}
 		}
 
 		int y1 = descent - halfHeight;
-		if (y0 != y1)
-		{
-			g.setColor(getHashColor());
-			g
-					.drawLine(indentation + halfWidth, y0, indentation
-							+ halfWidth, y1);
-		}
-
+		
+		if (tree.isExpanded(new TreePath(((DefaultMutableTreeNode) curr)
+																.getPath())))
+			if (y0 != y1)
+			{
+				g.setColor(getHashColor());
+				g.drawLine(indentation + halfWidth, y0, indentation
+								+ halfWidth, y1);
+			}
 		return descent;
 	}
 
Index: kaffe/libraries/javalib/javax/swing/tree/DefaultTreeCellRenderer.java
diff -u kaffe/libraries/javalib/javax/swing/tree/DefaultTreeCellRenderer.java:1.6 kaffe/libraries/javalib/javax/swing/tree/DefaultTreeCellRenderer.java:1.7
--- kaffe/libraries/javalib/javax/swing/tree/DefaultTreeCellRenderer.java:1.6	Wed Jul  6 02:01:16 2005
+++ kaffe/libraries/javalib/javax/swing/tree/DefaultTreeCellRenderer.java	Thu Jul  7 02:19:02 2005
@@ -380,13 +380,6 @@
 		this.selected = selected;
 		this.hasFocus = hasFocus;
 
-		if (leaf)
-			setLeafIcon(getLeafIcon());
-		else if (expanded)
-			setOpenIcon(getOpenIcon());
-		else
-			setClosedIcon(getClosedIcon());
-
 		setText(val.toString());
 		setHorizontalAlignment(LEFT);
 		setOpaque(true);
@@ -394,17 +387,23 @@
 		setEnabled(true);
 		setFont(getFont());
 
+		if (leaf)
+			setIcon(getLeafIcon());
+		else if (expanded)
+			setIcon(getOpenIcon());
+		else
+			setIcon(getClosedIcon());
+
 		if (selected) 
 		{
 			super.setBackground(getBackgroundSelectionColor());
-			super.setForeground(getTextSelectionColor());
+			setForeground(getTextSelectionColor());
 		}
 		else
 		{
 			super.setBackground((tree.getParent()).getBackground());
-			super.setForeground(getTextNonSelectionColor());
-		}
-		
+			setForeground(getTextNonSelectionColor());
+		}		
 		
 		return this;
 	}
Index: kaffe/libraries/javalib/javax/swing/tree/DefaultTreeSelectionModel.java
diff -u kaffe/libraries/javalib/javax/swing/tree/DefaultTreeSelectionModel.java:1.12 kaffe/libraries/javalib/javax/swing/tree/DefaultTreeSelectionModel.java:1.13
--- kaffe/libraries/javalib/javax/swing/tree/DefaultTreeSelectionModel.java:1.12	Wed Jul  6 02:01:16 2005
+++ kaffe/libraries/javalib/javax/swing/tree/DefaultTreeSelectionModel.java	Thu Jul  7 02:19:02 2005
@@ -466,6 +466,7 @@
 	 */
 	public void clearSelection()
 	{
+		leadPath = null;
 		selection = null;
 	}
 



More information about the kaffe mailing list