merge the formfield patch from ooo-build
[ooovba.git] / testautomation / framework / tools / includes / formcontrols.inc
blobb6d202f1c7e888c4ccbd3b8702c180d636cc5d78
1 'encoding UTF-8  Do not remove or change this line!
2 '**************************************************************************
3 '* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 '* 
5 '* Copyright 2008 by Sun Microsystems, Inc.
6 '*
7 '* OpenOffice.org - a multi-platform office productivity suite
8 '*
9 '* $RCSfile: formcontrols.inc,v $
11 '* $Revision: 1.1 $
13 '* last change: $Author: jsi $ $Date: 2008-06-16 12:19:05 $
15 '* This file is part of OpenOffice.org.
17 '* OpenOffice.org is free software: you can redistribute it and/or modify
18 '* it under the terms of the GNU Lesser General Public License version 3
19 '* only, as published by the Free Software Foundation.
21 '* OpenOffice.org is distributed in the hope that it will be useful,
22 '* but WITHOUT ANY WARRANTY; without even the implied warranty of
23 '* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24 '* GNU Lesser General Public License version 3 for more details
25 '* (a copy is included in the LICENSE file that accompanied this code).
27 '* You should have received a copy of the GNU Lesser General Public License
28 '* version 3 along with OpenOffice.org.  If not, see
29 '* <http://www.openoffice.org/license.html>
30 '* for a copy of the LGPLv3 License.
32 '/************************************************************************
33 ' **
34 ' ** owner : joerg.skottke@sun.com
35 ' **
36 ' ** short description : Tools to draw and select form controls in basic-ide
37 ' **
38 '\******************************************************************************
40 public const ICONTROLCOUNT = 22
42 function hGetControlParams( cParam as string ) as integer
44     '///<h3>Retrieve basic parameters to draw formcontrols to a dialog</h3>
45     '///<i>All values are in percent relative to the window size.
46     '///+ All values are optimized for 1024x768 pixels screen resolution but 
47     '///+ have been tested successfully with 1280x1024 and 800x600</i><br>
48     '///<i>In most cases it is desired to place multiple controls on a single 
49     '///+ dialog pane. To prevent the controls from overlapping each other
50     '///+ they are arranged in rows and columns. Each control is identified
51     '///+ by a unique number (see description for hInsertControl(...)). The 
52     '///+ dimensions are defined in hGetControlParams(...). The coordinates
53     '///+ returned by this function can be used to draw and to select a control.</i><br>    
54     '///<u>Input</u>:
55     '///<ol>
56     '///+<li>Name of the coordinate (string). Valid options are:</li>
57     '///<ul>
58     '///+<li>&quot;XOREGO&quot; (Upper left corner)</li>
59     '///+<li>&quot;YOREGO&quot; (Upper left corner)</li>
60     '///+<li>&quot;XDIST&quot; (Distance between the upper left corners of neighbor controls)</li>
61     '///+<li>&quot;YDIST&quot; (Distance between the upper left corners of neighbor controls)</li>
62     '///+<li>&quot;XSIZE&quot; (Width of control)</li>
63     '///+<li>&quot;YSIZE&quot; (Heighth of the control)</li>
64     '///</ul>
65     '///</ol>
66     '///<u>Returns</u>:
67     '///<ol>
68     '///+<li>Coordinate/Distance/Size in percent of window size (integer)</li>
69     '///<ul>
70     '///+<li>A number between 1 and 100</li>
71     '///+<li>0 on error (invalid function parameter)</li>
72     '///</ul>
73     '///</ol>
74     '///<u>Description</u>:
75     '///<ul>
77     cParam = ucase( cParam ) 
79     '///+<li>Currently following values are defined:</li>
80     '///<ul>
81     select case cParam
82     '///+<li>XOREGO = 31</li>
83     case "XOREGO" : hGetControlParams() = 31
84     '///+<li>XDIST = 8</li>
85     case "XDIST"  : hGetControlParams() = 8
86     '///+<li>XSIZE = 6</li>
87     case "XSIZE"  : hGetControlParams() = 6
88     '///+<li>YOREGO = 30</li>
89     case "YOREGO" : hGetControlParams() = 30
90     '///+<li>YDIST = 7</li>
91     case "YDIST"  : hGetControlParams() = 7
92     '///+<li>YSIZE = 5</li>
93     case "YSIZE"  : hGetControlParams() = 5   
94     '///+<li>Incorrect function parameter = 0</li>
95     case else     : hGetControlParams() = 0
96     '///</ul>
97     end select
98     '///</ul>
99     
100 end function
102 '*******************************************************************************
104 function hGetControlName( iControl as integer ) as string
106     '///<h3>A function to deliver a speaking name for all form controls</h3>
107     '///<i>Note that the numbers of the controls are unique</i><br>
108     '///<i>In most cases it is desired to place multiple controls on a single 
109     '///+ dialog pane. To prevent the controls from overlapping each other
110     '///+ they are arranged in rows and columns. Each control is identified
111     '///+ by a unique number (see description for hInsertControl(...)). The 
112     '///+ dimensions are defined in hGetControlParams(...). The coordinates
113     '///+ returned by this function can be used to draw and to select a control.</i><br>    
114     '///<u>Input</u>:
115     '///<ol>
116     '///+<li>Number of the control (integer)</li>
117     '///<ul>
118     '///+<li>Any number between 1 and 22, see description below</li>
119     '///</ul>
120     '///</ol>
121     '///<u>Returns</u>:
122     '///<ol>
123     '///+<li>Name for a control (string)</li>
124     '///<ul>
125     '///+<li>Name for a control (may contain whitespaces)</li>
126     '///+<li>An empty string in case of an invalid function parameter</li>
127     '///</ul>
128     '///</ol>
129     '///<u>Description</u>:
130     '///<ul>
131     
133     dim sControl as string
135     '///+<li>Currently following control are defined:</li>
136     '///<ol>
137     select case iControl
138     '///+<li>Push Button</li>
139     case 1  : sControl = "Push Button"
140     '///+<li>Image Control</li>
141     case 2  : sControl = "Image Control"
142     '///+<li>Check Box</li>
143     case 3  : sControl = "Check Box"
144     '///+<li>Radio Button</li>
145     case 4  : sControl = "Radio Button"
146     '///+<li>Fixed Text</li>
147     case 5  : sControl = "Fixed Text"
148     '///+<li>Edit Field</li>
149     case 6  : sControl = "Edit Field"
150     '///+<li>List Box</li>
151     case 7  : sControl = "List Box"
152     '///+<li>Combo Box</li>
153     case 8  : sControl = "Combo Box"
154     '///+<li>Vertical ScrollBar</li>
155     case 9  : sControl = "Vertical ScrollBar"
156     '///+<li>Horizontal ScrollBar</li>
157     case 10 : sControl = "Horizontal ScrollBar"
158     '///+<li>Frame</li>
159     case 11 : sControl = "Frame"
160     '///+<li>Progress Bar</li>
161     case 12 : sControl = "Progress Bar"
162     '///+<li>Vertical Fixed Line</li>
163     case 13 : sControl = "Vertical Fixed Line"
164     '///+<li>Horizontal Fixed Line</li>
165     case 14 : sControl = "Horizontal Fixed Line"
166     '///+<li>Date Field</li>
167     case 15 : sControl = "Date Field"
168     '///+<li>Time Field</li>
169     case 16 : sControl = "Time Field"
170     '///+<li>Numeric Field</li>
171     case 17 : sControl = "Numeric Field"
172     '///+<li>Currency Field</li>
173     case 18 : sControl = "Currency Field"
174     '///+<li>Form Field</li>
175     case 19 : sControl = "Form Field"
176     '///+<li>Pattern Field</li>
177     case 20 : sControl = "Pattern Field"
178     '///+<li>File Control</li>
179     case 21 : sControl = "File Control"
180     '///+<li>Tree Control</li>
181     case 22 : sControl = "Tree Control" 
182     '///</ol>
183     '///+<li>&quot;&quot; for function parameter &lt; 1 or &gt; 22 </li>
184     case else : sControl = ""
185     end select
186     
187     hGetControlName() = sControl
188     '///</ul>
189     
190 end function
192 '*******************************************************************************
194 function hInsertControl( iControl as integer ) as string
196     '///<h3>Function to insert one of the BASIC formcontrols by index</h3>
197     '///<i>Note that the numbers of the controls are unique</i><br>
198     '///<i>In most cases it is desired to place multiple controls on a single 
199     '///+ dialog pane. To prevent the controls from overlapping each other
200     '///+ they are arranged in rows and columns. Each control is identified
201     '///+ by a unique number (see description for hInsertControl(...)). The 
202     '///+ dimensions are defined in hGetControlParams(...). The coordinates
203     '///+ returned by this function can be used to draw and to select a control.</i><br>    
204     '///<u>Input</u>:
205     '///<ol>
206     '///+<li>Number of the control (integer)</li>
207     '///<ul>
208     '///+<li>Any number between 1 and 22, see description below</li>
209     '///</ul>
210     '///</ol>
211     '///<u>Returns</u>:
212     '///<ol>
213     '///+<li>Name for a control (string)</li>
214     '///<ul>
215     '///+<li>Name for a control (may contain whitespaces)</li>
216     '///+<li>An empty string in case of an invalid function parameter</li>
217     '///</ul>
218     '///</ol>
219     '///<u>Description</u>:
220     '///<ul>
221     
222     const CFN = "hInsertControl::"
223     
224     Kontext "ToolsCollectionBar"
226     '///+<li>Click on the requested button on the ToolsCollectionBar:</li>
227     '///<ol>
228     select case iControl
229     '///+<li>Push Button</li>
230     case 1  : InsPushButton.click()
231     '///+<li>Image Control</li>
232     case 2  : InsImgCtrl.click()
233     '///+<li>Check Box</li>
234     case 3  : InsCheckbox.click()
235     '///+<li>Radio Button</li>
236     case 4  : InsRadioButton.click()
237     '///+<li>Fixed Text</li>
238     case 5  : InsFixedText.click()
239     '///+<li>Edit Field</li>
240     case 6  : InsEditField.click()
241     '///+<li>List Box</li>
242     case 7  : InsListbox.click()
243     '///+<li>Combo Box</li>
244     case 8  : InsComboBox.click()
245     '///+<li>Vertical ScrollBar</li>
246     case 9  : InsScrollBarV.click()
247     '///+<li>Horizontal ScrollBar</li>
248     case 10 : InsScrollBarH.click()
249     '///+<li>Frame</li>
250     case 11 : InsFrame.click()
251     '///+<li>Progress Bar</li>
252     case 12 : InsProgressbar.click()
253     '///+<li>Vertical Fixed Line</li>
254     case 13 : InsFixedLineV.click()
255     '///+<li>Horizontal Fixed Line</li>
256     case 14 : InsFixedLineH.click()
257     '///+<li>Date Field</li>
258     case 15 : InsDateField.click()
259     '///+<li>Time Field</li>
260     case 16 : InsTimeField.click()
261     '///+<li>Numeric Field</li>
262     case 17 : InsNumField.click()
263     '///+<li>Currency Field</li>
264     case 18 : InsCurrencyField.click()
265     '///+<li>Form Field</li>
266     case 19 : InsFormField.click()
267     '///+<li>Pattern Field</li>
268     case 20 : InsPatternField.click()
269     '///+<li>File Control</li>
270     case 22 : InsFileCtrl.click()
271     '///+<li>Tree Control</li>
272     case 22 : InsTreeControl.click()
273     end select
274     '///</ol>
275     '///+<li>&quot;&quot; for function parameter &lt; 1 or &gt; 22 </li>
276     
277     hInsertControl() = hGetControlName( iControl )
278     '///</ul>
279     
280 end function
282 '*******************************************************************************
284 function hDrawControlOnDialog( iControl as integer ) as string
286     '///<h3>Draw a control on a dialog at a fixed position</h3>
287     '///<i>Note that the numbers of the controls are unique</i><br>
288     '///<i>In most cases it is desired to place multiple controls on a single 
289     '///+ dialog pane. To prevent the controls from overlapping each other
290     '///+ they are arranged in rows and columns. Each control is identified
291     '///+ by a unique number (see description for hInsertControl(...)). The 
292     '///+ dimensions are defined in hGetControlParams(...). The coordinates
293     '///+ returned by this function can be used to draw and to select a control.</i><br>    
294     '///<u>Input</u>:
295     '///<ol>
296     '///+<li>Number of the control (integer)</li>
297     '///<ul>
298     '///+<li>Any number between 1 and 22, see description for hInsertControl()</li>
299     '///</ul>
300     '///</ol>
301     '///<u>Returns</u>:
302     '///<ol>
303     '///+<li>Name for a control (string)</li>
304     '///<ul>
305     '///+<li>Name for a control (may contain whitespaces)</li>
306     '///+<li>An empty string in case of an invalid function parameter</li>
307     '///</ul>
308     '///</ol>
309     '///<u>Description</u>:
310     '///<ul>
312     const CFN = "hDrawControlOnDialog::"
313     
314     '///+<li>Verify function parameter (this is a top level function)</li> 
315     if ( ( iControl < 1 ) or ( iControl > ICONTROLCOUNT ) ) then
316         warnlog( CFN & "Invalid control-number (iControl) passed: " & iControl )
317         hDrawControlOnDialog() = false
318         exit function
319     endif    
320     
321     
322     dim sControl as string   ' The name of the current control
323     dim brc as boolean       ' some returnvalue
324     
325     ' coordinates of the controls on the dialog in the dialog-editor
326     dim iXO as integer
327     dim iYO as integer
328     dim iXE as integer
329     dim iYE as integer
330     
331     '///+<li>determine where the control is to be painted (hGetControlPos...)</li>
332     iXO = hGetControlPosXO( iControl )
333     iYO = hGetControlPosYO( iControl )
334     iXE = hGetControlPosXE( iControl )
335     iYE = hGetControlPosYE( iControl )
336     
337     '///+<li>click the desired control</li> 
338     sControl = hInsertControl( iControl )
339     printlog( CFN & " at XO=" & iXO & _
340                     " XE=" & iXE & _
341                     " YO=" & iYO & _
342                     " YE=" & iYE & _
343                     " : " & sControl )
345     '///+<li>Draw the control (using hDrawControl(...))</li>
346     brc = hDrawControl( iXO, iYO, iXE, iYE )    
347     hDrawControlOnDialog() = sControl
348     '///</ul>
349     
350 end function
352 '*******************************************************************************
354 function hDrawControl( xPos as integer, _
355                        yPos as integer, _
356                        xEnd as integer, _
357                        yEnd as integer ) as boolean
358                        
359     '///<h3>Draw a control on the dialog pane in the dialog editor</h3>
360     '///<i>Starting point: Basic IDE/Dialog editor</i><br>
361     '///<i>In most cases it is desired to place multiple controls on a single 
362     '///+ dialog pane. To prevent the controls from overlapping each other
363     '///+ they are arranged in rows and columns. Each control is identified
364     '///+ by a unique number (see description for hInsertControl(...)). The 
365     '///+ dimensions are defined in hGetControlParams(...). The coordinates
366     '///+ returned by this function can be used to draw and to select a control.</i><br>    
367     '///<i>Note: All units are in percent of the relative to the current window size</i><br>
368     '///<u>Input</u>:
369     '///<ol>
370     '///+<li>X-Orego (Upper left corner) (integer)</li>
371     '///<ul>
372     '///+<li>Min = 0</li>
373     '///+<li>Max = 100 (allowed but not useful)</li>
374     '///</ul>
375     '///+<li>Y-Orego (Upper left corner) (integer)</li>
376     '///<ul>
377     '///+<li>Min = 0</li>
378     '///+<li>Max = 100 (allowed but not useful)</li>
379     '///</ul>
380     '///+<li>X-End (Lower right corner) (integer)</li>
381     '///<ul>
382     '///+<li>Min = 0</li>
383     '///+<li>Max = 100 (allowed but not useful)</li>
384     '///</ul>
385     '///+<li>Y-End (Lower right corner) (integer)</li>
386     '///<ul>
387     '///+<li>Min = 0</li>
388     '///+<li>Max = 100 (allowed but not useful)</li>
389     '///</ul>    
390     '///</ol>
391     '///<u>Returns</u>:
392     '///<ol>
393     '///+<li>Errorstatus (boolean)</li>
394     '///<ul>
395     '///+<li>TRUE on success</li>
396     '///+<li>FALSE on failure</li>
397     '///</ul>
398     '///</ol>
399     '///<u>Description</u>:
400     '///<ul>
401     
402     const CFN = "hDrawControl::"   
403     
404     '///+<li>Set context to Basic IDE</li>
405     Kontext "BasicIDE"
406     
407     '///+<li>Draw the control using mouse actions</li>
408     '///<ol>
409     '///+<li>Mouse down on pos X/Y-Orego</li>
410     '///+<li>Mouse move to pos X/Y-End</li>
411     '///+<li>Mouse up on pos X/Y-End</li>
412     '///</ol>
413     '///</ul>
414     
415     DialogWindow.MouseUp( 20 , 20 )
416     
417     try
418         DialogWindow.MouseDown ( xPos, yPos )
419         DialogWindow.MouseMove ( xEnd, yEnd )
420         DialogWindow.MouseUp   ( xEnd, yEnd )
421         hDrawControl() = true
422     catch
423         warnlog( "#i39852# " & CFN & "Unable to complete mouseactions on dialog" )
424         hDrawControl() = false
425     endcatch
426     
428 end function
430 '*******************************************************************************
432 function hGetControlPosXO( iControl as integer ) as integer
434     '///<h3>Retrieve the upper left X-coordinate for a control</h3>
435     '///<i>In most cases it is desired to place multiple controls on a single 
436     '///+ dialog pane. To prevent the controls from overlapping each other
437     '///+ they are arranged in rows and columns. Each control is identified
438     '///+ by a unique number (see description for hInsertControl(...)). The 
439     '///+ dimensions are defined in hGetControlParams(...). The coordinates
440     '///+ returned by this function can be used to draw and to select a control.</i><br>
441     '///<u>Input</u>:
442     '///<ol>
443     '///+<li>Number of the control (integer)</li>
444     '///<ul>
445     '///+<li>Any number between 1 and 22, see description for hInsertControl()</li>
446     '///</ul>
447     '///</ol>
448     '///<u>Returns</u>:
449     '///<ol>
450     '///+<li>X-Orego in percent of window size (integer)</li>
451     '///</ol>
452     '///<u>Description</u>:
453     '///<ul>
454     
455     dim xOffset as integer
456         xOffset = hGetControlParams( "xorego" )
457         
458     dim xDistance as integer
459         xDistance = hGetControlParams( "xdist" )
460     
461     '///+<li>Define an offset for the control depending on its ID</li>
462     '///<ul>
463     '///+<li>&lt; 7 : Column one</li>
464     '///+<li>7 ... 12 : Column two</li>
465     '///+<li>13 ... 18 : Column three</li>
466     '///+<li>&gt; 18 : Column four</li>
467     '///</ul>
468     '///</ul> 
469     
470     if ( iControl <= 6 ) then
471         hGetControlPosXO() = xOffset
472     elseif( ( iControl >= 7 ) and ( iControl <= 12 ) ) then
473         hGetControlPosXO() = xOffset + 1 * xDistance
474     elseif( ( iControl >= 13 ) and ( iControl <= 18 ) ) then
475         hGetControlPosXO() = xOffset + 2 * xDistance
476     else
477         hGetControlPosXO() = xOffset + 3 * xDistance
478     endif
479     
480 end function
481     
482 '*******************************************************************************
484 function hGetControlPosYO( iControl as integer ) as integer
486     '///<h3>Retrieve the upper left Y-coordinate for a control</h3>
487     '///<i>In most cases it is desired to place multiple controls on a single 
488     '///+ dialog pane. To prevent the controls from overlapping each other
489     '///+ they are arranged in rows and columns. Each control is identified
490     '///+ by a unique number (see description for hInsertControl(...)). The 
491     '///+ dimensions are defined in hGetControlParams(...). The coordinates
492     '///+ returned by this function can be used to draw and to select a control.</i><br>
493     '///<u>Input</u>:
494     '///<ol>
495     '///+<li>Number of the control (integer)</li>
496     '///<ul>
497     '///+<li>Any number between 1 and 21, see description for hInsertControl()</li>
498     '///</ul>
499     '///</ol>
500     '///<u>Returns</u>:
501     '///<ol>
502     '///+<li>Y-Orego in percent of window size (integer)</li>
503     '///</ol>
504     '///<u>Description</u>:
505     '///<ul>
506     dim yOffset as integer
507         yOffset = hGetControlParams( "yorego" )
508         
509     dim yDistance as integer
510         yDistance = hGetControlParams( "ydist" )
511         
512     '///+<li>Define an offset for the control depending on its ID</li>
513     '///<ul>
514     '///+<li>1 ,  7 , 13 , 19 : Row one</li>
515     '///+<li>2 ,  8 , 14 , 20 : Row two</li>
516     '///+<li>3 ,  9 , 15 , 21 : Row three</li>
517     '///+<li>4 , 10 , 16 , 22 : Row four</li>
518     '///+<li>5 , 11 , 17 : Row five</li>
519     '///+<li>6 , 12 , 18 : Row six</li>
520     '///</ul>
521     '///</ul>
523     select case iControl
524     case 1 ,  7 , 13 , 19 : hGetControlPosYO() = yOffset
525     case 2 ,  8 , 14 , 20 : hGetControlPosYO() = yOffset + 1 * yDistance
526     case 3 ,  9 , 15 , 21 : hGetControlPosYO() = yOffset + 2 * yDistance
527     case 4 , 10 , 16 , 22 : hGetControlPosYO() = yOffset + 3 * yDistance
528     case 5 , 11 , 17      : hGetControlPosYO() = yOffset + 4 * yDistance
529     case 6 , 12 , 18      : hGetControlPosYO() = yOffset + 5 * yDistance
530     end select
531     
532 end function
534 '*******************************************************************************
536 function hGetControlPosXE( iControl as integer ) as integer
538     '///<h3>Retrieve the lower right X-coordinate for a control</h3>
539     '///<i>In most cases it is desired to place multiple controls on a single 
540     '///+ dialog pane. To prevent the controls from overlapping each other
541     '///+ they are arranged in rows and columns. Each control is identified
542     '///+ by a unique number (see description for hInsertControl(...)). The 
543     '///+ dimensions are defined in hGetControlParams(...). The coordinates
544     '///+ returned by this function can be used to draw and to select a control.</i><br>
545     '///<u>Input</u>:
546     '///<ol>
547     '///+<li>Number of the control (integer)</li>
548     '///<ul>
549     '///+<li>Any number between 1 and 22, see description for hInsertControl()</li>
550     '///</ul>
551     '///</ol>
552     '///<u>Returns</u>:
553     '///<ol>
554     '///+<li>X-End in percent of window size (integer)</li>
555     '///</ol>
556     '///<u>Description</u>:
557     '///<ul>
559     '///+<li>Get pos for X-Orego, add &quot;XSIZE&quot;</li>
560     hGetControlPosXE() = hGetControlPosXO( iControl ) + _
561                          hGetControlParams( "xsize" )
562     '///</ul>
563     
564 end function
566 '*******************************************************************************
568 function hGetControlPosYE( iControl as integer ) as integer
570     '///<h3>Retrieve the lower right Y-coordinate for a control</h3>
571     '///<i>In most cases it is desired to place multiple controls on a single 
572     '///+ dialog pane. To prevent the controls from overlapping each other
573     '///+ they are arranged in rows and columns. Each control is identified
574     '///+ by a unique number (see description for hInsertControl(...)). The 
575     '///+ dimensions are defined in hGetControlParams(...). The coordinates
576     '///+ returned by this function can be used to draw and to select a control.</i><br>
577     '///<u>Input</u>:
578     '///<ol>
579     '///+<li>Number of the control (integer)</li>
580     '///<ul>
581     '///+<li>Any number between 1 and 22, see description for hInsertControl()</li>
582     '///</ul>
583     '///</ol>
584     '///<u>Returns</u>:
585     '///<ol>
586     '///+<li>Y-End in percent of window size (integer)</li>
587     '///</ol>
588     '///<u>Description</u>:
589     '///<ul>    
591     '///+<li>Get pos for Y-Orego, add &quot;YSIZE&quot;</li>
592     hGetControlPosYE() = hGetControlPosYO( iControl ) + _
593                          hGetControlParams( "ysize" )
594     '///</ul>
595     
596 end function
598 '*******************************************************************************
600 function hGetControlPosXM( iControl as integer ) as integer
602     '///<h3>Retrieve the center (X) of a control</h3>
603     '///<i>In most cases it is desired to place multiple controls on a single 
604     '///+ dialog pane. To prevent the controls from overlapping each other
605     '///+ they are arranged in rows and columns. Each control is identified
606     '///+ by a unique number (see description for hInsertControl(...)). The 
607     '///+ dimensions are defined in hGetControlParams(...). The coordinates
608     '///+ returned by this function can be used to draw and to select a control.</i><br>
609     '///<u>Input</u>:
610     '///<ol>
611     '///+<li>Number of the control (integer)</li>
612     '///<ul>
613     '///+<li>Any number between 1 and 22, see description for hInsertControl()</li>
614     '///</ul>
615     '///</ol>
616     '///<u>Returns</u>:
617     '///<ol>
618     '///+<li>X-Center in percent of window size (integer)</li>
619     '///</ol>
620     '///<u>Description</u>:
621     '///<ul>        
623     dim XO as integer
624     dim XE as integer
625     
626     '///+<li>Find X-Orego</li>
627     XO = hGetControlPosXO( iControl )
628     
629     '///+<li>Find X-End</li>
630     XE = hGetControlPosXE( iControl )
631     
632     '///+<li>Calculate the distance, find the middle between the two</li>
633     hGetControlPosXM() = XO + 0.5 * ( XE - XO )
634     '///</ul>
636 end function 
638 '*******************************************************************************
640 function hGetControlPosYM( iControl as integer ) as integer
642     '///<h3>Retrieve the center (Y) of a control</h3>
643     '///<i>In most cases it is desired to place multiple controls on a single 
644     '///+ dialog pane. To prevent the controls from overlapping each other
645     '///+ they are arranged in rows and columns. Each control is identified
646     '///+ by a unique number (see description for hInsertControl(...)). The 
647     '///+ dimensions are defined in hGetControlParams(...). The coordinates
648     '///+ returned by this function can be used to draw and to select a control.</i><br>
649     '///<u>Input</u>:
650     '///<ol>
651     '///+<li>Number of the control (integer)</li>
652     '///<ul>
653     '///+<li>Any number between 1 and 22, see description for hInsertControl()</li>
654     '///</ul>
655     '///</ol>
656     '///<u>Returns</u>:
657     '///<ol>
658     '///+<li>Y-Center in percent of window size (integer)</li>
659     '///</ol>
660     '///<u>Description</u>:
661     '///<ul>        
663     dim YO as integer
664     dim YE as integer
665     
666     '///+<li>Find Y-Orego</li>
667     YO = hGetControlPosYO( iControl )
668     
669     '///+<li>Find Y-End</li>
670     YE = hGetControlPosYE( iControl )
671     
672     '///+<li>Calculate the distance, find the middle between the two</li>
673     hGetControlPosYM() = YO + 0.5 * ( YE - YO )  
674     '///</ul>
675     
676 end function
678 '*******************************************************************************
680 function hSelectControl( iControl as integer ) as boolean
682     '///<h3>Function to select one of the BASIC formcontrols by index</h3>
683     '///<i>Note: Refer to the inline documentation for implementation details</i><br>
684     '///<i>In most cases it is desired to place multiple controls on a single 
685     '///+ dialog pane. To prevent the controls from overlapping each other
686     '///+ they are arranged in rows and columns. Each control is identified
687     '///+ by a unique number (see description for hInsertControl(...)). The 
688     '///+ dimensions are defined in hGetControlParams(...). The coordinates
689     '///+ returned by this function can be used to draw and to select a control.</i><br>
690     '///<u>Input</u>:
691     '///<ol>
692     '///+<li>Number of the control (integer)</li>
693     '///<ul>
694     '///+<li>Any number between 1 and 22, see description for hInsertControl()</li>
695     '///</ul>
696     '///</ol>
697     '///<u>Returns</u>:
698     '///<ol>
699     '///+<li>Errorstatus (boolean)</li>
700     '///<ul>
701     '///+<li>TRUE if the properties-button on ToolsCollectionBar is enabled</li>
702     '///+<li>FALSE in any other case</li>
703     '///</ul>
704     '///</ol>
705     '///<u>Description</u>:
706     '///<ul>        
708     dim xPos as integer
709     dim yPos as integer
710     dim iTry as integer  ' we try five times to grab the control
711     dim iTab as integer
713     hSelectControl() = false
715     '///+<li>Check function parameter, this is a top level function</li>
716     if ( ( iControl < 1 ) or ( iControl > ICONTROLCOUNT ) ) then
717         warnlog( "Incorrect index passed to function" )
718         exit function
719     endif       
721     '///+<li>Verify that the ToolsCollectionBar is visible. if not: Abort</li>
722     kontext "ToolsCollectionBar"
723     if ( not ToolsCollectionBar.exists() ) then
724         warnlog( "The ToolsCollectionBar is not visible, open it first" )
725         exit function
726     endif
727     
728     '///+<li>Enable the selection mode on ToolsCollectionBar</li>
729     SelectMode.click()
730     
731     ' Note: The controls have areas where they ignore a mouseclick. E.g. the
732     ' framecontrol can only be grabbed at the border, you won't be able to 
733     ' select it by clicking in the middle. Furthermore - even if the Dialog-
734     ' editor-window is maximized - we might still miss the upper left corner.
735     ' So what happens in this loop is that we try to click in the middle of the
736     ' control. This works in 21 out of 22 cases. If it fails, we try to grab the 
737     ' border, first upper left corner then lower right. If this still fails,
738     ' we try to select the control by using a rectangle selection around the
739     ' control. If this last resort fails, the function exits gracefully but
740     ' with a warnlog (causing some other functions to fail with warnings
741     ' as well). Beware of possible problems with screen resolutions. 
742     ' This function has been tested for 1024x768 and 1280x1024 pixels.
743     ' Method 4 is dangerous because it might accidentially select the 
744     ' background window which is the reason why this is not the default.
745     
746     ' New: Method 5 is troublesome as well because #i79126 does not enable the 
747     ' OpenProperties-button on the Macro Controls Float. Currently it is just used 
748     ' to see what happens if we hack alog using keystrokes. Experimental.
749     
750     '///+<li>Try four different ways of selecting the control before giving up</li>
751     '///<ol>
752     '///+<li>Mouse-Click in the middle</li>
753     '///+<li>Mouse-Click on upper left corner</li>
754     '///+<li>Mouse-Click on lower right corner</li>
755     '///+<li>Rubberband around the control (Mouse movement)</li>
756     '///+<li>Deselct everything and use <TAB> to activate the control</li>
757     '///</ol>
758     for iTry = 1 to 5
759         
760         Kontext "BasicIDE"
761         
762         select case iTry
763         case 1 
764             xPos = hGetControlPosXM( iControl )  
765             yPos = hGetControlPosYM( iControl )
766             DialogWindow.MouseMove( xPos, yPos )
767             DialogWindow.MouseDown( xPos, yPos )
768             DialogWindow.MouseUp  ( xPos, yPos ) 
769         case 2
770             xPos = hGetControlPosXO( iControl )  
771             yPos = hGetControlPosYO( iControl ) 
772             DialogWindow.MouseMove( xPos, yPos )
773             DialogWindow.MouseDown( xPos, yPos )
774             DialogWindow.MouseUp  ( xPos, yPos ) 
775         case 3
776             xPos = hGetControlPosXE( iControl )  
777             yPos = hGetControlPosYE( iControl )
778             DialogWindow.MouseMove( xPos, yPos )
779             DialogWindow.MouseDown( xPos, yPos )
780             DialogWindow.MouseUp  ( xPos, yPos ) 
781         case 4
782             xPos = hGetControlPosXO( iControl ) - 2  
783             yPos = hGetControlPosYO( iControl ) - 2
784             DialogWindow.MouseMove( xPos, yPos )
785             DialogWindow.MouseDown( xPos, yPos )
786             DialogWindow.MouseUp  ( xPos, yPos ) 
787             
788             xPos = hGetControlPosXE( iControl ) + 2  
789             yPos = hGetControlPosYE( iControl ) + 2              
790             DialogWindow.MouseMove( xPos, yPos )
791             DialogWindow.MouseUp  ( xPos, yPos ) 
792         case 5
793             qaerrorlog( "#i79126# - OpenProperties disabled when selecting control via tab" )
794             'xPos = 80
795             'yPos = 20
796             'DialogWindow.MouseDown( xPos, yPos )
797             'DialogWindow.MouseUp  ( xPos, yPos )
798             'for iTab = 1 to iControl + 1
799             '    DialogWindow.typeKeys( "<TAB>" )
800             'next iTab       
801         end select
802         
803         
804     
805         '///+<li>Check that the ToolsCollectionBar is open</li>
806         kontext "ToolsCollectionBar"
807         if ( ToolsCollectionBar.exists() ) then
808             wait( 300 )
809             if ( OpenProperties.isEnabled() ) then
810                 hSelectControl() = true
811                 exit for
812             else
813                 wait( 500 )
814             endif
815         endif
816         
817     next iTry
818     '///</ul>
820 end function