1*76b6b121SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*76b6b121SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*76b6b121SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*76b6b121SAndrew Rist  * distributed with this work for additional information
6*76b6b121SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*76b6b121SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*76b6b121SAndrew Rist  * "License"); you may not use this file except in compliance
9*76b6b121SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*76b6b121SAndrew Rist  *
11*76b6b121SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*76b6b121SAndrew Rist  *
13*76b6b121SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*76b6b121SAndrew Rist  * software distributed under the License is distributed on an
15*76b6b121SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*76b6b121SAndrew Rist  * KIND, either express or implied.  See the License for the
17*76b6b121SAndrew Rist  * specific language governing permissions and limitations
18*76b6b121SAndrew Rist  * under the License.
19*76b6b121SAndrew Rist  *
20*76b6b121SAndrew Rist  *************************************************************/
21*76b6b121SAndrew Rist 
22*76b6b121SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir package complex.XUserInputInterception;
25cdf0e10cSrcweir 
26cdf0e10cSrcweir import com.sun.star.accessibility.AccessibleRole;
27cdf0e10cSrcweir import com.sun.star.accessibility.XAccessible;
28cdf0e10cSrcweir import com.sun.star.accessibility.XAccessibleComponent;
29cdf0e10cSrcweir import com.sun.star.accessibility.XAccessibleContext;
30cdf0e10cSrcweir import com.sun.star.awt.KeyEvent;
31cdf0e10cSrcweir import com.sun.star.awt.MouseEvent;
32cdf0e10cSrcweir import com.sun.star.awt.Point;
33cdf0e10cSrcweir import com.sun.star.awt.Rectangle;
34cdf0e10cSrcweir import com.sun.star.awt.XKeyHandler;
35cdf0e10cSrcweir import com.sun.star.awt.XMouseClickHandler;
36cdf0e10cSrcweir import com.sun.star.awt.XUserInputInterception;
37cdf0e10cSrcweir import com.sun.star.awt.XWindow;
38cdf0e10cSrcweir import com.sun.star.chart.XChartDocument;
39cdf0e10cSrcweir import com.sun.star.frame.*;
40cdf0e10cSrcweir import com.sun.star.lang.*;
41cdf0e10cSrcweir import com.sun.star.lang.EventObject;
42cdf0e10cSrcweir import com.sun.star.sheet.XSpreadsheetDocument;
43cdf0e10cSrcweir import com.sun.star.text.XTextDocument;
44cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
45cdf0e10cSrcweir import com.sun.star.uno.XInterface;
46cdf0e10cSrcweir import com.sun.star.util.*;
47cdf0e10cSrcweir import java.awt.Robot;
48cdf0e10cSrcweir import java.awt.event.InputEvent;
49cdf0e10cSrcweir 
50cdf0e10cSrcweir import util.AccessibilityTools;
51cdf0e10cSrcweir import util.SOfficeFactory;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir // ---------- junit imports -----------------
54cdf0e10cSrcweir import org.junit.After;
55cdf0e10cSrcweir import org.junit.AfterClass;
56cdf0e10cSrcweir import org.junit.Before;
57cdf0e10cSrcweir import org.junit.BeforeClass;
58cdf0e10cSrcweir import org.junit.Test;
59cdf0e10cSrcweir import org.openoffice.test.OfficeConnection;
60cdf0e10cSrcweir import static org.junit.Assert.*;
61cdf0e10cSrcweir // ------------------------------------------
62cdf0e10cSrcweir //-----------------------------------------------
63cdf0e10cSrcweir /**
64cdf0e10cSrcweir  * This <CODE>ComplexTest</CODE> checks the interface
65cdf0e10cSrcweir  * <CODE>XUserInputInterception</CODE>. Therefore it creates a document,
66cdf0e10cSrcweir  * adds a mouse and a key listener onto the interface and fire the
67cdf0e10cSrcweir  * correspond events. If all listener works as expected the test resluts in
68cdf0e10cSrcweir  * <CODE>OK</CODE> status.
69cdf0e10cSrcweir  * @short Check the interface XUserInputIntercaption
70cdf0e10cSrcweir  * @descr checks is a simple way the interface XUserInputInteraction
71cdf0e10cSrcweir  */
72cdf0e10cSrcweir public class EventTest {
73cdf0e10cSrcweir     //-------------------------------------------
74cdf0e10cSrcweir     // some const
75cdf0e10cSrcweir 
76cdf0e10cSrcweir     //-------------------------------------------
77cdf0e10cSrcweir     // member
78cdf0e10cSrcweir 
79cdf0e10cSrcweir     /** points to the global uno service manager. */
80cdf0e10cSrcweir     private XMultiServiceFactory m_xMSF = null;
81cdf0e10cSrcweir 
82cdf0e10cSrcweir     /** indicates if the mousePressed event was called*/
83cdf0e10cSrcweir     private boolean m_mousePressed = false;
84cdf0e10cSrcweir     /** indicates if the mouseReleased event was called*/
85cdf0e10cSrcweir     private boolean m_mouseReleased = false;
86cdf0e10cSrcweir 
87cdf0e10cSrcweir     /** indicates if the mousePressed event was called*/
88cdf0e10cSrcweir     private boolean m_keyPressed = false;
89cdf0e10cSrcweir     /** indicates if the mouseReleased event was called*/
90cdf0e10cSrcweir     private boolean m_keyReleased = false;
91cdf0e10cSrcweir 
92cdf0e10cSrcweir     /** points to a global StarOffice factory */
93cdf0e10cSrcweir     private SOfficeFactory m_SOF = null;
94cdf0e10cSrcweir 
95cdf0e10cSrcweir     /**
96cdf0e10cSrcweir      * define the miliseconds to wait until a <CODE>EventTrigger</CODE> thread should
97cdf0e10cSrcweir      * be finished with its work
98cdf0e10cSrcweir      */
99cdf0e10cSrcweir     final int m_threadWait = 3000;
100cdf0e10cSrcweir 
101cdf0e10cSrcweir     //-------------------------------------------
102cdf0e10cSrcweir     // test environment
103cdf0e10cSrcweir 
104cdf0e10cSrcweir     //-------------------------------------------
105cdf0e10cSrcweir     /**
106cdf0e10cSrcweir      * The test methods are:
107cdf0e10cSrcweir      * <ul>
108cdf0e10cSrcweir      *    <li><CODE>checkTextDocument</CODE></LI>
109cdf0e10cSrcweir      *    <li><CODE>checkCalcDocument</CODE></LI>
110cdf0e10cSrcweir      *    <li><CODE>checkDrawDocument</CODE></LI>
111cdf0e10cSrcweir      *    <li><CODE>checkImpressDocument</CODE></LI>
112cdf0e10cSrcweir      *    <li><CODE>checkChartDocument</CODE></LI>
113cdf0e10cSrcweir      *    <li><CODE>checkMathDocument</CODE></li>
114cdf0e10cSrcweir      * </ul>
115cdf0e10cSrcweir      * @short A function to tell the framework,
116cdf0e10cSrcweir      * which test functions are available.
117cdf0e10cSrcweir      * @return All test methods.
118cdf0e10cSrcweir      * @todo Think about selection of tests from outside ...
119cdf0e10cSrcweir      */
120cdf0e10cSrcweir //    public String[] getTestMethodNames() {
121cdf0e10cSrcweir //        return new String[]
122cdf0e10cSrcweir //        { "checkTextDocument",
123cdf0e10cSrcweir //          "checkCalcDocument",
124cdf0e10cSrcweir //          "checkDrawDocument",
125cdf0e10cSrcweir //          "checkImpressDocument",
126cdf0e10cSrcweir //          "checkChartDocument",
127cdf0e10cSrcweir //          "checkMathDocument",
128cdf0e10cSrcweir //        };
129cdf0e10cSrcweir //    }
130cdf0e10cSrcweir 
131cdf0e10cSrcweir     //-------------------------------------------
132cdf0e10cSrcweir     /**
133cdf0e10cSrcweir      * creates the mebmer <CODE>m_xMSF</CODE> and <CODE>m_SOF</CODE>
134cdf0e10cSrcweir      * @short Create the environment for following tests.
135cdf0e10cSrcweir      * @descr create an empty test frame, where we can load
136cdf0e10cSrcweir      * different components inside.
137cdf0e10cSrcweir      */
138cdf0e10cSrcweir @Before public void before() {
139cdf0e10cSrcweir         // get uno service manager from global test environment
140cdf0e10cSrcweir         m_xMSF = getMSF();
141cdf0e10cSrcweir 
142cdf0e10cSrcweir         // create frame instance
143cdf0e10cSrcweir         try {
144cdf0e10cSrcweir             // get a soffice factory object
145cdf0e10cSrcweir             m_SOF = SOfficeFactory.getFactory(getMSF());
146cdf0e10cSrcweir 
147cdf0e10cSrcweir         } catch(java.lang.Throwable ex) {
148cdf0e10cSrcweir             fail("Could not create the XUserInputInterception instance.");
149cdf0e10cSrcweir         }
150cdf0e10cSrcweir     }
151cdf0e10cSrcweir 
152cdf0e10cSrcweir     //-------------------------------------------
153cdf0e10cSrcweir     /**
154cdf0e10cSrcweir      * closes the document
155cdf0e10cSrcweir      * @short close the document.
156cdf0e10cSrcweir      * @param xDoc the document to close
157cdf0e10cSrcweir      */
158cdf0e10cSrcweir     public void closeDoc(XInterface xDoc) {
159cdf0e10cSrcweir         XCloseable xClose = UnoRuntime.queryInterface(XCloseable.class, xDoc);
160cdf0e10cSrcweir         try {
161cdf0e10cSrcweir             xClose.close(false);
162cdf0e10cSrcweir         } catch(com.sun.star.util.CloseVetoException exVeto) {
163cdf0e10cSrcweir             System.out.println("document couldn't be closed successfully.");
164cdf0e10cSrcweir         }
165cdf0e10cSrcweir     }
166cdf0e10cSrcweir 
167cdf0e10cSrcweir     /**
168cdf0e10cSrcweir      * creates a text document and check the <CODE>XMouseClickHandler</CODE> and
169cdf0e10cSrcweir      * <CODE>XKeyHandler</CODE>
170cdf0e10cSrcweir      * @see com.sun.star.awt.XKeyHandler
171cdf0e10cSrcweir      * @see com.sun.star.awt.XMouseClickHandler
172cdf0e10cSrcweir      */
173cdf0e10cSrcweir     @Test public void checkTextDocument(){
174cdf0e10cSrcweir 
175cdf0e10cSrcweir         XTextDocument xDoc = null;
176cdf0e10cSrcweir 
177cdf0e10cSrcweir         try{
178cdf0e10cSrcweir             xDoc = m_SOF.createTextDoc("WriterTest");
179cdf0e10cSrcweir         } catch (com.sun.star.uno.Exception e){
180cdf0e10cSrcweir             fail("Could not create a text document: " +e.toString());
181cdf0e10cSrcweir         }
182cdf0e10cSrcweir 
183cdf0e10cSrcweir         checkListener(xDoc);
184cdf0e10cSrcweir 
185cdf0e10cSrcweir         closeDoc(xDoc);
186cdf0e10cSrcweir     }
187cdf0e10cSrcweir 
188cdf0e10cSrcweir     /**
189cdf0e10cSrcweir      * creates an impress document and check the <CODE>XMouseClickHandler</CODE> and
190cdf0e10cSrcweir      * <CODE>XKeyHandler</CODE>
191cdf0e10cSrcweir      * @see com.sun.star.awt.XKeyHandler
192cdf0e10cSrcweir      * @see com.sun.star.awt.XMouseClickHandler
193cdf0e10cSrcweir      */
194cdf0e10cSrcweir     @Test public void checkImpressDocument(){
195cdf0e10cSrcweir 
196cdf0e10cSrcweir         XComponent xDoc = null;
197cdf0e10cSrcweir 
198cdf0e10cSrcweir         try{
199cdf0e10cSrcweir             xDoc = m_SOF.createImpressDoc("ImpressTest");
200cdf0e10cSrcweir         } catch (com.sun.star.uno.Exception e){
201cdf0e10cSrcweir             fail("Could not create an impress document: " +e.toString());
202cdf0e10cSrcweir         }
203cdf0e10cSrcweir 
204cdf0e10cSrcweir         checkListener(xDoc);
205cdf0e10cSrcweir 
206cdf0e10cSrcweir         closeDoc(xDoc);
207cdf0e10cSrcweir     }
208cdf0e10cSrcweir 
209cdf0e10cSrcweir     /**
210cdf0e10cSrcweir      * creates a chart document and check the <CODE>XMouseClickHandler</CODE> and
211cdf0e10cSrcweir      * <CODE>XKeyHandler</CODE>
212cdf0e10cSrcweir      * @see com.sun.star.awt.XKeyHandler
213cdf0e10cSrcweir      * @see com.sun.star.awt.XMouseClickHandler
214cdf0e10cSrcweir      */
215cdf0e10cSrcweir // TODO!
216cdf0e10cSrcweir //    @Test public void checkChartDocument(){
217cdf0e10cSrcweir //
218cdf0e10cSrcweir //        XChartDocument xDoc = null;
219cdf0e10cSrcweir //
220cdf0e10cSrcweir //        try{
221cdf0e10cSrcweir //            xDoc = m_SOF.createChartDoc("ChartTest");
222cdf0e10cSrcweir //        } catch (com.sun.star.uno.Exception e){
223cdf0e10cSrcweir //            fail("Could not create a chart document: " +e.toString());
224cdf0e10cSrcweir //        }
225cdf0e10cSrcweir //
226cdf0e10cSrcweir //        checkListener(xDoc);
227cdf0e10cSrcweir //
228cdf0e10cSrcweir //        closeDoc(xDoc);
229cdf0e10cSrcweir //    }
230cdf0e10cSrcweir 
231cdf0e10cSrcweir     /**
232cdf0e10cSrcweir      * creates a math document and check the <CODE>XMouseClickHandler</CODE> and
233cdf0e10cSrcweir      * <CODE>XKeyHandler</CODE>
234cdf0e10cSrcweir      * @see com.sun.star.awt.XKeyHandler
235cdf0e10cSrcweir      * @see com.sun.star.awt.XMouseClickHandler
236cdf0e10cSrcweir      */
237cdf0e10cSrcweir     @Test public void checkMathDocument(){
238cdf0e10cSrcweir 
239cdf0e10cSrcweir         XComponent xDoc = null;
240cdf0e10cSrcweir 
241cdf0e10cSrcweir         try{
242cdf0e10cSrcweir             xDoc = m_SOF.createMathDoc("MathTest");
243cdf0e10cSrcweir         } catch (com.sun.star.uno.Exception e){
244cdf0e10cSrcweir             fail("Could not create a math document: " +e.toString());
245cdf0e10cSrcweir         }
246cdf0e10cSrcweir 
247cdf0e10cSrcweir         checkListener(xDoc);
248cdf0e10cSrcweir 
249cdf0e10cSrcweir         closeDoc(xDoc);
250cdf0e10cSrcweir     }
251cdf0e10cSrcweir 
252cdf0e10cSrcweir     /**
253cdf0e10cSrcweir      * creates a draw document and check the <CODE>XMouseClickHandler</CODE> and
254cdf0e10cSrcweir      * <CODE>XKeyHandler</CODE>
255cdf0e10cSrcweir      * @see com.sun.star.awt.XKeyHandler
256cdf0e10cSrcweir      * @see com.sun.star.awt.XMouseClickHandler
257cdf0e10cSrcweir      */
258cdf0e10cSrcweir     @Test public void checkDrawDocument(){
259cdf0e10cSrcweir 
260cdf0e10cSrcweir         XComponent xDoc = null;
261cdf0e10cSrcweir 
262cdf0e10cSrcweir         try{
263cdf0e10cSrcweir             xDoc = m_SOF.createDrawDoc("DrawTest");
264cdf0e10cSrcweir         } catch (com.sun.star.uno.Exception e){
265cdf0e10cSrcweir             fail("Could not create a draw document: " +e.toString());
266cdf0e10cSrcweir         }
267cdf0e10cSrcweir 
268cdf0e10cSrcweir         checkListener(xDoc);
269cdf0e10cSrcweir 
270cdf0e10cSrcweir         closeDoc(xDoc);
271cdf0e10cSrcweir     }
272cdf0e10cSrcweir 
273cdf0e10cSrcweir     /**
274cdf0e10cSrcweir      * creates a calc document and check the <CODE>XMouseClickHandler</CODE> and
275cdf0e10cSrcweir      * <CODE>XKeyHandler</CODE>
276cdf0e10cSrcweir      * @see com.sun.star.awt.XKeyHandler
277cdf0e10cSrcweir      * @see com.sun.star.awt.XMouseClickHandler
278cdf0e10cSrcweir      */
279cdf0e10cSrcweir     @Test public void checkCalcDocument(){
280cdf0e10cSrcweir 
281cdf0e10cSrcweir         XSpreadsheetDocument xDoc = null;
282cdf0e10cSrcweir 
283cdf0e10cSrcweir         try{
284cdf0e10cSrcweir             xDoc = m_SOF.createCalcDoc("CalcTest");
285cdf0e10cSrcweir         } catch (com.sun.star.uno.Exception e){
286cdf0e10cSrcweir             fail("Could not create a calc document: " +e.toString());
287cdf0e10cSrcweir         }
288cdf0e10cSrcweir 
289cdf0e10cSrcweir         checkListener(xDoc);
290cdf0e10cSrcweir         closeDoc(xDoc);
291cdf0e10cSrcweir     }
292cdf0e10cSrcweir 
293cdf0e10cSrcweir     /**
294cdf0e10cSrcweir      * This is the central test method. It is called by ceck[DOCTYPE]Document. It
295cdf0e10cSrcweir      * creates the <CODE>XUserInputInterception</CODE> from the document and call the
296cdf0e10cSrcweir      * <CODE>checkMouseListener</CODE> test and the <CODE>checkKeyListener</CODE> test
297cdf0e10cSrcweir      * @param xDoc the document to test
298cdf0e10cSrcweir      */
299cdf0e10cSrcweir     private void checkListener(XInterface xDoc){
300cdf0e10cSrcweir 
301cdf0e10cSrcweir         XModel xModel = UnoRuntime.queryInterface(XModel.class, xDoc);
302cdf0e10cSrcweir 
303cdf0e10cSrcweir         XUserInputInterception xUII = getUII(xModel);
304cdf0e10cSrcweir 
305cdf0e10cSrcweir         checkMouseListener(xUII, xModel);
306cdf0e10cSrcweir         checkKeyListener(xUII, xModel);
307cdf0e10cSrcweir     }
308cdf0e10cSrcweir 
309cdf0e10cSrcweir     /**
310cdf0e10cSrcweir      * Creates a <CODE>MyKeyHandler</CODE> and adds it to the
311cdf0e10cSrcweir      * <CODE>XUserInputInterception</CODE>. Then an <CODE>EventTrigger</CODE> thread
312cdf0e10cSrcweir      * was created and started.
313cdf0e10cSrcweir      * Has <CODE>OK</CODE> if the members <CODE>m_keyPressed</CODE> and
314cdf0e10cSrcweir      * <CODE>m_keyReleased</CODE> are <CODE>TRUE</CODE>
315cdf0e10cSrcweir      * @param xUII the XUserInputInterception
316cdf0e10cSrcweir      * @param xModel the XModel of a document
317cdf0e10cSrcweir      * @see EventTest.MyKeyHander
318cdf0e10cSrcweir      * @see EventTest.EventTrigger
319cdf0e10cSrcweir      */
320cdf0e10cSrcweir     private void checkKeyListener(XUserInputInterception xUII, XModel xModel) {
321cdf0e10cSrcweir         m_keyPressed = false;
322cdf0e10cSrcweir         m_keyReleased = false;
323cdf0e10cSrcweir 
324cdf0e10cSrcweir         MyKeyHandler keyListener = new MyKeyHandler();
325cdf0e10cSrcweir 
326cdf0e10cSrcweir         xUII.addKeyHandler(keyListener);
327cdf0e10cSrcweir 
328cdf0e10cSrcweir         System.out.println("starting thread to check the key listener...");
329cdf0e10cSrcweir         EventTrigger et = new EventTrigger(xModel, EventTriggerType.KEY_TEXT_INTO_DOC);
330cdf0e10cSrcweir 
331cdf0e10cSrcweir         et.run();
332cdf0e10cSrcweir 
333cdf0e10cSrcweir         util.utils.shortWait(m_threadWait);
334cdf0e10cSrcweir         System.out.println("key listener thread should be finished.");
335cdf0e10cSrcweir 
336cdf0e10cSrcweir         assertTrue("key event does not work!", m_keyPressed && m_keyReleased);
337cdf0e10cSrcweir         xUII.removeKeyHandler(keyListener);
338cdf0e10cSrcweir 
339cdf0e10cSrcweir     }
340cdf0e10cSrcweir 
341cdf0e10cSrcweir     /**
342cdf0e10cSrcweir      * Creates a <CODE>MyMouseClickHandler</CODE> and adds it to the
343cdf0e10cSrcweir      * <CODE>XUserInputInterception</CODE>. Then an <CODE>EventTrigger</CODE> thread
344cdf0e10cSrcweir      * was created and started.
345cdf0e10cSrcweir      * Has <CODE>OK</CODE> if the members <CODE>m_mousePressed</CODE> and
346cdf0e10cSrcweir      * <CODE>m_mouseReleased</CODE> are <CODE>TRUE</CODE>
347cdf0e10cSrcweir      * @param xUII the XUserInputInterception
348cdf0e10cSrcweir      * @param xModel the XModel of a document
349cdf0e10cSrcweir      * @see EventTest.MyMouseClickHander
350cdf0e10cSrcweir      * @see EventTest.EventTrigger
351cdf0e10cSrcweir      */
352cdf0e10cSrcweir 
353cdf0e10cSrcweir     private void checkMouseListener(XUserInputInterception xUII, XModel xModel) {
354cdf0e10cSrcweir 
355cdf0e10cSrcweir         m_mousePressed = false;
356cdf0e10cSrcweir         m_mouseReleased = false;
357cdf0e10cSrcweir 
358cdf0e10cSrcweir         MyMouseClickHandler mouseListener = new MyMouseClickHandler();
359cdf0e10cSrcweir 
360cdf0e10cSrcweir         xUII.addMouseClickHandler(mouseListener);
361cdf0e10cSrcweir 
362cdf0e10cSrcweir         System.out.println("starting thread to check the mouse listener...");
363cdf0e10cSrcweir         EventTrigger et = new EventTrigger(xModel, EventTriggerType.MOUSE_KLICK_INTO_DOC);
364cdf0e10cSrcweir 
365cdf0e10cSrcweir         et.run();
366cdf0e10cSrcweir 
367cdf0e10cSrcweir         util.utils.shortWait(m_threadWait);
368cdf0e10cSrcweir         System.out.println("mouse listener thread should be finished.");
369cdf0e10cSrcweir 
370cdf0e10cSrcweir         assertTrue("mouse event does not work!", m_mousePressed && m_mouseReleased);
371cdf0e10cSrcweir         xUII.removeMouseClickHandler(mouseListener);
372cdf0e10cSrcweir     }
373cdf0e10cSrcweir 
374cdf0e10cSrcweir     /**
375cdf0e10cSrcweir      * returns the <CODE>XUserInputInterception</CODE> from the <CODE>XMdoel</CODE>
376cdf0e10cSrcweir      * @param xModel the XModel of a document
377cdf0e10cSrcweir      * @return the <CODE>XUserInputInterception</CODE> of the document
378cdf0e10cSrcweir      */
379cdf0e10cSrcweir     private XUserInputInterception getUII(XModel xModel){
380cdf0e10cSrcweir 
381cdf0e10cSrcweir         XController xController = xModel.getCurrentController();
382cdf0e10cSrcweir 
383cdf0e10cSrcweir         XUserInputInterception xUII = UnoRuntime.queryInterface(XUserInputInterception.class, xController);
384cdf0e10cSrcweir         if (xUII == null) {
385cdf0e10cSrcweir             fail("could not get XUserInputInterception from XContoller");
386cdf0e10cSrcweir         }
387cdf0e10cSrcweir          return xUII;
388cdf0e10cSrcweir     }
389cdf0e10cSrcweir 
390cdf0e10cSrcweir     /**
391cdf0e10cSrcweir      * Listener which added and its method must be called
392cdf0e10cSrcweir      * on <code>keyPressed</code> and <code>keyReleased</code> call.
393cdf0e10cSrcweir      */
394cdf0e10cSrcweir     public class MyKeyHandler implements XKeyHandler {
395cdf0e10cSrcweir         /**
396cdf0e10cSrcweir          * This event sets the member <code>m_keyPressed</coed> to
397cdf0e10cSrcweir          *  <code>true</code>
398cdf0e10cSrcweir          * @param oEvent The key event informs about the pressed key.
399cdf0e10cSrcweir          * @return returns <CODE>TRUE</CODE> in erery case
400cdf0e10cSrcweir          */
401cdf0e10cSrcweir         public boolean keyPressed( KeyEvent oEvent ){
402cdf0e10cSrcweir             System.out.println("XKeyHandler: keyPressed-Event");
403cdf0e10cSrcweir             m_keyPressed = true;
404cdf0e10cSrcweir             return true;
405cdf0e10cSrcweir         }
406cdf0e10cSrcweir         /**
407cdf0e10cSrcweir          * This event sets the member <code>m_keyReleased</coed> to
408cdf0e10cSrcweir          *  <code>true</code>
409cdf0e10cSrcweir          * @param oEvent The key event informs about the pressed key.
410cdf0e10cSrcweir          * @return returns <CODE>TRUE</CODE> in erery case
411cdf0e10cSrcweir          */
412cdf0e10cSrcweir         public boolean keyReleased( KeyEvent oEvent ){
413cdf0e10cSrcweir             System.out.println("XKeyHandler: keyReleased-Event");
414cdf0e10cSrcweir             m_keyReleased = true;
415cdf0e10cSrcweir             return true;
416cdf0e10cSrcweir         }
417cdf0e10cSrcweir         /**
418cdf0e10cSrcweir          * This event does nothing usefull
419cdf0e10cSrcweir          * @param oEvent refers to the object that fired the event.
420cdf0e10cSrcweir          */
421cdf0e10cSrcweir         public void disposing( EventObject oEvent ){
422cdf0e10cSrcweir             System.out.println("XKeyHandler: disposing-Event");
423cdf0e10cSrcweir         }
424cdf0e10cSrcweir     }
425cdf0e10cSrcweir 
426cdf0e10cSrcweir     /**
427cdf0e10cSrcweir      * Listener which added and its method must be called
428cdf0e10cSrcweir      * on <code>mousePressed</code> and <code>mouseReleased</code> call.
429cdf0e10cSrcweir      */
430cdf0e10cSrcweir     public class MyMouseClickHandler implements XMouseClickHandler {
431cdf0e10cSrcweir         /**
432cdf0e10cSrcweir          * This event sets the member <code>m_mousePressed</coed> to
433cdf0e10cSrcweir          *  <code>true</code>
434cdf0e10cSrcweir          * @param oEvent The mouse event informs about the kind of mouse event.
435cdf0e10cSrcweir          * @return returns <CODE>TRUE</CODE> in erery case
436cdf0e10cSrcweir          */
437cdf0e10cSrcweir         public boolean mousePressed( MouseEvent oEvent ){
438cdf0e10cSrcweir             System.out.println("XMouseClickHandler: mousePressed-Event");
439cdf0e10cSrcweir             m_mousePressed = true;
440cdf0e10cSrcweir             return true;
441cdf0e10cSrcweir         }
442cdf0e10cSrcweir         /**
443cdf0e10cSrcweir          * This event sets the member <code>m_mouseReleased</coed> to
444cdf0e10cSrcweir          *  <code>true</code>
445cdf0e10cSrcweir          * @param oEvent The mouse event informs about the kind of mouse event.
446cdf0e10cSrcweir          * @return returns <CODE>TRUE</CODE> in erery case
447cdf0e10cSrcweir          */
448cdf0e10cSrcweir         public boolean mouseReleased( MouseEvent oEvent ){
449cdf0e10cSrcweir             System.out.println("XMouseClickHandler: mouseReleased-Event");
450cdf0e10cSrcweir             m_mouseReleased = true;
451cdf0e10cSrcweir             return true;
452cdf0e10cSrcweir         }
453cdf0e10cSrcweir         /**
454cdf0e10cSrcweir          * This event does nothing usefull
455cdf0e10cSrcweir          * @param oEvent refers to the object that fired the event.
456cdf0e10cSrcweir          */
457cdf0e10cSrcweir         public void disposing( EventObject oEvent ){
458cdf0e10cSrcweir             System.out.println("XMouseClickHandler: disposing-Event");
459cdf0e10cSrcweir         }
460cdf0e10cSrcweir     };
461cdf0e10cSrcweir 
462cdf0e10cSrcweir     /**
463cdf0e10cSrcweir      * To check the events this class is a thread which click a mouse button and
464cdf0e10cSrcweir      * press a key with the <CODE>Robot</CODE> class
465cdf0e10cSrcweir      * @see java.awt.Robot
466cdf0e10cSrcweir      */
467cdf0e10cSrcweir     private class EventTrigger extends Thread{
468cdf0e10cSrcweir 
469cdf0e10cSrcweir         /**
470cdf0e10cSrcweir          * represents a <CODE>AccessibilityTools</CODE>
471cdf0e10cSrcweir          */
472cdf0e10cSrcweir         private final AccessibilityTools at = new AccessibilityTools();
473cdf0e10cSrcweir         /**
474cdf0e10cSrcweir          * represents an <CODE>EventType</CODE>
475cdf0e10cSrcweir          * @see EventTest.EventTriggerType
476cdf0e10cSrcweir          */
477cdf0e10cSrcweir         private int eventType = 0;
478cdf0e10cSrcweir         /**
479cdf0e10cSrcweir          * represents a <CODE>XModel</CODE> of a document
480cdf0e10cSrcweir          */
481cdf0e10cSrcweir         private XModel xModel = null;
482cdf0e10cSrcweir 
483cdf0e10cSrcweir         /**
484cdf0e10cSrcweir          * Creates an instacne of this class. The parameter <CODE>eType</CODE> represents
485cdf0e10cSrcweir          * the kind of event wich will be triggert at <CODE>run()</CODE>
486cdf0e10cSrcweir          * @param model the model of a document
487cdf0e10cSrcweir          * @param eType the kind of event which should be trigger
488cdf0e10cSrcweir          */
489cdf0e10cSrcweir         public EventTrigger(XModel model, int eType)
490cdf0e10cSrcweir         {
491cdf0e10cSrcweir             this.xModel = model;
492cdf0e10cSrcweir             this.eventType = eType;
493cdf0e10cSrcweir         }
494cdf0e10cSrcweir 
495cdf0e10cSrcweir         /**
496cdf0e10cSrcweir          * Triggers the event wich is represented by <CODE>eventType</CODE>
497cdf0e10cSrcweir          * The scenarios are:
498cdf0e10cSrcweir          * <ul>
499cdf0e10cSrcweir          *    <li>EventTest.EventTriggerType.MOUSE_KLICK_INTO_DOC
500cdf0e10cSrcweir          *        which calls
501cdf0e10cSrcweir          *        <li><CODE>clickIntoDoc</CODE></LI>
502cdf0e10cSrcweir          *        </LI>
503cdf0e10cSrcweir          *    <li>EventTest.EventTriggerType.KEY_TEXT_INTO_DOC
504cdf0e10cSrcweir          *        which calls
505cdf0e10cSrcweir          *            <li><CODE>clickIntodoc</CODE></LI>
506cdf0e10cSrcweir          *            <li><CODE>keyIntoDoc</CODE></LI>
507cdf0e10cSrcweir          *    </LI>
508cdf0e10cSrcweir          * </UL>
509cdf0e10cSrcweir          */
510cdf0e10cSrcweir         public void run(){
511cdf0e10cSrcweir 
512cdf0e10cSrcweir             switch (this.eventType){
513cdf0e10cSrcweir 
514cdf0e10cSrcweir                 case EventTriggerType.MOUSE_KLICK_INTO_DOC:
515cdf0e10cSrcweir                     clickIntoDoc();
516cdf0e10cSrcweir                     break;
517cdf0e10cSrcweir                 case EventTriggerType.KEY_TEXT_INTO_DOC:
518cdf0e10cSrcweir                     clickIntoDoc();
519cdf0e10cSrcweir                     keyIntoDoc();
520cdf0e10cSrcweir                     break;
521cdf0e10cSrcweir 
522cdf0e10cSrcweir             }
523cdf0e10cSrcweir         }
524cdf0e10cSrcweir         /**
525cdf0e10cSrcweir          * This method cklicks into the middel of a document. It uses Accessibility
526cdf0e10cSrcweir          * to get the document and query for its position and its range to calculate
527cdf0e10cSrcweir          * the middle. This values was used for <CODE>Robot</CODE> Class. This
528cdf0e10cSrcweir          * Robot class is able to move the mouse and to cklick a mouse button
529cdf0e10cSrcweir          * @see java.awt.Robot
530cdf0e10cSrcweir         */
531cdf0e10cSrcweir         private void clickIntoDoc(){
532cdf0e10cSrcweir             try{
533cdf0e10cSrcweir                 // get the position and the range of a scroll bar
534cdf0e10cSrcweir 
535cdf0e10cSrcweir                 XWindow xWindow = at.getCurrentWindow(
536cdf0e10cSrcweir                                           getMSF(),
537cdf0e10cSrcweir                                           xModel);
538cdf0e10cSrcweir 
539cdf0e10cSrcweir                 XAccessible xRoot = at.getAccessibleObject(xWindow);
540cdf0e10cSrcweir 
541cdf0e10cSrcweir 
542cdf0e10cSrcweir 
543cdf0e10cSrcweir                 XAccessibleContext xPanel = at.getAccessibleObjectForRole(xRoot, AccessibleRole.PANEL);
544cdf0e10cSrcweir                 XAccessibleComponent xPanelCont = UnoRuntime.queryInterface(XAccessibleComponent.class, xPanel);
545cdf0e10cSrcweir 
546cdf0e10cSrcweir                 // the position of the panel
547cdf0e10cSrcweir                 Point point = xPanelCont.getLocationOnScreen();
548cdf0e10cSrcweir 
549cdf0e10cSrcweir                 // the range of the panel
550cdf0e10cSrcweir                 Rectangle rect = xPanelCont.getBounds();
551cdf0e10cSrcweir 
552cdf0e10cSrcweir                 try {
553cdf0e10cSrcweir                     Robot rob = new Robot();
554cdf0e10cSrcweir                     int x = point.X + (rect.Width / 2);
555cdf0e10cSrcweir                     int y = point.Y + (rect.Height / 2);
556cdf0e10cSrcweir                     System.out.println("try to klick into the middle of the document");
557cdf0e10cSrcweir                     rob.mouseMove(x, y);
558cdf0e10cSrcweir                     rob.mousePress(InputEvent.BUTTON1_MASK);
559cdf0e10cSrcweir                     rob.mouseRelease(InputEvent.BUTTON1_MASK);
560cdf0e10cSrcweir                 } catch (java.awt.AWTException e) {
561cdf0e10cSrcweir                     System.out.println("couldn't press mouse button");
562cdf0e10cSrcweir                 }
563cdf0e10cSrcweir             } catch (java.lang.Exception e){
564cdf0e10cSrcweir                 System.out.println("could not click into the scroll bar: " + e.toString());
565cdf0e10cSrcweir             }
566cdf0e10cSrcweir         }
567cdf0e10cSrcweir 
568cdf0e10cSrcweir         /**
569cdf0e10cSrcweir          * This method press the "A" key. Therefore it uses the <CODE>Robot</CODE>
570cdf0e10cSrcweir          * class.
571cdf0e10cSrcweir          * @see java.awt.Robot
572cdf0e10cSrcweir         */
573cdf0e10cSrcweir         private void keyIntoDoc(){
574cdf0e10cSrcweir             try {
575cdf0e10cSrcweir                 Robot rob = new Robot();
576cdf0e10cSrcweir                 System.out.println("try to press 'A'");
577cdf0e10cSrcweir                 rob.keyPress(java.awt.event.KeyEvent.VK_A);
578cdf0e10cSrcweir                 rob.keyRelease(java.awt.event.KeyEvent.VK_A);
579cdf0e10cSrcweir             } catch (java.awt.AWTException e) {
580cdf0e10cSrcweir                 System.out.println("couldn't press key");
581cdf0e10cSrcweir             }
582cdf0e10cSrcweir 
583cdf0e10cSrcweir         }
584cdf0e10cSrcweir     }
585cdf0e10cSrcweir 
586cdf0e10cSrcweir     /** This interface represents all possible actions which could be used
587cdf0e10cSrcweir      * in the <CODE>EventTrigger</CODE> class.
588cdf0e10cSrcweir      * @see EventTest.EventTrigger
589cdf0e10cSrcweir     */
590cdf0e10cSrcweir     private interface EventTriggerType{
591cdf0e10cSrcweir 
592cdf0e10cSrcweir         /** klick the mouse into the scroll bar*/
593cdf0e10cSrcweir         final public static int MOUSE_KLICK_INTO_DOC = 1;
594cdf0e10cSrcweir 
595cdf0e10cSrcweir         /** write some text into a spread sheet*/
596cdf0e10cSrcweir         final public static int KEY_TEXT_INTO_DOC = 2;
597cdf0e10cSrcweir     }
598cdf0e10cSrcweir 
599cdf0e10cSrcweir 
600cdf0e10cSrcweir 
601cdf0e10cSrcweir 
602cdf0e10cSrcweir     private XMultiServiceFactory getMSF()
603cdf0e10cSrcweir     {
604cdf0e10cSrcweir         final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager());
605cdf0e10cSrcweir         return xMSF1;
606cdf0e10cSrcweir     }
607cdf0e10cSrcweir 
608cdf0e10cSrcweir     // setup and close connections
609cdf0e10cSrcweir     @BeforeClass public static void setUpConnection() throws Exception {
610cdf0e10cSrcweir         System.out.println("setUpConnection()");
611cdf0e10cSrcweir         connection.setUp();
612cdf0e10cSrcweir     }
613cdf0e10cSrcweir 
614cdf0e10cSrcweir     @AfterClass public static void tearDownConnection()
615cdf0e10cSrcweir         throws InterruptedException, com.sun.star.uno.Exception
616cdf0e10cSrcweir     {
617cdf0e10cSrcweir         System.out.println("tearDownConnection()");
618cdf0e10cSrcweir         connection.tearDown();
619cdf0e10cSrcweir     }
620cdf0e10cSrcweir 
621cdf0e10cSrcweir     private static final OfficeConnection connection = new OfficeConnection();
622cdf0e10cSrcweir 
623cdf0e10cSrcweir }