2 * This file is part of the LibreOffice project.
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 * This file incorporates work covered by the following license notice:
10 * Licensed to the Apache Software Foundation (ASF) under one or more
11 * contributor license agreements. See the NOTICE file distributed
12 * with this work for additional information regarding copyright
13 * ownership. The ASF licenses this file to you under the Apache
14 * License, Version 2.0 (the "License"); you may not use this file
15 * except in compliance with the License. You may obtain a copy of
16 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 import com
.sun
.star
.accessibility
.AccessibleRole
;
21 import com
.sun
.star
.accessibility
.XAccessible
;
22 import com
.sun
.star
.accessibility
.XAccessibleComponent
;
23 import com
.sun
.star
.accessibility
.XAccessibleContext
;
24 import com
.sun
.star
.awt
.Point
;
25 import com
.sun
.star
.awt
.PosSize
;
26 import com
.sun
.star
.awt
.Rectangle
;
27 import com
.sun
.star
.awt
.XExtendedToolkit
;
28 import com
.sun
.star
.awt
.XTopWindow
;
29 import com
.sun
.star
.awt
.XWindow
;
30 import com
.sun
.star
.beans
.PropertyValue
;
31 import com
.sun
.star
.frame
.XModel
;
32 import com
.sun
.star
.lang
.EventObject
;
33 import com
.sun
.star
.lang
.XComponent
;
34 import com
.sun
.star
.lang
.XMultiServiceFactory
;
35 import com
.sun
.star
.sheet
.RangeSelectionEvent
;
36 import com
.sun
.star
.sheet
.XRangeSelection
;
37 import com
.sun
.star
.sheet
.XRangeSelectionChangeListener
;
38 import com
.sun
.star
.sheet
.XRangeSelectionListener
;
39 import com
.sun
.star
.uno
.UnoRuntime
;
40 import java
.awt
.Robot
;
41 import java
.awt
.event
.InputEvent
;
42 import java
.io
.PrintWriter
;
43 import lib
.MultiMethodTest
;
45 import lib
.StatusException
;
46 import util
.AccessibilityTools
;
49 * Check the XRangeSelection interface.
51 public class _XRangeSelection
extends MultiMethodTest
{
52 public XRangeSelection oObj
= null;
53 MyRangeSelectionListener aListener
= null;
56 public void before() {
57 aListener
= new _XRangeSelection
.MyRangeSelectionListener(log
);
58 // workaround for i34499
59 XModel xModel
= (XModel
)tEnv
.getObjRelation("FirstModel");
61 throw new StatusException(Status
.failed("Object relation FirstModel' not set."));
62 XWindow xWindow
= xModel
.getCurrentController().getFrame().getContainerWindow();
63 XTopWindow xTopWindow
= UnoRuntime
.queryInterface(XTopWindow
.class, xWindow
);
69 public void _abortRangeSelection() {
70 requiredMethod("removeRangeSelectionChangeListener()");
71 requiredMethod("removeRangeSelectionListener()");
72 oObj
.abortRangeSelection();
73 tRes
.tested("abortRangeSelection()", true);
76 public void _addRangeSelectionChangeListener() {
77 oObj
.addRangeSelectionChangeListener(aListener
);
78 tRes
.tested("addRangeSelectionChangeListener()", true);
81 public void _addRangeSelectionListener() {
82 oObj
.addRangeSelectionListener(aListener
);
83 tRes
.tested("addRangeSelectionListener()", true);
86 public void _removeRangeSelectionChangeListener() {
87 oObj
.removeRangeSelectionChangeListener(aListener
);
88 tRes
.tested("removeRangeSelectionChangeListener()", true);
91 public void _removeRangeSelectionListener() {
92 oObj
.removeRangeSelectionListener(aListener
);
93 tRes
.tested("removeRangeSelectionListener()", true);
96 public void _startRangeSelection() {
97 requiredMethod("addRangeSelectionChangeListener()");
98 requiredMethod("addRangeSelectionListener()");
100 // get the sheet center
101 Point center
= getSheetCenter();
103 throw new StatusException(Status
.failed("Couldn't get the sheet center."));
105 PropertyValue
[] props
= new PropertyValue
[3];
106 props
[0] = new PropertyValue();
107 props
[0].Name
= "InitialValue";
108 props
[0].Value
= "B3:D5";
109 props
[1] = new PropertyValue();
110 props
[1].Name
= "Title";
111 props
[1].Value
= "the title";
112 props
[2] = new PropertyValue();
113 props
[2].Name
= "CloseOnMouseRelease";
114 props
[2].Value
= Boolean
.FALSE
;
115 oObj
.startRangeSelection(props
);
116 // wait for listeners
119 // get closer button: move if window covers the sheet center
120 Point closer
= getCloser(center
);
122 throw new StatusException(Status
.failed("Couldn't get the close Button."));
124 // do something to trigger the listeners
125 clickOnSheet(center
);
129 clickOnSheet(closer
);
132 // open a new range selection
133 props
[0].Value
= "C4:E6";
134 oObj
.startRangeSelection(props
);
136 props
[0].Value
= "C2:E3";
137 oObj
.startRangeSelection(props
);
140 oObj
.startRangeSelection(props
);
142 oObj
.abortRangeSelection();
144 System
.out
.println("Listener called: " + aListener
.bAbortCalled
);
146 tRes
.tested("startRangeSelection()", aListener
.listenerCalled());
150 * Determine the current top window center and return this as a point.
151 * @return a point representing the sheet center.
153 protected Point
getSheetCenter() {
154 log
.println("Trying to get AccessibleSpreadsheet");
156 XComponent xSheetDoc
= (XComponent
) tEnv
.getObjRelation("DOCUMENT");
158 XModel xModel
= UnoRuntime
.queryInterface(XModel
.class, xSheetDoc
);
159 System
.out
.println("Name: " + xModel
.getCurrentController().getFrame().getName());
161 XWindow xWindow
= AccessibilityTools
.getCurrentWindow(xModel
);
162 XAccessible xRoot
= AccessibilityTools
.getAccessibleObject(xWindow
);
164 XAccessibleContext ctx
= AccessibilityTools
.getAccessibleObjectForRole(xRoot
, AccessibleRole
.TABLE
);
166 XAccessibleComponent AccessibleSpreadsheet
= UnoRuntime
.queryInterface(XAccessibleComponent
.class,ctx
);
168 log
.println("Got " + util
.utils
.getImplName(AccessibleSpreadsheet
));
170 Object toolkit
= null;
173 toolkit
= tParam
.getMSF().createInstance("com.sun.star.awt.Toolkit");
174 } catch (com
.sun
.star
.uno
.Exception e
) {
175 log
.println("Couldn't get toolkit");
176 e
.printStackTrace(log
);
177 throw new StatusException("Couldn't get toolkit", e
);
180 XExtendedToolkit tk
= UnoRuntime
.queryInterface(
181 XExtendedToolkit
.class, toolkit
);
183 XTopWindow tw
= null;
185 int k
= tk
.getTopWindowCount();
186 for (int i
=0;i
<k
;i
++) {
188 XTopWindow tw_temp
= tk
.getTopWindow(i
);
189 XAccessible xacc
= UnoRuntime
.queryInterface(XAccessible
.class, tw_temp
);
191 if (xacc
.getAccessibleContext().getAccessibleName().indexOf("d2")>0) {
195 log
.println("\t unknown window");
198 } catch (com
.sun
.star
.lang
.IndexOutOfBoundsException e
) {
202 System
.out
.println("No TopWindow :-(");
206 Point point
= AccessibleSpreadsheet
.getLocationOnScreen();
207 Rectangle rect
= AccessibleSpreadsheet
.getBounds();
208 Point retPoint
= new Point();
209 retPoint
.X
= point
.X
+ (rect
.Width
/ 2);
210 retPoint
.Y
= point
.Y
+ (rect
.Height
/ 2);
215 * Get the closer button on the right top of the current window.
216 * @return A point representing the closer button.
218 private Point
getCloser(Point center
) {
219 XMultiServiceFactory xMSF
= tParam
.getMSF();
220 Object aToolkit
= null;
222 aToolkit
= xMSF
.createInstance("com.sun.star.awt.Toolkit");
224 catch(com
.sun
.star
.uno
.Exception e
) {
225 throw new StatusException("Could not create 'com.sun.star.awt.Toolkit'.", e
);
227 XExtendedToolkit xExtendedToolkit
= UnoRuntime
.queryInterface(XExtendedToolkit
.class, aToolkit
);
228 XTopWindow tw
= null;
230 XAccessibleComponent xAccessibleComponent
= null;
231 int k
= xExtendedToolkit
.getTopWindowCount();
232 for (int i
=0;i
<k
;i
++) {
234 XTopWindow tw_temp
= xExtendedToolkit
.getTopWindow(i
);
235 XAccessible xacc
= UnoRuntime
.queryInterface(XAccessible
.class, tw_temp
);
237 System
.out
.println("Name: " + xacc
.getAccessibleContext().getAccessibleName());
238 if (xacc
.getAccessibleContext().getAccessibleName().startsWith("the title")) {
240 XAccessibleContext xContext
= xacc
.getAccessibleContext();
241 xAccessibleComponent
= UnoRuntime
.queryInterface(XAccessibleComponent
.class, xContext
);
242 if (xAccessibleComponent
== null)
243 System
.out
.println("!!!! MIST !!!!");
245 System
.out
.println("########## KLAPPT ########## ");
249 log
.println("\t unknown window");
252 } catch (com
.sun
.star
.lang
.IndexOutOfBoundsException e
) {
256 System
.out
.println("No TopWindow :-(");
260 XWindow xWindow
= UnoRuntime
.queryInterface(XWindow
.class, tw
);
261 Rectangle posSize
= xWindow
.getPosSize();
263 // compare the center point with the dimensions of the current top window
264 boolean windowOK
= false;
266 if (posSize
.X
<= center
.X
&& center
.X
<= posSize
.X
+ posSize
.Width
) {
267 if (posSize
.Y
<= center
.Y
&& center
.Y
<= posSize
.Y
+posSize
.Height
) {
268 // move window out of the way
269 posSize
.X
= posSize
.X
+ 10;
270 posSize
.Y
= posSize
.Y
+10;
271 xWindow
.setPosSize(posSize
.X
, posSize
.Y
, posSize
.Width
, posSize
.Height
, PosSize
.POS
);
283 Point p
= xAccessibleComponent
.getLocationOnScreen();
284 Point closer
= new Point();
285 closer
.X
= p
.X
+ posSize
.Width
- 2;
287 System
.out
.println("Closer: " + closer
.X
+ " " + closer
.Y
);
291 protected boolean clickOnSheet(Point point
) {
292 log
.println("Clicking in the center of the AccessibleSpreadsheet");
295 Robot rob
= new Robot();
296 rob
.mouseMove(point
.X
, point
.Y
);
297 rob
.mousePress(InputEvent
.BUTTON1_MASK
);
299 rob
.mouseRelease(InputEvent
.BUTTON1_MASK
);
301 } catch (java
.awt
.AWTException e
) {
302 log
.println("couldn't press mouse button");
311 public static class MyRangeSelectionListener
implements XRangeSelectionListener
, XRangeSelectionChangeListener
{
312 boolean bAbortCalled
= false;
313 boolean bChangeCalled
= false;
314 boolean bDoneCalled
= false;
315 PrintWriter log
= null;
317 public MyRangeSelectionListener(PrintWriter log
) {
321 public void aborted(RangeSelectionEvent rangeSelectionEvent
) {
322 log
.println("Called 'aborted' with: " + rangeSelectionEvent
.RangeDescriptor
);
326 public void descriptorChanged(RangeSelectionEvent rangeSelectionEvent
) {
327 log
.println("Called 'descriptorChanged' with: " + rangeSelectionEvent
.RangeDescriptor
);
328 bChangeCalled
= true;
331 public void done(RangeSelectionEvent rangeSelectionEvent
) {
332 log
.println("Called 'done' with: " + rangeSelectionEvent
.RangeDescriptor
);
336 public boolean listenerCalled() {
337 return bAbortCalled
& bChangeCalled
& bDoneCalled
;
340 public void reset() {
341 bAbortCalled
= false;
342 bChangeCalled
= false;
348 * @param eventObject The event.
350 public void disposing(EventObject eventObject
) {