update dev300-m58
[ooovba.git] / testautomation / global / tools / includes / optional / t_basic_ide_tools.inc
blob2d7300950c6a0aa24f1baf0695529a0e291c698c
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: t_basic_ide_tools.inc,v $
11 '* $Revision: 1.2 $
13 '* last change: $Author: obo $ $Date: 2008-07-25 07:44:37 $
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 for the property-browser test
37 ' **
38 '\******************************************************************************
40 function hShowMacroControls() as boolean
42     '///<h3>Tear off the ToolsCollectionBar from the MacroBar</h3>
43     '///<i>Starting point: Basic dialog editor is open and has the focus</i>
44     '///<ul>
45     const CFN = "hShowMacroControls::"   
46     
47     printlog( CFN & "Enter" )
49     '///+<li>Test whether the ToolsCollectionBar is already open. If yes, exit directly</li>
50     kontext "ToolsCollectionBar"
51     if ( ToolsCollectionBar.exists( 3 ) ) then
52         printlog( CFN & "Exit: ToolsCollectionBar is already open." )
53         hShowMacroControls() = true
54         exit function
55     endif
56     
57     '///+<li>Verify that the Dialog Bar is available</li>
58     Kontext "DialogBar"
59     if ( DialogBar.exists( 5 ) ) then
61         '///+<li>Verify that the controls-button is enabled</li>
62         try        
63             '///+<li>Click on the controls-button to open the ToolsCollectionBar</li>
64             controls.click()
65             
66             '///+<li>Tear off the ToolsCollectionBar from the DialogBar</li>
67             controls.tearOff()
68             
69             '///+<li>Verify that the ToolsCollectionBar is visible and can be accessed</li>
70             kontext "ToolsCollectionBar"
71             if ( ToolsCollectionBar.exists( 5 ) ) then
72             
73                 '///+<li>Move it to the upper left corner at pos 50/50</li>
74                 ToolsCollectionBar.Move ( 50 , 50 )
75                 printlog( CFN & "Exit: ToolsCollectionBar is open and has been placed" )
76                 hShowMacroControls() = true
77                 exit function
78             else
79                 printlog( CFN & "Exit: ToolsCollectionBar is not available. Aborting." )
80                 hShowMacroControls() = false
81                 exit function
82             endif
83         catch
84             printlog( CFN & "Exit: The Controls-Button is not enabled. Aborting." )
85             hShowMacroControls() = false
86             exit function
87         endcatch        
88     else
89         printlog( CFN & "Exit: The Dialog Bar is not available. Aborting." )
90         hShowMacroControls() = false
91         exit function
92     endif
93     '///</ul>    
94         
95 end function
97 '*******************************************************************************
99 function hGetBasicWorkFile( cMajorID as string ) as string
101     '///<h3>Retrieve a filename, depending on gApplication and Build-ID</h3>
102     '///<i>Structure: work-directory/basic[.suffix]</i>
103     '///<ul>
104     
105     const CFN = "hGetBasicWorkFile::"
106     
107     dim sFile as string
108     
109     '///+<li>Build a path and a filename (path from UNO, Suffix from global-module)</li>
110     sFile = hGetWorkPath() & "basic" & hGetSuffix( cMajorId )
111     sFile = ConvertPath( sFile )
112     
113     printlog( CFN & sFile & " for " & gApplication & " (" & cMajorID & ")" )
114         
115     '///+<li>Return the path as string</li>
116     hGetBasicWorkFile() = convertpath( sFile )
117     
118     '///</ul>
120 end function
122 '*******************************************************************************
124 function hOpenBasicIDE() as boolean
126     '///<h3>Open the Basic IDE for the last module listed in the Macro Organizer</h3>
127     '///<i>Starting point: Basic Macro Organizer has focus</i>
128     '///<ul>
129     
130     const CFN = "hOpenBasicIDE::"
131     
132     '///+<li>Select the last module in the treelist, verify that it can be edited</li>
133     hSelectTheLastModule( true )
134     
135     '///+<li>Click the Edit-button</li>
136     Bearbeiten.click()
137     
138     '///+<li>Maximize the Basic IDE (required to ensure proper operation of mousemovements)</li>
139     sleep( 2 )
140     kontext "BasicIde"
141     BasicIde.maximize()
142     
143     '///+<li>Verify that the Basic IDE is open, return TRUE on success</li>
144     if ( BasicIde.exists() ) then
145        printlog( CFN & "Open Basic-IDE for existing module: success" )
146        hOpenBasicIDE() = true
147     else
148        printlog( CFN & "Open Basic-IDE for existing module: failure" )
149        hOpenBasicIDE() = false
150     endif
151     
152     '///</ul>
154 end function
156 '*******************************************************************************
158 function hCloseBasicIDE() as boolean
160     '///<h3>Close the BASIC-IDE with best effort verification</h3>
161     '///<i>Starting point: Basic IDE is open and has the focus</i>
162     '///<ol>
163     '///+<li>File-menu</li>
164     '///+<li>Slot FileClose</li>
165     '///+<li>hCloseDocument()/hDestroyDocument()</li>
166     '///</ol>
167     '///<ul>
168     
169     use "global\tools\includes\optional\t_docfuncs.inc"
170     
171     const CFN = "hCloseBasicIDE::"
172     dim brc as boolean
174     '///+<li>Close the macro controls float</li>
175     hCloseCollectionBar()
177     '///+<li>Try to close the current document</li>
178     brc = hDestroyDocument()
179     if ( brc ) then
180         hCloseBasicIDE() = true
181     else
182         hCloseBasicIDE() = false
183         qaerrorlog( "#i54135# Failed to close BASIC IDE" )
184     endif
185     '///</ul>
187 end function
189 '*******************************************************************************
191 function hReOpenBasicDialog() as boolean
193     '///<h3>Open BASIC-IDE after loading a workfile with documentbound macro</h3>
194     '///<i>Starting point: Focus on document containing at least one macro</i><br>
195     '///<i>IMPORTANT: Errorhandling is incomplete, test may end up in undefined state</i>
196     '///<ul>
197     
198     dim brc as boolean
200     '///+<li>open the macro dialog, select the last module</li>
201     brc = hSelectTheLastModule( true )
202     if ( not brc ) then
203         warnlog( "Could not open the last module for editing." )
204         hReOpenBasicDialog() = false
205         exit function
206     endif
208     '///+<li>edit the module</li>
209     Bearbeiten.Click()
211     '///+<li>find the dialog window.</li>
212     kontext "BasicIDE"
213     BasicIde.maximize()
215     brc = hFindFirstDialog() 
216     if ( not brc ) then
217         warnlog( "Could not find any dialog" )
218         hReOpenBasicDialog() = false
219     else
220         hReOpenBasicDialog() = true
221     endif
222     
223     '///+<li>Return TRUE on success, FALSE on failure</li>
224     '///</ul>
226 end function
228 '*******************************************************************************
230 function hFindFirstDialog() as boolean
232     '///<h3>Find the first dialog in the BASIC-IDE</h3>
233     '///<i>Starting point: Basic IDE must be open and has the focus</i>
234     '///<ul>
235     
236     dim iPosOverTabbar as integer
237     dim brc as boolean
238     const CFN = "hFindFirstDialog::"
240     '///+<li>Set focus to Basic IDE, maximize it</li>
241     kontext "BasicIde"
242     BasicIde.maximize()
243     
245     brc = false
247     '///+<li>move pointer over the tabbar and click until a dialog opens (hopefully)</li>
248     for iPosOverTabbar = 1 to 20
250         Tabbar.MouseDown ( 5 * iPosOverTabbar , 50 )
251         Tabbar.MouseUp   ( 5 * iPosOverTabbar , 50 )
253         if ( DialogWindow.Exists() ) then
254             brc = true
255             DialogWindow.typeKeys( "<up>", 5 )
256             exit for
257         endif
259     next iPosOverTabbar
260     
261     '///+<li>Return TRUE on success, FALSE on failure</li>
262     if ( brc ) then
263         printlog( CFN & "Found dialog" )
264     else
265         printlog( CFN & "Could not find the first dialog via tabbar" )
266     endif
267     hFindFirstDialog() = brc
268     '///</ul>
270 end function
272 '*******************************************************************************
274 function hSelectDialogPane() as boolean
276     '///<h3>Select the dialog pane in the Basic dialog editor</h3>
277     '///<i>Starting point: Basic dialog editor is open and has the focus</i>
278     '///<ul>
280     const CFN = "hSelectDialogPane::"
281     printlog( CFN & "Enter" )
282     
283     '///+<li>Select background dialog by rubberband</li>
284     kontext "BasicIDE"
285     
286     '///+<li>Set the mousepointer down at 90/90</li>
287     DialogWindow.mouseDown( 90 , 90 )
288     
289     '///+<li>Move it to 10/10</li>
290     DialogWindow.mouseMove( 10 , 10 )
291     
292     '///+<li>Release the mouse pointer at 10/10</li>
293     DialogWindow.mouseUp  ( 10 , 10 )
294     
295     '///+<li>Return TRUE, currently no verification is implemented</li>
296     printlog( CFN & "Exit: Selected dialog pane (not verified)" )
297     hSelectDialogPane() = true
298     '///</ul>
300 end function
302 '*******************************************************************************
304 function hCloseCollectionBar() as boolean
306     '///<h3>Close the ToolsCollectionBar (Macro Controls Float)</h3>
307     '///<i>Starting point: Basic Dialog editor is open, ToolsCollectionBar is open</i>
308     '///<ul>
309     
310     const CFN = "hCloseCollectionBar::"
311     const RETRIES = 3
312     
313     dim iTry as integer
314         iTry = 0
315     
316     '///+<li>Try to close the ToolsCollectionBar max 3 times</li>
317     kontext "ToolsCollectionBar"
318     while ( ToolsCollectionBar.exists( 1 ) )
319         iTry = iTry + 1
320         printlog( CFN & "Closing ToolsCollectionBar..." )
321         ToolsCollectionBar.close()
322         
323         if ( iTry = RETRIES ) then
324             printlog( CFN & "Failed to close ToolsCollectionBar" )
325             hCloseCollectionBar() = false
326             exit function
327         endif
328     wend
330     hCloseCollectionBar() = true
331     '///</ul>
332     
333 end function
335 '*******************************************************************************
337 function hDeleteMacro() as boolean
339     '///<h3>Delete all text in the Basic IDE editor</h3>
340     '///<i>Starting point: Basic IDE is open, has focus, code can be edited</i>
341     '///<ul>
342     
343     use "global\tools\includes\optional\t_accels.inc"
345     '///+<li>Verify all prerequisites are met (BasicIDE must be open)</li>
346     kontext "BasicIDE"
347     if ( not BasicIde.exists() ) then
348         warnlog( "hDeleteMacro::BasicIDE is not visible/active. Aborting" )
349         hDeleteMacro() = false
350         exit function
351     endif
353     dim brc as boolean
354     
355     '///+<li>get the languagespecific accelerator for "Edit->Select All"</li> 
356     dim cAccelerator as string
357         cAccelerator = hGetAccel( "SelectAll" )
358     
359     printlog( "hDeleteMacro::Using Accel: " & cAccelerator )
361     ' Common for all actions is that we delete the existing macro before
362     ' inserting the new one. This fails if the accelerator for SelectAll
363     ' is incorrect, we try to recover by doing this manually then.
364     '///+<li>Delete the entire content of the Basic IDE editor</li>
365     EditWindow.TypeKeys( cAccelerator )
366     EditWindow.TypeKeys( "<Delete>" )
368     ' Verify that the EditWindow is empty, if not use a method that
369     ' should work for all languages/locales
370     '///+<li>Verify that the editor window is indeed empty</li>
371     brc = hIsEditWindowEmpty()
372     if ( not brc ) then
373         qaerrorlog( "#i52430# hDeleteMacro::Accelerator " & cAccelerator & " failed" )
374         printlog( "hDeleteMacro::Trying alternative method" )
375         EditWindow.TypeKeys( "<Mod1 Home>" )
376         EditWindow.TypeKeys( "<Mod1 Shift End>" )
377         EditWindow.TypeKeys( "<Delete>" )
378         brc = hIsEditWindowEmpty()
379     endif
381     '///+<li>Return TRUE on success, FALSE on failure</li>
382     hDeleteMacro() = brc
383     '///</ul>
385 end function
387 '*******************************************************************************
389 function hIsEditWindowEmpty() as boolean
391     '///<h3>Test if the Basic-EditWindow is empty</h3>
392     '///<i>Starting point: Basic IDE editor is open and has the focus</i>
393     '///<ul>
394     
395     '///+<li>Verify that prerequisites are met: Basic IDE must be open</li>
396     kontext "BasicIDE"
397     if ( not BasicIDE.exists() ) then
398         warnlog( "hIsEditWindowEmpty::BasicIde is not open/visible" )
399         hIsEditWindowEmpty() = false
400         exit function
401     endif
403     '///+<li>Verify that the EditWindow is empty. EditCopy is disabled when empty</li>
404     EditWindow.TypeKeys( "<Mod1 Home>" )
405     EditWindow.TypeKeys( "<Mod1 Shift End>" )
406     try
407         EditCopy
408         printlog( "EditCopy should be enabled for empty Basic IDE editor" )
409     catch
410         setClipboard( "" )
411     endcatch
413     if ( getClipBoardText() <> "" ) then
414         hIsEditWindowEmpty() = false
415         printlog( "hIsEditWindowEmpty::no - content follows:" )
416         printlog( GetClipboardText )
417     else
418         hIsEditWindowEmpty() = true
419         printlog( "hIsEditWindowEmpty::yes" )
420     endif
421     
422     '///+<li>Return TRUE on success, FALSE on failure</li>
423     '///</ul>
425 end function
427 '*******************************************************************************
429 function hRenameTab( cTabName as string ) as integer
431     '///<h3>Rename the first tab in the Basic IDE Tabbar</h3>
432     '///<i>Starting point: Basic IDE is open, at least one tab exists</i><br>
433     '///Return values are:
434     '///<ul>
435     '///+<li>0 = Tab was correctly renamed</li>
436     '///+<li>1 = Invalid name warning is displayed (handle outside of function)</li>
437     '///+<li>2 = Unknown error / failed to rename the tab</li>
438     '///+<li>3 = Unable to access context menu</li>
439     '///</ul>
440     '///Description
441     '///<ul>
442     
443     const CFN = "hRenameTab::"
444     
445     dim cString as string
446     dim iWait as integer
447     dim iTry as integer
448     dim brc as boolean
449         brc = false
451     cString = "<HOME><SHIFT END>" & cTabName & "<RETURN>" 
452     kontext "basicide"
453     
454     '///+<li>Open the context menu of the tabbar</li>
455     for iTry = 1 to 5
456             try
457             kontext "basicide"
458                 Tabbar.OpenContextMenu
459             hMenuSelectNr( 3 )
460             sleep( 2 )
461             brc = true
463         catch
464             printlog( "No context menu, retrying..." )
465         endcatch
466     next iTry    
467         '///+<li>Select to rename the tab</li>
468     if ( not brc ) then
469         warnlog( CFN & "Unable to access Context Menu" )
470         hRenameTab() = 3 
471         exit function       
472     endif
473     
474     try
475         '///+<li>Overwrite the old name of the tab</li>
476         kontext "basicide"
477         Tabbar.TypeKeys( cString , true )
478         hRenameTab() = 0
479         printlog( CFN & "Tab renamed: " & cTabName )
480     catch
481         '///+<li>Handle possible errors</li>
482         hRenameTab() = 2
483         warnlog(  CFN & "Failed to rename tab: " & cTabName )
484         exit function
485     endcatch
486     
487     kontext "active"
488     for iWait = 1 to 3
489         sleep( 1 )
490         if ( active.exists() ) then
491             hRenameTab() = 1
492             printlog( CFN & "Invalid name for tab: Warning is displayed" )
493             exit for
494         endif
495     next iWait
496     '///+<li>Return 0, 1 or 2</li>
497     '///</ul>
498     
499 end function
501 '*******************************************************************************
503 function hGetTabNameFromOrganizer() as string
505     '///<h3>Retrieve the name of a tab from the Basic Library Organizer</h3>
506     '///<i>Starting point: Basic IDE is open and has the focus</i>
507     '///<ul>
509     const CFN = "hGetTabNameFromOrganizer::"
510     dim cReturnString as string
512     '///+<li>Open the Basic Library Organizer</li>
513     '///+<li>Go to the Module-Tab</li>
514     '///+<li>Get the name of the currently selected item from the Module-list</li>
515     '///+<li>Close the Macro Library Organizer</li> 
516     if ( hOpenBasicObjectOrganizer( 1 ) ) then
517         cReturnString = Modulliste.GetSelText()
518         TabModule.Close()
519         printlog( CFN & "Returning Tab-Name: " & cReturnString )
520     else
521         cReturnString = "Failure: Macro Organizer not open"
522         warnlog( CFN & cReturnString )
523         
524     endif
525     
526     '///+<li>Return the name from the Module-list</li>
527     hGetTabNameFromOrganizer() = cReturnString
528     '///</ul>
529    
530 end function
532 '*******************************************************************************
534 function hNewDialog() as boolean
536     '///<h3>Create a new BASIC dialog</h3>
537     '///<i>Starting point: Basic IDE is open</i>
538     '///<ul>
540     const CFN = "hNewDialog::"
542     '///+<li>Open the context menu for the tabbar</li>
543     kontext "basicide"
544     Tabbar.OpenContextMenu
545     
546     '///+<li>Select the first item (insert)</li>
547     hMenuSelectNr( 1 )
548     WaitSlot( 1000 ) ' sleep( 1 )
549     
550     '///+<li>Select the second item (new dialog)</li>
551     hMenuSelectNr( 2 )
552     WaitSlot( 2000 ) ' sleep( 2 )
553     
554     '///+<li>Verify that a new dialog is opened and has the focus</li>
555     if ( DialogWindow.Exists() ) then 
556         printlog( CFN & "New dialog is open" )
557         hNewDialog() = true
558                 if ( DialogWindow.IsMax() = false ) then                
559                         DialogWindow.Maximize()
560                         Wait( 2000 )
561                 end if          
562     else
563         warnlog( CFN & "New dialog is not open" )
564         hNewDialog() = false
565     endif
566     '///+<li>Return TRUE on success, FALSE on failure</li>
567     '///</ul>
569 end function
571 '*******************************************************************************
573 function hNewModule() as boolean
575     '///<h3>Create a new BASIC module</h3>
576     '///<i>Starting point: Basic IDE is open</i>
577     '///<ul>
579     const CFN = "hNewModule::"
581     '///+<li>Open the context menu for the tabbar</li>
582     kontext "basicide"
583     Tabbar.OpenContextMenu
584     
585     '///+<li>Select the first item (insert)</li>
586     hMenuSelectNr( 1 )
587     WaitSlot( 1000 ) ' sleep( 1 )
588     
589     '///+<li>Select the first item (new module)</li>
590     hMenuSelectNr( 1 )
591     WaitSlot( 2000 ) ' sleep( 2 )
592     
593     '///+<li>Verify that a new module is opened and has the focus</li>
594     if ( EditWindow.Exists() ) then 
595         printlog( CFN & "New module is open" )
596         hNewModule() = true 
597     else
598         warnlog( CFN & "New module is not open" )
599         hNewModule() = false
600     endif
601     '///+<li>Return TRUE on success, FALSE on failure</li>
602     '///</ul>
604 end function        
606 '*******************************************************************************
608 function hHideModule() as boolean
610     '///<h3>Hide a Basic Module from the IDE</h3>
611     '///<i>Starting point: Basic IDE is open and has the focus</i>
612     '///<ul>
614     const CFN = "hHideModule::"
615     
616     kontext "basicide"
617     
618     '///+<li>Open the context menu of the tabbar</li>
619     try
620        tabbar.openContextMenu
621        
622        '///+<li>Select the fourth entry (Hide)</li>
623        hMenuSelectNr( 4 )
624        sleep( 1 )
625        hHideModule() = true
626        printlog( CFN & "Success" )
627     catch
628        hHideModule() = false 
629        warnlog( CFN & "Failure" )
630     endcatch
631     '///+<li>Return TRUE on success, FALSE on any other condition (not verified)</li>
632     '///</ul>
633    
634 end function   
636 '*******************************************************************************
638 function hInitFormControls( cModule as string ) as boolean
640     '///<h3>Get from a new document to the Macro Controls Float in one go</h3>
641     '///<i>Starting point: Plain document</i><br>
642     '///This function performs following steps:
643     '///<ol>
644     '///+<li>Open the Basic Organizer</li>
645     '///+<li>Create a new module for the current document</li>
646     '///+<li>Open a new basic dialog</li>
647     '///+<li>Open the Macro controls float</li>
648     '///</ol>
649     '///Description:
650     '///<ul>
651     
652     const CFN = "hInitFormControls::"    
653     dim brc as boolean
654     '///+<li>Create and edit a new module for the current document</li>
655     brc = hInitBasicIde( cModule )
656     if ( not brc ) then
657         warnlog( "Could not create new module" )
658         hCloseBasicIde()
659         hInitFormControls() = false
660         exit function
661     endif     
662     
663     kontext "BasicIde"
664     BasicIde.maximize()   
666     '///+<li>Create a new dialog.</li>
667     brc = hNewDialog()
668     if ( not brc ) then
669         warnlog( "Could not create Basic-Dialog" )
670         hCloseBasicIde()
671         hInitFormControls() = false
672         exit function
673     endif    
674     
675     '///+<li>Open the macro controls float.</li>
676     brc = hShowMacroControls()
677     if ( not brc ) then
678         warnlog( CFN & "Could not tear off the macro controls float" )
679         hCloseBasicIde()
680         hInitFormControls() = false
681         exit function            
682     endif
683     
684     '///+<li>Return TRUE if all went well, FALSE on any other error</li>
685     hInitFormControls() = true
686     '///</ul>
687     '///NOTE: The function will try to cleanup after itself in case of failure
688     
689 end function
691 '*******************************************************************************
693 function hInitBasicIde( cModule as string ) as boolean
695     '///<h3>Get from a new document to the Basic IDE in one go</h3>
696     '///<i>Starting point: New, plain document</i>
697     '///<ul>
698     
699     use "global\tools\includes\optional\t_basic_organizer_tools.inc"
700     use "global\tools\includes\optional\t_listfuncs.inc"
702     const CFN = "hInitBasicIde::"
704     if ( cModule = "" ) then
705         warnlog( CFN & "Invalid parameter passed to function" )
706         hInitBasicIde() = false
707         exit function
708     endif        
709     
710     ' some multi-purpose return code 
711     dim brc as boolean 
712     
713     '///+<li>Open the basic Organizer</li>
714     brc = hOpenBasicOrganizerFromDoc()
715     if ( not brc ) then
716         warnlog( CFN & "Could not open the Basic Organizer, aborting" )
717         hInitBasicIde() = false
718         exit function
719     endif
721     '///+<li>Create a new module for the current document</li>
722     brc = hCreateModuleForDoc( cModule )
723     if ( not brc ) then
724         warnlog( CFN & "The Basic-IDE is not open, aborting" )
725         hInitBasicIde() = false
726         
727         kontext "Makro"
728         if ( Makro.exists() ) then
729             printlog( CFN & "Closed Macro Organizer" )
730             Makro.cancel()
731         endif
732         exit function
733     endif
734     
735     '///+<li>Maximize the BasicIDE</li>
736     kontext "BasicIde"
737     BasicIde.maximize()
738     
739     '///+<li>Verify that the Basic IDE is open, return TRUE on success, FASLE on failure</li>
740     hInitBasicIde() = true
741     '///</ul>
742     '///NOTE: The function will try to to clean up after itself in case of any error    
743     
744 end function 
746 '*******************************************************************************
748 function hInsertMacro( _id as integer ) as boolean
750     '///<h3>Insert a macro into the Basic-IDE edit window by Index</h3>
751     '///<i>Starting point: Basic IDE is open, has the focus</i>
752     '///<ul>
753     
754     const CFN = "hInsertMacro::"
755     dim brc as boolean
756     
757     if ( ( _id < 1 ) or ( _id > 3 ) ) then
758         warnlog( CFN & "Invalid parameter passed to function: " & _id )
759         hInsertMacro() = false
760         exit function
761     endif
762     
763     kontext "basicide"
764     
765     '///+<li>Delete the content of the edit window</li>
766     brc = hDeleteMacro()
767     if ( not brc ) then
768         warnlog( CFN & "Content of Basic-IDE was not deleted" )
769         hInsertMacro() = false
770         exit function
771     endif
772         
773     '///+<li>Insert a macro by index (passed as function parameter)</li>
774     select case _id
775     case 1 :
776         ' this is a working macro that contains no errors
777         EditWindow.TypeKeys( "'# TTMacro1: This is a short testscript for automated testing!<return><return>" )
778         EditWindow.TypeKeys( "sub main<return><return>" )
779         EditWindow.TypeKeys( "print " & Chr (34) + "hallo" & Chr (34) )
780         EditWindow.TypeKeys( "<Return><Return>" )
781         EditWindow.TypeKeys( "<Home>end sub<return>" )
782         hInsertMacro() = true
783         printlog( CFN & "Inserted: " & _id )
784     case 2 :
785         EditWindow.TypeKeys( "'# TTMacro2: a second module for automated testing!" )
786         EditWindow.TypeKeys( "<Return><Return>" )
787         hInsertMacro() = true
788         printlog( CFN & "Inserted: " & _id )
789     case 3 :
790         EditWindow.TypeKeys( "'# TTMacro3: Bring up a messagebox<return><return>" )
791         EditWindow.TypeKeys( "sub main<return><return>" )
792         EditWindow.TypeKeys( "    msgbox " & Chr (34) + "TTMacro3" & Chr (34) )
793         EditWindow.TypeKeys( "<Return><Return>" )
794         EditWindow.TypeKeys( "<Home>end sub<return>" )
795         hInsertMacro() = true  
796         printlog( CFN & "Inserted: " & _id )
797     end select
798    
799     '///</ul>
800     
801 end function
803 '*******************************************************************************
805 function hTestMacro( _id as integer ) as integer
807     '///<h3>Verify that the correct macro is visible in the IDE edit Window</h3>
808     '///<i>Starting point: Basic IDE is open and has focus</i>
809     '///<ul>
810     
811     const CFN = "hTestMacro::"
813     kontext "basicide"
815     '///+<li>Copy the first line in the editwindow to clipboard</li>  
816     EditWindow.TypeKeys( "<Mod1 Home>" )
817     EditWindow.TypeKeys( "<Home><Shift End>" ) 
818     EditCopy
819     
820     '///+<li>Compare the string to a unique substring for the macro</li>
821     select case _id
822     case 1 :
823         if ( Instr ( GetClipboardText, "TTMacro1" ) <> 0 ) then
824             printlog( CFN & "The correct macro is displayed in the editwindow" )
825             htestMacro() = 1
826             exit function
827         endif
828     case 2 :
829         if ( Instr ( GetClipboardText, "TTMacro2" ) <> 0 ) then
830             printlog( CFN & "The correct macro is displayed in the editwindow" )
831             htestMacro() = 2
832             exit function
833         endif
834     case 3 :
835         if ( Instr ( GetClipboardText, "TTMacro3" ) <> 0 ) then
836             printlog( CFN & "The correct macro is displayed in the editwindow" )
837             htestMacro() = 3
838             exit function
839         endif        
840     end select
841     
842     hTestMacro() = 0
843     '///</ul>
844     
845 end function
847 '*******************************************************************************
849 function hCreateBasicWorkFiles() as string
851     '///<H3>Create a macro, attach it to a file, save the file</H3>
852     '///<i>Starting point: The first doc or any other plain document</i>
853     '///<ul>
854     const CFN = "hCreateBasicWorkFiles::"
855     const CMACRO = "TestMacro"
856     
857     ' some returncodes
858     dim brc as boolean
859     dim irc as integer
860     dim crc as string
861     
862     dim sFile as string
863         sFile = hGetBasicWorkFile( "CURRENT" )
864         
865     '///+<li>Open a new document</li>
866     call hCreateDocument()
867     
868     '///+<li>Change the document (to save it)</li>
869     crc = hChangeDoc()
870     printlog( CFN & crc )
871     
872     '///+<li>Open Basic-Organizer, select the document and create a module</li>
873     brc = hInitBasicIde( CMACRO )
874     if ( not brc ) then
875         printlog( CFN & "Unable to create a module, aborting" )
876         call hDestroyDocument()
877         hCreateBasicWorkFiles() = ""
878         exit function
879     endif
880     
881     '///+<li>Insert a macro that triggers a messagebox</li>
882     brc = hInsertMacro( 3 )
883     if ( not brc ) then
884         printlog( CFN & "Unable to insert macro, aborting" )
885         hCloseBasicIde()
886         call hDestroyDocument()
887         hCreateBasicWorkFiles() = ""
888         exit function
889     endif
890     
891     '///+<li>Close the Basic-IDE</li>
892     brc = hCloseBasicIde()
893     
894     '///+<li>Save the file without autoextension, overwrite existing</li>
895     brc = hFileSaveAsKill( sFile )
896     if ( not brc ) then
897         printlog( CFN & "Unknown error while saving the file. Resetting" )
898         call ExitRestartTheOffice
899         hCreateBasicWorkFiles() = ""
900         exit function
901     endif
902     
903     '///+<li>Close the document</li>
904     call hDestroyDocument()
905     
906     '///</ul>
907     
908 end function
911 '*******************************************************************************
913 function hIDESelectTabByIndex( iIndex as integer ) as string
915     use "global\tools\includes\optional\t_accels.inc"
918     '///<h3>Select a tab within the BASIC-IDE by index</h3>
919      '///<i>The BASIC-IDE has to be open and has the focus. This function
920      '///+ selects the tab by sending CTRL+PAGEUP or CTRL+PAGEDOWN to the IDE using 
921      '///+ the .typeKeys method. It is assumed that - when opening the IDE - the 
922      '///+ first tab is active. When the specified index has been reached we 
923      '///+ retrieve the name of the current tab by opening the context menu on the 
924      '///+ tab and selecting &quot;Rename&quot;. The name (which should be 
925      '///+ highlighted by default) is then copied to the clipboard and returned  
926      '///+ to the calling function.</i><br><br>
928     '///<u>Parameter(s):</u><br>
929     '///<ol>
931     '///+<li>Index of the requested Tab (Integer)</li>
932     '///<ul>
933     '///+<li>Index must not be negative</li>
934     '///+<li>0 does nothing (returning the name of the current tab)</li>
935     '///+<li>Index must be &le; present number of tabs</li>
936     '///+<li>If Index &gt; number of tabs, the last tab is selected</li>
937     '///</ul>
939     '///</ol>
942     '///<u>Returns:</u><br>
943     '///<ol>
944     '///+<li>Name of the selected tab (string)</li>
945     '///<ul>
946     '///+<li>Always evaluate the returnvalue</li>
947     '///</ul>
948     '///</ol>
950     const CFN = "hIDESelectTabByIndex::"
951     printlog( CFN & "Enter with option: " & iIndex )
952     dim brc as boolean 'a multi purpose boolean returnvalue
953     
954     dim cTabName as string
955     dim iCurrentTab as integer
956     dim cAccel as string
958     '///<u>Description:</u>
959     '///<ul>
960     '///+<li>Set context to BASIC IDE</li>
961     kontext "BasicIDE"
962     
963     '///+<li>Retrieve the accelerator to switch tabs</li>
964     '///+<li>Switch tabs</li>
965     select case iIndex
966     case 0   :  cAccel = ""
967     case 1   :  cAccel = hGetAccel( "IDE_SWITCH_TAB-" )
968                 for iTab = 1 to 20
969                     BasicIDE.typeKeys( cAccel )
970                 next iTab
971     case else:  cAccel = hGetAccel( "IDE_SWITCH_TAB+" )
972                 for iTab = 1 to iIndex
973                     BasicIDE.typeKeys( cAccel )
974                 next iTab
975     end select
976     
977     '///+<li>Select the Tabbar</li>
978     Kontext "Tabbar"
979     
980     '///+<li>Open the context menu</li>
981     hUseMenu()
982     
983     '///+<li>Select &quot;Rename&quot;</li>
984     hSelectMenuNr( 3 )
985     
986     '///+<li>Copy the selected string to the clipboard</li>
987     EditCopy
988     
989     '///+<li>Send ESC to the tabbar to deselect the tab</li>
990     Kontext "Tabbar"
991     Tabbar.typeKeys( "<ESCAPE>" )
992     
993     '///+<li>Copy the string from clipboard to a local variable</li>
994     cTabName = getClipboardText
995     
996     '///+<li>Print exit message, set return value</li>
997     printlog( CFN & "Exit with result: " & cTabName )
998     hIDESelectTabByIndex() = cTabName
999     '///</ul>
1001 end function