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.java.accessibility.logging;
25 
26 import com.sun.star.accessibility.*;
27 import com.sun.star.uno.*;
28 
29 /**
30  *
31  */
32 public class XAccessibleEventLog implements XAccessibleEventListener {
33 
34     private static XAccessibleEventLog theEventListener = null;
35 
36     private static java.util.Hashtable proxyList = new java.util.Hashtable();
37 
38     /** Creates a new instance of UNOAccessibleEventListener */
XAccessibleEventLog()39     public XAccessibleEventLog() {
40     }
41 
get()42     private static XAccessibleEventListener get() {
43         if (theEventListener == null) {
44             theEventListener = new XAccessibleEventLog();
45         }
46         return theEventListener;
47     }
48 
addEventListener(XAccessibleContext xac, java.awt.Component c)49     public static void addEventListener(XAccessibleContext xac, java.awt.Component c) {
50         XAccessibleEventBroadcaster broadcaster = (XAccessibleEventBroadcaster)
51             UnoRuntime.queryInterface(XAccessibleEventBroadcaster.class, xac);
52         if (broadcaster != null) {
53             broadcaster.addEventListener(XAccessibleEventLog.get());
54 
55             // remember the proxy objects
56             synchronized (proxyList) {
57 //                proxyList.put(UnoRuntime.generateOid(xac), new WeakReference(c));
58                 proxyList.put(UnoRuntime.generateOid(xac), c);
59             }
60         }
61     }
62 
disposing(com.sun.star.lang.EventObject eventObject)63     public void disposing(com.sun.star.lang.EventObject eventObject) {
64     }
65 
notifyEvent(com.sun.star.accessibility.AccessibleEventObject accessibleEventObject)66     public void notifyEvent(com.sun.star.accessibility.AccessibleEventObject accessibleEventObject) {
67         switch (accessibleEventObject.EventId) {
68             case AccessibleEventId.ACTIVE_DESCENDANT_CHANGED:
69                 logMessage(accessibleEventObject.Source, "Retrieved active descendant event.");
70                 break;
71             case AccessibleEventId.STATE_CHANGED:
72                 logStateChange(accessibleEventObject.Source,
73                     accessibleEventObject.OldValue,
74                     accessibleEventObject.NewValue);
75                 break;
76             case AccessibleEventId.CHILD:
77                 logMessage(accessibleEventObject.Source, "Retrieved children event.");
78                 break;
79            case AccessibleEventId.BOUNDRECT_CHANGED:
80                 logMessage(accessibleEventObject.Source, "Retrieved boundrect changed event.");
81                 break;
82            case AccessibleEventId.VISIBLE_DATA_CHANGED:
83                 logMessage(accessibleEventObject.Source, "Retrieved visible data changed event.");
84                 break;
85            case AccessibleEventId.INVALIDATE_ALL_CHILDREN:
86                 logMessage(accessibleEventObject.Source, "Retrieved invalidate children event.");
87                 break;
88             default:
89                 break;
90         }
91     }
92 
logStateChange(Object o, Object any1, Object any2)93     public void logStateChange(Object o, Object any1, Object any2) {
94         try {
95             if (AnyConverter.isShort(any1)) {
96                 logStateChange(o, AnyConverter.toShort(any1), " is no longer ");
97             }
98 
99             if (AnyConverter.isShort(any2)) {
100                 logStateChange(o, AnyConverter.toShort(any2), " is now ");
101             }
102         } catch (com.sun.star.lang.IllegalArgumentException e) {
103         }
104     }
105 
logStateChange(Object o, short n, String s)106     public void logStateChange(Object o, short n, String s) {
107         switch(n) {
108             case AccessibleStateType.ACTIVE:
109                 logMessage(o, s + javax.accessibility.AccessibleState.ACTIVE);
110                 break;
111             case AccessibleStateType.ARMED:
112                 logMessage(o, s + javax.accessibility.AccessibleState.ARMED);
113                 break;
114             case AccessibleStateType.CHECKED:
115                 logMessage(o, s + javax.accessibility.AccessibleState.CHECKED);
116                 break;
117             case AccessibleStateType.ENABLED:
118                 logMessage(o, s + javax.accessibility.AccessibleState.ENABLED);
119                 break;
120             case AccessibleStateType.FOCUSED:
121                 logMessage(o, s + javax.accessibility.AccessibleState.FOCUSED);
122                 break;
123             case AccessibleStateType.PRESSED:
124                 logMessage(o, s + javax.accessibility.AccessibleState.PRESSED);
125                 break;
126             case AccessibleStateType.SELECTED:
127                 logMessage(o, s + javax.accessibility.AccessibleState.SELECTED);
128                 break;
129             case AccessibleStateType.SENSITIVE:
130                 logMessage(o, s + "sensitive");
131                 break;
132             case AccessibleStateType.SHOWING:
133                 logMessage(o, s + javax.accessibility.AccessibleState.SHOWING);
134                 break;
135             case AccessibleStateType.VISIBLE:
136                 logMessage(o, s + javax.accessibility.AccessibleState.VISIBLE);
137                 break;
138             default:
139                 logMessage(o, s + "??? (FIXME)");
140                 break;
141         }
142     }
143 
logMessage(Object o, String s)144     protected static void logMessage(Object o, String s) {
145         XAccessibleContext xac = (XAccessibleContext) UnoRuntime.queryInterface(XAccessibleContext.class, o);
146         if( xac != null ) {
147             String oid = UnoRuntime.generateOid(xac);
148             synchronized (proxyList) {
149                   logMessage( (javax.accessibility.Accessible) proxyList.get( oid ), s );
150 //                WeakReference r = (WeakReference) proxyList.get( oid );
151 //                if(r != null) {
152 //                    System.err.println( "*** Warning *** event is " + r.get() );
153 //                    logMessage( (javax.accessibility.Accessible) r.get(), s );
154 //                } else {
155 //                    System.err.println( "*** Warning *** event source not found in broadcaster list" );
156 //                }
157             }
158         } else
159             System.err.println( "*** Warning *** event source does not implement XAccessibleContext" );
160     }
161 
logMessage(javax.accessibility.Accessible a, String s)162     protected static void logMessage(javax.accessibility.Accessible a, String s) {
163         if (a != null) {
164             logMessage(a.getAccessibleContext(), s);
165         } else {
166             logMessage(s);
167         }
168     }
169 
logMessage(javax.accessibility.AccessibleContext ac, String s)170     protected static void logMessage(javax.accessibility.AccessibleContext ac, String s) {
171         if (ac != null) {
172             logMessage("[" + ac.getAccessibleRole() + "] "
173                 + ac.getAccessibleName() + ": " + s);
174         } else {
175             logMessage(s);
176         }
177     }
178 
logMessage(String s)179     protected static void logMessage(String s) {
180         System.err.println(s);
181     }
182 }
183