xref: /AOO41X/test/testcommon/source/org/openoffice/test/vcl/widgets/VclControl.java (revision 20033afda2b51c7ee30363db73adea149f0f8745)
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.test.vcl.widgets;
25 
26 import java.awt.Rectangle;
27 
28 import org.openoffice.test.common.Condition;
29 import org.openoffice.test.vcl.Tester;
30 import org.openoffice.test.vcl.client.Constant;
31 
32 /**
33  * VCL control proxy
34  */
35 public class VclControl extends VclWidget {
36 
37     protected String id = null;
38 
39     protected int type = -1;
40 
41     /**
42      * Construct an instance with the given VclApp and ID
43      * @param app
44      * @param id
45      */
VclControl(VclApp app, String id)46     public VclControl(VclApp app, String id) {
47         super(app);
48         this.id = id;
49     }
50 
51     /**
52      * Get the ID of the control
53      *
54      * @return
55      */
getId()56     public String getId() {
57         return this.id;
58     }
59 
click()60     public void click() {
61         invoke(Constant.M_Click);
62     }
63 
64     /**
65      * Click
66      *
67      * @param locator
68      * @param x
69      * @param y
70      */
click(int x, int y)71     public void click(int x, int y) {
72         Rectangle rect = getValidScreenRectangle();
73         Tester.click((int) rect.x + x, (int) rect.y + y);
74     }
75 
doubleClick(int x, int y)76     public void doubleClick(int x, int y) {
77         Rectangle rect = getValidScreenRectangle();
78         Tester.doubleClick((int) rect.x + x, (int) rect.y + y);
79     }
80 
click(double xPercent, double yPercent)81     public void click(double xPercent, double yPercent) {
82         Rectangle rect = getValidScreenRectangle();
83         Tester.click((int)(rect.x + xPercent * rect.width), (int) (rect.y + yPercent * rect.height));
84     }
85 
doubleClick(double xPercent, double yPercent)86     public void doubleClick(double xPercent, double yPercent) {
87         Rectangle rect = getValidScreenRectangle();
88         Tester.doubleClick((int)(rect.x + xPercent * rect.width), (int) (rect.y + yPercent * rect.height));
89     }
90 
rightClick(int x, int y)91     public void rightClick(int x, int y) {
92         Rectangle rect = getValidScreenRectangle();
93         Tester.rightClick((int) rect.x + x, (int) rect.y + y);
94     }
95 
drag(int fromX, int fromY, int toX, int toY)96     public void drag(int fromX, int fromY, int toX, int toY) {
97         Rectangle rect = getValidScreenRectangle();
98         Tester.drag((int) rect.x + fromX, (int) rect.y + fromY, (int) rect.x + toX, (int) rect.y + toY);
99     }
100 
101     /**
102      * Return the caption of control
103      *
104      * @return
105      */
getCaption()106     public String getCaption() {
107         return (String) invoke(Constant.M_Caption);
108     }
109 
110     /**
111      * Returns if the control is enabled
112      *
113      * @return Returns true if the control is enabled, otherwise false is
114      *         returned.
115      */
isEnabled()116     public boolean isEnabled() {
117         return (Boolean) invoke(Constant.M_IsEnabled);
118     }
119 
120     /**
121      * Returns if the control is checked
122      *
123      * @return Returns true if the control is enabled, otherwise false is
124      *         returned.
125      */
isChecked()126     public boolean isChecked() {
127         return (Boolean) invoke(Constant.M_IsChecked);
128     }
129 
130     /**
131      * Return the count of fixed text in the control
132      *
133      * @return
134      */
getFixedTextCount()135     protected int getFixedTextCount() {
136         return (Integer) invoke(Constant.M_GetFixedTextCount);
137 
138     }
139 
140     /**
141      * Return the fixed text in the control
142      *
143      * @param i
144      *            the index of fixed text
145      * @return the text of fixed text
146      */
getFixedText(int i)147     protected String getFixedText(int i) {
148         return (String) invoke(Constant.M_GetFixedText, new Object[] { new Integer(i + 1) });
149     }
150 
151     /**
152      * Operate the control via VclHook
153      *
154      * @param methodId
155      * @param args
156      * @return
157      */
invoke(int methodId, Object... args)158     public Object invoke(int methodId, Object... args) {
159         return app.caller.callControl(getId(), methodId, args);
160     }
161 
162     /**
163      *
164      * @param methodId
165      * @return
166      */
invoke(int methodId)167     public Object invoke(int methodId) {
168         return app.caller.callControl(getId(), methodId);
169     }
170 
171     /**
172      * Internal use
173      *
174      */
useMenu()175     protected void useMenu() {
176         invoke(Constant.M_UseMenu);
177     }
178 
179     /**
180      * TODO implement it. This is test tool implementation to input keyboard
181      * keys.
182      *
183      */
inputKeys(String keys)184     public void inputKeys(String keys) {
185         invoke(Constant.M_TypeKeys, new Object[] { keys });
186     }
187 
188     /**
189      * Check if the control exists in a period of time
190      */
exists(double iTimeout)191     public boolean exists(double iTimeout) {
192         return exists(iTimeout, 1);
193     }
194 
195     /**
196      * Check if the control exists in a period of time
197      */
exists(double iTimeout, double interval)198     public boolean exists(double iTimeout, double interval) {
199         return new Condition() {
200             @Override
201             public boolean value() {
202                 return VclControl.this.exists();
203             }
204         }.test(iTimeout, interval);
205     }
206 
207     /**
208      * Wait for the control to exist in a period of time. If the time is out, an
209      * ObjectNotFoundException will be throwed.
210      *
211      * @param iTimeout
212      * @param interval
213      */
214     public void waitForExistence(double iTimeout, double interval) {
215         new Condition() {
216             @Override
217             public boolean value() {
218                 return VclControl.this.exists();
219             }
220         }.waitForTrue( this + " is not found!", iTimeout, interval);
221     }
222 
223 
224     public void waitForEnabled(double iTimeout, double interval) {
225         new Condition() {
226 
227             @Override
228             public boolean value() {
229                 return VclControl.this.isEnabled();
230             }
231 
232         }.waitForTrue("Time out to wait the control to be enabled!", iTimeout, interval);
233     }
234 
235     public void waitForDisabled(double iTimeout, double interval) {
236         new Condition() {
237 
238             @Override
239             public boolean value() {
240                 return !VclControl.this.isEnabled();
241             }
242 
243         }.waitForTrue("Time out to wait the control to be disabled!", iTimeout, interval);
244     }
245 
246     public void waitForText(final String text, double iTimeout, double interval) {
247         new Condition() {
248 
249             @Override
250             public boolean value() {
251                 return text.equals(VclControl.this.getCaption());
252             }
253 
254         }.waitForTrue("Time out to wait the control to show the text: " + text, iTimeout, interval);
255     }
256 
257 
258     public int getType() {
259         if (type == -1)
260             type = ((Long) invoke(Constant.M_GetRT)).intValue();
261         return type;
262     }
263 
264     /**
265      * Returns if the control exists
266      *
267      * @return Returns true if the control is existed, otherwise false is
268      *         returned.
269      *
270      */
271     public boolean exists() {
272         if (!app.exists())
273             return false;
274         try {
275             return (Boolean) invoke(Constant.M_Exists);
276         } catch (Exception e) {
277             return false;
278         }
279     }
280 
281     public void focus() {
282         inputKeys("");
283     }
284 
285     public void typeKeys(String keys) {
286         focus();
287         Tester.typeKeys(keys);
288     }
289 
290     public Rectangle getScreenRectangle() {
291         String ret = (String) invoke(Constant.M_GetScreenRectangle, new Object[] { Boolean.FALSE });
292         if (ret == null)
293             return null;
294         String[] data = ret.split(",");
295         int x = Integer.parseInt(data[0]);
296         int y = Integer.parseInt(data[1]);
297         int w = Integer.parseInt(data[2]);
298         int h = Integer.parseInt(data[3]);
299         return new Rectangle(x, y, w, h);
300     }
301 
302     public Rectangle getValidScreenRectangle() {
303         Rectangle rect = getScreenRectangle();
304         Tester.sleep(0.1);
305         rect = getScreenRectangle();
306         if (rect == null)
307             throw new RuntimeException(this + " - screen rectangle could not be computed! Maybe it is not showing!");
308         return rect;
309     }
310 
311     public VclMenuItem menuItem(String path) {
312         return new VclMenuItem(new VclMenu(this), path);
313     }
314     /**
315      * Opens the context menu of the control.
316      * <p>
317      * The context menu opens at the position of the mouse.
318      * <p>
319      * To open the context menu at a specific position in a window, you have to
320      * first move the mouse to the position before using this method.
321      * <p>
322      *
323      * @param
324      */
325     public void openContextMenu() {
326         invoke(Constant.M_OpenContextMenu);
327     }
328 
329 
330     public String toString() {
331         return id;
332     }
333 }
334