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.uno.UnoRuntime;
23*b1cdbd2cSJim Jagielski import com.sun.star.accessibility.*;
24*b1cdbd2cSJim Jagielski import java.util.Vector;
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski /**
27*b1cdbd2cSJim Jagielski  * The node type for the AccessibleTreeModel.
28*b1cdbd2cSJim Jagielski  * This implements all the child-handling based on the appropriate
29*b1cdbd2cSJim Jagielski  * NodeHandlers. Trivial nodes can be implemented by any Object
30*b1cdbd2cSJim Jagielski  * type.
31*b1cdbd2cSJim Jagielski  */
32*b1cdbd2cSJim Jagielski class AccTreeNode
33*b1cdbd2cSJim Jagielski     extends AccessibleTreeNode
34*b1cdbd2cSJim Jagielski {
35*b1cdbd2cSJim Jagielski     class HandlerDescriptor
36*b1cdbd2cSJim Jagielski     {
HandlerDescriptor(NodeHandler aHandler)37*b1cdbd2cSJim Jagielski         public HandlerDescriptor (NodeHandler aHandler)
38*b1cdbd2cSJim Jagielski         {
39*b1cdbd2cSJim Jagielski             maHandler = aHandler;
40*b1cdbd2cSJim Jagielski             mnChildCount = -1;
41*b1cdbd2cSJim Jagielski         }
42*b1cdbd2cSJim Jagielski         public NodeHandler maHandler;
43*b1cdbd2cSJim Jagielski         public int mnChildCount;
44*b1cdbd2cSJim Jagielski     }
45*b1cdbd2cSJim Jagielski     /// NodeHandlers for this node
46*b1cdbd2cSJim Jagielski     private Vector maHandlers;
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski     // The accessible context of this node.
49*b1cdbd2cSJim Jagielski     private XAccessible mxAccessible;
50*b1cdbd2cSJim Jagielski     private XAccessibleContext mxContext;
51*b1cdbd2cSJim Jagielski     private XAccessibleComponent mxComponent;
52*b1cdbd2cSJim Jagielski     private XAccessibleText mxText;
53*b1cdbd2cSJim Jagielski     private XAccessibleTable mxTable;
54*b1cdbd2cSJim Jagielski 
AccTreeNode(XAccessible xAccessible, XAccessibleContext xContext, AccessibleTreeNode aParent)55*b1cdbd2cSJim Jagielski     public AccTreeNode (XAccessible xAccessible, XAccessibleContext xContext, AccessibleTreeNode aParent)
56*b1cdbd2cSJim Jagielski     {
57*b1cdbd2cSJim Jagielski         this (xAccessible, xContext, xContext, aParent);
58*b1cdbd2cSJim Jagielski     }
59*b1cdbd2cSJim Jagielski 
AccTreeNode(XAccessible xAccessible, XAccessibleContext xContext, Object aDisplay, AccessibleTreeNode aParent)60*b1cdbd2cSJim Jagielski     public AccTreeNode (XAccessible xAccessible, XAccessibleContext xContext, Object aDisplay, AccessibleTreeNode aParent)
61*b1cdbd2cSJim Jagielski     {
62*b1cdbd2cSJim Jagielski         super (aDisplay, aParent);
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski         maHandlers = new Vector(5);
65*b1cdbd2cSJim Jagielski         mxContext = xContext;
66*b1cdbd2cSJim Jagielski         mxAccessible = xAccessible;
67*b1cdbd2cSJim Jagielski     }
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski     /** Update the internal data extracted from the corresponding accessible
70*b1cdbd2cSJim Jagielski         object.  This is done by replacing every handler by a new one.  An
71*b1cdbd2cSJim Jagielski         update method at each handler would be better of course.
72*b1cdbd2cSJim Jagielski     */
update()73*b1cdbd2cSJim Jagielski     public void update ()
74*b1cdbd2cSJim Jagielski     {
75*b1cdbd2cSJim Jagielski         for (int i=0; i<maHandlers.size(); i++)
76*b1cdbd2cSJim Jagielski         {
77*b1cdbd2cSJim Jagielski             System.out.println ("replacing handler " + i);
78*b1cdbd2cSJim Jagielski             HandlerDescriptor aDescriptor = (HandlerDescriptor)maHandlers.get(i);
79*b1cdbd2cSJim Jagielski             aDescriptor.maHandler = aDescriptor.maHandler.createHandler (mxContext);
80*b1cdbd2cSJim Jagielski             aDescriptor.mnChildCount =
81*b1cdbd2cSJim Jagielski                     aDescriptor.maHandler.getChildCount (this);
82*b1cdbd2cSJim Jagielski         }
83*b1cdbd2cSJim Jagielski     }
84*b1cdbd2cSJim Jagielski 
getContext()85*b1cdbd2cSJim Jagielski     public XAccessibleContext getContext ()
86*b1cdbd2cSJim Jagielski     {
87*b1cdbd2cSJim Jagielski         return mxContext;
88*b1cdbd2cSJim Jagielski     }
89*b1cdbd2cSJim Jagielski 
getComponent()90*b1cdbd2cSJim Jagielski     public XAccessibleComponent getComponent ()
91*b1cdbd2cSJim Jagielski     {
92*b1cdbd2cSJim Jagielski         if (mxComponent == null && mxContext != null)
93*b1cdbd2cSJim Jagielski             mxComponent = (XAccessibleComponent)UnoRuntime.queryInterface(
94*b1cdbd2cSJim Jagielski                 XAccessibleComponent.class, mxContext);
95*b1cdbd2cSJim Jagielski         return mxComponent;
96*b1cdbd2cSJim Jagielski     }
97*b1cdbd2cSJim Jagielski 
getExtendedComponent()98*b1cdbd2cSJim Jagielski     public XAccessibleExtendedComponent getExtendedComponent ()
99*b1cdbd2cSJim Jagielski     {
100*b1cdbd2cSJim Jagielski         if (mxComponent == null)
101*b1cdbd2cSJim Jagielski             getComponent();
102*b1cdbd2cSJim Jagielski         if (mxComponent != null)
103*b1cdbd2cSJim Jagielski             return (XAccessibleExtendedComponent)UnoRuntime.queryInterface(
104*b1cdbd2cSJim Jagielski                 XAccessibleExtendedComponent.class, mxComponent);
105*b1cdbd2cSJim Jagielski         else
106*b1cdbd2cSJim Jagielski             return null;
107*b1cdbd2cSJim Jagielski     }
108*b1cdbd2cSJim Jagielski 
getText()109*b1cdbd2cSJim Jagielski     public XAccessibleText getText ()
110*b1cdbd2cSJim Jagielski     {
111*b1cdbd2cSJim Jagielski         if (mxText == null && mxContext != null)
112*b1cdbd2cSJim Jagielski             mxText = (XAccessibleText)UnoRuntime.queryInterface(
113*b1cdbd2cSJim Jagielski                 XAccessibleText.class, mxContext);
114*b1cdbd2cSJim Jagielski         return mxText;
115*b1cdbd2cSJim Jagielski     }
116*b1cdbd2cSJim Jagielski 
getEditText()117*b1cdbd2cSJim Jagielski     public XAccessibleEditableText getEditText ()
118*b1cdbd2cSJim Jagielski     {
119*b1cdbd2cSJim Jagielski         return (XAccessibleEditableText)UnoRuntime.queryInterface(
120*b1cdbd2cSJim Jagielski                 XAccessibleEditableText.class, mxContext);
121*b1cdbd2cSJim Jagielski     }
122*b1cdbd2cSJim Jagielski 
getTable()123*b1cdbd2cSJim Jagielski     public XAccessibleTable getTable ()
124*b1cdbd2cSJim Jagielski     {
125*b1cdbd2cSJim Jagielski         if (mxTable == null && mxContext != null)
126*b1cdbd2cSJim Jagielski             mxTable = (XAccessibleTable)UnoRuntime.queryInterface(
127*b1cdbd2cSJim Jagielski                 XAccessibleTable.class, mxContext);
128*b1cdbd2cSJim Jagielski         return mxTable;
129*b1cdbd2cSJim Jagielski     }
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski 
getAccessible()132*b1cdbd2cSJim Jagielski     public XAccessible getAccessible()
133*b1cdbd2cSJim Jagielski     {
134*b1cdbd2cSJim Jagielski         if ((mxAccessible == null) && (mxContext != null))
135*b1cdbd2cSJim Jagielski             mxAccessible = (XAccessible)UnoRuntime.queryInterface(
136*b1cdbd2cSJim Jagielski                 XAccessible.class, mxContext);
137*b1cdbd2cSJim Jagielski         return mxAccessible;
138*b1cdbd2cSJim Jagielski     }
139*b1cdbd2cSJim Jagielski 
getSelection()140*b1cdbd2cSJim Jagielski     public XAccessibleSelection getSelection ()
141*b1cdbd2cSJim Jagielski     {
142*b1cdbd2cSJim Jagielski         return (XAccessibleSelection)UnoRuntime.queryInterface(
143*b1cdbd2cSJim Jagielski                 XAccessibleSelection.class, mxContext);
144*b1cdbd2cSJim Jagielski     }
145*b1cdbd2cSJim Jagielski 
addHandler( NodeHandler aHandler )146*b1cdbd2cSJim Jagielski     public void addHandler( NodeHandler aHandler )
147*b1cdbd2cSJim Jagielski     {
148*b1cdbd2cSJim Jagielski         if (aHandler != null)
149*b1cdbd2cSJim Jagielski             maHandlers.add (new HandlerDescriptor (aHandler));
150*b1cdbd2cSJim Jagielski     }
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski     /** iterate over handlers and return child sum */
getHandlerDescriptor(int i)154*b1cdbd2cSJim Jagielski     protected HandlerDescriptor getHandlerDescriptor (int i)
155*b1cdbd2cSJim Jagielski     {
156*b1cdbd2cSJim Jagielski         HandlerDescriptor aDescriptor = (HandlerDescriptor)maHandlers.get(i);
157*b1cdbd2cSJim Jagielski         if (aDescriptor.mnChildCount < 0)
158*b1cdbd2cSJim Jagielski             aDescriptor.mnChildCount =
159*b1cdbd2cSJim Jagielski                     aDescriptor.maHandler.getChildCount (this);
160*b1cdbd2cSJim Jagielski         return aDescriptor;
161*b1cdbd2cSJim Jagielski     }
162*b1cdbd2cSJim Jagielski 
getChildCount()163*b1cdbd2cSJim Jagielski     public int getChildCount()
164*b1cdbd2cSJim Jagielski     {
165*b1cdbd2cSJim Jagielski         int nChildCount = 0;
166*b1cdbd2cSJim Jagielski         for (int i = 0; i < maHandlers.size(); i++)
167*b1cdbd2cSJim Jagielski         {
168*b1cdbd2cSJim Jagielski             HandlerDescriptor aDescriptor = getHandlerDescriptor (i);
169*b1cdbd2cSJim Jagielski             nChildCount += aDescriptor.mnChildCount;
170*b1cdbd2cSJim Jagielski         }
171*b1cdbd2cSJim Jagielski         return nChildCount;
172*b1cdbd2cSJim Jagielski     }
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski     /** iterate over handlers until the child is found */
getChild(int nIndex)175*b1cdbd2cSJim Jagielski     public AccessibleTreeNode getChild (int nIndex)
176*b1cdbd2cSJim Jagielski         throws IndexOutOfBoundsException
177*b1cdbd2cSJim Jagielski     {
178*b1cdbd2cSJim Jagielski         if( nIndex >= 0 )
179*b1cdbd2cSJim Jagielski         {
180*b1cdbd2cSJim Jagielski             for(int i = 0; i < maHandlers.size(); i++)
181*b1cdbd2cSJim Jagielski             {
182*b1cdbd2cSJim Jagielski                 // check if this handler has the child, and if not
183*b1cdbd2cSJim Jagielski                 // search with next handler
184*b1cdbd2cSJim Jagielski                 HandlerDescriptor aDescriptor = getHandlerDescriptor (i);
185*b1cdbd2cSJim Jagielski                 if (nIndex < aDescriptor.mnChildCount)
186*b1cdbd2cSJim Jagielski                     return aDescriptor.maHandler.getChild (this, nIndex);
187*b1cdbd2cSJim Jagielski                 else
188*b1cdbd2cSJim Jagielski                     nIndex -= aDescriptor.mnChildCount;
189*b1cdbd2cSJim Jagielski             }
190*b1cdbd2cSJim Jagielski         }
191*b1cdbd2cSJim Jagielski         else
192*b1cdbd2cSJim Jagielski             throw new IndexOutOfBoundsException();
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski         // nothing found?
195*b1cdbd2cSJim Jagielski         return null;
196*b1cdbd2cSJim Jagielski     }
197*b1cdbd2cSJim Jagielski 
getChildNoCreate(int nIndex)198*b1cdbd2cSJim Jagielski     public AccessibleTreeNode getChildNoCreate (int nIndex)
199*b1cdbd2cSJim Jagielski         throws IndexOutOfBoundsException
200*b1cdbd2cSJim Jagielski     {
201*b1cdbd2cSJim Jagielski         if( nIndex >= 0 )
202*b1cdbd2cSJim Jagielski         {
203*b1cdbd2cSJim Jagielski             for(int i = 0; i < maHandlers.size(); i++)
204*b1cdbd2cSJim Jagielski             {
205*b1cdbd2cSJim Jagielski                 // check if this handler has the child, and if not
206*b1cdbd2cSJim Jagielski                 // search with next handler
207*b1cdbd2cSJim Jagielski                 HandlerDescriptor aDescriptor = getHandlerDescriptor (i);
208*b1cdbd2cSJim Jagielski                 if (nIndex < aDescriptor.mnChildCount)
209*b1cdbd2cSJim Jagielski                     return aDescriptor.maHandler.getChildNoCreate (this, nIndex);
210*b1cdbd2cSJim Jagielski                 else
211*b1cdbd2cSJim Jagielski                     nIndex -= aDescriptor.mnChildCount;
212*b1cdbd2cSJim Jagielski             }
213*b1cdbd2cSJim Jagielski         }
214*b1cdbd2cSJim Jagielski         else
215*b1cdbd2cSJim Jagielski             throw new IndexOutOfBoundsException();
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski         // nothing found?
218*b1cdbd2cSJim Jagielski         return null;
219*b1cdbd2cSJim Jagielski     }
220*b1cdbd2cSJim Jagielski 
removeChild(int nIndex)221*b1cdbd2cSJim Jagielski     public boolean removeChild (int nIndex)
222*b1cdbd2cSJim Jagielski         throws IndexOutOfBoundsException
223*b1cdbd2cSJim Jagielski     {
224*b1cdbd2cSJim Jagielski         boolean bStatus = false;
225*b1cdbd2cSJim Jagielski         if (nIndex >= 0)
226*b1cdbd2cSJim Jagielski         {
227*b1cdbd2cSJim Jagielski             for (int i=0; i<maHandlers.size(); i++)
228*b1cdbd2cSJim Jagielski             {
229*b1cdbd2cSJim Jagielski                 // check if this handler has the child, and if not
230*b1cdbd2cSJim Jagielski                 // search with next handler
231*b1cdbd2cSJim Jagielski                 HandlerDescriptor aDescriptor = getHandlerDescriptor (i);
232*b1cdbd2cSJim Jagielski                 if (nIndex < aDescriptor.mnChildCount)
233*b1cdbd2cSJim Jagielski                 {
234*b1cdbd2cSJim Jagielski                     bStatus = aDescriptor.maHandler.removeChild (this, nIndex);
235*b1cdbd2cSJim Jagielski                     aDescriptor.mnChildCount = aDescriptor.maHandler.getChildCount (this);
236*b1cdbd2cSJim Jagielski                     break;
237*b1cdbd2cSJim Jagielski                 }
238*b1cdbd2cSJim Jagielski                 else
239*b1cdbd2cSJim Jagielski                     nIndex -= aDescriptor.mnChildCount;
240*b1cdbd2cSJim Jagielski             }
241*b1cdbd2cSJim Jagielski         }
242*b1cdbd2cSJim Jagielski         else
243*b1cdbd2cSJim Jagielski             throw new IndexOutOfBoundsException();
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski         return bStatus;
246*b1cdbd2cSJim Jagielski     }
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 
indexOf(AccessibleTreeNode aNode)249*b1cdbd2cSJim Jagielski     public int indexOf (AccessibleTreeNode aNode)
250*b1cdbd2cSJim Jagielski     {
251*b1cdbd2cSJim Jagielski         int nBaseIndex = 0;
252*b1cdbd2cSJim Jagielski         if (aNode != null)
253*b1cdbd2cSJim Jagielski         {
254*b1cdbd2cSJim Jagielski             for (int i=0; i<maHandlers.size(); i++)
255*b1cdbd2cSJim Jagielski             {
256*b1cdbd2cSJim Jagielski                 HandlerDescriptor aDescriptor = getHandlerDescriptor (i);
257*b1cdbd2cSJim Jagielski                 int nIndex = aDescriptor.maHandler.indexOf (aNode);
258*b1cdbd2cSJim Jagielski                 if (nIndex >= 0)
259*b1cdbd2cSJim Jagielski                     return nBaseIndex + nIndex;
260*b1cdbd2cSJim Jagielski                 else
261*b1cdbd2cSJim Jagielski                     nBaseIndex += aDescriptor.mnChildCount;
262*b1cdbd2cSJim Jagielski             }
263*b1cdbd2cSJim Jagielski         }
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski         return -1;
266*b1cdbd2cSJim Jagielski     }
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski     /** this node is a leaf if have no handlers, or is those
269*b1cdbd2cSJim Jagielski             handlers show no children */
isLeaf()270*b1cdbd2cSJim Jagielski     public boolean isLeaf()
271*b1cdbd2cSJim Jagielski     {
272*b1cdbd2cSJim Jagielski         return (maHandlers.size() == 0);// || (getChildCount() == 0);
273*b1cdbd2cSJim Jagielski     }
274*b1cdbd2cSJim Jagielski 
equals(Object aOther)275*b1cdbd2cSJim Jagielski     public boolean equals (Object aOther)
276*b1cdbd2cSJim Jagielski     {
277*b1cdbd2cSJim Jagielski         return (this == aOther) || (aOther!=null && aOther.equals(mxContext));
278*b1cdbd2cSJim Jagielski     }
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski     /** iterate over handlers until the child is found */
getActions(Vector aActions)282*b1cdbd2cSJim Jagielski     public void getActions(Vector aActions)
283*b1cdbd2cSJim Jagielski     {
284*b1cdbd2cSJim Jagielski         for(int i = 0; i < maHandlers.size(); i++)
285*b1cdbd2cSJim Jagielski         {
286*b1cdbd2cSJim Jagielski             HandlerDescriptor aDescriptor = getHandlerDescriptor (i);
287*b1cdbd2cSJim Jagielski             NodeHandler aHandler = aDescriptor.maHandler;
288*b1cdbd2cSJim Jagielski             String[] aHandlerActions = aHandler.getActions (this);
289*b1cdbd2cSJim Jagielski             for(int j = 0; j < aHandlerActions.length; j++ )
290*b1cdbd2cSJim Jagielski             {
291*b1cdbd2cSJim Jagielski                 aActions.add( aHandlerActions[j] );
292*b1cdbd2cSJim Jagielski             }
293*b1cdbd2cSJim Jagielski         }
294*b1cdbd2cSJim Jagielski     }
295*b1cdbd2cSJim Jagielski 
performAction( int nIndex )296*b1cdbd2cSJim Jagielski     public void performAction( int nIndex )
297*b1cdbd2cSJim Jagielski     {
298*b1cdbd2cSJim Jagielski         if( nIndex >= 0 )
299*b1cdbd2cSJim Jagielski         {
300*b1cdbd2cSJim Jagielski             for(int i = 0; i < maHandlers.size(); i++)
301*b1cdbd2cSJim Jagielski             {
302*b1cdbd2cSJim Jagielski                 // check if this handler has the child, and if not
303*b1cdbd2cSJim Jagielski                 // search with next handler
304*b1cdbd2cSJim Jagielski                 HandlerDescriptor aDescriptor = getHandlerDescriptor (i);
305*b1cdbd2cSJim Jagielski                 NodeHandler aHandler = aDescriptor.maHandler;
306*b1cdbd2cSJim Jagielski                 int nCount = aHandler.getActions(this).length;
307*b1cdbd2cSJim Jagielski                 if( nCount > nIndex )
308*b1cdbd2cSJim Jagielski                 {
309*b1cdbd2cSJim Jagielski                     aHandler.performAction(this, nIndex );
310*b1cdbd2cSJim Jagielski                     return;
311*b1cdbd2cSJim Jagielski                 }
312*b1cdbd2cSJim Jagielski                 else
313*b1cdbd2cSJim Jagielski                     nIndex -= nCount;
314*b1cdbd2cSJim Jagielski             }
315*b1cdbd2cSJim Jagielski         }
316*b1cdbd2cSJim Jagielski     }
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski     /** Try to add the specified accessible object as new accessible child of the
319*b1cdbd2cSJim Jagielski         AccessibleTreeHandler.
320*b1cdbd2cSJim Jagielski         Note that child is used in another context than
321*b1cdbd2cSJim Jagielski         it is used in the other methods of this class.
322*b1cdbd2cSJim Jagielski     */
addAccessibleChild(XAccessible xChild)323*b1cdbd2cSJim Jagielski     public AccessibleTreeNode addAccessibleChild (XAccessible xChild)
324*b1cdbd2cSJim Jagielski     {
325*b1cdbd2cSJim Jagielski         for(int i = 0; i < maHandlers.size(); i++)
326*b1cdbd2cSJim Jagielski         {
327*b1cdbd2cSJim Jagielski             HandlerDescriptor aDescriptor = getHandlerDescriptor (i);
328*b1cdbd2cSJim Jagielski             if (aDescriptor.maHandler instanceof AccessibleTreeHandler)
329*b1cdbd2cSJim Jagielski             {
330*b1cdbd2cSJim Jagielski                 AccessibleTreeHandler aHandler = (AccessibleTreeHandler)aDescriptor.maHandler;
331*b1cdbd2cSJim Jagielski                 AccessibleTreeNode aNode = aHandler.addAccessibleChild (this, xChild);
332*b1cdbd2cSJim Jagielski                 aDescriptor.mnChildCount = aHandler.getChildCount (this);
333*b1cdbd2cSJim Jagielski                 return aNode;
334*b1cdbd2cSJim Jagielski             }
335*b1cdbd2cSJim Jagielski         }
336*b1cdbd2cSJim Jagielski         return null;
337*b1cdbd2cSJim Jagielski     }
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski     /** Update the specified handlers.
340*b1cdbd2cSJim Jagielski         @return
341*b1cdbd2cSJim Jagielski             The returned array containes the indices of the updated children
342*b1cdbd2cSJim Jagielski             and can be used to create a TreeModelEvent.
343*b1cdbd2cSJim Jagielski     */
updateChildren(java.lang.Class class1)344*b1cdbd2cSJim Jagielski     public Vector updateChildren (java.lang.Class class1)
345*b1cdbd2cSJim Jagielski     {
346*b1cdbd2cSJim Jagielski         return updateChildren (class1, null);
347*b1cdbd2cSJim Jagielski     }
348*b1cdbd2cSJim Jagielski 
updateChildren(java.lang.Class class1, java.lang.Class class2)349*b1cdbd2cSJim Jagielski     public Vector updateChildren (java.lang.Class class1, java.lang.Class class2)
350*b1cdbd2cSJim Jagielski     {
351*b1cdbd2cSJim Jagielski         Vector aChildIndices = new Vector();
352*b1cdbd2cSJim Jagielski         int nOffset = 0;
353*b1cdbd2cSJim Jagielski         for(int i=0; i < maHandlers.size(); i++)
354*b1cdbd2cSJim Jagielski         {
355*b1cdbd2cSJim Jagielski             HandlerDescriptor aDescriptor = getHandlerDescriptor (i);
356*b1cdbd2cSJim Jagielski             if ((class1.isInstance(aDescriptor.maHandler))
357*b1cdbd2cSJim Jagielski                 || (class2 !=null && class2.isInstance(aDescriptor.maHandler)))
358*b1cdbd2cSJim Jagielski             {
359*b1cdbd2cSJim Jagielski                 aDescriptor.maHandler.update(this);
360*b1cdbd2cSJim Jagielski                 // Get updated number of children.
361*b1cdbd2cSJim Jagielski                 int nChildCount = aDescriptor.maHandler.getChildCount (this);
362*b1cdbd2cSJim Jagielski                 aDescriptor.mnChildCount = nChildCount;
363*b1cdbd2cSJim Jagielski                 // Fill in the indices of the updated children.
364*b1cdbd2cSJim Jagielski                 for (int j=0; j<nChildCount; j++)
365*b1cdbd2cSJim Jagielski                     aChildIndices.add(new Integer(j+nOffset));
366*b1cdbd2cSJim Jagielski             }
367*b1cdbd2cSJim Jagielski             nOffset += aDescriptor.mnChildCount;
368*b1cdbd2cSJim Jagielski         }
369*b1cdbd2cSJim Jagielski         return aChildIndices;
370*b1cdbd2cSJim Jagielski     }
371*b1cdbd2cSJim Jagielski }
372