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