This fixes BasicTreeUI.getPathBounds() to also consider the tree's
insets, plus it adds a bunch of null checks for safety (all of this
stuff is public API and can thus be overridden to return null, so...).

2007-04-03  Roman Kennke  <[EMAIL PROTECTED]>

        * javax/swing/plaf/basic/BasicTreeUI.java
        (getPathBounds): Consider the tree's insets. Added a bunch of
        null checks.

/Roman

-- 
http://kennke.org/blog/
Index: javax/swing/plaf/basic/BasicTreeUI.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicTreeUI.java,v
retrieving revision 1.156
diff -u -1 -5 -r1.156 BasicTreeUI.java
--- javax/swing/plaf/basic/BasicTreeUI.java	10 Dec 2006 20:25:48 -0000	1.156
+++ javax/swing/plaf/basic/BasicTreeUI.java	3 Apr 2007 20:40:32 -0000
@@ -104,31 +104,31 @@
 import javax.swing.tree.TreeNode;
 import javax.swing.tree.TreePath;
 import javax.swing.tree.TreeSelectionModel;
 import javax.swing.tree.VariableHeightLayoutCache;
 
 /**
  * A delegate providing the user interface for <code>JTree</code> according to
  * the Basic look and feel.
  * 
  * @see javax.swing.JTree
  * @author Lillian Angel ([EMAIL PROTECTED])
  * @author Sascha Brawer ([EMAIL PROTECTED])
  * @author Audrius Meskauskas ([EMAIL PROTECTED])
  */
 public class BasicTreeUI
-    extends TreeUI
+  extends TreeUI
 {
   /**
    * The tree cell editing may be started by the single mouse click on the
    * selected cell. To separate it from the double mouse click, the editing
    * session starts after this time (in ms) after that single click, and only no
    * other clicks were performed during that time.
    */
   static int WAIT_TILL_EDITING = 900;
 
   /** Collapse Icon for the tree. */
   protected transient Icon collapsedIcon;
 
   /** Expanded Icon for the tree. */
   protected transient Icon expandedIcon;
 
@@ -644,31 +644,42 @@
     return treeSelectionModel;
   }
 
   /**
    * Returns the Rectangle enclosing the label portion that the last item in
    * path will be drawn to. Will return null if any component in path is
    * currently valid.
    * 
    * @param tree is the current tree the path will be drawn to.
    * @param path is the current path the tree to draw to.
    * @return the Rectangle enclosing the label portion that the last item in the
    *         path will be drawn to.
    */
   public Rectangle getPathBounds(JTree tree, TreePath path)
   {
-    return treeState.getBounds(path, new Rectangle());
+    Rectangle bounds = null;
+    if (tree != null && treeState != null)
+      {
+        bounds = treeState.getBounds(path, null);
+        Insets i = tree.getInsets();
+        if (bounds != null && i != null)
+          {
+            bounds.x += i.left;
+            bounds.y += i.top;
+          }
+      }
+    return bounds;
   }
 
   /**
    * Returns the max height of all the nodes in the tree.
    * 
    * @param tree - the current tree
    * @return the max height.
    */
   int getMaxHeight(JTree tree)
   {
     if (maxHeight != 0)
       return maxHeight;
 
     Icon e = UIManager.getIcon("Tree.openIcon");
     Icon c = UIManager.getIcon("Tree.closedIcon");
@@ -1549,31 +1560,30 @@
     int rows = treeState.getRowCount();
     
     if (rows == 0)
       // There is nothing to do if the tree is empty.
       return;
 
     Rectangle clip = g.getClipBounds();
 
     Insets insets = tree.getInsets();
 
     if (clip != null && treeModel != null)
       {
         int startIndex = tree.getClosestRowForLocation(clip.x, clip.y);
         int endIndex = tree.getClosestRowForLocation(clip.x + clip.width,
                                                      clip.y + clip.height);
-
         // Also paint dashes to the invisible nodes below.
         // These should be painted first, otherwise they may cover
         // the control icons.
         if (endIndex < rows)
           for (int i = endIndex + 1; i < rows; i++)
             {
               TreePath path = treeState.getPathForRow(i);
               if (isLastChild(path))
                 paintVerticalPartOfLeg(g, clip, insets, path);
             }
 
         // The two loops are required to ensure that the lines are not
         // painted over the other tree components.
 
         int n = endIndex - startIndex + 1;

Reply via email to