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 org.openoffice.accessibility.misc.AccessibleEventMulticaster; 27 28 import javax.swing.tree.DefaultMutableTreeNode; 29 import javax.swing.SwingUtilities; 30 31 import com.sun.star.accessibility.AccessibleEventId; 32 import com.sun.star.accessibility.AccessibleEventObject; 33 import com.sun.star.accessibility.XAccessible; 34 import com.sun.star.accessibility.XAccessibleContext; 35 import com.sun.star.accessibility.XAccessibleEventBroadcaster; 36 import com.sun.star.accessibility.XAccessibleEventListener; 37 38 import com.sun.star.uno.UnoRuntime; 39 40 class AccessibilityNode extends DefaultMutableTreeNode implements XAccessible, 41 XAccessibleEventListener, XAccessibleEventBroadcaster { 42 43 protected AccessibilityModel treeModel; 44 protected XAccessibleContext unoAccessibleContext; 45 46 private XAccessibleEventListener listener; 47 AccessibilityNode(AccessibilityModel treeModel)48 public AccessibilityNode(AccessibilityModel treeModel) { 49 this.treeModel = treeModel; 50 } 51 finalize()52 protected void finalize() throws java.lang.Throwable { 53 if (userObject != null) { 54 treeModel.removeNode(userObject); 55 } 56 } 57 58 /** Sets the XAccessibleContext object of this node */ setAccessibleContext(XAccessibleContext xAccessibleContext)59 public void setAccessibleContext(XAccessibleContext xAccessibleContext) { 60 unoAccessibleContext = xAccessibleContext; 61 } 62 63 /** Returns the XAccessibleContext object of this node */ getAccessibleContext()64 public XAccessibleContext getAccessibleContext() { 65 return unoAccessibleContext; 66 } 67 68 /** Attaches or Detaches the itself as listener to unoAccessibleContext */ setAttached(boolean attach)69 protected void setAttached(boolean attach) { 70 XAccessibleContext xAccessibleContext = unoAccessibleContext; 71 if (xAccessibleContext != null) { 72 try { 73 XAccessibleEventBroadcaster xAccessibleEventBroadcaster = 74 UnoRuntime.queryInterface( XAccessibleEventBroadcaster.class, xAccessibleContext ); 75 if (xAccessibleEventBroadcaster != null) { 76 if (attach) { 77 xAccessibleEventBroadcaster.addEventListener(this); 78 } else { 79 xAccessibleEventBroadcaster.removeEventListener(this); 80 } 81 } 82 } catch (com.sun.star.uno.RuntimeException e) { 83 // FIXME: error message ! 84 } 85 } 86 } 87 disposing(com.sun.star.lang.EventObject eventObject)88 public void disposing(com.sun.star.lang.EventObject eventObject) { 89 XAccessibleEventListener localListener = this.listener; 90 if (localListener != null) { 91 localListener.disposing(eventObject); 92 } 93 94 treeModel.removeNode(userObject); 95 userObject = null; 96 unoAccessibleContext = null; 97 // FIXME: mark the object as being disposed in the tree view ! 98 } 99 handleChildRemoved(XAccessible xAccessible)100 protected void handleChildRemoved(XAccessible xAccessible) { 101 final AccessibilityNode node = treeModel.findNode(xAccessible); 102 if (node != null) { 103 SwingUtilities.invokeLater(new java.lang.Runnable() { 104 public void run() { 105 treeModel.removeNodeFromParent(node); 106 } 107 }); 108 } 109 } 110 handleChildAdded(XAccessible xAccessible)111 protected void handleChildAdded(XAccessible xAccessible) { 112 final AccessibilityNode parent = this; 113 final AccessibilityNode node = treeModel.createNode(xAccessible); 114 if (node != null) { 115 SwingUtilities.invokeLater(new java.lang.Runnable() { 116 public void run() { 117 try { 118 XAccessibleContext xAC = node.getAccessibleContext(); 119 if (xAC != null) { 120 treeModel.insertNodeInto(node, parent, 121 xAC.getAccessibleIndexInParent()); 122 } 123 } catch (com.sun.star.uno.RuntimeException e) { 124 // FIXME: output 125 } 126 } 127 }); 128 } 129 } 130 notifyEvent(AccessibleEventObject accessibleEventObject)131 public void notifyEvent(AccessibleEventObject accessibleEventObject) { 132 if (accessibleEventObject.EventId == AccessibleEventId.CHILD) { 133 XAccessible xAccessible = UnoRuntime.queryInterface( XAccessible.class, accessibleEventObject.OldValue ); 134 if (xAccessible != null) { 135 handleChildRemoved(xAccessible); 136 } 137 138 xAccessible = UnoRuntime.queryInterface( XAccessible.class, accessibleEventObject.NewValue ); 139 if (xAccessible != null) { 140 handleChildAdded(xAccessible); 141 } 142 } 143 144 XAccessibleEventListener localListener = this.listener; 145 if (localListener != null) { 146 localListener.notifyEvent(accessibleEventObject); 147 } 148 } 149 addEventListener(com.sun.star.accessibility.XAccessibleEventListener xAccessibleEventListener)150 public synchronized void addEventListener(com.sun.star.accessibility.XAccessibleEventListener xAccessibleEventListener) { 151 listener = AccessibleEventMulticaster.add(listener, xAccessibleEventListener); 152 } 153 removeEventListener(com.sun.star.accessibility.XAccessibleEventListener xAccessibleEventListener)154 public synchronized void removeEventListener(com.sun.star.accessibility.XAccessibleEventListener xAccessibleEventListener) { 155 listener = AccessibleEventMulticaster.remove(listener, xAccessibleEventListener); 156 } 157 } 158 159 160