Surely, RI shows that the tree scrolls only in one direction, down.
Roman Kennke wrote:
This fixes unit-scrolling and implements block scrolling for JTree. It also fixes a minor glitch in VariableHeightLayoutCache.2006-08-13 Roman Kennke <[EMAIL PROTECTED]> * javax/swing/JTree.java (getScrollableUnitIncrement): Fixed direction. (getScrollableBlockIncrement): Implemented to scroll one page. * javax/swing/tree/VariableHeightLayoutCache.java (distance): Consider y + height already outside the node. /Roman ------------------------------------------------------------------------ Index: javax/swing/JTree.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/JTree.java,v retrieving revision 1.72 diff -u -1 -2 -r1.72 JTree.java --- javax/swing/JTree.java 9 Aug 2006 16:22:49 -0000 1.72 +++ javax/swing/JTree.java 13 Aug 2006 20:33:17 -0000 @@ -1675,47 +1675,70 @@* * @param visibleRect the currently visible part of the component.* @param orientation the scrolling orientation * @param direction the scrolling direction (negative - up, positive -down). * The values greater than one means that more mouse wheel or similar * events were generated, and hence it is better to scroll the longer * distance. * @author Audrius Meskauskas ([EMAIL PROTECTED]) */ public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { - int delta; + int delta = 0;// Round so that the top would start from the row boundaryif (orientation == SwingConstants.VERTICAL) { - // One pixel down, otherwise picks another row too high. - int row = getClosestRowForLocation(visibleRect.x, visibleRect.y + 1); - row = row + direction; - if (row < 0) - row = 0; - - Rectangle newTop = getRowBounds(row); - delta = newTop.y - visibleRect.y; + int row = getClosestRowForLocation(0, visibleRect.y); + if (row != -1) + { + Rectangle b = getRowBounds(row); + if (b.y != visibleRect.y) + { + if (direction < 0) + delta = Math.max(0, visibleRect.y - b.y); + else + delta = b.y + b.height - visibleRect.height; + } + else + { + if (direction < 0) + { + if (row != 0) + { + b = getRowBounds(row - 1); + delta = b.height; + } + } + else + delta = b.height; + } + } } else - delta = direction * rowHeight == 0 ? 20 : rowHeight; + // The RI always returns 4 for HORIZONTAL scrolling. + delta = 4; return delta; }public int getScrollableBlockIncrement(Rectangle visibleRect,int orientation, int direction) { - return getScrollableUnitIncrement(visibleRect, orientation, direction); + int block; + if (orientation == SwingConstants.VERTICAL) + block = visibleRect.height; + else + block = visibleRect.width; + return block; }public boolean getScrollableTracksViewportHeight(){ if (getParent() instanceof JViewport) return ((JViewport) getParent()).getHeight() > getPreferredSize().height; return false; }public boolean getScrollableTracksViewportWidth(){ if (getParent() instanceof JViewport) Index: javax/swing/tree/VariableHeightLayoutCache.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/tree/VariableHeightLayoutCache.java,v retrieving revision 1.16 diff -u -1 -2 -r1.16 VariableHeightLayoutCache.java --- javax/swing/tree/VariableHeightLayoutCache.java 7 Jun 2006 14:36:03 -0000 1.16 +++ javax/swing/tree/VariableHeightLayoutCache.java 13 Aug 2006 20:33:17 -0000 @@ -442,26 +442,26 @@ else return best.getPath();} /*** Get the closest distance from this point till the given rectangle. Only * vertical distance is taken into consideration. */ int distance(Rectangle r, int x, int y) { if (y < r.y) return r.y - y; - else if (y > r.y + r.height) - return y - (r.y + r.height); + else if (y > r.y + r.height - 1) + return y - (r.y + r.height - 1); else return 0; }/*** Get the number of the visible childs for the given tree path. If the node * is not expanded, 0 is returned. Otherwise, the number of children is * obtained from the model as the number of children for the last path * component.* * @param path the tree path* @return int the number of the visible childs (for row).
