merge the formfield patch from ooo-build
[ooovba.git] / testautomation / global / tools / includes / required / t_tools1.inc
blob6fbfd5358e524dd83b93ec0cf62672ded09f929c
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_tools1.inc,v $
11 '* $Revision: 1.1 $
13 '* last change: $Author: jsi $ $Date: 2008-06-13 10:27:11 $
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 '/******************************************************************************
34 '* owner : joerg.skottke@sun.com
36 '* short description : Tools (1)
38 '\******************************************************************************
40 private SLEEP_TIME_REQUESTED as integer
41 private SLEEP_CALLS_SUM as integer
42 private SLEEP_TIME_USED as integer
44 private const VERBOSE = FALSE
46 function GetClipboardText as string
48     '/// Returns the correct clipboard text (also if there is a 'RETURN' at it's end.
49     Dim i% : Dim CBText$
50     Dim Zwischen$
52     wait 500
53     GetClipboardText = ""
54     CBText$ = GetClipboard
56     if CBText$ = "" then
57         GetClipboardText = ""
58         exit function
59     end if
61     if asc ( Right( CBText$, 1 )) = 10 then
62         Zwischen$ = Mid( CBText$, 1, len(CBText$)-1 )
63         if Zwischen$ <> "" then
64             if asc ( Right( Zwischen$, 1 )) = 13 then
65                 GetClipboardText = Mid( Zwischen$, 1, len(Zwischen$)-1 )
66             else
67                 GetClipboardText = Zwischen$
68             end if
69         else
70             GetClipboardText = Zwischen$
71         end if
72     else
73         if asc ( Right( CBText$, 1 )) = 13 then
74             Zwischen$ = Mid( CBText$, 1, len(CBText$)-1 )
75             if asc ( Right( Zwischen$, 1 )) = 10 then
76                 GetClipboardText = Mid( Zwischen$, 1, len(Zwischen$)-1 )
77             else
78                 GetClipboardText = Zwischen$
79             end if
80         else
81             GetClipboardText = CBText$
82         end if
83     end if
84     
85 end function
87 '*******************************************************************************
89 function hDoubleClickInList ( window, Selektion as String, optional bFocus as boolean ) as Boolean
91     '/// hDoubleClickInList
92     '///+ Makes a double click onto an entry in a list (tested only in <i>style lists</i>)
93     '///+ window: name of list ///'
94     '///+ selektion: string to find in list ///'
95     '///+ bFocus: TRUE: activate the window with mouseclick before leaving ///'
96     '///+ ReturnValue: if found: TRUE; else FALSE ///'
98     Dim i as Integer
99     Dim AlterWert as String
100     Dim NeuerWert as String
102     NeuerWert = "!=!  !=!"                ' init with dummy value
103     window.TypeKeys "<Home>"
104     if window.gettext <> Selektion then
105         for i=1 to 100 step 2
106         
107             window.MouseDown 5, i +1
108             window.MouseUp 5, i +1
109             AlterWert = window.GetText
110             window.TypeKeys "<Down>"
111             NeuerWert = Window.GetText
112             window.TypeKeys "<Up>"
113             
114             if AlterWert = Selektion then
115             
116                 window.MouseDown 5, i +1
117                 window.MouseUp 5, i +1
118                 
119                 ' catch if <down> had any effects
120                 if Window.GetText = Selektion then     
121                 
122                     window.MouseDoubleClick 5, i +1
123                     
124                     ' if optional parameter provided
125                     if (isMissing (bFocus) = FALSE) then 
126                         window.MouseDown 5, i +1
127                         window.MouseUp 5, i +1
128                     endif
129                     
130                     i = 202
131                 else
132                     i=0                                 ' start at top of list
133                 end if
134             else
135             
136                 if AlterWert = NeuerWert then
137                     Warnlog "'" + Selektion + "' wasn't found in list!"
138                     i = 202
139                 else
140                 
141                     if i > 98 then
142                         i=40                  ' list not at end, but scrolled
143                     endif
144                     
145                 end if
146                 
147             end if
148             
149         next i
150         
151         if i < 200 OR i > 100 then
152             hDoubleClickInList = FALSE
153         else
154             hDoubleClickInList = TRUE
155         end if
156         
157     else
158         window.TypeKeys "<Return>"
159         hDoubleClickInList = TRUE
160     endif
162 end function
164 '*******************************************************************************
166 sub hMouseClick ( window, xPos, yPos )
167     
168     ' Author: Thorsten Ziehm (26.09.2000)
169     '/// hMouseClick
170     '///+ Do a mouse click on a named window.
171     '/// <i>Input</i>:
172     '///+ window : The object on which the mouse click should be make (document, listbox, window)
173     '///+ xPos : x-position (relativ to the size of the window (1:100)
174     '///+ yPos : y-position (relativ to the size of the window (1:100)
175     window.MouseDown ( xPos, yPos )
176     window.MouseUp ( xPos, yPos )
177     
178 end sub
180 '*******************************************************************************
182 function wielange (StrtTime, optional iFormat as integer) as String
184     ' Author: Michael Friedrichs
185     '/// wielange
186     '///+ Returns the time between a start- and an end timeframe.
187     '///+  iFormat: 0: default; 1: mysql ///'
189     Dim Zeitspanne
190     Dim Zeitspannesek
191     Dim Zeitspannemin
192     Dim Zeitspanneh
193     dim sTemp as string
195     if isMissing(iFormat) then
196         'dim iFormat as integer
197         iFormat = 0
198     endif
200     Zeitspanne = Now() - StrtTime
201     Zeitspannesek = Zeitspanne / 1.15741E-05 + 1
202     Zeitspanneh = Fix(Zeitspannesek / 3600)
203     Zeitspannesek = Zeitspannesek - Zeitspanneh * 3600
204     Zeitspannemin = Fix(Zeitspannesek / 60)
205     Zeitspannesek = Zeitspannesek - Zeitspannemin * 60
206     Zeitspannesek = Fix(Zeitspannesek)
207     select case iFormat
208     case 0 
209         sTemp = "" & Zeitspanneh & "h " & Zeitspannemin & "m " & Zeitspannesek & "s"
210     case 1 
211     ' mysql format for status.inc
212         if Zeitspanneh < 10 then         
213             sTemp = "0" & Zeitspanneh & ":"
214         else
215             sTemp = "" & Zeitspanneh & ":"
216         end if
217         
218         if Zeitspannemin < 10 then
219             sTemp = "" & sTemp & "0" & Zeitspannemin & ":"
220         else
221             sTemp = "" & sTemp & Zeitspannemin & ":"
222         end if
223         
224         if Zeitspannesek < 10 then
225             sTemp = "" & sTemp & "0" & Zeitspannesek
226         else
227             sTemp = "" & sTemp & Zeitspannesek
228         end if
229         
230     case default: 
231         qaErrorLog "t_tools1.inc::wielange: optional parameter iFormat out of range!"
232         sTemp = ""
233     end select
235     wielange = sTemp
236     
237 end function
239 '*******************************************************************************
241 function Sleep( optional _iSeconds as integer ) as integer
243     const CFN = "global::tools::includes::required::Sleep(...): "
244     
245     const STATUS_NO_DELAY          = 0
246     const STATUS_TIMEOUT_EXCEEDED  = 1
247     const STATUS_WAITSLOT_CRASHED  = 2
248     const STATUS_CLASSIC_WAIT_USED = 3
250     ' This is the "classic" behavior of the sleep function. If you did not set 
251     ' GLOBAL_USE_NEW_SLEEP to TRUE in your .bas file, this will be used.
252     if ( not GLOBAL_USE_NEW_SLEEP ) then
253         if ( IsMissing( _iSeconds ) ) then
254             wait( 1000 )
255         else
256             wait( _iSeconds * 1000 )
257         endif
258         sleep() = STATUS_CLASSIC_WAIT_USED
259         exit function
260     endif
262     ' This is an extended and accelerated version of the "classic" sleep()
263     ' subroutine which used to call Wait( n ) with a given number of
264     ' milliseconds. This function uses WaitSlot( n ) and is dynamic.
265     ' The try...catch block is necessary because WaitSlot() can - under certain
266     ' yet unknown conditions - make the office application crash.
267     ' When called with 0 seconds we return 0 (dynamic sleep statements within
268     ' test initialization can actually call the function with a Zero parameter)
269     ' A negative number forces the function to use the classic behavior.
270     ' If no time is given the function defaults to 5 seconds.
271     ' The function now provides returnvalues:
272     ' 0 = Normal WaitSlot() used, this is the preferred method.
273     ' 1 = WaitSlot() timeout reached, one extra second was added.
274     '     This is bad and the script developer should try to fix it.
275     ' 2 = Wait() was used (classic method, fallback).
276     ' 3 = Wait() was used (forced old behavior)
278     dim iMilliseconds as integer
279     dim iStatus as integer       : iStatus      = 0
280     dim lBegin as long           : lBegin       = GetSystemTicks
281     dim iSeconds as integer      : iSeconds     = 5
282     dim iSystemDelay as integer  : iSystemDelay = 1000
283     dim iTimeDiff as long        : iTimeDiff    = 0
284     
285     ' On Solaris we are a little slower, so we increase the system delay a little
286     if ( instr( lcase( gtSysName ) , "solaris" ) > 0 ) then
287         iSystemDelay = 1500
288     endif
290     ' Override default wait time (5 seconds) if parameter is given
291     if ( not IsMissing( _iSeconds ) ) then
292         iSeconds = _iSeconds
293     endif
295     ' Do exit directly if no wait requested
296     if ( iSeconds = 0 ) then
297         Sleep() = STATUS_NO_DELAY
298         exit function
299     endif
301     ' We need the time in ms and absolute (parameter can be negative)
302     iMilliseconds = abs( iSeconds * 1000 )
303     
304     ' Here we actually do the delay and generate return values
305     ' If WaitSlot() times out, we give an extra second (wait(1000))
306     if ( iSeconds > 0 ) then
307         try
308             if ( WaitSlot( iMilliseconds ) <> WSFinished ) then
309                 wait( iSystemDelay )
310                 iStatus = STATUS_TIMEOUT_EXCEEDED
311             endif
312         catch
313             wait( iMilliseconds )
314             iStatus = STATUS_WAITSLOT_CRASHED
315         endcatch
316     else
317         Wait( iMilliseconds )
318         iStatus = STATUS_CLASSIC_WAIT_USED
319     endif
320     
321     ' Find out how long it took, warn if time was zero (sleep most likely not required)
322     iTimeDiff = GetSystemTicks - lBegin
323     if ( iTimeDiff = 0 ) then
324         printlog( CFN & "Zero time. Please consider removing Sleep() statement" )
325     endif
326     
327     if ( VERBOSE ) then
328         SLEEP_CALLS_SUM      = SLEEP_CALLS_SUM + 1
329         SLEEP_TIME_USED      = SLEEP_TIME_USED + iTimeDiff / 1000 ' good enough
330         SLEEP_TIME_REQUESTED = SLEEP_TIME_REQUESTED + iSeconds 
331         printlog( CFN & "--------------------- New call ---------------------" )
332         printlog( CFN & "Total Sleep()-Time requested (seconds): " & SLEEP_TIME_REQUESTED )
333         printlog( CFN & "Total Sleep()-Time used (seconds).....: " & SLEEP_TIME_USED      )
334         printlog( CFN & "Total number of Sleep()-Calls.........: " & SLEEP_CALLS_SUM      )
335     endif
336     
337     ' Try to make something useful out of the status
338     if ( iStatus <> 0 ) then
339         printlog( CFN & "Sleep(" & abs( iSeconds ) & "), took " _
340         & iTimeDiff & " ms, rc=" & iStatus )
341         select case iStatus
342         case STATUS_TIMEOUT_EXCEEDED : 
343             printlog( CFN & "Timeout exceeded." )
344         case STATUS_WAITSLOT_CRASHED : 
345             printlog( CFN & "Used Wait(n). WaitSlot() failed." )
346         case STATUS_CLASSIC_WAIT_USED : 
347             printlog( CFN & "Used Wait(n). Classic behavior forced" )
348         end select
349     endif
350     Sleep() = iStatus
352 end function
354 '*******************************************************************************
356 sub DialogTest( Window, optional iNumber as integer)
358     '/// DialogTest
359     '///+ Make <i>SnapShots</i>
360     '/// <b>Window</b> : the name of the window as declared in qa/qatesttool/global/win/*
361     '/// <i>Optional Parameter</i> <b>iNumber</b> : Number to distinguish windows which dynamical change their content but not their ID///'
362     '///+ the number has to be provided by the testscript creator ///'
363     Dim Ergebnis as Integer
364     Dim Ausgabe as String
365     Dim UndRaus as Boolean
366     Dim sCount as string
368     ' evaluate optional parameter
369     if isMissing(iNumber) then
370         'just one picture
371         sCount = ""
372     else
373         'there will be more pictures with the same ID
374         sCount = "_"+iNumber
375     endif
377     if gDasNicht=0 then
378         ' In Place Translation Feature: not used anymore;
379         ' The matching of the strings on the later migration step never worked.
380         ' Just kept here for historical reasons
381         Ausgabe = ""
382         UndRaus = FALSE
383         while UndRaus = FALSE
384             Ausgabe = translate
385             if Ausgabe <> "" OR Ausgabe <> "1" then
386                 if Left ( Ausgabe, 1 ) = "0" then
387                     Ausgabe = Right ( Ausgabe, Len( Ausgabe )- 2 )
388                     AnhaengenAnDatei ( gOfficePath + "trans_output.txt", Ausgabe )
389                 end if
390             end if
391             if Ausgabe = "1" then
392                 UndRaus = TRUE
393             endif
394         wend
395     else
396         ' Usual window check
397         try
398             if Not window.Exists(2) then
399                 Warnlog "   - Window nicht existent:" + window.Name + " " + window.ID
400                 exit sub
401             end if
402             'To get a history, of what windows are covered, use the following line
403             '      AnhaengenAnDatei ( ConvertPath (gOfficePath + "user\work\wieviel.txt"), window.Name + " " + sCount + " : " + window.ID )
404         catch
405             ExceptLog
406         endcatch
407     end if
409     if gbSnapShot = TRUE then
410         'Make Screenshot from dialog and save as HelpID.bmp
411         Dim Dummy as String, sName as String, sPicName as String
413         'get window ID
414         Dummy = Window
415         'set filename
416         sName = Dummy + sCount + ".bmp"
418         'save with respect to application and language
419         sCapturePath = ConvertPath (gOfficePath + "user\work\screenshots"+iSprache+"\")
420         sPicName = sCapturePath + lCase(gApplication)
421         'create directory if it doesn't exist
422         if hDirectoryExists(sPicName) <> TRUE then
423             mkdir (sPicName)
424         end if
425         sPicName = sPicName + sName
426         try
427             sleep 1
428             window.SnapShot( sPicName )
429         catch
430             warnlog "t_tools1.inc::DialogTest Failed to save screenshot: '" + sPicName + "'"
431         endcatch
432         printlog sPicName
433     end if
434     
435 end sub
437 '*******************************************************************************
439 function hFindeImDokument ( Passage$ , Optional A, optional bRegEx ) as boolean
441     ' Author: Joerg Sievers (13.11.2001)
442     '/// hFindeImDokument
443     '/// Searches via 'Search&Replace'-Dlg in StarOffice Writer, -Clac,
444     '///+ -HTML, -GlobalDoc for the string <b>EXACT MATCH</b>.
445     '///+ Only ONE TIME and THE FIRST search phrase will be found!
446     '/// <i>Optional Parameter</i> <b>a</b> : If you do not want a warnlog message
447     '/// <i>Optional Parameter</i> <b>bRegEx</b> : if you look fort an regular expression
448     Dim WhatIsIn as string
449     Dim bSilent as boolean
451     bSilent = NOT isMissing(a)
452     gApplication = UCase ( gApplication )
453     hFindeImDokument = FALSE
455     select case gApplication
457     case "CALC" :
458         Kontext "DocumentCalc"
459         DocumentCalc.TypeKeys "<MOD1 HOME>"
461     case "WRITER" :
462         Kontext "DocumentWriter"
463         DocumentWriter.TypeKeys "<MOD1 HOME>"
465     case "HTMLDOKUMENT":
466         Kontext "DocumentWriterWeb"
467         DocumentWriterWeb.TypeKeys "<MOD1 HOME>"
469     case "GLOBALDOC" :
470         Kontext "DocumentMasterDoc"
471         DocumentMasterDoc.TypeKeys "<MOD1 HOME>"
472     end select
474     SetClipboard ""
475     EditSearchAndReplace
476     
477     Kontext "FindAndReplace"
478     if SimilaritySearch.IsVisible = False then
479         More.Click
480     end if
481     
482     if MatchCase.IsChecked = False then
483         MatchCase.Check
484     end if
485     
486     if SimilaritySearch.IsChecked = TRUE then
487         SimilaritySearch.UnCheck
488         if NOT bSilent then
489             warnlog "'Similarity search' checkbox was enabled! It shouldn't be the default!"
490         endif
491     end if
492     
493     if IsMissing(bRegEx) <> TRUE then
494         RegularExpressions.Check
495     end if
496     
497     SearchFor.Settext Passage$
498     SearchNow.Click
499     
500     Kontext
501     if NOT Active.Exists(2) then
502     
503         Kontext "FindAndReplace"
504         More.Click
505         FindAndReplace.Cancel
506         EditCopy
507         WhatIsIn = GetClipboardText
508         
509         if WhatIsIn <> Passage$ then
510             if NOT bSilent then
511                 warnlog "The search-request for '" & Passage$ & "' has been fault! (Found: '"& WhatIsIn & "')"
512             end if
513         else
514             hFindeImDokument = TRUE
515         end if
516         
517     else
518         try
519             Kontext
520             if Active.Exists(1) then
521                 Active.OK
522             end if
523             
524             if NOT bSilent then
525                 warnlog "The search-request for '" & Passage$ & "' has been fault! (Found: '"& WhatIsIn & "')"
526             end if
527             
528             Kontext "FindAndReplace"
529             if SimilaritySearch.IsVisible = False then
530                 More.Click
531             endif
532             
533             if MatchCase.IsChecked then
534                 MatchCase.UnCheck
535             endif
536             
537             if SimilaritySearch.IsChecked = TRUE then
538             
539                 SimilaritySearch.UnCheck
540                 if NOT bSilent then
541                     warnlog "'Similarity search' checkbox was enabled! It shouldn't be the default!"
542                 endif
543             end if
544             
545             if IsMissing(bRegEx) <> TRUE then
546                 RegularExpressions.UnCheck
547             endif
548             
549             More.Click
550             FindAndReplace.Cancel
551         catch
552             Active.Yes
553             
554             Kontext
555             if bSilent then
556                 if Active.Exists then
557                     printlog "> "+Active.GetText
558                 endif
559             endif
560             
561             if Active.Exists then
562                 Active.OK
563             endif
564             
565             if NOT bSilent then
566                 warnlog "The search-request for '" & Passage$ & "' has been fault! (Found: '"& WhatIsIn & "')"
567             endif
568             
569             Kontext "FindAndReplace"
570             if SimilaritySearch.IsVisible = False then
571                 More.Click
572             endif
573             
574             if MatchCase.IsChecked then
575                 MatchCase.UnCheck
576             endif
577             
578             if SimilaritySearch.IsChecked = TRUE then
579             
580                 SimilaritySearch.UnCheck
581                 if NOT bSilent then
582                     warnlog "'Similarity search' checkbox was enabled! It shouldn't be the default!"
583                 endif
584             end if
585             
586             if IsMissing(bRegEx) <> TRUE then
587                 RegulaererAusdruck.UnCheck
588             endif
589             
590             More.Click
591             FindAndReplace.Cancel
592             
593         endcatch
594     end if
595     
596 end function
598 '*******************************************************************************
600 function hFindeMehrImDokument ( Passage as string , WieOft as integer ) as boolean
602     ' Author: Joerg Sievers (26.07.2000)
603     '/// hFindeMehrImDokument
604     '/// Searches per 'Search&Replace'-Dlg in StarOffice Writer, -Clac,
605     '///+-HTML, -GlobalDoc for the string <b>EXACT MATCH</b>.
606     '/// You have to give the function the number how often the phrase
607     '///+should be found in the document as an additional parameter (as integer).
608     '/// Only when exact the number of the phrase will be found correctly
609     '///+the function gives back TRUE.
610     '/// <i>see also</i> : hFindeImDokument (TOOLS.INC)
611     Dim i as integer
612     gApplication = UCase ( gApplication )
614     hFindeMehrImDokument = FALSE
616     select case gApplication
618     case "CALC" : 
619         Kontext "DocumentCalc"
620         DocumentCalc.TypeKeys "<MOD1 HOME>"
622     case "WRITER" : 
623         Kontext "DocumentWriter"
624         DocumentWriter.TypeKeys "<MOD1 HOME>"
626     case "HTMLDOKUMENT": 
627         Kontext "DocumentWriter"
628         DocumentWriter.TypeKeys "<MOD1 HOME>"
630     case "GLOBALDOC" : 
631         Kontext "DocumentMasterDoc"
632         DocumentMasterDoc.TypeKeys "<MOD1 HOME>"
634     end select
636     SetClipboard ""
637     EditSearchAndReplace
639     For i = 1 to WieOft
640     
641         Kontext "FindAndReplace"
642         if NOT MatchCase.IsChecked then
643             MatchCase.Check
644         endif
645         SearchFor.Settext Passage
646         SearchNow.Click
647         
648         Kontext
649         if NOT Active.Exists(2) then
650         
651             FindAndReplace.Cancel
652             EditCopy
653             
654             if GetClipboardText <> Passage then
655                 warnlog "The search-request for '" & Passage & "' has been fault!"
656                 i = WieOft
657             else
658                 if i = WieOft then
659                     hFindeImDokument = TRUE
660                     printlog "Searchphrase found " & i & " time(s)."
661                 end if
662             end if
663         else
664             try
665                 Active.OK
666                 
667                 Kontext
668                 if Active.Exists then
669                     Active.OK
670                 endif
671                 warnlog "The search-request for '" & Passage & "' has been fault!"
672                 i = WieOft
673                 Kontext "FindAndReplace"
674                 
675                 if MatchCase.IsChecked then
676                     MatchCase.UnCheck
677                 endif
678                 FindAndReplace.Cancel
679             catch
680                 Active.Yes
681                 
682                 Kontext
683                 if Active.Exists then
684                     Active.OK
685                 endif
686                 warnlog "The search-request for '" & Passage & "' has been fault!"
687                 i = WieOft
688                 
689                 Kontext "FindAndReplace"
690                 if MatchCase.IsChecked then
691                     MatchCase.UnCheck
692                 endif
693                 FindAndReplace.Cancel
694             endcatch
695         end if
696     Next i
697     Kontext "FindAndReplace"
698     if FindAndReplace.Exists(2) then
699         FindAndReplace.Cancel
700     end if
701     
702 end function
704 '*******************************************************************************
706 sub ErgebnisSchreiben ( Window, Name$ )
708     '/// ErgebnisSchreiben
709     '///+ Used in context with making screenshots.
710     
711     Dim FileNum% : Dim i%
712     Dim Datei$
713     Dim Text$ : Dim Text2$
715     Datei$ = sCapturePath + "Ergebis.txt"
716     Text2$ = Window.Name
717     Text$ = Text2$ +  "    =>   " + Name$
719     FileNum% = FreeFile
720     Open Datei$ for Append  as #FileNum%
721     Print #FileNum%, Text$
722     Close #FileNum%
723     
724 end sub
726 '*******************************************************************************
728 sub TextInDatei ( TextText$, Datei$ )
730     '/// TextInDatei
731     
732     Dim FileNum%
734     FileNum% = FreeFile
735     Open Datei$ for Append  as #FileNum%
736     Print #FileNum%, TextText$
737     Close #FileNum%
738     
739 end sub
741 '*******************************************************************************
743 function TrimTab ( sTrimmer as String ) as String
745     '/// TrimTab
746     '/// <u>Input</u>: the original text
747     '/// Returns the string without &lt;tab&gt;s at the beginning and the end of a string.
748     
749     Dim sInterim as String
751     sInterim = sTrimmer
752     sInterim = lTrimTab ( sInterim )
753     TrimTab = rTrimTab ( sInterim ) 
755 end function
757 '*******************************************************************************
759 function lTrimTab ( slTrimmer as String ) as String
761     '/// lTrimTab
762     '/// <u>Input</u>: the original text
763     '/// Returns the string without &lt;tab&gt;s at the beginning.
764     '/// Cuts &lt;Tab's&gt; at the beginning of a string ( left )
765     
766     Dim i, iLen as Integer
767     Dim sInterim as String
769     iLen = len ( slTrimmer )
770     sInterim = slTrimmer
772     for i=1 to iLen
773         if Asc ( left ( sInterim, 1 ) ) = 9 then
774             sInterim = Right ( sInterim, len ( sInterim ) - 1 )
775         else
776             i=iLen+1
777         end if
778     next i
779     lTrimTab = sInterim
780 end function
782 '*******************************************************************************
784 function rTrimTab ( srTrimmer as String ) as String
786     '/// rTrimTab
787     '/// Input: the original text
788     '/// Returns the string without &lt;tab&gt;s at the end.
789     '/// Cuts &lt;Tab's&gt; at the beginning of a string ( right )
791     Dim i, iLen as Integer
792     Dim sInterim as String
794     iLen = len ( srTrimmer )
795     sInterim = srTrimmer
797     for i=1 to iLen
798         if Asc ( right ( sInterim, 1 ) ) = 9 then
799             sInterim = left ( sInterim, len ( sInterim ) - 1 )
800         else
801             i=iLen+1
802         end if
803     next i
804     rTrimTab = sInterim
806     end function
808 '*******************************************************************************
810 function TrimString (Content as String, delim as integer) as String
812     ' Author: Frank Heitbrock (26.07.2002)
813     '/// TrimString
814     '/// <u>Input</u>: The  String, the delimiter which should be cut from the string.
815     '/// Returns the String without the delimiter.
816     '/// <u>Example</u>:
817     '///+ Content = &quot;&nbsp;H&nbsp;a&nbsp;l&nbsp;l&nbsp;o&nbsp;&quot;, delim = 32 (ascii for space character)
818     '///+ Return = &quot;Hallo&quot;
819     dim strlen as integer, i as integer, k as integer
820     dim CharBuff(1 to 100) as String
821     dim ResultStr as String
822     ' at first cut the empty strings left and right of the String
823     Content = lTrim(Content)
824     Content = rTrim(Content)
825     ' now we search for all appropriate ascii characters in the middle of the String and delete them
826     strlen = len(Content)
827     k = 1
828     for i = 1 to strlen
829         if mid(Content, i, 1) <> chr(delim) then
830             CharBuff(k) = mid(Content, i, 1)
831             k = k +1
832         end if
833     next i
834     for i = 1 to k
835         ResultStr = ResultStr + CharBuff(i)
836     next i
837     TrimString = ResultStr
839 end function
841 '*******************************************************************************
843 function ActiveDeactivateAsianSupport ( WhatState as Boolean ) as Boolean
845     ' Author: Thorsten Ziehm
846     '/// ActiveDeactivateAsianSupport
847     '/// <u>Input</u>: TRUE or FALSE
848     '///+ TRUE: The Asian support will be enabled.
849     '///+ FALSE:  The Asian support will be disabled.
850     '/// <u>Return:</u>
851     '///+ TRUE/FALSE for the last state of the checkbox in the office UI.
852     ToolsOptions
853     hToolsOptions ( "LanguageSettings", "Languages" )
855     IF Aktivieren.IsEnabled then        'the checkbox is disabled in asian versions
856         ActiveDeactivateAsianSupport = Aktivieren.IsChecked         ' the function gets the old state of the checkbox
858         if WhatState = TRUE then
859             try
860                 Aktivieren.Check
861             catch
862             endcatch
863         else
864             Aktivieren.UnCheck
865         end if
866         gAsianSup = WhatState    ' Set the global variable
868         Kontext "ExtrasOptionenDlg"
869         ExtrasOptionenDlg.OK
870         Sleep (3)
871     else
872         ActiveDeactivateAsianSupport = TRUE
873         If WhatState = FALSE then
874             warnlog "Deactivating of asian language support is not possible, because it is disabled in cjk versions"
875         end if
876         Kontext "ExtrasOptionenDlg"
877         ExtrasOptionenDlg.OK
878         Sleep (3)
879     end if
881 end function
883 '*******************************************************************************
885 function ActiveDeactivateCTLSupport ( WhatState as Boolean ) as Boolean
887     ' Author: Hercule Li (March 2004)
888     '/// ActiveDeactivateCTLSupport
889     '/// <u>Input</u>: TRUE or FALSE
890     '/// TRUE :  The CTL will be enabled.
891     '/// FALSE:  The CTL will be disabled.
892     '/// <u>Return:</u>
893     '/// TRUE/FALSE for the last state of the checkbox in the office UI.
894     ToolsOptions
895     hToolsOptions ( "LanguageSettings", "Languages" )
897     IF ComplexScriptEnabled.IsEnabled then        'the checkbox is disabled in CTL versions
898         ActiveDeactivateCTLSupport = ComplexScriptEnabled.IsChecked      ' the function gets the old state of the checkbox
900         if WhatState = TRUE then
901             ComplexScriptEnabled.Check
902         else
903             ComplexScriptEnabled.UnCheck
904         end if
905         gCTLSup = WhatState    ' Set the global variable
907         Kontext "ExtrasOptionenDlg"
908         ExtrasOptionenDlg.OK
909         Sleep (3)
910     else
911         ActiveDeactivateCTLSupport = TRUE
912         If WhatState = FALSE then
913             warnlog "Deactivating of CTL language support is not possible, because it is disabled in ctl versions"
914         end if
915         Kontext "ExtrasOptionenDlg"
916         ExtrasOptionenDlg.OK
917         Sleep (3)
918     end if
920 end function
922 '*******************************************************************************
924 function GetDecimalSeperator ( optional sDummy$ ) as String
926     '/// <u>Precondition</u>: Measuring unit has to be set to centimeter (cm) before using this function. (see: fSetMeasurementToCM())
927     '///+ <u>Input</u>: Number with fractionmark from <i>NumericField</i> as string
928     '///+ <u>Output</u>: A dot (.) or a comma (,) as string
929     Dim sCheckForSeparator as string
930     Const cWhereIsThisFunction = "qa::qatesttool::global::tools::inc::t_tools1.inc::GetDecimalSeperator: "
931     Dim bDotOrCommaIncluded as boolean
933     'Setting the determination of a dot or a comma to FALSE until it was successfull.
934     bDotOrCommaIncluded = FALSE
936     if IsMissing(sDummy$) then
937         '/// Opening a new document depending on <i>gApplication</i> value and closing it at the end.
938         Call hNewDocument
939         '/// Tools / Options / (Modul: gApplication) / General tabpage.
940         ToolsOptions
941         '///+ <ol><li>Reading the string of the tabulator numeric field</li>
942         select case gApplication
943         case "WRITER" 
944             Call hToolsOptions("WRITER","GENERAL")
945             sCheckForSeparator = Tabulatorenabstand.GetText
946         case "CALC" 
947             Call hToolsOptions("CALC","GENERAL")
948             sCheckForSeparator = Tabulator.GetText
949         case "IMPRESS" 
950             Call hToolsOptions("IMPRESS","GENERAL")
951             sCheckForSeparator = Tabulatorenabstand.GetText
952         case "DRAW" 
953             Call hToolsOptions("DRAW","GENERAL")
954             sCheckForSeparator = Tabulatorenabstand.GetText
955         case "MASTERDOCUMENT"
956             Call hToolsOptions("WRITER","GENERAL")
957             sCheckForSeparator = Tabulatorenabstand.GetText
958         case "HTML"
959             Call hToolsOptions("WRITER","GENERAL")
960             sCheckForSeparator = Tabulatorenabstand.GetText
961         case else
962             warnlog cWhereIsThisFunction & "For this module ("& gApplication &") no decimal seperator setting exists."
963         end select
964         Kontext "ExtrasOptionenDlg"
965         ExtrasOptionenDlg.OK
966         if Instr(sCheckForSeparator, ",") > 0 then
967             GetDecimalSeperator = ","
968             bDotOrCommaIncluded = TRUE
969         endif
970         if Instr(sCheckForSeparator, ".") > 0 then
971             GetDecimalSeperator = "."
972             bDotOrCommaIncluded = TRUE
973         endif
974         Call hCloseDocument
975     else
976         '///+ <li>or determining the seperator depending on the OPTIONAL value (string).</li></ol>
977         'Get position of fraction mark / get IT
978         if InStr (sDummy$, ",") > 0 then
979             GetDecimalSeperator = ","
980             bDotOrCommaIncluded = TRUE
981         endif
982         if InStr (sDummy$, ".") > 0 then
983             GetDecimalSeperator = "."
984             bDotOrCommaIncluded = TRUE
985         endif
986     endif
988     '/// If the determination failed the dot will be used (default) as decimal seperator.
989     if bDotOrCommaIncluded = FALSE then
990         warnlog cWhereIsThisFunction & "Unable to determine decimal separator. Setting dot (.) as default."
991         GetDecimalSeperator = "."
992     endif
993     printlog "Info: Decimal Seperator is a '" & GetDecimalSeperator & "'."
994     
995 end function
997 '*******************************************************************************
999 sub sResetTheOffice as boolean
1001     Dim uno
1002     Dim ap
1003     Dim xViewRoot
1004     Dim apara(1) As new com.sun.star.beans.PropertyValue
1005     Dim temp()
1006     Dim i,x as integer
1007     Dim sString as string
1008     Dim fDeleteList(32000) as string
1009     Dim sLanguage as string
1010     Dim bError as boolean
1011     Dim sDefaultLocale as string
1012     Dim sDefaultLocaleCJK as string
1013     Dim sDefaultLocaleCTL as string
1014     Dim sfgetL10Nvalue as string
1015     Dim SetupXML as String
1016     Dim SetupXMLNet as string
1017     Dim SetupXMLDefault as string
1018     Dim sLanOutIni as string
1020     sString = "qa:qatesttool:calc:options:inc:coption1.inc:: "
1021     sResetTheOffice = TRUE
1023     ' only run on UNIX platforms; there is a problem with the quickstarter on win32
1024     if ("unx" = gPlatgroup) then
1025         try
1026             SetupXML = gOfficePath & ConvertPath("user\registry\data\org\openoffice\Setup.xcu")
1027             ' function 'fgetL10Nvalue' is also in this library
1028             sLanOutIni = fgetL10Nvalue(SetupXML)
1029         catch
1030             try
1031                 ' BugID 98315 -> looking in networkpath for the language until bug will be fixed.
1032                 SetupXMLNet = gNetzOfficePath & ConvertPath("share\registry\data\org\openoffice\Setup.xcu")
1033                 sLanOutIni = fgetL10Nvalue(SetupXMLNet)
1034             catch
1035                 try
1036                     ' It is an English FAT version 645m9s2 or higher.
1037                     SetupXMLDefault = gOfficePath & ConvertPath("share\registry\data\org\openoffice\Setup.xcu")
1038                     sLanOutIni = fgetL10Nvalue(SetupXMLDefault)
1039                 catch
1040                     warnlog sString & SetupXML & " not found => can't get the correct Office-Language!."
1041                     sResetTheOffice = FALSE
1042                     Exit sub
1043                 endcatch
1044             endcatch
1045         endcatch
1047         uno=hGetUnoService()
1049         'Get UI language
1050         try
1051             ap=uno.createInstance("com.sun.star.configuration.ConfigurationProvider")
1052             apara(0).Name="nodepath"
1053             apara(0).Value="/org.openoffice.Office.Linguistic/General"
1054             apara(1).Name="lazywrite"
1055             apara(1).Value=False
1056             xViewRoot=ap.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess",aPara())
1057             sLanguage = sfgetL10Nvalue
1058             sDefaultLocale = xViewRoot.getPropertyValue("DefaultLocale")
1059             sDefaultLocaleCJK = xViewRoot.getPropertyValue("DefaultLocale_CJK")
1060             sDefaultLocaleCTL = xViewRoot.getPropertyValue("DefaultLocale_CTL")
1061             printlog "Old UI language: '" + sLanOutIni + "'"
1062             printlog "Old default locale: '" + sDefaultLocale + "'"
1063             printlog "Old default locale CJK: '" + sDefaultLocaleCJK + "'"
1064             printlog "Old default locale CTL: '" + sDefaultLocaleCTL + "'"
1065             xViewRoot.dispose()
1066             bError = FALSE
1067         catch
1068             warnlog sString + "Failed to read UI language."
1069             bError = TRUE
1070         endcatch
1072         if NOT bError then
1073             'Close OOo
1074             try
1075                 ' To prevent restarting of OOo, the try/catch is around this and
1076                 ' to prevent messages about communication errors
1077                 printlog ResetApplication
1078                 FileExit "SynchronMode", TRUE
1079                 try
1080                     ' It is no error, if this fails - so it gets its own try/catch
1081                     kontext
1082                     if active.exists(5) then
1083                         active.no 'discard changes
1084                     endif
1085                 catch
1086                 endcatch
1087                 bError = FALSE
1088             catch
1089                 warnlog sString + "Failed to close OOo."
1090                 bError = TRUE
1091             endcatch
1092             sleep 10 'To wait until OOo is realy away
1093         endif
1095         'only act, if no error and if language <> ''
1096         if (NOT bError AND sLanguage <> "") then
1097             'Remove user directory
1098             try
1099                 if (right(gOfficePath,1)=gPathSigne) then
1100                     'Dir doesn't work, is a path singe is at the end
1101                     gOfficePath = left(gOfficePath,len(gOfficePath)-1)
1102                 endif
1103                 printlog "Going to delete directory: '" + gOfficePath + "'"
1104                 if (dir(gOfficePath) = "") then
1105                     qaErrorlog "Directory is already deleted."
1106                 else
1107                     rmDir (gOfficePath)
1108                     if (dir(gOfficePath) <> "") then
1109                         warnlog "Directory wasn't deleted."
1110                     endif
1111                 endif
1112                 bError = FALSE
1113             catch
1114                 warnlog sString + "Failed to delete user directory."
1115                 bError = TRUE
1116             endcatch
1117         endif
1119         'Start OOo and restore language
1120         'Needs only to be done, if UI language wasn't the default (!= "")
1121         if ((sLanguage & sDefaultLocale & sDefaultLocaleCJK & sDefaultLocaleCTL) <> "") then
1122             try
1123                 hStartTheOffice
1124                 Call hDisableQuickstarter
1125                 'Here we need the Exit from a running Quickstarter...
1126                 Call ExitRestartTheOffice
1127                 uno=hGetUnoService()
1128                 ap=uno.createInstance("com.sun.star.configuration.ConfigurationProvider")
1129                 apara(0).Name="nodepath"
1130                 apara(0).Value="/org.openoffice.Office.Linguistic/General"
1131                 apara(1).Name="lazywrite"
1132                 apara(1).Value=False
1133                 xViewRoot=ap.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess",aPara())
1134                 if (sLanOutIni <> "") then
1135                     printlog "Old UI language: '" + sLanOutIni + "'"
1136                     xViewRoot.setPropertyValue("UILocale", sLanOutIni)
1137                     xViewRoot.commitChanges()
1138                 endif
1139                 if (sDefaultLocale <> "") then
1140                     printlog "Old default locale: '" + sDefaultLocale + "'"
1141                     xViewRoot.setPropertyValue("DefaultLocale", sDefaultLocale)
1142                     xViewRoot.commitChanges()
1143                 endif
1144                 if (sDefaultLocaleCJK <> "") then
1145                     printlog "Old default locale CJK: '" + sDefaultLocaleCJK + "'"
1146                     xViewRoot.setPropertyValue("DefaultLocale_CJK", sDefaultLocaleCJK)
1147                     xViewRoot.commitChanges()
1148                 endif
1149                 if (sDefaultLocaleCTL <> "") then
1150                     printlog "Old default locale CTL: '" + sDefaultLocaleCTL + "'"
1151                     xViewRoot.setPropertyValue("DefaultLocale_CTL", sDefaultLocaleCTL)
1152                     xViewRoot.commitChanges()
1153                 endif
1154                 if xViewRoot.hasPendingChanges() then
1155                     warnlog(sFileFunction+"Changes still pending...")
1156                 endif
1157                 xViewRoot.dispose()
1158             catch
1159                 warnlog sString + "Failed to set UI language."
1160                 exit sub
1161             endcatch
1162         endif
1164         Call ExitRestartTheOffice
1165     endif
1166 end sub
1168 '*******************************************************************************
1170 sub raiseApplication
1172     ' Try to solve focus problem on MacOS X; After calling this function, OOo should be most front;
1173     Dim i as integer
1174     Dim a as integer
1175     Dim b as integer
1176     Dim tBundle as string
1177     Dim aPath
1179     ' Calling just the .app with open on MacOS X via shell command
1180     if ( lcase( gPlatform ) = "osx" ) then
1181     
1182         aPath = split(gNetzOfficePath, gPathSigne)
1183         a=0
1184         ' make sure 'Contents' is just one time in path
1185         for i=0 to uBound(aPath)
1186         
1187             if "Contents" = aPath(i) then
1188                 a=a+1
1189             endif
1190             
1191         next i
1192         
1193         ' exit if not
1194         if a<>1 then
1195             exit sub
1196         end if
1197         
1198         i=inStr(gNetzOfficePath, "Contents")
1199         tBundle=left(gNetzOfficePath, i-2)
1200         shell("open",1 ,tBundle, true)
1201         
1202     end if
1203 end sub
1205 '*******************************************************************************
1207 function hUseAsyncSlot( cSlot as string ) as integer
1209     dim iWait as integer
1210     dim iTime as integer : iTime = 0
1211     const MAX_WAIT = 100
1212     const DELAY = 100
1213     const CFN = "global::tools::includes::required::hUseAsyncSlot():"
1215     if ( VERBOSE ) then printlog( CFN & "Using slot: " & cSlot )    
1216     WaitSlot()
1217     for iWait = 1 to MAX_WAIT
1218         try
1219             select case ( lcase( cSlot ) )
1220             case "fileclose"                      : FileClose
1221             case "filesaveas"                     : FileSaveAs( "SynchronMode", TRUE )
1222             case "filesaveall"                    : FileSaveAll( "SynchronMode", TRUE )
1223             case "fileexport"                     : FileExport
1224             case "filereload"                     : FileReload( "SynchronMode", TRUE )
1225             case "fileopen"                       : FileOpen
1226             
1227             case "editdoc"                        : EditDoc
1228             case "editcopy"                       : EditCopy
1229             case "editchangesrecord"              : EditChangesRecord
1230             case "editchangesshow"                : EditChangesShow
1231             case "editchangesprotecttrace"        : EditChangesProtectTrace
1232             case "editchangescomment"             : EditChangesComment
1234             case "editpaste"                      : EditPaste
1235             case "editcopy"                       : EditCopy
1236             case "editcut"                        : EditCut
1237             case "editselectall"                  : EditSelectAll
1238             case "editselectallmath"              : EditSelectAllMath
1239             case "editselectionmodeblock"         : EditSelectionModeBlock
1240             case "editselectionmodestandard"      : EditSelectionModeStandard
1241             case "editdeletecontents"             : EditDeleteContents
1242             case "editundo"                       : EditUndo
1243             case "editredo"                       : EditRedo
1244             case "editrepeat"                     : EditRepeat
1245             case "editpastespecial"               : EditPasteSpecial
1246             case "editpastespecialwriter"         : EditPasteSpecialWriter
1247             case "editsearchandreplace"           : EditSearchAndReplace
1248             case "editduplicate"                  : EditDuplicate
1249             case "editgluepoints"                 : EditGluePoints
1250             case "editdeleteslide"                : EditDeleteSlide
1251             case "editobjectproperties"           : EditObjectProperties
1252             case "editobjectedit"                 : EditObjectEdit
1253             case "editobjectsavecopyas"           : EditObjectSaveCopyAs
1254             
1255             case "formatcharttype"                : FormatChartType
1256             case "formatcontrol"                  : FormatControl
1257             case "formateditpoints"               : FormatEditPoints
1258             case "formatsections"                 : FormatSections
1259             case "formatchangecaseupper"          : FormatChangeCaseUpper
1260             case "formatchangecaselower"          : FormatChangeCaseLower
1261             case "formatarea"                     : FormatArea
1262             case "formatarrangebringtofrontcalc"  : FormatArrangeBringToFrontCalc
1263             case "formatflipvertically"           : FormatFlipVertically
1264             case "formatfliphorizontally"         : FormatFlipHorizontally
1265             case "formatline"                     : FormatLine
1266             case "formatpositionandsize"          : FormatPositionAndSize
1267             case "formatfontwork"                 : FormatFontwork
1268             case "formatparagraph"                : FormatParagraph
1269             case "formatstylebold"                : FormatStyleBold
1270             case "formatungroupdraw"              : FormatUngroupDraw
1271             case "formatexitgroupdraw"            : FormatExitGroupDraw
1272             case "formatgroupgroup"               : FormatGroupGroup
1273             case "formatgroupeditgroupcalc"       : FormatGroupEditGroupCalc
1274             case "formatalignmentlefttext"        : FormatAlignmentLeftText
1275             case "formatgraphics"                 : FormatGraphics
1276             case "formatanchortopage"             : FormatAnchorToPage
1277             case "formatwrapcontour"              : FormatWrapContour
1278             case "formatwrapeditcontour"          : FormatWrapEditContour
1279             case "formatpagewriter"               : FormatPageWriter
1280             
1281             case "insertindexesbibliographyentry" : InsertIndexesBibliographyEntry
1282             
1283             case "contextpositionandsize"         : ContextPositionAndSize
1284             
1285             case "toolslanguagehyphenate"         : ToolsLanguageHyphenate
1286             case "toolsupdateallindexes"          : ToolsUpdateAllIndexes
1287             case "toolsupdatefields"              : ToolsUpdateFields
1288             case "toolsupdatelinks"               : ToolsUpdateLinks
1289             case "toolslanguagehangulhanjaconversion" : ToolsLanguageHangulHanjaConversion
1290             
1291             case else : warnlog( "Unknown slot called: " & cSlot )
1292             end select
1293             
1294             exit for
1295         catch
1296             wait( DELAY )
1297             iTime = iWait * DELAY
1298         endcatch
1299     next iWait
1300     
1301     ' Timeout is -1
1302     if ( iTime = MAX_WAIT * DELAY ) then
1303         iTime = -1 
1304     endif
1305     if ( VERBOSE ) then printlog( CFN & "Exit with rc=" & iTime )
1306     hUseAsyncSlot() = iTime
1307     
1308     
1309 end function
1311 '*******************************************************************************
1313 function hClickButton( oButton as object ) as integer
1315     dim iWait as integer
1316     dim iTime as integer : iTime = 0
1317     const MAX_WAIT = 50
1318     const CFN = "global::tools::includes::required::hClickButton():"
1320     if ( VERBOSE ) then printlog( CFN & "Click button: " & oButton.name() )    
1321     WaitSlot()
1322     for iWait = 1 to MAX_WAIT
1323         try
1324             if ( oButton.exists() ) then
1325                 if ( VERBOSE ) then printlog( CFN & "Button exists" )
1326                 if ( oButton.isEnabled() ) then
1327                     if ( VERBOSE ) then printlog( "Button is enabled" )
1328                     oButton.click()
1329                 endif
1330             endif
1331             exit for
1332         catch
1333             wait( 100 )
1334             iTime = iWait * 100
1335         endcatch
1336     next iWait
1337     if ( iTime = 5000 ) then
1338         iTime = -1 
1339     endif
1340     if ( VERBOSE ) then printlog( CFN & "Exit with rc=" & iTime )
1341     hClickButton() = iTime
1342     
1343 end function