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 complex.toolkit.accessibility;
25 
26 import com.sun.star.lang.EventObject;
27 import com.sun.star.awt.Rectangle;
28 import com.sun.star.awt.PosSize;
29 import com.sun.star.awt.XWindow;
30 import com.sun.star.accessibility.AccessibleEventObject;
31 import com.sun.star.accessibility.XAccessible;
32 import com.sun.star.accessibility.XAccessibleEventBroadcaster;
33 import com.sun.star.accessibility.XAccessibleEventListener;
34 import com.sun.star.accessibility.XAccessibleContext;
35 import com.sun.star.uno.XInterface;
36 import com.sun.star.uno.UnoRuntime;
37 
38 /**
39  * Testing <code>
40  * com.sun.star.accessibility.XAccessibleEventBroadcaster</code>
41  * interface methods :
42  * <ul>
43  *  <li><code> addEventListener()</code></li>
44  *  <li><code> removeEventListener()</code></li>
45  * </ul> <p>
46  *
47  * This test needs the following object relations :
48  * <ul>
49  *  <li> <code>'EventProducer'</code> (of type
50  *  <code>ifc.accessibility._XAccessibleEventBroadcaster.EventProducer</code>):
51  *   this must be an implementation of the interface which could perform
52  *   some actions for generating any kind of <code>AccessibleEvent</code></li>
53  * <ul> <p>
54  *
55  * @see com.sun.star.accessibility.XAccessibleEventBroadcaster
56  */
57 public class _XAccessibleEventBroadcaster {
58 
59     public XAccessibleEventBroadcaster oObj = null;
60     EventProducer prod = null ;
61     EvListener list = new EvListener();
62 
63     /**
64      * An event producer
65      */
66     public static class EventProducer {
67         XWindow xWindow;
EventProducer(XWindow window)68         public EventProducer(XWindow window) {
69             xWindow = window;
70         }
71 
fireEvent()72        public void fireEvent() {
73             Rectangle newPosSize = xWindow.getPosSize();
74             newPosSize.Width = newPosSize.Width - 20;
75             newPosSize.Height = newPosSize.Height - 20;
76             newPosSize.X = newPosSize.X + 20;
77             newPosSize.Y = newPosSize.Y + 20;
78             xWindow.setPosSize(newPosSize.X, newPosSize.Y, newPosSize.Width,
79                                     newPosSize.Height, PosSize.POSSIZE);
80         }
81     }
82 
83     /**
84      * Listener implementation which registers listener calls.
85      */
86     private class EvListener implements XAccessibleEventListener {
87         public AccessibleEventObject notifiedEvent = null ;
notifyEvent(AccessibleEventObject ev)88         public void notifyEvent(AccessibleEventObject ev) {
89             System.out.println("Listener, Event : " + ev.EventId);
90             System.out.println("EventID: " + ev.EventId);
91             Object old=ev.OldValue;
92             if (old instanceof com.sun.star.accessibility.XAccessible) {
93                 System.out.println("Old: "+((XAccessible)old).getAccessibleContext().getAccessibleName());
94             }
95 
96             Object nev=ev.NewValue;
97             if (nev instanceof com.sun.star.accessibility.XAccessible) {
98                 System.out.println("New: "+((XAccessible)nev).getAccessibleContext().getAccessibleName());
99             }
100             notifiedEvent = ev;
101         }
102 
disposing(EventObject ev)103         public void disposing(EventObject ev) {}
104     }
105 
106     /**
107      * c'tor
108      * @param object
109      * @param eventMessage
110      * @param window
111      */
_XAccessibleEventBroadcaster(XInterface object, XWindow window)112     public _XAccessibleEventBroadcaster(XInterface object, XWindow window) {
113         oObj = UnoRuntime.queryInterface(XAccessibleEventBroadcaster.class, object);
114         prod = new EventProducer(window);
115     }
116 
117     /**
118      * Adds two listeners and fires event by mean of object relation. <p>
119      * Has <b> OK </b> status if both listeners were called
120      * @return
121      */
_addEventListener()122     public boolean _addEventListener() {
123         System.out.println("adding two listeners");
124         oObj.addEventListener(list);
125         boolean isTransient = chkTransient(oObj);
126         System.out.println("fire event");
127         prod.fireEvent() ;
128 
129         try {
130             Thread.sleep(1500);
131         }
132         catch (InterruptedException ex) {
133         }
134 
135         boolean works = true;
136 
137         if (list.notifiedEvent == null) {
138             if (!isTransient) {
139                 System.out.println("listener wasn't called");
140                 works = false;
141             } else {
142                 System.out.println("Object is Transient, listener isn't expected to be called");
143             }
144             oObj.removeEventListener(list);
145         }
146 
147         return works;
148     }
149 
150     /**
151      * Removes one of two listeners added before and and fires event
152      * by mean of object relation. <p>
153      *
154      * Has <b> OK </b> status if the removed listener wasn't called. <p>
155      *
156      * The following method tests are to be completed successfully before :
157      * <ul>
158      *  <li> <code>addEventListener()</code> : to have added listeners </li>
159      * </ul>
160      * @return
161      */
_removeEventListener()162     public boolean _removeEventListener() {
163 
164         list.notifiedEvent = null;
165 
166         System.out.println("remove first listener");
167         oObj.removeEventListener(list);
168 
169         System.out.println("fire event");
170         prod.fireEvent() ;
171 
172         try {
173             Thread.sleep(500);
174         }
175         catch (InterruptedException ex) {
176         }
177 
178         if (list.notifiedEvent == null) {
179             System.out.println("listener wasn't called -- OK");
180         }
181 
182         return list.notifiedEvent == null;
183 
184     }
185 
chkTransient(Object Testcase)186     protected static boolean chkTransient(Object Testcase) {
187         XAccessibleContext accCon = UnoRuntime.queryInterface(XAccessibleContext.class, Testcase);
188         if (accCon.getAccessibleStateSet().contains(
189             com.sun.star.accessibility.AccessibleStateType.TRANSIENT)){
190             if (!accCon.getAccessibleParent().getAccessibleContext().getAccessibleStateSet().contains(
191                         com.sun.star.accessibility.AccessibleStateType.MANAGES_DESCENDANTS)) {
192                 return false;
193             }
194             return true;
195         }
196         return false;
197     }
198 
199 }
200 
201