1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package org.openoffice.accessibility.awb.tree;
25 
26 import javax.swing.tree.TreeNode;
27 import javax.swing.tree.MutableTreeNode;
28 import javax.swing.tree.DefaultMutableTreeNode;
29 import javax.swing.event.TreeExpansionListener;
30 import javax.swing.event.TreeWillExpandListener;
31 
32 import com.sun.star.accessibility.AccessibleRole;
33 import com.sun.star.accessibility.XAccessible;
34 import com.sun.star.accessibility.XAccessibleContext;
35 
36 /**
37  *
38  */
39 public class DynamicAccessibilityModel extends AccessibilityModel implements TreeExpansionListener, TreeWillExpandListener {
40 
41     /* Creates a AccessibilityNode object for a window */
createWindowNode(XAccessible xAccessible, XAccessibleContext xAccessibleContext)42     protected AccessibilityNode createWindowNode(XAccessible xAccessible,
43             XAccessibleContext xAccessibleContext) {
44         if (xAccessible != null) {
45             // Some objects inherit XAccessible, but should not appear in
46             // the hierarchy as toplevels (like sub-menus), so they don't
47             // return an accessible context.
48             if (xAccessibleContext != null) {
49                 AccessibilityNode node = new AccessibilityNode(this);
50                 node.setUserObject(xAccessible);
51                 node.setAccessibleContext(xAccessibleContext);
52                 putNode(xAccessible, node);
53                 return node;
54             }
55         }
56         return null;
57     }
58 
59     /* Creates a DynamicAccessibilityNode object */
createNode(XAccessible xAccessible)60     protected AccessibilityNode createNode(XAccessible xAccessible) {
61         if (xAccessible != null) {
62             try {
63                 // Some objects inherit XAccessible, but should not appear in
64                 // the hierarchy as toplevels (like sub-menus), so they don't
65                 // return an accessible context.
66                 XAccessibleContext xAccessibleContext = xAccessible.getAccessibleContext();
67                 if (xAccessibleContext != null) {
68                     AccessibilityNode node = new DynamicAccessibilityNode(this);
69                     node.setUserObject(xAccessible);
70                     node.setAccessibleContext(xAccessibleContext);
71                     putNode(xAccessible, node);
72                     return node;
73                 }
74             } catch (com.sun.star.uno.RuntimeException e) {
75             }
76         }
77         return null;
78     }
79 
treeCollapsed(javax.swing.event.TreeExpansionEvent treeExpansionEvent)80     public void treeCollapsed(javax.swing.event.TreeExpansionEvent treeExpansionEvent) {
81         TreeNode node = (TreeNode) treeExpansionEvent.getPath().getLastPathComponent();
82         if (node instanceof DynamicAccessibilityNode) {
83             DynamicAccessibilityNode dynode = (DynamicAccessibilityNode) node;
84             dynode.clear();
85         }
86     }
87 
treeExpanded(javax.swing.event.TreeExpansionEvent treeExpansionEvent)88     public void treeExpanded(javax.swing.event.TreeExpansionEvent treeExpansionEvent) {
89         TreeNode node = (TreeNode) treeExpansionEvent.getPath().getLastPathComponent();
90         if (node instanceof AccessibilityNode) {
91             // Calling oneway methods from an UNO thread may cause
92             // deadlocks, so adding the listeners here.
93             for (java.util.Enumeration e = node.children(); e.hasMoreElements(); ) {
94                 ((AccessibilityNode) e.nextElement()).setAttached(true);
95             }
96         }
97     }
98 
treeWillCollapse(javax.swing.event.TreeExpansionEvent treeExpansionEvent)99     public void treeWillCollapse(javax.swing.event.TreeExpansionEvent treeExpansionEvent)
100             throws javax.swing.tree.ExpandVetoException {
101         TreeNode node = (TreeNode) treeExpansionEvent.getPath().getLastPathComponent();
102         if (node instanceof AccessibilityNode) {
103             // Calling oneway methods from an UNO thread may cause
104             // deadlocks, so adding the listeners here.
105             for (java.util.Enumeration e = node.children(); e.hasMoreElements(); ) {
106                 ((AccessibilityNode) e.nextElement()).setAttached(false);
107             }
108         }
109     }
110 
treeWillExpand(javax.swing.event.TreeExpansionEvent treeExpansionEvent)111     public void treeWillExpand(javax.swing.event.TreeExpansionEvent treeExpansionEvent)
112             throws javax.swing.tree.ExpandVetoException {
113         TreeNode node = (TreeNode) treeExpansionEvent.getPath().getLastPathComponent();
114         if (node instanceof DynamicAccessibilityNode) {
115             DynamicAccessibilityNode dynode = (DynamicAccessibilityNode) node;
116             dynode.populate();
117         }
118     }
119 }
120