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