Index: javax/swing/JTree.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/JTree.java,v retrieving revision 1.51 diff -u -r1.51 JTree.java --- javax/swing/JTree.java 8 Nov 2005 20:59:05 -0000 1.51 +++ javax/swing/JTree.java 14 Nov 2005 20:33:35 -0000 @@ -2597,7 +2597,6 @@ { if (path == null) return; - TreePath parent = path.getParentPath(); doExpandParents(path, state); } Index: javax/swing/event/TreeModelEvent.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/event/TreeModelEvent.java,v retrieving revision 1.3 diff -u -r1.3 TreeModelEvent.java --- javax/swing/event/TreeModelEvent.java 2 Jul 2005 20:32:50 -0000 1.3 +++ javax/swing/event/TreeModelEvent.java 14 Nov 2005 20:33:35 -0000 @@ -55,12 +55,12 @@ /** * childIndices */ - protected int[] childIndices = new int[0]; + protected int[] childIndices = null; /** * children */ - protected Object[] children = new Object[0]; + protected Object[] children = null; /** * path @@ -164,7 +164,9 @@ * @returns String representation */ public String toString() { - return null; // TODO + return getClass() + " [Source: " + getSource() + ", TreePath: " + getTreePath() + + ", Child Indicies: " + getChildIndices() + ", Children: " + getChildren() + + ", Path: " + getPath() +"]"; } // toString() Index: javax/swing/plaf/basic/BasicTreeUI.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicTreeUI.java,v retrieving revision 1.109 diff -u -r1.109 BasicTreeUI.java --- javax/swing/plaf/basic/BasicTreeUI.java 8 Nov 2005 20:59:04 -0000 1.109 +++ javax/swing/plaf/basic/BasicTreeUI.java 14 Nov 2005 20:33:35 -0000 @@ -2870,8 +2866,11 @@ */ public void treeStructureChanged(TreeModelEvent e) { - validCachedPreferredSize = false; + if (e.getPath().length == 1 + && !e.getPath()[0].equals(treeModel.getRoot())) + tree.expandPath(new TreePath(treeModel.getRoot())); updateCurrentVisiblePath(); + validCachedPreferredSize = false; tree.revalidate(); tree.repaint(); } @@ -3330,8 +3329,10 @@ */ Object getParent(Object root, Object node) { - if (root == null || node == null) + if (root == null || node == null || + root.equals(node)) return null; + if (node instanceof TreeNode) return ((TreeNode) node).getParent(); return findNode(root, node); @@ -3348,21 +3349,23 @@ */ private Object findNode(Object root, Object node) { - int size = 0; - if (!treeModel.isLeaf(root)) - size = treeModel.getChildCount(root); - for (int i = 0; i < size; i++) - { - if (treeModel.getIndexOfChild(root, node) != -1) - return root; - - Object n = findNode(treeModel.getChild(root, i), node); - if (n != null) - return n; + if (!treeModel.isLeaf(root) && !root.equals(node)) + { + int size = treeModel.getChildCount(root); + for (int j = 0; j < size; j++) + { + Object child = treeModel.getChild(root, j); + if (node.equals(child)) + return root; + + Object n = findNode(child, node); + if (n != null) + return n; + } } return null; } - + /** * Get previous visible node in the tree. Package private for use in inner * classes. @@ -3832,6 +3835,7 @@ && tree.isExpanded(new TreePath(next)))) next = getNextNode(next); + Object root = next; TreePath current = null; while (next != null) { @@ -3842,13 +3846,28 @@ do { TreePath path = new TreePath(getPathToRoot(next, 0)); - if ((tree.isVisible(path) && tree.isExpanded(path)) || - treeModel.isLeaf(next)) + if ((tree.isVisible(path) && tree.isExpanded(path)) + || treeModel.isLeaf(next)) next = getNextNode(next); else - next = getNextSibling(next); + { + Object pNext = next; + next = getNextSibling(pNext); + // if no next sibling, check parent's next sibling. + if (next == null) + { + Object parent = getParent(root, pNext); + while (next == null && parent != null) + { + next = getNextSibling(parent); + if (next == null) + parent = getParent(treeModel.getRoot(), next); + } + } + } } - while (next != null && !tree.isVisible(new TreePath(getPathToRoot(next, 0)))); + while (next != null && + !tree.isVisible(new TreePath(getPathToRoot(next, 0)))); } currentVisiblePath = current;