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 ifc.awt;
25 
26 import com.sun.star.awt.FocusEvent;
27 import com.sun.star.awt.KeyEvent;
28 import com.sun.star.awt.MouseEvent;
29 import com.sun.star.awt.PaintEvent;
30 import com.sun.star.awt.Point;
31 import com.sun.star.awt.PosSize;
32 import com.sun.star.awt.Rectangle;
33 import com.sun.star.awt.Size;
34 import com.sun.star.awt.WindowEvent;
35 import com.sun.star.awt.XFocusListener;
36 import com.sun.star.awt.XKeyListener;
37 import com.sun.star.awt.XMouseListener;
38 import com.sun.star.awt.XMouseMotionListener;
39 import com.sun.star.awt.XPaintListener;
40 import com.sun.star.awt.XWindow;
41 import com.sun.star.awt.XWindowListener;
42 import com.sun.star.drawing.XControlShape;
43 import com.sun.star.lang.EventObject;
44 import lib.MultiMethodTest;
45 import util.ValueComparer;
46 
47 /**
48 * Testing <code>com.sun.star.awt.XWindow</code>
49 * interface methods :
50 * <ul>
51 *  <li><code> setPosSize()</code></li>
52 *  <li><code> getPosSize()</code></li>
53 *  <li><code> setVisible()</code></li>
54 *  <li><code> setEnable()</code></li>
55 *  <li><code> setFocus()</code></li>
56 *  <li><code> addWindowListener()</code></li>
57 *  <li><code> removeWindowListener()</code></li>
58 *  <li><code> addFocusListener()</code></li>
59 *  <li><code> removeFocusListener()</code></li>
60 *  <li><code> addKeyListener()</code></li>
61 *  <li><code> removeKeyListener()</code></li>
62 *  <li><code> addMouseListener()</code></li>
63 *  <li><code> removeMouseListener()</code></li>
64 *  <li><code> addMouseMotionListener()</code></li>
65 *  <li><code> removeMouseMotionListener()</code></li>
66 *  <li><code> addPaintListener()</code></li>
67 *  <li><code> removePaintListener()</code></li>
68 * </ul> <p>
69 * This test needs the following object relations :
70 * <ul>
71 *  <li> <code>'XWindow.AnotherWindow'</code> (of type <code>XWindow</code>):
72 *   Some another window which can gain focus so the tested one
73 *   must lost it. </li>
74 *  <li> <code>'XWindow.ControlShape'</code> <b>optional</b>
75 *   (of type <code>XControlShape</code>):
76 *   Some shapes cann't change their size within fixed ControlShape
77 *   and their size could be changed only if size of container
78 *   ControlShape is changed. For such shapes this relation should
79 *   be passed for proper <code>addWindowListener</code> test. </li>
80 * </ul> <p>
81 * Test is <b> NOT </b> multithread compilant. <p>
82 * @see com.sun.star.awt.XWindow
83 */
84 public class _XWindow extends MultiMethodTest {
85     public XWindow oObj = null;
86     private Rectangle posSize = null ;
87     private XWindow win = null;
88 
89     /**
90     * Test calls the method. <p>
91     * Has <b> OK </b> status if the method does not return null.
92     */
_getPosSize()93     public void _getPosSize() {
94         posSize = oObj.getPosSize() ;
95         tRes.tested("getPosSize()", posSize != null) ;
96     }
97 
98     /**
99     * After defining Rectangle structure to be set, test calls the method. <p>
100     * Has <b> OK </b> status if structure obtained using getPosSize() is
101     * equal to structure previously set using setPosSize(). <p>
102     * The following method tests are to be completed successfully before :
103     * <ul>
104     *  <li> <code> getPosSize() </code> :  returns the outer bounds of
105     *  the window </li>
106     * </ul>
107     */
_setPosSize()108     public void _setPosSize() {
109         Rectangle newRec = new Rectangle();
110 
111         requiredMethod("getPosSize()");
112         newRec.X = posSize.X + 1;
113         newRec.Y = posSize.Y + 1;
114         newRec.Width = posSize.Width - 3;
115         newRec.Height = posSize.Height - 3;
116         oObj.setPosSize(newRec.X, newRec.Y, newRec.Width, newRec.Height,
117             PosSize.POSSIZE);
118         Rectangle gPS = oObj.getPosSize();
119         log.println("Was : (" + posSize.X + ", " + posSize.Y + ", " +
120             posSize.Width + ", " + posSize.Height + "), ");
121         log.println("Set : (" + newRec.X + ", " + newRec.Y + ", " +
122             newRec.Width + ", " + newRec.Height + "), ");
123         log.println("Get : (" + gPS.X + ", " + gPS.Y + ", " +
124             gPS.Width + ", " + gPS.Height + "). ");
125         tRes.tested("setPosSize()", ValueComparer.equalValue(newRec, gPS) );
126     }
127 
128     /**
129     * At first object relation 'XWindow.AnotherWindow' is obtained.
130     * Then test calls the methods of two 'XWindow' objects several times to be
131     * sure that the focus has changed. <p>
132     * Has <b> OK </b> status if the method successfully returns
133     * and no exceptions were thrown.
134     */
_setFocus()135     public void _setFocus() {
136         win = (XWindow) tEnv.getObjRelation("XWindow.AnotherWindow");
137         oObj.setFocus();
138         win.setFocus();
139         oObj.setFocus();
140         tRes.tested("setFocus()", true);
141     }
142 
143     /**
144     * Test calls the method twice with two parameters: 'true' and 'false'. <p>
145     * Has <b> OK </b> status if the method successfully returns
146     * and no exceptions were thrown.
147     */
_setVisible()148     public void _setVisible() {
149         oObj.setVisible(false);
150         oObj.setVisible(true);
151         tRes.tested("setVisible()", true);
152     }
153 
154     /**
155     * Test calls the method twice with two parameters: 'true' and 'false'. <p>
156     * Has <b> OK </b> status if the method successfully returns
157     * and no exceptions were thrown.
158     */
_setEnable()159     public void _setEnable() {
160         oObj.setEnable(false);
161         oObj.setEnable(true);
162         tRes.tested("setEnable()", true);
163     }
164 
165 
166     /**
167     * A class we use to test addWindowListener() and
168     * removeWindowListener()
169     */
170     public class TestWindowListener implements XWindowListener {
171         public boolean resized = false ;
172         public boolean moved = false ;
173         public boolean hidden = false ;
174         public boolean shown = false ;
175 
init()176         public void init() {
177             resized = false ;
178             moved = false ;
179             hidden = false ;
180             shown = false ;
181         }
182 
windowResized(WindowEvent e)183         public void windowResized(WindowEvent e) {
184             resized = true ;
185         }
windowMoved(WindowEvent e)186         public void windowMoved(WindowEvent e) {
187             moved = true ;
188         }
windowHidden(EventObject e)189         public void windowHidden(EventObject e) {
190             hidden = true ;
191         }
windowShown(EventObject e)192         public void windowShown(EventObject e) {
193             shown = true ;
194         }
disposing(EventObject e)195         public void disposing(EventObject e) {}
196 
197     }
198 
199     private TestWindowListener wListener = new TestWindowListener() ;
200 
201 
202     /**
203     * Test calls the method. Then we check if listener's methods were called
204     * when we move, resize, hide and show the window. The resizing is
205     * performed depending on 'XWindow.ControlShape' existence. If this
206     * relation exists then the size and position of container control
207     * shape is changed, else the position and size of window itself is
208     * chaged<p>
209     *
210     * Has <b> OK </b> status if methods of wListener were called when
211     * corresponding events occurred. <p>
212     *
213     * The following method tests are to be executed before :
214     * <ul>
215     *  <li> <code> setPosSize() </code>: sets the outer bounds of the
216     *  window</li>
217     *  <li> <code> setVisible() </code>: shows or hides the window
218     *  depending on the parameter</li>
219     * </ul>
220     */
_addWindowListener()221     public void _addWindowListener() {
222         executeMethod("setPosSize()");
223         executeMethod("setVisible()");
224         boolean result = true ;
225 
226         oObj.addWindowListener(wListener);
227 
228         // testing wListener.windowMoved()
229         XControlShape ctrlShape = (XControlShape)
230             tEnv.getObjRelation("XWindow.ControlShape");
231         log.println("change object position and size...");
232 
233         if (ctrlShape != null) {
234             try {
235                 Size sz = ctrlShape.getSize();
236                 sz.Height += 100;
237                 ctrlShape.setSize(sz);
238                 Point pos = ctrlShape.getPosition();
239                 pos.X += 100 ;
240                 ctrlShape.setPosition(pos);
241             } catch (com.sun.star.beans.PropertyVetoException e) {
242                 log.println("Couldn't change size or position: ");
243                 e.printStackTrace(log);
244             }
245         } else {
246             oObj.setPosSize(posSize.X + 2, 0, 0, 0, PosSize.X);
247             oObj.setPosSize(0, 0, 100, 100, PosSize.WIDTH);
248         }
249 
250         shortWait();
251         boolean res = wListener.resized && wListener.moved &&
252             !wListener.hidden && !wListener.shown;
253         result &= res;
254         if (!res) {
255             log.println("\twindowHidden()  wasn't called: " + !wListener.hidden);
256             log.println("\twindowShown()   wasn't called: " + !wListener.shown);
257             log.println("\twindowResized()    was called: " + wListener.resized);
258             log.println("\twindowMoved()      was called: " + wListener.moved);
259         } else {
260             log.println("windowMoved() and windowResized() was called");
261         }
262 
263         // testing wListener.windowHidden()
264         wListener.init();
265         shortWait();
266         log.println("set object invisible...");
267         oObj.setVisible(false);
268         shortWait();
269         res = wListener.hidden && !wListener.resized
270                         && !wListener.moved && !wListener.shown;
271         result &= res;
272         if (!res) {
273             log.println("\twindowHidden()     was called: " + wListener.hidden);
274             log.println("\twindowShown()   wasn't called: " + !wListener.shown);
275             log.println("\twindowResized() wasn't called: " + !wListener.resized);
276             log.println("\twindowMoved()   wasn't called: " + !wListener.moved);
277         } else {
278             log.println("windowHidden() was called");
279         }
280 
281         // testing wListener.windowShown()
282         wListener.init() ;
283         shortWait();
284         log.println("set object visible...");
285         oObj.setVisible(true) ;
286         shortWait();
287         res = wListener.shown && !wListener.resized &&
288                 !wListener.hidden && !wListener.moved;
289         result &= res;
290         if (!res) {
291             log.println("\twindowHidden()  wasn't called: " + !wListener.hidden);
292             log.println("\twindowShown()      was called: " + wListener.shown);
293             log.println("\twindowResized() wasn't called: " + !wListener.resized);
294             log.println("\twindowMoved()   wasn't called: " + !wListener.moved);
295         } else {
296             log.println("windowShown() was called");
297         }
298 
299         tRes.tested("addWindowListener()", result) ;
300     }
301 
302 
303     /**
304     * Test calls the method. Then we change window and check that listener's
305     * methods were not called. <p>
306     * Has <b> OK </b> status if listener does not react on window events.<p>
307     * The following method tests are to be completed successfully before :
308     * <ul>
309     *  <li> <code> addWindowListener() </code>: adds window listener to the
310     *  object </li>
311     * </ul>
312     */
_removeWindowListener()313     public void _removeWindowListener() {
314         requiredMethod("addWindowListener()");
315         oObj.removeWindowListener(wListener);
316         wListener.init();
317         oObj.setPosSize(posSize.X, posSize.Y,
318             posSize.Width , posSize.Height, PosSize.POSSIZE);
319         oObj.setVisible(false);
320         oObj.setVisible(true);
321         boolean res = !(wListener.resized || wListener.moved
322             || wListener.hidden || wListener.shown);
323 
324         tRes.tested("removeWindowListener()", res);
325     }
326 
327     /**
328     * A class we use to test addFocusListener() and
329     * removeFocusListener()
330     */
331     public class TestFocusListener implements XFocusListener {
332         public boolean gained = false ;
333         public boolean lost = false ;
334 
focusGained(FocusEvent e)335         public void focusGained(FocusEvent e) {
336             gained = true ;
337         }
focusLost(FocusEvent e)338         public void focusLost(FocusEvent e) {
339             lost = true ;
340         }
init()341         public void init() {
342             gained = false;
343             lost = false;
344         }
disposing(EventObject e)345         public void disposing(EventObject e) {}
346 
347     }
348 
349     private TestFocusListener fListener = new TestFocusListener();
350 
351     /**
352     * Test calls the method. Then we change focus and check that listener's
353     * methods were called. <p>
354     * Has <b> OK </b> status if methods of fListener were called when
355     * corresponding events occurred. <p>
356     * The following method tests are to be completed successfully before :
357     * <ul>
358     *  <li> <code> setFocus() </code>: sets the focus to the window </li>
359     * </ul>
360     */
_addFocusListener()361     public void _addFocusListener() {
362         boolean result = true ;
363 
364         requiredMethod("setFocus()");
365         oObj.addFocusListener(fListener) ;
366 
367         // testing fListener.lost()
368         oObj.setFocus();
369         shortWait();
370         win.setFocus();
371         shortWait();
372         result &= fListener.lost;
373         if (!fListener.lost) {
374             log.println("Lost focus was not notified about") ;
375         }
376 
377         // testing fListener.gained()
378         oObj.setFocus() ;
379         shortWait();
380         result &= fListener.gained;
381         if (!fListener.gained) {
382             log.println("Gained focus was not notified about") ;
383         }
384 
385         tRes.tested("addFocusListener()", result) ;
386     }
387 
388     /**
389     * Test calls the method. Then we change focus and check that listener's
390     * methods were not called. <p>
391     * Has <b> OK </b> status if listener does not react on focus changing. <p>
392     * The following method tests are to be completed successfully before :
393     * <ul>
394     *  <li> <code> addFocusListener() </code> : adds focus listener to
395     * the object </li>
396     * </ul>
397     */
_removeFocusListener()398     public void _removeFocusListener() {
399         requiredMethod("addFocusListener()");
400         oObj.removeFocusListener(fListener);
401         fListener.init();
402         oObj.setFocus();
403         win.setFocus();
404         oObj.setFocus();
405         boolean res = !(fListener.gained || fListener.lost);
406         tRes.tested("removeFocusListener()", res);
407     }
408 
409     /**
410     * A class we use to test addKeyListener() and
411     * removeKeyListener()
412     */
413     public class TestKeyListener implements XKeyListener {
414         public boolean pressed = false;
415         public boolean released = false;
keyPressed(KeyEvent e)416         public void keyPressed(KeyEvent e) { pressed = true; }
keyReleased(KeyEvent e)417         public void keyReleased(KeyEvent e) { released = true; }
disposing(EventObject e)418         public void disposing(EventObject e) {}
init()419         public void init() { pressed = false; released = false; }
420     }
421 
422     private TestKeyListener kListener = new TestKeyListener();
423 
424     /**
425     * Test calls the method. <p>
426     * Has <b> OK </b> status if no exceptions were thrown. <p>
427     */
_addKeyListener()428     public void _addKeyListener() {
429         oObj.addKeyListener(kListener);
430         tRes.tested("addKeyListener()", true);
431     }
432 
433     /**
434     * Test calls the method. <p>
435     * Has <b> OK </b> status if no exceptions were thrown. <p>
436     * The following method tests are to be completed successfully before :
437     * <ul>
438     *  <li> <code> addKeyListener() </code> : adds key listener to
439     *  the object </li>
440     * </ul>
441     */
_removeKeyListener()442     public void _removeKeyListener() {
443         requiredMethod("addKeyListener()");
444         oObj.removeKeyListener(kListener);
445         tRes.tested("removeKeyListener()", true);
446     }
447 
448     /**
449     * A class we use to test addMouseListener() and
450     * removeMouseListener()
451     */
452     public class TestMouseListener implements XMouseListener {
453         public boolean pressed = false;
454         public boolean released = false;
455         public boolean entered = false;
456         public boolean exited = false;
457 
mousePressed(MouseEvent e)458         public void mousePressed(MouseEvent e) {
459             pressed = true;
460         }
461 
mouseReleased(MouseEvent e)462         public void mouseReleased(MouseEvent e) {
463             released = true;
464         }
465 
mouseEntered(MouseEvent e)466         public void mouseEntered(MouseEvent e) {
467             entered = true;
468         }
469 
mouseExited(MouseEvent e)470         public void mouseExited(MouseEvent e) {
471             exited = true;
472         }
473 
disposing(EventObject e)474         public void disposing(EventObject e) {}
475 
init()476         public void init() {
477             pressed = false;
478             released = false;
479             exited = false;
480             entered = false;
481         }
482 
483     }
484 
485     private TestMouseListener mListener = new TestMouseListener();
486 
487     /**
488     * Test calls the method. <p>
489     * Has <b> OK </b> status if no exceptions were thrown. <p>
490     */
_addMouseListener()491     public void _addMouseListener() {
492         oObj.addMouseListener(mListener);
493         tRes.tested("addMouseListener()", true);
494     }
495 
496     /**
497     * Test calls the method. <p>
498     * Has <b> OK </b> status if no exceptions were thrown. <p>
499     * The following method tests are to be completed successfully before :
500     * <ul>
501     *  <li> <code> addMouseListener() </code> : adds mouse listener to
502     * the object</li>
503     * </ul>
504     */
_removeMouseListener()505     public void _removeMouseListener() {
506         requiredMethod("addMouseListener()");
507         oObj.removeMouseListener(mListener);
508         tRes.tested("removeMouseListener()", true);
509     }
510 
511     /**
512     * A class we use to test addMouseMotionListener() and
513     * removeMouseMotionListener()
514     */
515     public class TestMouseMotionListener implements XMouseMotionListener {
516         public boolean dragged = false;
517         public boolean moved = false;
518 
mouseDragged(MouseEvent e)519         public void mouseDragged(MouseEvent e) {
520             dragged = true;
521         }
522 
mouseMoved(MouseEvent e)523         public void mouseMoved(MouseEvent e) {
524             moved = true;
525         }
526 
disposing(EventObject e)527         public void disposing(EventObject e) {}
528 
init()529         public void init() {
530             dragged = false;
531             moved = false;
532         }
533 
534     }
535 
536     private TestMouseMotionListener mmListener = new TestMouseMotionListener();
537 
538     /**
539     * Test calls the method. <p>
540     * Has <b> OK </b> status if no exceptions were thrown. <p>
541     */
_addMouseMotionListener()542     public void _addMouseMotionListener() {
543         oObj.addMouseMotionListener(mmListener);
544         tRes.tested("addMouseMotionListener()", true);
545     }
546 
547     /**
548     * Test calls the method. <p>
549     * Has <b> OK </b> status if no exceptions were thrown. <p>
550     * The following method tests are to be completed successfully before :
551     * <ul>
552     *  <li> <code> addMouseMotionListener() </code> : adds mouse motion
553     * listener to the object</li>
554     * </ul>
555     */
_removeMouseMotionListener()556     public void _removeMouseMotionListener() {
557         requiredMethod("addMouseMotionListener()");
558         oObj.removeMouseMotionListener(mmListener);
559         tRes.tested("removeMouseMotionListener()", true);
560     }
561 
562     /**
563     * A class we use to test addPaintListener() and
564     * removePaintListener()
565     */
566     public class TestPaintListener implements XPaintListener {
567         public boolean paint = false;
568 
windowPaint(PaintEvent e)569         public void windowPaint(PaintEvent e) {
570             paint = true;
571         }
572 
disposing(EventObject e)573         public void disposing(EventObject e) {}
574 
init()575         public void init() {
576             paint = false;
577         }
578 
579     }
580 
581     private TestPaintListener pListener = new TestPaintListener();
582 
583     /**
584     * Test calls the method. <p>
585     * Has <b> OK </b> status if no exceptions were thrown. <p>
586     */
_addPaintListener()587     public void _addPaintListener() {
588         oObj.addPaintListener(pListener);
589         tRes.tested("addPaintListener()", true);
590     }
591 
592     /**
593     * Test calls the method. <p>
594     * Has <b> OK </b> status if no exceptions were thrown. <p>
595     * The following method tests are to be completed successfully before :
596     * <ul>
597     *  <li> <code> addPaintListener() </code> : adds paint listener to
598     * the object </li>
599     * </ul>
600     */
_removePaintListener()601     public void _removePaintListener() {
602         requiredMethod("addPaintListener()");
603         oObj.removePaintListener(pListener);
604         tRes.tested("removePaintListener()", true);
605     }
606 
607     /**
608     * Sleeps for 0.2 sec. to allow StarOffice to react on <code>
609     * reset</code> call.
610     */
shortWait()611     private void shortWait() {
612         try {
613             Thread.sleep(2000) ;
614         } catch (InterruptedException e) {
615             log.println("While waiting :" + e) ;
616         }
617     }
618 
619 }
620 
621