1*cdf0e10cSrcweir import javax.swing.tree.TreeModel;
2*cdf0e10cSrcweir import javax.swing.event.TreeModelListener;
3*cdf0e10cSrcweir import javax.swing.tree.TreePath;
4*cdf0e10cSrcweir import javax.swing.event.TreeModelEvent;
5*cdf0e10cSrcweir import java.util.Vector;
6*cdf0e10cSrcweir 
7*cdf0e10cSrcweir public class AccessibilityTreeModelBase
8*cdf0e10cSrcweir     implements TreeModel
9*cdf0e10cSrcweir {
10*cdf0e10cSrcweir     public AccessibilityTreeModelBase ()
11*cdf0e10cSrcweir     {
12*cdf0e10cSrcweir         setRoot (null);
13*cdf0e10cSrcweir         maTMListeners = new Vector();
14*cdf0e10cSrcweir     }
15*cdf0e10cSrcweir 
16*cdf0e10cSrcweir     public synchronized void addTreeModelListener(TreeModelListener l)
17*cdf0e10cSrcweir     {
18*cdf0e10cSrcweir         maTMListeners.add(l);
19*cdf0e10cSrcweir     }
20*cdf0e10cSrcweir 
21*cdf0e10cSrcweir     public synchronized void removeTreeModelListener(TreeModelListener l)
22*cdf0e10cSrcweir     {
23*cdf0e10cSrcweir         maTMListeners.remove(l);
24*cdf0e10cSrcweir     }
25*cdf0e10cSrcweir 
26*cdf0e10cSrcweir     public synchronized int getChildCount(Object aParent)
27*cdf0e10cSrcweir     {
28*cdf0e10cSrcweir         return (aParent instanceof AccessibleTreeNode) ?
29*cdf0e10cSrcweir             ((AccessibleTreeNode)aParent).getChildCount() : 0;
30*cdf0e10cSrcweir     }
31*cdf0e10cSrcweir 
32*cdf0e10cSrcweir     public synchronized Object getChild (Object aParent, int nIndex)
33*cdf0e10cSrcweir     {
34*cdf0e10cSrcweir         Object aChild = null;
35*cdf0e10cSrcweir         try
36*cdf0e10cSrcweir         {
37*cdf0e10cSrcweir             if (aParent != null && aParent instanceof AccessibleTreeNode)
38*cdf0e10cSrcweir                 aChild = ((AccessibleTreeNode)aParent).getChild(nIndex);
39*cdf0e10cSrcweir             else
40*cdf0e10cSrcweir                 System.out.println ("getChild called for unknown parent node");
41*cdf0e10cSrcweir         }
42*cdf0e10cSrcweir         catch (com.sun.star.lang.IndexOutOfBoundsException e)
43*cdf0e10cSrcweir         {
44*cdf0e10cSrcweir             aChild = ("no child " + nIndex + " from " + aParent + ": " + e);
45*cdf0e10cSrcweir         }
46*cdf0e10cSrcweir         return aChild;
47*cdf0e10cSrcweir     }
48*cdf0e10cSrcweir 
49*cdf0e10cSrcweir     public synchronized Object getChildNoCreate (Object aParent, int nIndex)
50*cdf0e10cSrcweir     {
51*cdf0e10cSrcweir         Object aChild = null;
52*cdf0e10cSrcweir         try
53*cdf0e10cSrcweir         {
54*cdf0e10cSrcweir             if (aParent != null && aParent instanceof AccessibleTreeNode)
55*cdf0e10cSrcweir                 aChild = ((AccessibleTreeNode)aParent).getChildNoCreate(nIndex);
56*cdf0e10cSrcweir             else
57*cdf0e10cSrcweir                 System.out.println ("getChild called for unknown parent node");
58*cdf0e10cSrcweir         }
59*cdf0e10cSrcweir         catch (com.sun.star.lang.IndexOutOfBoundsException e)
60*cdf0e10cSrcweir         { }
61*cdf0e10cSrcweir         return aChild;
62*cdf0e10cSrcweir     }
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir     /** iterate over all children and look for child */
65*cdf0e10cSrcweir     public synchronized int getIndexOfChild (Object aParent, Object aChild)
66*cdf0e10cSrcweir     {
67*cdf0e10cSrcweir         int nIndex = -1;
68*cdf0e10cSrcweir         try
69*cdf0e10cSrcweir         {
70*cdf0e10cSrcweir             if ((aParent instanceof AccessibleTreeNode) && (aChild instanceof AccessibleTreeNode))
71*cdf0e10cSrcweir             {
72*cdf0e10cSrcweir                 AccessibleTreeNode aParentNode = (AccessibleTreeNode) aParent;
73*cdf0e10cSrcweir                 AccessibleTreeNode aChildNode = (AccessibleTreeNode) aChild;
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir                 int nChildCount = aParentNode.getChildCount();
76*cdf0e10cSrcweir                 for( int i = 0; i < nChildCount; i++ )
77*cdf0e10cSrcweir                 {
78*cdf0e10cSrcweir                     if (aChildNode.equals (aParentNode.getChild (i)))
79*cdf0e10cSrcweir                     {
80*cdf0e10cSrcweir                         nIndex = i;
81*cdf0e10cSrcweir                         break;
82*cdf0e10cSrcweir                     }
83*cdf0e10cSrcweir                 }
84*cdf0e10cSrcweir             }
85*cdf0e10cSrcweir         }
86*cdf0e10cSrcweir         catch (com.sun.star.lang.IndexOutOfBoundsException e)
87*cdf0e10cSrcweir         {
88*cdf0e10cSrcweir             // Return -1 by falling through.
89*cdf0e10cSrcweir         }
90*cdf0e10cSrcweir 
91*cdf0e10cSrcweir         // not found?
92*cdf0e10cSrcweir         return nIndex;
93*cdf0e10cSrcweir     }
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir     public boolean isLeaf (Object aNode)
96*cdf0e10cSrcweir     {
97*cdf0e10cSrcweir         return (aNode instanceof AccessibleTreeNode) ?
98*cdf0e10cSrcweir             ((AccessibleTreeNode)aNode).isLeaf() : true;
99*cdf0e10cSrcweir     }
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir 
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir     public synchronized Object getRoot()
104*cdf0e10cSrcweir     {
105*cdf0e10cSrcweir         return maRoot;
106*cdf0e10cSrcweir     }
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir     public void valueForPathChanged(TreePath path, Object newValue)
109*cdf0e10cSrcweir     { }
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir     protected synchronized void setRoot (AccessibleTreeNode aRoot)
112*cdf0e10cSrcweir     {
113*cdf0e10cSrcweir         maRoot = aRoot;
114*cdf0e10cSrcweir     }
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir 
117*cdf0e10cSrcweir     // The list of TreeModelListener objects.
118*cdf0e10cSrcweir     protected Vector maTMListeners;
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir     // The root node of the tree.  Use setRoot to change it.
121*cdf0e10cSrcweir     private AccessibleTreeNode maRoot = null;
122*cdf0e10cSrcweir }
123