1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski import com.sun.star.accessibility.*; 23*b1cdbd2cSJim Jagielski import com.sun.star.lang.XServiceInfo; 24*b1cdbd2cSJim Jagielski import com.sun.star.lang.IndexOutOfBoundsException; 25*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime; 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski import java.util.Vector; 28*b1cdbd2cSJim Jagielski import java.awt.*; 29*b1cdbd2cSJim Jagielski import java.awt.event.*; 30*b1cdbd2cSJim Jagielski import javax.swing.*; 31*b1cdbd2cSJim Jagielski import javax.swing.tree.*; 32*b1cdbd2cSJim Jagielski import javax.swing.event.*; 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski /** This is the tree component that is responsible for displaying the 37*b1cdbd2cSJim Jagielski contents of the tree model on the screen. 38*b1cdbd2cSJim Jagielski */ 39*b1cdbd2cSJim Jagielski public class AccessibilityTree 40*b1cdbd2cSJim Jagielski implements TreeExpansionListener, TreeWillExpandListener 41*b1cdbd2cSJim Jagielski { 42*b1cdbd2cSJim Jagielski /** Create a new accessibility tree. Use the specified message display 43*b1cdbd2cSJim Jagielski for displaying messages and the specified canvas to draw the 44*b1cdbd2cSJim Jagielski graphical representations of accessible objects on. 45*b1cdbd2cSJim Jagielski */ AccessibilityTree()46*b1cdbd2cSJim Jagielski public AccessibilityTree () 47*b1cdbd2cSJim Jagielski { 48*b1cdbd2cSJim Jagielski maTree = new JTree (); 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski AccessibilityTreeModel aModel = 51*b1cdbd2cSJim Jagielski new AccessibilityTreeModel ( 52*b1cdbd2cSJim Jagielski new StringNode ("Please press Update button", null)); 53*b1cdbd2cSJim Jagielski maTree.setModel (aModel); 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski maCellRenderer = new AccessibleTreeCellRenderer(); 56*b1cdbd2cSJim Jagielski // setCellRenderer (maCellRenderer); 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski // allow editing of XAccessibleText interfaces 59*b1cdbd2cSJim Jagielski // setEditable (true); 60*b1cdbd2cSJim Jagielski // maTreeModel.addTreeModelListener( new TextUpdateListener() ); 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim Jagielski maTree.addMouseListener (new MouseListener (this)); 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski // Listen to expansions and collapses to change the mouse cursor. 65*b1cdbd2cSJim Jagielski mnExpandLevel = 0; 66*b1cdbd2cSJim Jagielski maTree.addTreeWillExpandListener (this); 67*b1cdbd2cSJim Jagielski maTree.addTreeExpansionListener (this); 68*b1cdbd2cSJim Jagielski } 69*b1cdbd2cSJim Jagielski getComponent()70*b1cdbd2cSJim Jagielski public JTree getComponent () 71*b1cdbd2cSJim Jagielski { 72*b1cdbd2cSJim Jagielski return maTree; 73*b1cdbd2cSJim Jagielski } 74*b1cdbd2cSJim Jagielski 75*b1cdbd2cSJim Jagielski // Change cursor during expansions to show the user that this is a 76*b1cdbd2cSJim Jagielski // lengthy operation. treeWillExpand(TreeExpansionEvent e)77*b1cdbd2cSJim Jagielski public void treeWillExpand (TreeExpansionEvent e) 78*b1cdbd2cSJim Jagielski { 79*b1cdbd2cSJim Jagielski if (mnExpandLevel == 0) 80*b1cdbd2cSJim Jagielski { 81*b1cdbd2cSJim Jagielski maTree.setCursor (new Cursor (Cursor.WAIT_CURSOR)); 82*b1cdbd2cSJim Jagielski } 83*b1cdbd2cSJim Jagielski mnExpandLevel += 1; 84*b1cdbd2cSJim Jagielski } treeWillCollapse(TreeExpansionEvent e)85*b1cdbd2cSJim Jagielski public void treeWillCollapse (TreeExpansionEvent e) 86*b1cdbd2cSJim Jagielski { 87*b1cdbd2cSJim Jagielski if (mnExpandLevel == 0) 88*b1cdbd2cSJim Jagielski { 89*b1cdbd2cSJim Jagielski maTree.setCursor (new Cursor (Cursor.WAIT_CURSOR)); 90*b1cdbd2cSJim Jagielski } 91*b1cdbd2cSJim Jagielski mnExpandLevel += 1; 92*b1cdbd2cSJim Jagielski } treeExpanded(TreeExpansionEvent e)93*b1cdbd2cSJim Jagielski public void treeExpanded (TreeExpansionEvent e) 94*b1cdbd2cSJim Jagielski { 95*b1cdbd2cSJim Jagielski mnExpandLevel -= 1; 96*b1cdbd2cSJim Jagielski if (mnExpandLevel == 0) 97*b1cdbd2cSJim Jagielski { 98*b1cdbd2cSJim Jagielski maTree.setCursor (new Cursor (Cursor.DEFAULT_CURSOR)); 99*b1cdbd2cSJim Jagielski } 100*b1cdbd2cSJim Jagielski } treeCollapsed(TreeExpansionEvent e)101*b1cdbd2cSJim Jagielski public void treeCollapsed (TreeExpansionEvent e) 102*b1cdbd2cSJim Jagielski { 103*b1cdbd2cSJim Jagielski mnExpandLevel -= 1; 104*b1cdbd2cSJim Jagielski if (mnExpandLevel == 0) 105*b1cdbd2cSJim Jagielski { 106*b1cdbd2cSJim Jagielski maTree.setCursor (new Cursor (Cursor.DEFAULT_CURSOR)); 107*b1cdbd2cSJim Jagielski } 108*b1cdbd2cSJim Jagielski } 109*b1cdbd2cSJim Jagielski 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski SetCanvas(Canvas aCanvas)112*b1cdbd2cSJim Jagielski public void SetCanvas (Canvas aCanvas) 113*b1cdbd2cSJim Jagielski { 114*b1cdbd2cSJim Jagielski maCanvas = aCanvas; 115*b1cdbd2cSJim Jagielski ((AccessibilityTreeModel)maTree.getModel()).setCanvas (maCanvas); 116*b1cdbd2cSJim Jagielski } 117*b1cdbd2cSJim Jagielski 118*b1cdbd2cSJim Jagielski /** Expand the nodes in the subtree rooted in aNode according to the the 119*b1cdbd2cSJim Jagielski specified expander. The tree is locked during the expansion. 120*b1cdbd2cSJim Jagielski */ expandTree(AccessibleTreeNode aNode, Expander aExpander)121*b1cdbd2cSJim Jagielski protected void expandTree (AccessibleTreeNode aNode, Expander aExpander) 122*b1cdbd2cSJim Jagielski { 123*b1cdbd2cSJim Jagielski if (mnExpandLevel == 0) 124*b1cdbd2cSJim Jagielski { 125*b1cdbd2cSJim Jagielski maTree.setEnabled (false); 126*b1cdbd2cSJim Jagielski } 127*b1cdbd2cSJim Jagielski mnExpandLevel += 1; 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski ((AccessibilityTreeModel)maTree.getModel()).lock (); 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski try 132*b1cdbd2cSJim Jagielski { 133*b1cdbd2cSJim Jagielski expandTree (new TreePath (aNode.createPath()), aExpander); 134*b1cdbd2cSJim Jagielski } 135*b1cdbd2cSJim Jagielski catch (Exception e) 136*b1cdbd2cSJim Jagielski { 137*b1cdbd2cSJim Jagielski // Ignore 138*b1cdbd2cSJim Jagielski } 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski mnExpandLevel -= 1; 141*b1cdbd2cSJim Jagielski if (mnExpandLevel == 0) 142*b1cdbd2cSJim Jagielski { 143*b1cdbd2cSJim Jagielski maTree.setEnabled (true); 144*b1cdbd2cSJim Jagielski ((AccessibilityTreeModel)maTree.getModel()).unlock (aNode); 145*b1cdbd2cSJim Jagielski } 146*b1cdbd2cSJim Jagielski } 147*b1cdbd2cSJim Jagielski expandTree( TreePath aPath, Expander aExpander )148*b1cdbd2cSJim Jagielski private TreePath expandTree( TreePath aPath, Expander aExpander ) 149*b1cdbd2cSJim Jagielski { 150*b1cdbd2cSJim Jagielski // return first expanded object 151*b1cdbd2cSJim Jagielski TreePath aFirst = null; 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski // System.out.print ("e"); 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski try 156*b1cdbd2cSJim Jagielski { 157*b1cdbd2cSJim Jagielski // get 'our' object 158*b1cdbd2cSJim Jagielski Object aObj = aPath.getLastPathComponent(); 159*b1cdbd2cSJim Jagielski 160*b1cdbd2cSJim Jagielski // expand this object, if the Expander tells us so 161*b1cdbd2cSJim Jagielski if( aExpander.expand( aObj ) ) 162*b1cdbd2cSJim Jagielski { 163*b1cdbd2cSJim Jagielski maTree.expandPath (aPath); 164*b1cdbd2cSJim Jagielski if( aFirst == null ) 165*b1cdbd2cSJim Jagielski aFirst = aPath; 166*b1cdbd2cSJim Jagielski } 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski // visit all children 169*b1cdbd2cSJim Jagielski if (aObj instanceof AccessibleTreeNode) 170*b1cdbd2cSJim Jagielski { 171*b1cdbd2cSJim Jagielski AccessibleTreeNode aNode = (AccessibleTreeNode)aObj; 172*b1cdbd2cSJim Jagielski int nLength = aNode.getChildCount(); 173*b1cdbd2cSJim Jagielski for( int i = 0; i < nLength; i++ ) 174*b1cdbd2cSJim Jagielski { 175*b1cdbd2cSJim Jagielski TreePath aRet = expandTree( 176*b1cdbd2cSJim Jagielski aPath.pathByAddingChild( aNode.getChild( i ) ), 177*b1cdbd2cSJim Jagielski aExpander ); 178*b1cdbd2cSJim Jagielski if( aFirst == null ) 179*b1cdbd2cSJim Jagielski aFirst = aRet; 180*b1cdbd2cSJim Jagielski } 181*b1cdbd2cSJim Jagielski } 182*b1cdbd2cSJim Jagielski } 183*b1cdbd2cSJim Jagielski catch (Exception e) 184*b1cdbd2cSJim Jagielski { 185*b1cdbd2cSJim Jagielski System.out.println ("caught exception while expanding tree path " 186*b1cdbd2cSJim Jagielski + aPath + ": " + e); 187*b1cdbd2cSJim Jagielski e.printStackTrace (); 188*b1cdbd2cSJim Jagielski } 189*b1cdbd2cSJim Jagielski 190*b1cdbd2cSJim Jagielski return aFirst; 191*b1cdbd2cSJim Jagielski } 192*b1cdbd2cSJim Jagielski 193*b1cdbd2cSJim Jagielski 194*b1cdbd2cSJim Jagielski /** Expand all nodes and their subtrees that represent shapes. Call 195*b1cdbd2cSJim Jagielski * this method from the outside. */ expandShapes()196*b1cdbd2cSJim Jagielski public void expandShapes () 197*b1cdbd2cSJim Jagielski { 198*b1cdbd2cSJim Jagielski expandShapes ((AccessibleTreeNode)maTree.getModel().getRoot()); 199*b1cdbd2cSJim Jagielski } expandShapes(AccessibleTreeNode aNode)200*b1cdbd2cSJim Jagielski public void expandShapes (AccessibleTreeNode aNode) 201*b1cdbd2cSJim Jagielski { 202*b1cdbd2cSJim Jagielski expandTree (aNode, new ShapeExpander()); 203*b1cdbd2cSJim Jagielski } 204*b1cdbd2cSJim Jagielski 205*b1cdbd2cSJim Jagielski /** Expand all nodes */ expandAll()206*b1cdbd2cSJim Jagielski public void expandAll () 207*b1cdbd2cSJim Jagielski { 208*b1cdbd2cSJim Jagielski expandAll ((AccessibleTreeNode)maTree.getModel().getRoot()); 209*b1cdbd2cSJim Jagielski } expandAll(AccessibleTreeNode aNode)210*b1cdbd2cSJim Jagielski public void expandAll (AccessibleTreeNode aNode) 211*b1cdbd2cSJim Jagielski { 212*b1cdbd2cSJim Jagielski expandTree (aNode, new AllExpander()); 213*b1cdbd2cSJim Jagielski } 214*b1cdbd2cSJim Jagielski 215*b1cdbd2cSJim Jagielski 216*b1cdbd2cSJim Jagielski disposing(com.sun.star.lang.EventObject e)217*b1cdbd2cSJim Jagielski public void disposing (com.sun.star.lang.EventObject e) 218*b1cdbd2cSJim Jagielski { 219*b1cdbd2cSJim Jagielski System.out.println ("disposing " + e); 220*b1cdbd2cSJim Jagielski } 221*b1cdbd2cSJim Jagielski 222*b1cdbd2cSJim Jagielski /* 223*b1cdbd2cSJim Jagielski public Dimension getPreferredSize () 224*b1cdbd2cSJim Jagielski { 225*b1cdbd2cSJim Jagielski Dimension aPreferredSize = super.getPreferredSize(); 226*b1cdbd2cSJim Jagielski Dimension aMinimumSize = super.getMinimumSize(); 227*b1cdbd2cSJim Jagielski if (aPreferredSize.width < aMinimumSize.width) 228*b1cdbd2cSJim Jagielski aPreferredSize.width = aMinimumSize.width; 229*b1cdbd2cSJim Jagielski return aPreferredSize; 230*b1cdbd2cSJim Jagielski } 231*b1cdbd2cSJim Jagielski */ 232*b1cdbd2cSJim Jagielski 233*b1cdbd2cSJim Jagielski class MouseListener extends MouseAdapter 234*b1cdbd2cSJim Jagielski { MouseListener(AccessibilityTree aTree)235*b1cdbd2cSJim Jagielski public MouseListener (AccessibilityTree aTree) 236*b1cdbd2cSJim Jagielski { 237*b1cdbd2cSJim Jagielski maTree=aTree; 238*b1cdbd2cSJim Jagielski } mousePressed(MouseEvent e)239*b1cdbd2cSJim Jagielski public void mousePressed(MouseEvent e) { popupTrigger(e); } mouseClicked(MouseEvent e)240*b1cdbd2cSJim Jagielski public void mouseClicked(MouseEvent e) { popupTrigger(e); } mouseEntered(MouseEvent e)241*b1cdbd2cSJim Jagielski public void mouseEntered(MouseEvent e) { popupTrigger(e); } mouseExited(MouseEvent e)242*b1cdbd2cSJim Jagielski public void mouseExited(MouseEvent e) { popupTrigger(e); } mouseReleased(MouseEvent e)243*b1cdbd2cSJim Jagielski public void mouseReleased(MouseEvent e) { popupTrigger(e); } 244*b1cdbd2cSJim Jagielski popupTrigger( MouseEvent e )245*b1cdbd2cSJim Jagielski public boolean popupTrigger( MouseEvent e ) 246*b1cdbd2cSJim Jagielski { 247*b1cdbd2cSJim Jagielski boolean bIsPopup = e.isPopupTrigger(); 248*b1cdbd2cSJim Jagielski if( bIsPopup ) 249*b1cdbd2cSJim Jagielski { 250*b1cdbd2cSJim Jagielski int selRow = maTree.getComponent().getRowForLocation(e.getX(), e.getY()); 251*b1cdbd2cSJim Jagielski if (selRow != -1) 252*b1cdbd2cSJim Jagielski { 253*b1cdbd2cSJim Jagielski TreePath aPath = maTree.getComponent().getPathForLocation(e.getX(), e.getY()); 254*b1cdbd2cSJim Jagielski 255*b1cdbd2cSJim Jagielski // check for actions 256*b1cdbd2cSJim Jagielski Object aObject = aPath.getLastPathComponent(); 257*b1cdbd2cSJim Jagielski JPopupMenu aMenu = new JPopupMenu(); 258*b1cdbd2cSJim Jagielski if( aObject instanceof AccTreeNode ) 259*b1cdbd2cSJim Jagielski { 260*b1cdbd2cSJim Jagielski AccTreeNode aNode = (AccTreeNode)aObject; 261*b1cdbd2cSJim Jagielski 262*b1cdbd2cSJim Jagielski Vector aActions = new Vector(); 263*b1cdbd2cSJim Jagielski aMenu.add (new AccessibilityTree.ShapeExpandAction(maTree, aNode)); 264*b1cdbd2cSJim Jagielski aMenu.add (new AccessibilityTree.SubtreeExpandAction(maTree, aNode)); 265*b1cdbd2cSJim Jagielski 266*b1cdbd2cSJim Jagielski aNode.getActions(aActions); 267*b1cdbd2cSJim Jagielski for( int i = 0; i < aActions.size(); i++ ) 268*b1cdbd2cSJim Jagielski { 269*b1cdbd2cSJim Jagielski aMenu.add( new NodeAction( 270*b1cdbd2cSJim Jagielski aActions.elementAt(i).toString(), 271*b1cdbd2cSJim Jagielski aNode, i ) ); 272*b1cdbd2cSJim Jagielski } 273*b1cdbd2cSJim Jagielski } 274*b1cdbd2cSJim Jagielski else if (aObject instanceof AccessibleTreeNode) 275*b1cdbd2cSJim Jagielski { 276*b1cdbd2cSJim Jagielski AccessibleTreeNode aNode = (AccessibleTreeNode)aObject; 277*b1cdbd2cSJim Jagielski String[] aActionNames = aNode.getActions(); 278*b1cdbd2cSJim Jagielski int nCount=aActionNames.length; 279*b1cdbd2cSJim Jagielski if (nCount > 0) 280*b1cdbd2cSJim Jagielski { 281*b1cdbd2cSJim Jagielski for (int i=0; i<nCount; i++) 282*b1cdbd2cSJim Jagielski aMenu.add( new NodeAction( 283*b1cdbd2cSJim Jagielski aActionNames[i], 284*b1cdbd2cSJim Jagielski aNode, 285*b1cdbd2cSJim Jagielski i)); 286*b1cdbd2cSJim Jagielski } 287*b1cdbd2cSJim Jagielski else 288*b1cdbd2cSJim Jagielski aMenu = null; 289*b1cdbd2cSJim Jagielski } 290*b1cdbd2cSJim Jagielski if (aMenu != null) 291*b1cdbd2cSJim Jagielski aMenu.show (maTree.getComponent(), 292*b1cdbd2cSJim Jagielski e.getX(), e.getY()); 293*b1cdbd2cSJim Jagielski } 294*b1cdbd2cSJim Jagielski } 295*b1cdbd2cSJim Jagielski 296*b1cdbd2cSJim Jagielski return bIsPopup; 297*b1cdbd2cSJim Jagielski } 298*b1cdbd2cSJim Jagielski 299*b1cdbd2cSJim Jagielski private AccessibilityTree maTree; 300*b1cdbd2cSJim Jagielski } 301*b1cdbd2cSJim Jagielski 302*b1cdbd2cSJim Jagielski class NodeAction extends AbstractAction 303*b1cdbd2cSJim Jagielski { 304*b1cdbd2cSJim Jagielski private int mnIndex; 305*b1cdbd2cSJim Jagielski private AccessibleTreeNode maNode; 306*b1cdbd2cSJim Jagielski NodeAction( String aName, AccessibleTreeNode aNode, int nIndex )307*b1cdbd2cSJim Jagielski public NodeAction( String aName, AccessibleTreeNode aNode, int nIndex ) 308*b1cdbd2cSJim Jagielski { 309*b1cdbd2cSJim Jagielski super( aName ); 310*b1cdbd2cSJim Jagielski maNode = aNode; 311*b1cdbd2cSJim Jagielski mnIndex = nIndex; 312*b1cdbd2cSJim Jagielski } 313*b1cdbd2cSJim Jagielski actionPerformed(ActionEvent e)314*b1cdbd2cSJim Jagielski public void actionPerformed(ActionEvent e) 315*b1cdbd2cSJim Jagielski { 316*b1cdbd2cSJim Jagielski maNode.performAction(mnIndex); 317*b1cdbd2cSJim Jagielski } 318*b1cdbd2cSJim Jagielski } 319*b1cdbd2cSJim Jagielski 320*b1cdbd2cSJim Jagielski // This action expands all shapes in the subtree rooted in the specified node. 321*b1cdbd2cSJim Jagielski class ShapeExpandAction extends AbstractAction 322*b1cdbd2cSJim Jagielski { 323*b1cdbd2cSJim Jagielski private AccessibilityTree maTree; 324*b1cdbd2cSJim Jagielski private AccTreeNode maNode; ShapeExpandAction(AccessibilityTree aTree, AccTreeNode aNode)325*b1cdbd2cSJim Jagielski public ShapeExpandAction (AccessibilityTree aTree, AccTreeNode aNode) 326*b1cdbd2cSJim Jagielski { 327*b1cdbd2cSJim Jagielski super ("Expand Shapes"); 328*b1cdbd2cSJim Jagielski maTree = aTree; 329*b1cdbd2cSJim Jagielski maNode = aNode; 330*b1cdbd2cSJim Jagielski } actionPerformed(ActionEvent e)331*b1cdbd2cSJim Jagielski public void actionPerformed (ActionEvent e) 332*b1cdbd2cSJim Jagielski { 333*b1cdbd2cSJim Jagielski maTree.expandShapes (maNode); 334*b1cdbd2cSJim Jagielski } 335*b1cdbd2cSJim Jagielski } 336*b1cdbd2cSJim Jagielski 337*b1cdbd2cSJim Jagielski // This action expands all nodes in the subtree rooted in the specified node. 338*b1cdbd2cSJim Jagielski class SubtreeExpandAction extends AbstractAction 339*b1cdbd2cSJim Jagielski { 340*b1cdbd2cSJim Jagielski private AccessibilityTree maTree; 341*b1cdbd2cSJim Jagielski private AccTreeNode maNode; SubtreeExpandAction(AccessibilityTree aTree, AccTreeNode aNode)342*b1cdbd2cSJim Jagielski public SubtreeExpandAction (AccessibilityTree aTree, AccTreeNode aNode) 343*b1cdbd2cSJim Jagielski { 344*b1cdbd2cSJim Jagielski super ("Expand Subtree"); 345*b1cdbd2cSJim Jagielski maTree = aTree; 346*b1cdbd2cSJim Jagielski maNode = aNode; 347*b1cdbd2cSJim Jagielski } actionPerformed(ActionEvent e)348*b1cdbd2cSJim Jagielski public void actionPerformed (ActionEvent e) 349*b1cdbd2cSJim Jagielski { 350*b1cdbd2cSJim Jagielski maTree.expandAll (maNode); 351*b1cdbd2cSJim Jagielski } 352*b1cdbd2cSJim Jagielski } 353*b1cdbd2cSJim Jagielski 354*b1cdbd2cSJim Jagielski /** Predicate class to determine whether a node should be expanded 355*b1cdbd2cSJim Jagielski * For use with expandTree method */ 356*b1cdbd2cSJim Jagielski abstract class Expander 357*b1cdbd2cSJim Jagielski { expand(Object aObject)358*b1cdbd2cSJim Jagielski abstract public boolean expand (Object aObject); 359*b1cdbd2cSJim Jagielski } 360*b1cdbd2cSJim Jagielski 361*b1cdbd2cSJim Jagielski /** expand all nodes */ 362*b1cdbd2cSJim Jagielski class AllExpander extends Expander 363*b1cdbd2cSJim Jagielski { expand(Object aObject)364*b1cdbd2cSJim Jagielski public boolean expand(Object aObject) { return true; } 365*b1cdbd2cSJim Jagielski } 366*b1cdbd2cSJim Jagielski 367*b1cdbd2cSJim Jagielski /** expand all nodes with accessibility roles > 100 */ 368*b1cdbd2cSJim Jagielski class ShapeExpander extends Expander 369*b1cdbd2cSJim Jagielski { expand(Object aObject)370*b1cdbd2cSJim Jagielski public boolean expand (Object aObject) 371*b1cdbd2cSJim Jagielski { 372*b1cdbd2cSJim Jagielski if (aObject instanceof AccTreeNode) 373*b1cdbd2cSJim Jagielski { 374*b1cdbd2cSJim Jagielski AccTreeNode aNode = (AccTreeNode)aObject; 375*b1cdbd2cSJim Jagielski XAccessibleContext xContext = aNode.getContext(); 376*b1cdbd2cSJim Jagielski if (xContext != null) 377*b1cdbd2cSJim Jagielski if (xContext.getAccessibleRole() >= 100) 378*b1cdbd2cSJim Jagielski return true; 379*b1cdbd2cSJim Jagielski } 380*b1cdbd2cSJim Jagielski return false; 381*b1cdbd2cSJim Jagielski } 382*b1cdbd2cSJim Jagielski } 383*b1cdbd2cSJim Jagielski 384*b1cdbd2cSJim Jagielski 385*b1cdbd2cSJim Jagielski 386*b1cdbd2cSJim Jagielski protected AccessibleTreeCellRenderer 387*b1cdbd2cSJim Jagielski maCellRenderer; 388*b1cdbd2cSJim Jagielski 389*b1cdbd2cSJim Jagielski 390*b1cdbd2cSJim Jagielski private JTree 391*b1cdbd2cSJim Jagielski maTree; 392*b1cdbd2cSJim Jagielski private Canvas 393*b1cdbd2cSJim Jagielski maCanvas; 394*b1cdbd2cSJim Jagielski private boolean 395*b1cdbd2cSJim Jagielski mbFirstShapeSeen; 396*b1cdbd2cSJim Jagielski private int 397*b1cdbd2cSJim Jagielski mnExpandLevel; 398*b1cdbd2cSJim Jagielski } 399