Index: javax/swing/JTree.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/JTree.java,v retrieving revision 1.40 diff -u -r1.40 JTree.java --- javax/swing/JTree.java 16 Sep 2005 20:11:17 -0000 1.40 +++ javax/swing/JTree.java 19 Sep 2005 15:34:00 -0000 @@ -111,7 +111,11 @@ private JTree tree; private TreePath tp; private Accessible acc; - private AccessibleStateSet states = new AccessibleStateSet(); + private AccessibleStateSet states; + private Vector selectionList; + private Vector actionList; + private TreeModel mod; + private Cursor cursor; /** * Constructs an AccessibleJTreeNode @@ -122,20 +126,54 @@ */ public AccessibleJTreeNode(JTree t, TreePath p, Accessible ap) { + states = new AccessibleStateSet(); + selectionList = new Vector(); + actionList = new Vector(); + mod = tree.getModel(); + cursor = JTree.this.getCursor(); + tree = t; tp = p; acc = ap; + + // Add all the children of this path that may already be + // selected to the selection list. + TreePath[] selected = tree.getSelectionPaths(); + for (int i = 0; i < selected.length; i++) + { + TreePath sel = selected[i]; + if ((sel.getParentPath()).equals(tp)) + selectionList.add(sel); + } + + // Add all the actions available for a node to + // the action list. + actionList.add("EXPAND"); + actionList.add("COLLAPSE"); + actionList.add("EDIT"); + actionList.add("SELECT"); + actionList.add("DESELECT"); } /** * Adds the specified selected item in the object to the object's * selection. * - * @param i - the i-th element in the TreePath to add to the selection + * @param i - the i-th child of this node. */ public void addAccessibleSelection(int i) { - // FIXME: not implemented properly. + if (mod != null) + { + Object child = mod.getChild(tp.getLastPathComponent(), i); + if (child != null) + { + if (!states.contains(AccessibleState.MULTISELECTABLE)) + clearAccessibleSelection(); + selectionList.add(child); + tree.addSelectionPath(tp.pathByAddingChild(child)); + } + } } /** @@ -165,7 +203,7 @@ */ public void clearAccessibleSelection() { - // Nothing to do here. + selectionList.clear(); } /** @@ -189,8 +227,22 @@ */ public boolean doAccessibleAction(int i) { - // FIXME: Not implemented fully. - return false; + if (i >= actionList.size() || i < 0) + return false; + + if (actionList.get(i).equals("EXPAND")) + tree.expandPath(tp); + else if (actionList.get(i).equals("COLLAPSE")) + tree.collapsePath(tp); + else if (actionList.get(i).equals("SELECT")) + tree.addSelectionPath(tp); + else if (actionList.get(i).equals("DESELECT")) + tree.removeSelectionPath(tp); + else if (actionList.get(i).equals("EDIT")) + tree.startEditingAtPath(tp); + else + return false; + return true; } /** @@ -200,8 +252,7 @@ */ public AccessibleAction getAccessibleAction() { - // FIXME: Not implemented fully. - return super.getAccessibleAction(); + return this; } /** @@ -211,8 +262,7 @@ */ public int getAccessibleActionCount() { - // FIXME: Not implemented fully. - return 0; + return actionList.size(); } /** @@ -223,6 +273,8 @@ */ public String getAccessibleActionDescription(int i) { + if (i < 0 || i >= actionList.size()) + return (actionList.get(i)).toString(); return super.getAccessibleDescription(); } @@ -249,7 +301,6 @@ */ public Accessible getAccessibleChild(int i) { - TreeModel mod = tree.getModel(); if (mod != null) { Object child = mod.getChild(tp.getLastPathComponent(), i); @@ -280,7 +331,7 @@ */ public AccessibleComponent getAccessibleComponent() { - return super.getAccessibleComponent(); + return this; } /** @@ -357,8 +408,7 @@ */ public AccessibleSelection getAccessibleSelection() { - // FIXME: Not implemented fully. - return super.getAccessibleSelection(); + return this; } /** @@ -369,10 +419,10 @@ */ public Accessible getAccessibleSelection(int i) { - // FIXME: Not implemented properly. - return new AccessibleJTreeNode(tree, tree. - getSelectionModel(). - getSelectionPaths()[i], acc); + if (i > 0 && i < getAccessibleSelectionCount()) + return new AccessibleJTreeNode(tree, + tp.pathByAddingChild(selectionList.get(i)), acc); + return null; } /** @@ -382,7 +432,7 @@ */ public int getAccessibleSelectionCount() { - return AccessibleJTree.this.getAccessibleSelectionCount(); + return selectionList.size(); } /** @@ -392,7 +442,6 @@ */ public AccessibleStateSet getAccessibleStateSet() { - TreeModel mod = tree.getModel(); if (isVisible()) states.add(AccessibleState.VISIBLE); if (tree.isCollapsed(tp)) @@ -469,8 +518,7 @@ */ public Cursor getCursor() { - // FIXME: Not implemented fully. - return null; + return cursor; } /** @@ -568,9 +616,10 @@ */ public boolean isAccessibleChildSelected(int i) { - TreeModel mod = tree.getModel(); Object child = mod.getChild(tp.getLastPathComponent(), i); - return tree.isPathSelected(tp.pathByAddingChild(child)); + if (child != null) + return tree.isPathSelected(tp.pathByAddingChild(child)); + return false; } /** @@ -622,12 +671,20 @@ */ public void removeAccessibleSelection(int i) { - // FIXME: Not implemented properly. - TreePath[] elements = tree.getSelectionPaths(); - Object[] newElements = new Object[i]; - for (int j = 0; j < i; j++) - newElements[j] = elements[j]; - tree.removeSelectionPath(new TreePath(newElements)); + if (mod != null) + { + Object child = mod.getChild(tp.getLastPathComponent(), i); + if (child != null) + { + if (!states.contains(AccessibleState.MULTISELECTABLE)) + clearAccessibleSelection(); + if (selectionList.contains(child)) + { + selectionList.remove(child); + tree.removeSelectionPath(tp.pathByAddingChild(child)); + } + } + } } /** @@ -665,7 +722,24 @@ */ public void selectAllAccessibleSelection() { - // FIXME: Not implemented fully. + Object parent = tp.getLastPathComponent(); + if (mod != null) + { + for (int i = 0; i < mod.getChildCount(parent); i++) + { + Object child = mod.getChild(parent, i); + if (child != null) + { + if (!states.contains(AccessibleState.MULTISELECTABLE)) + clearAccessibleSelection(); + if (selectionList.contains(child)) + { + selectionList.add(child); + tree.addSelectionPath(tp.pathByAddingChild(child)); + } + } + } + } } /** @@ -715,7 +789,7 @@ */ public void setCursor(Cursor c) { - // FIXME: Not implemented fully. + cursor = c; } /** @@ -784,7 +858,7 @@ */ public AccessibleJTree() { - // FIXME: Not implemented fully. + // Nothing to do here. } /** @@ -822,7 +896,9 @@ */ public Accessible getAccessibleAt(Point p) { - // FIXME: Not implemented fully. + TreePath tp = getClosestPathForLocation(p.x, p.y); + if (tp != null) + return new AccessibleJTreeNode(JTree.this, tp, null); return null; } @@ -873,11 +949,14 @@ /** * Get the AccessibleSelection associated with this object. * - * @param the accessible selection of the tree + * @return the accessible selection of the tree */ public AccessibleSelection getAccessibleSelection() { - // FIXME: Not implemented fully. + TreeModel mod = getModel(); + if (mod != null) + return (new AccessibleJTreeNode(JTree.this, + new TreePath(mod.getRoot()), null)).getAccessibleSelection(); return null; } @@ -888,7 +967,10 @@ */ public Accessible getAccessibleSelection(int i) { - // FIXME: Not implemented fully. + TreeModel mod = getModel(); + if (mod != null) + return (new AccessibleJTreeNode(JTree.this, + new TreePath(mod.getRoot()), null)).getAccessibleSelection(i); return null; } Index: javax/swing/plaf/basic/BasicTreeUI.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicTreeUI.java,v retrieving revision 1.78 diff -u -r1.78 BasicTreeUI.java --- javax/swing/plaf/basic/BasicTreeUI.java 14 Sep 2005 20:25:13 -0000 1.78 +++ javax/swing/plaf/basic/BasicTreeUI.java 19 Sep 2005 15:34:00 -0000 @@ -3519,22 +3519,24 @@ { if (path != null) { - if (tree.getSelectionModel().getSelectionMode() == TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION) + if (tree.getSelectionModel().getSelectionMode() == + TreeSelectionModel.SINGLE_TREE_SELECTION) { + tree.getSelectionModel().clearSelection(); tree.addSelectionPath(path); tree.setLeadSelectionPath(path); } - else if (tree.getSelectionModel().getSelectionMode() == TreeSelectionModel.CONTIGUOUS_TREE_SELECTION) + else if (tree.getSelectionModel().getSelectionMode() == + TreeSelectionModel.CONTIGUOUS_TREE_SELECTION) { // TODO } else { - tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); - - tree.getSelectionModel().clearSelection(); tree.addSelectionPath(path); tree.setLeadSelectionPath(path); + tree.getSelectionModel().setSelectionMode + (TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); } } }