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 java.util.Vector;
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski /**
26*b1cdbd2cSJim Jagielski  * Map an arbitrary object into parts of a tree node.
27*b1cdbd2cSJim Jagielski  */
28*b1cdbd2cSJim Jagielski abstract class NodeHandler
29*b1cdbd2cSJim Jagielski {
30*b1cdbd2cSJim Jagielski     /** This vector is used as cache for the child objects.
31*b1cdbd2cSJim Jagielski     */
32*b1cdbd2cSJim Jagielski     protected Vector maChildList;
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski 
createHandler( com.sun.star.accessibility.XAccessibleContext xContext)35*b1cdbd2cSJim Jagielski     public abstract NodeHandler createHandler (
36*b1cdbd2cSJim Jagielski         com.sun.star.accessibility.XAccessibleContext xContext);
37*b1cdbd2cSJim Jagielski 
NodeHandler()38*b1cdbd2cSJim Jagielski     public NodeHandler ()
39*b1cdbd2cSJim Jagielski     {
40*b1cdbd2cSJim Jagielski         maChildList = new Vector ();
41*b1cdbd2cSJim Jagielski     }
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski     /** Clear the cache of child objects.
44*b1cdbd2cSJim Jagielski     */
clear()45*b1cdbd2cSJim Jagielski     public void clear ()
46*b1cdbd2cSJim Jagielski     {
47*b1cdbd2cSJim Jagielski         synchronized (maChildList)
48*b1cdbd2cSJim Jagielski         {
49*b1cdbd2cSJim Jagielski             maChildList = new Vector ();
50*b1cdbd2cSJim Jagielski         }
51*b1cdbd2cSJim Jagielski     }
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski     /** This factory method creates an individual handler for the specified
54*b1cdbd2cSJim Jagielski         object that may hold information to accelerate the access to its children.
55*b1cdbd2cSJim Jagielski     */
56*b1cdbd2cSJim Jagielski     //    public abstract NodeHandler createHandler (Object aObject);
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski     /** return the number of children this object has */
getChildCount(Object aObject)59*b1cdbd2cSJim Jagielski     public int getChildCount(Object aObject)
60*b1cdbd2cSJim Jagielski     {
61*b1cdbd2cSJim Jagielski         synchronized (maChildList)
62*b1cdbd2cSJim Jagielski         {
63*b1cdbd2cSJim Jagielski             return maChildList.size();
64*b1cdbd2cSJim Jagielski         }
65*b1cdbd2cSJim Jagielski     }
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski     /**
68*b1cdbd2cSJim Jagielski      * return a child object. Complex
69*b1cdbd2cSJim Jagielski      * children have to be AccTreeNode instances.
70*b1cdbd2cSJim Jagielski      * @see AccTreeNode
71*b1cdbd2cSJim Jagielski      */
getChild(AccessibleTreeNode aParent, int nIndex)72*b1cdbd2cSJim Jagielski     public AccessibleTreeNode getChild (AccessibleTreeNode aParent, int nIndex)
73*b1cdbd2cSJim Jagielski     {
74*b1cdbd2cSJim Jagielski         synchronized (maChildList)
75*b1cdbd2cSJim Jagielski         {
76*b1cdbd2cSJim Jagielski             AccessibleTreeNode aChild = (AccessibleTreeNode)maChildList.get(nIndex);
77*b1cdbd2cSJim Jagielski             if (aChild == null)
78*b1cdbd2cSJim Jagielski             {
79*b1cdbd2cSJim Jagielski                 aChild = createChild (aParent, nIndex);
80*b1cdbd2cSJim Jagielski                 if (aChild == null)
81*b1cdbd2cSJim Jagielski                     aChild = new StringNode ("could not create child", aParent);
82*b1cdbd2cSJim Jagielski                 maChildList.setElementAt (aChild, nIndex);
83*b1cdbd2cSJim Jagielski             }
84*b1cdbd2cSJim Jagielski             return aChild;
85*b1cdbd2cSJim Jagielski         }
86*b1cdbd2cSJim Jagielski     }
87*b1cdbd2cSJim Jagielski 
getChildNoCreate(AccessibleTreeNode aParent, int nIndex)88*b1cdbd2cSJim Jagielski     public AccessibleTreeNode getChildNoCreate (AccessibleTreeNode aParent, int nIndex)
89*b1cdbd2cSJim Jagielski     {
90*b1cdbd2cSJim Jagielski         synchronized (maChildList)
91*b1cdbd2cSJim Jagielski         {
92*b1cdbd2cSJim Jagielski             return (AccessibleTreeNode)maChildList.get(nIndex);
93*b1cdbd2cSJim Jagielski         }
94*b1cdbd2cSJim Jagielski     }
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski     /** Remove the specified child from the list of children.
97*b1cdbd2cSJim Jagielski     */
removeChild(AccessibleTreeNode aNode, int nIndex)98*b1cdbd2cSJim Jagielski     public boolean removeChild (AccessibleTreeNode aNode, int nIndex)
99*b1cdbd2cSJim Jagielski     {
100*b1cdbd2cSJim Jagielski         try
101*b1cdbd2cSJim Jagielski         {
102*b1cdbd2cSJim Jagielski             synchronized (maChildList)
103*b1cdbd2cSJim Jagielski             {
104*b1cdbd2cSJim Jagielski                 System.out.println ("    removing child at position " + nIndex + ": "
105*b1cdbd2cSJim Jagielski                     + maChildList.elementAt (nIndex));
106*b1cdbd2cSJim Jagielski                 maChildList.remove (nIndex);
107*b1cdbd2cSJim Jagielski             }
108*b1cdbd2cSJim Jagielski         }
109*b1cdbd2cSJim Jagielski         catch (Exception e)
110*b1cdbd2cSJim Jagielski         {
111*b1cdbd2cSJim Jagielski             return false;
112*b1cdbd2cSJim Jagielski         }
113*b1cdbd2cSJim Jagielski         return true;
114*b1cdbd2cSJim Jagielski     }
115*b1cdbd2cSJim Jagielski 
indexOf(AccessibleTreeNode aNode)116*b1cdbd2cSJim Jagielski     public int indexOf (AccessibleTreeNode aNode)
117*b1cdbd2cSJim Jagielski     {
118*b1cdbd2cSJim Jagielski         synchronized (maChildList)
119*b1cdbd2cSJim Jagielski         {
120*b1cdbd2cSJim Jagielski             return maChildList.indexOf (aNode);
121*b1cdbd2cSJim Jagielski         }
122*b1cdbd2cSJim Jagielski     }
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski     /** Create a child object for the specified data.  This method is called
125*b1cdbd2cSJim Jagielski         usually from getChild and put there into the cache.
126*b1cdbd2cSJim Jagielski     */
createChild( AccessibleTreeNode aParent, int nIndex)127*b1cdbd2cSJim Jagielski     public abstract AccessibleTreeNode createChild (
128*b1cdbd2cSJim Jagielski         AccessibleTreeNode aParent, int nIndex);
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski     //
131*b1cdbd2cSJim Jagielski     // The following methods support editing of children and actions.
132*b1cdbd2cSJim Jagielski     // They have default implementations for no actions and read-only.
133*b1cdbd2cSJim Jagielski     //
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski     /** May this child be changed? */
isChildEditable(AccessibleTreeNode aNode, int nIndex)136*b1cdbd2cSJim Jagielski     public boolean isChildEditable (AccessibleTreeNode aNode, int nIndex)
137*b1cdbd2cSJim Jagielski     {
138*b1cdbd2cSJim Jagielski         return false;
139*b1cdbd2cSJim Jagielski     }
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski     /** change this child's value */
142*b1cdbd2cSJim Jagielski     //    public void setChild(Object aObject, int nIndex) { }
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski     /** get names of suported actions */
getActions(AccessibleTreeNode aNode)146*b1cdbd2cSJim Jagielski     public String[] getActions (AccessibleTreeNode aNode)
147*b1cdbd2cSJim Jagielski     {
148*b1cdbd2cSJim Jagielski         return new String[] {};
149*b1cdbd2cSJim Jagielski     }
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski     /** perform action */
performAction(AccessibleTreeNode aNode, int nIndex)152*b1cdbd2cSJim Jagielski     public void performAction (AccessibleTreeNode aNode, int nIndex)
153*b1cdbd2cSJim Jagielski     {
154*b1cdbd2cSJim Jagielski     }
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski     /** Update all children.
157*b1cdbd2cSJim Jagielski     */
update(AccessibleTreeNode aNode)158*b1cdbd2cSJim Jagielski     public void update (AccessibleTreeNode aNode)
159*b1cdbd2cSJim Jagielski     {
160*b1cdbd2cSJim Jagielski     }
161*b1cdbd2cSJim Jagielski }
162