update dev300-m58
[ooovba.git] / testautomation / global / tools / includes / required / t_files.inc
blob7d81f7b565fbf28c7ec6a225d00a255aeef192b0
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_files.inc,v $
11 '* $Revision: 1.4 $
13 '* last change: $Author: rt $ $Date: 2008-08-28 11:59:04 $
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 : thorsten.bosbach@sun.com
36 '* short description : Global routines for loading, saving, printing, export
38 '\******************************************************************************
40 private const C_INFO = TRUE ' Set this to TRUE to increase verbosity of some functions
41 private const VERBOSE = true
43 function hGrafikEinfuegen  ( Grafik$ ) as Boolean
44     '/// hGrafikEinfuegen hGraphicInsert
45     '/// A graphic will be inserted (not linked).
46     '/// <u>Input</u>: Filename with complete path
47     '/// <u>Return</u>: TRUE or FALSE if the graphic could be inserted or not.
49     Dim DieDatei as String
50     Dim IsActive as Boolean
52     DieDatei = ConvertPath ( Grafik$ )
54     InsertGraphicsFromFile
55     WaitSlot()
57     Kontext
58     If Active.Exists(1) then
59         warnlog "  Hinweis: " & Active.GetText
60         Active.Ok
61     End If
64     Kontext "GrafikEinfuegenDlg"
65     if ( GrafikEinfuegenDlg.exists( 2 ) ) then
67         Vorschau.Uncheck
68         if gApplication <> "HTML" AND gApplication <> "HTML" then
69             Verknuepfen.UnCheck
70         end if
72         Dateiname.SetText DieDatei
73         DateiTyp.Select 1                               ' set the filter to 'all formats'
74         Oeffnen.Click
76         Kontext "Active"
77         if Active.Exists(2) then
78             Warnlog "  Hinweis: " & Active.GetText
79             try
80                 Active.OK
81             catch
82                 try
83                     Active.Yes
84                 catch
85                     Active.Cancel
86                 endcatch
87             endcatch
88             Kontext "GrafikEinfuegenDlg"
89             if GrafikEinfuegenDlg.Exists then
90                 GrafikEinfuegenDlg.Cancel
91             endif
92         else
93             hGrafikEinfuegen = IsImageLoaded
94         end if
95     else
96         'GrafikEinfuegeDlg not open
97     endif
98 end function
100 '-------------------------------------------------------------------------------
102 function hGrafikVerknuepftEinfuegen  ( Grafik$ ) as Boolean
103     '/// hGrafikEinfuegenEinfuegen hGraphicInsertLinked
104     '/// A graphic will be inserted <b>LINKED</b>
105     '/// <u>Input</u>: Filename with complete path
106     '/// <u>Return</u>: TRUE or FALSE if the graphic could be inserted or not.
107     Dim DieDatei as String
108     Dim IsActive as Boolean
110     DieDatei = ConvertPath ( Grafik$ )
112     InsertGraphicsFromFile
113     WaitSlot()
115     Kontext
116     If Active.Exists(1) then
117         warnlog "  Hinweis: " & Active.GetText
118         Active.Ok
119     End If
120     Kontext "GrafikEinfuegenDlg"
121     if ( GrafikEinfuegenDlg.exists( 1 ) ) then
123         Vorschau.UnCheck
124         if gApplication <> "HTML" AND gApplication <> "HTML" then
125             Verknuepfen.Check
126         end if
128         Dateiname.SetText DieDatei
129         DateiTyp.Select 1                               ' set the filter to 'all formats'
130         Oeffnen.Click
132         Kontext "Active"
133         if Active.Exists(2) then
134             Warnlog "  Hinweis: " + Active.GetText
135             try
136                 Active.OK
137             catch
138                 Active.Yes
139             endcatch
140             Kontext "GrafikEinfuegenDlg"
141             if GrafikEinfuegenDlg.Exists then
142                 GrafikEinfuegenDlg.Cancel
143             endif
144         else
145             hGrafikVerknuepftEinfuegen = IsImageLoaded
146         end if
147     else
148         'GrafikEinfuegenDlg not open
149     endif
150 end function
152 '-------------------------------------------------------------------------------
154 function IsItSaved as boolean
155     '/// IsItSaved
156     '/// Wait until document is saved.
157     Dim iLoop as integer
159     IsItSaved = FALSE
160     sleep(3)
161     for iLoop =1 to 20
162         try
163             'Calling slot 'IsDocSaving'
164             IsItSaved = IsDocSaving
165         catch
166             IsItSaved = FALSE
167         endcatch
169         if IsItSaved = TRUE then
170             exit for
171         end if
172         sleep(1)
173     next iLoop
174     sleep(2)
175 end function
177 '-------------------------------------------------------------------------------
179 function IsItLoaded as boolean
180     '/// IsItLoaded
181     '/// Wait until document is loaded
182     Dim iLoop as integer
184     IsItLoaded = FALSE
185     sleep(3)
186     for iLoop =1 to 20
187         try
188             'Calling slot 'IsDocLoading'
189             IsItLoaded = IsDocLoading
190         catch
191             IsItLoaded = FALSE
192         endcatch
194         if IsItLoaded = TRUE then
195             exit for
196         end if
197         sleep(1)
198     next iLoop
199     sleep(2)
200 end function
202 '-------------------------------------------------------------------------------
204 function hIsNamedDocLoaded (ShouldFile as String, optional bSilent as boolean) as Boolean
205     dim sTemp as string
206     '/// hIsNamedDocLoaded ///'
207     '/// !fails always if a template is loaded, because you have to set a new filename in the save-dialog -> not usable in this case ! ///'
208     '/// Input: name of loaded file; Output: True/False ///'
209     '///+' if a doc got loaded, the filename in a 'SaveAs' Dlg is different from "" ///
210     '///+' usually the file name of the loaded document with an changed extension chosen from SO ///
212     if (isMissing(bSilent)) then
213         bSilent = False
214     endif
216     hIsNamedDocLoaded  = FALSE      ' Let's  start WorstCase :-(
217     FileSaveAs
218     Kontext "SpeichernDlg"
219     If DateiOhneExt(DateiExtract(Dateiname.GetSelText)) = DateiOhneExt(DateiExtract(ShouldFile)) Then
220         hIsNamedDocLoaded = True
221     Else
222         sTemp = left(right(ShouldFile,2),1) ' get the 2nd last character ' vor;dot;sti;pot;std;xlt
223         if (((sTemp="o") or (sTemp="t") or (sTemp="l")) and ((left(right(ShouldFile,4),1)=".") or (left(right(ShouldFile,5),1)="."))) then
224             hIsNamedDocLoaded = TRUE ' exception! for linux! and MS-Office Templates
225         else
226             if ((Dateiname.GetSeltext = "") and not bSilent) then
227                 Warnlog "Default filename is empty!"+left(right(ShouldFile,3),1)
228             endif
229         endif
230     End If
231     SpeichernDlg.Cancel
232 end function
234 '-------------------------------------------------------------------------------
236 function IsImageLoaded
237     '/// IsImageLoaded
238     '/// Wait until images in document are loaded
239     Dim i% : Dim Herbert as Boolean
241     Sleep 3
242     for i%=1 to 20
243         try
244             Herbert = IsDocImageLoading
245         catch
246             Herbert = FALSE
247         endcatch
248         if Herbert = TRUE then
249             i%=100
250         endif
251         Sleep (1)
252     next i%
253     if i<100 then
254         IsImageLoaded = FALSE
255     else
256         IsImageLoaded = TRUE
257     end if
258 end function
260 '-------------------------------------------------------------------------------
262 sub hIsWebPageLoaded as boolean
263     'Author: Joerg Sievers
264     '/// If a document in StarOffice Writer is loaded all 9 items in the
265     '///+ statusbar are visible otherwise not.
266     '///+ This sub checks the state of these items.
267     Dim i as integer
268     Dim iGibtdenStatusraus as integer
269     printlog "- global::tools::inc::tfiles.inc::hIsWebPageLoaded"
270     hIsWebPageLoaded = FALSE
271     for i = 1 to 20
272         Kontext "DocumentWriter"
273         if DocumentWriter.Exists(3) then
274             'Count the items on the status bar.
275             iGibtdenStatusraus = DocumentWriter.StatusGetItemCount
276             'There are nine items on the status bar if the web page has been loaded.
277             if iGibtdenStatusraus = 9 then
278                 hIsWebPageLoaded = TRUE
279                 exit for
280             end If
281         end if
282         WaitSlot( 3000 )
283     next i
284 end sub
286 '-------------------------------------------------------------------------------
288 sub hSys2IntDlg
289     '/// Change from system to StarOffice-internal file-dialog (only for Win32)
290     if gPlatgroup <> "unx" then
291         Call hhSysToInt ( TRUE )
292     endif
293     gUseSysDlg = FALSE
294 end sub
296 '-------------------------------------------------------------------------------
298 sub hInt2SysDlg
299     '/// Change from StarOffice-internal to system file-dialog (only for Win32)
300     if gPlatgroup <> "unx" then
301         Call hhSysToInt ( FALSE )
302     endif
303     gUseSysDlg = TRUE
304 end sub
306 '-------------------------------------------------------------------------------
308 sub hhSysToInt ( bwhats as Boolean )
309     '/// subroutine for <i>hSys2IntDlg</i> and </i>hInt2SysDlg</i>
310     ToolsOptions
311     hToolsOptions ( "StarOffice", "General" )
312     if bwhats = TRUE then
313         StarOfficeDialogeBenutzen.Check
314     else
315         StarOfficeDialogeBenutzen.Uncheck
316     end if
317     Sleep 1
318     Kontext "OptionenDlg"
319     OptionenDlg.OK
320     WaitSlot( 3000 )
321 end sub
323 '-------------------------------------------------------------------------------
325 function hGetUsedFilter () as string
326     '/// Get used filter for loaded file.
327     try
328         FileSaveAs
329         Kontext "SpeichernDlg"
330         hGetUsedFilter = dateityp.getseltext
331         SpeichernDlg.Cancel
332     catch
333         hGetUsedFilter = "Not possible; try/catch fail in function"
334     endcatch
335 end function
337 '-------------------------------------------------------------------------------
339 function hFileExport (sName as string, sFilter as string) as boolean
340     '/// Wrapper function to simplify the use of the export functions, just give a filename and export format.
341     '///+ INPUT:<ul><li>sName: filename</li><li>sFilter: &quot;PDF&quot;: call export for PDF</li></ul>
342     '///+ RETURN: execution success?
343     select case sFilter
344     case "PDF" : '/// use the function 'hExportAsPDF' with RECOMMENDED values /// '
345         hFileExport = hExportAsPDFmulti (3, TRUE,  sName, FALSE, TRUE, 1, 1)
346     end select
347     kontext
348     if active.exists(5) then
349         try
350             printlog active.getText
351             active.ok
352             warnLog "i26820 - errormessage about saving"
353         catch
354             printlog "pdf unexpected error in hFileExport()"
355         endcatch
356     endif
357 end function
359 '-------------------------------------------------------------------------------
361 function hExportAsPDFmulti (iTypeOfCall as integer, bExecute as boolean, sFileName as string, bAutoExtension as boolean, bOverwriteFile as boolean, iRange as integer, iConpression as integer, optional sRange as string) as boolean
362     '/// Export a document to PDF with various options.
363     '///+ INPUT
364     '///+<ul><li>iTypeOfCall</li><ul><li>1: via  the icon in the functionbar (no options selectable, since only file dialog comes up!)</li>
365     '///+<li>2: via File->Send->Document As PDF Attachment... (makes no sense either, because after the mail window comes up... (you can't handle by the testtool))</li>
366     '///+<li>3 via File->Export As PDF... (RECOMMENDED)</li></ul>
367     '///+<li>bExecute: Shall all dialogs left with OK? TRUE (RECOMMENDED) / FALSE</li>
368     '///+<li>sFileName: Filename to use</li>
369     '///+<li>bAutoExtension: Shall the file extension be chosen by StarOffice? TRUE / FALSE (RECOMMENDED)</li>
370     '///+<li>bOverwriteFile: If filename already exists should it be overwritten? TRUE (RECOMMENDED) / FALSE</li>
371     '///+<li>iRange:</li><ol><li>1: All (RECOMMENDED)</li>
372     '///+<li>2: Pages: The range is set in the optional parameter 'sRange' at the end</li>
373     '///+<li>3: Selection</li></ol>
374     '///+<li>iConpression:</li><ol><li>1: JpegCompression check and ReduceImageResolution check</li>
375     '///+<li>2: JpegCompression check and ReduceImageResolution uncheck</li>
376     '///+<li>3: LosslessCompression check and ReduceImageResolution uncheck</li></ol>
377     '///+<li>sRange: Optional parameter only used for iRange=2; takes the page range as text</li>
378     '///+<li>RETURN: Any Errors? TRUE / FALSE</li></ul>
379     dim sPDF as string
380     dim sTemp as string
381     dim iTemp as integer
382     dim sTFileName as string
383     dim iCount as integer
385     sPDF = "PDF - Portable Document Format (.pdf)"
386     hExportAsPDFmulti = TRUE ' optimistic
387     iTemp = 0
389     select case (iTypeOfCall)
390     case 1 : '/// click the button 'Export Directly as PDF' on the Functionbar ///'
391         kontext "Standardbar"
392         try
393             ExportAsPDF.click
394         catch
395             Warnlog "Button 'Export directly as PDF' not accessible!"
396             hExportAsPDFmulti = FALSE
397             exit function
398         endcatch
399     case 2 : '/// File->Send->Document As PDF Attachment... ///'
400         try
401             FileSendDocumentAsPDF
402         catch
403             Warnlog "'Export as PDF' not accessible!"
404             hExportAsPDFmulti = FALSE
405             exit function
406         endcatch
407     case 3 : '/// File->Export As PDF... ///'
408         try
409             FileExportAsPDF ' works in draw/impress, too but is not 'legal' in the UI :-)
410         catch
411             Warnlog "Button 'Export as PDF' not accessible!"
412             hExportAsPDFmulti = FALSE
413             exit function
414         endcatch
415     end select
417     ' only if the type is 1 OR 3 then the File Save dialog appear
418     ' just kept here for compatibility reasons - has to get removed around july 2007
419     if (iTypeOfCall = 1 OR iTypeOfCall = 3) then
420         kontext "ExportierenDlg"
421         if ExportierenDlg.exists(5) then
422             try
423                 Dateityp.Select sPDF
424             catch
425                 Warnlog "Unable to select filter: '" + sPDF + "'"
426                 ExportierenDlg.Cancel
427                 hExportAsPDFmulti = FALSE
428                 exit function
429             endcatch
431             sTemp = Dateityp.GetSelText
432             if (sTemp <> sPDF) then
433                 Warnlog "filter for PDF export is missing :-( '" + sPDF + "'"
434             end if
435             '/// set Textbox 'File name' ///'
436             Dateiname.SetText sFileName
437             'if the file has no pdf extension then add the extension
438             if (lCase(right(sFileName, 4))=".pdf") then
439                 sTFileName = sFileName
440             else
441                 sTFileName = sFileName + ".pdf"
442             endif
443             '/// click on the button 'Export...' ///'
444             if (bExecute) then
445                 speichern.Click
446                 kontext "AlienWarning"
447                 if AlienWarning.exists(5) then
448                     warnlog "#i41983# Alien Warning on export not allowed."
449                     AlienWarning.OK
450                 endif
451                 if (iTypeOfCall = 1) then
452                     ''Export Directly as PDF'
453                 endif
454                 iCount = 0
455                 ' wait until file exists for max 5 minutes
456                 while ((dir(sTFileName)="") AND (iCount < 30))
457                     sleep 10
458                     inc iCount
459                 wEnd
460             endif
461         else
462             'ExportierenDlg.Cancel
463         end if
465         ' if file exists, there is a message...
466         kontext "PDFOptions"
467         if NOT PDFOptions.exists then
468             Kontext
469             if messagebox.exists (5) then
470                 if (bOverwriteFile) then
471                     messagebox.Yes
472                 else
473                     messagebox.No
474                     kontext "ExportierenDlg"
475                     ExportierenDlg.Cancel
476                     hExportAsPDFmulti = FALSE
477                 end if
478             end if
479         end if
480     end if
483     ' only if the type is 2 OR 3 then the PDF option dialog appear
484     if (iTypeOfCall = 2 OR iTypeOfCall = 3) then
485         kontext "PDFOptions"
486         select case (iRange)
487         case 1 : '/// check radiobutton 'All' ///'
488             try
489                 RangeAll.Check
490             catch
491                 Warnlog "Radiobutton 'All' not accessible!"
492                 PDFOptions.Cancel
493                 hExportAsPDFmulti = FALSE
494                 exit function
495             endcatch
496         case 2 : '/// check radiobutton 'Pages' ///'
497             try
498                 RangePages.Check
499             catch
500                 Warnlog "Radiobutton 'Range' not accessible!"
501                 PDFOptions.Cancel
502                 hExportAsPDFmulti = FALSE
503                 exit function
504             endcatch
505             if isMissing(sRange) then
506                 Warnlog "parameter 'sRange' in function 'hExportAsPDFmulti' is not optional if 'iRange' = 2"
507                 hExportAsPDFmulti = FALSE
508             else
509                 '/// set range textbox the given value ///'
510                 RangePagesEdit.SetText sRange
511             end if
512         case 3 : '/// check radiobutton 'Selection' (not enabled in math!) ///'
513             try
514                 if (RangeSelection.IsEnabled <> TRUE)then
515                     Warnlog "RangeSelection is disabled :-("
516                 else
517                     RangeSelection.Check
518                 end if
519             catch
520                 Warnlog "Radiobutton 'Selection' not accessible!"
521                 PDFOptions.Cancel
522                 hExportAsPDFmulti = FALSE
523                 exit function
524             endcatch
525         end select
527         select case (iConpression)
528         case 1 : '/// JpegCompression check and ReduceImageResolution check///'
529             try
530                 JpegCompression.Check
531                 ReduceImageResolution.Check
532             catch
533                 Warnlog "Radiobutton 'Reduce Image Resolution' not accessible!"
534                 PDFOptions.Cancel
535                 hExportAsPDFmulti = FALSE
536                 exit function
537             endcatch
538         case 2 : '/// JpegCompression check and ReduceImageResolution uncheck ///'
539             try
540                 JpegCompression.Check
541                 ReduceImageResolution.UnCheck
542             catch
543                 Warnlog "Radiobutton 'Jpeg Compression' not accessible!"
544                 PDFOptions.Cancel
545                 hExportAsPDFmulti = FALSE
546                 exit function
547             endcatch
548         case 3 : '/// LosslessCompression check and ReduceImageResolution uncheck ///'
549             try
550                 LosslessCompression.Check
551                 ReduceImageResolution.UnCheck
552             catch
553                 Warnlog "Radiobutton 'Lossless Compression' not accessible!"
554                 PDFOptions.Cancel
555                 hExportAsPDFmulti = FALSE
556                 exit function
557             endcatch
558         end select
559         if (bExecute) then
560             try
561                 PDFOptions.OK
562             catch
563                 qaErrorlog "ImprovementOfSave: PDF export loops?"
564             endcatch
565         else
566             PDFOptions.Cancel
567         end if
568     end if
569     ' only if the type is 1 OR 3 then the File Save dialog appear
570     kontext "ExportierenDLG"
571     if (iTypeOfCall = 1 OR iTypeOfCall = 3) then
572         if ExportierenDLG.exists(5) then
573             try
574                 Dateityp.Select sPDF
575             catch
576                 Warnlog "Unable to select filter: '" + sPDF + "'"
577                 ExportierenDLG.Cancel
578                 hExportAsPDFmulti = FALSE
579                 exit function
580             endcatch
582             sTemp = Dateityp.GetSelText
583             if (sTemp <> sPDF) then
584                 Warnlog "filter for PDF export is missing :-( '" + sPDF + "'"
585             end if
586             '/// set Textbox 'File name' ///'
587             Dateiname.SetText sFileName
588             'if the file has no pdf extension then add the extension
589             if (lCase(right(sFileName, 4))=".pdf") then
590                 sTFileName = sFileName
591             else
592                 sTFileName = sFileName + ".pdf"
593             endif
594             '/// click on the button 'Export...' ///'
595             if (bExecute) then
596                 Speichern.Click
597                 kontext "AlienWarning"
598                 if AlienWarning.exists(5) then
599                     warnlog "#i41983# Alien Warning on export not allowed."
600                     AlienWarning.OK
601                 endif
602                 if (iTypeOfCall = 1) then
603                     ''Export Directly as PDF'
604                 endif
605                 iCount = 0
606                 ' wait until file exists for max 5 minutes
607                 while ((dir(sTFileName)="") AND (iCount < 30))
608                     sleep 10
609                     inc iCount
610                 wEnd
611             endif
612         else
613             try
614             ExportierenDLG.Cancel
615             catch
616             printlog "export not there"
617             endcatch
618         end if
620         ' if file exists, there is a message...
621         kontext "PDFOptions"
622         if NOT PDFOptions.exists then
623             Kontext
624             if messagebox.exists (5) then
625                 if (bOverwriteFile) then
626                     messagebox.Yes
627                 else
628                     messagebox.No
629                     kontext "ExportierenDLG"
630                     ExportierenDLG.Cancel
631                     hExportAsPDFmulti = FALSE
632                 end if
633             end if
634         end if
635     end if
637 end function
639 '-------------------------------------------------------------------------------
641 function hDeleteFile( cFileOrig as string ) as boolean
643     const CFN = "global::tools::includes::required::t_files.inc::hDeleteFile():"
644     dim cHome as string
645     cHome = gOfficePath & "user"
646     cHome = convertpath( cHome )
647     dim cFile as string
648     cFile = convertpath( cFileOrig )
650     '///<h3>Delete a file</h3>
651     '///<i>In many cases it is a good idea to use this function outside the testcase.<br>
652     '///+ You should always evaluate the returncode</i><br>
653     '///<u>Input</u>:
654     '///<ol>
655     '///+<li>Filename (string)</li>
656     '///<ul>
657     '///+<li>The function converts the path to system specific syntax (convertpath)
658     '///+ but does <b>not</b> modify the input parameter</li>
659     '///</ul>
660     '///</ol>
661     '///<u>Returns</u>:
662     '///<ol>
663     '///+<li>Errorstatus (boolean)</li>
664     '///<ul>
665     '///+<li>TRUE: File was deleted/does not exist</li>
666     '///+<li>FALSE: File could not be deleted/any other error</li>
667     '///</ul>
668     '///</ol>
669     '///<u>Description</u>:
670     '///<ul>
672     ' this function tries to delete a file and does some very basic error-
673     ' handling. Returns 'true' on success, only error while deleting returns
674     ' 'false', if the file does not exist, it is considered to be successfully
675     ' deleted.
676     ' i introduced this function due to a number of cases where deleting files
677     ' actually failed because of weird code or situations where the user lacks
678     ' accessrights to files are not handled at all.
680     '///+<li>We may never delete a file outside gOfficePath/user/work</li>
681     if ( instr( cFile , cHome ) = 0 ) then
682         qaerrorlog( CFN & "Trying to delete file outside (default)homedir -> forbidden" )
683         qaerrorlog( CFN & "Home: " & cHome )
684         qaerrorlog( CFN & "File: " & cFile )
685         hDeleteFile() = false
686         exit function
687     endif
689     cFile = convertpath( cFile )
691     '///+<li>Check that the file exists</li>
692     if ( FileExists( cFile ) ) then
694         '///+<li>Use kill to delete</li>
695         try
697             kill( cFile )
699             '///+<li>Verify that the file does not exist anymore</li>
700             if ( FileExists( cFile ) ) then
701                 warnlog( CFN & "File was not deleted: " & cFile )
702                 hDeleteFile() = false
703             else
704                 if ( VERBOSE ) then printlog( CFN & "File successfully deleted: " & cFile )
705                 hDeleteFile() = true
706             endif
708         catch
710             '///+<li>in very rare cases 'kill' fails and can be handled this way</li>
711             qaerrorlog( CFN & "Deleting file failed: " & cFile )
712             hDeleteFile() = false
714         endcatch
716     else
718         '///+<li>write some text to the log if the file does not exist</li>
719         printlog( CFN & "Nothing to do." )
720         hDeleteFile() = true
722     endif
724     '///</ul>
726 end function
728 '-------------------------------------------------------------------------------
730 function hFileCloseAll() as integer
732     dim iDocumentCount as integer : iDocumentCount = 0
733     Do Until GetDocumentCount = 0
734         Call hCloseDocument()
735         iDocumentCount = iDocumentCount + 1
736     Loop
737     hFileCloseAll() = iDocumentCount
738     
739 end function
741 '-------------------------------------------------------------------------------
743 function hFileOpen( cFile as string ) as boolean
745     dim sFile as string : sFile = convertToURL( convertpath( cFile ) )
746     hFileOpen() = FALSE
747     const CFN = "global::tools::inc::t_files.inc::hFileOpen():"
748     if ( C_INFO ) then printlog( CFN & "Load: " & sFile )
749     FileOpen( "URL", sFile, "FrameName", "_default" )
750     if ( hFileWait( FALSE ) >= 0 ) then hFileOpen() = TRUE
752 end function
754 '-------------------------------------------------------------------------------
756 function hFileOpenSpecial( cFile as string, cFlag as string ) as boolean
758     ' Open a file with some special options
759     ' cFlag = "ReadOnly" opens file read-onlx
760     ' cFlag = "AsTemplate" opens file as templat
761     ' cFlag = <Any other string> treats string as password
763     dim sFile as string : sFile = convertToURL( convertpath( cFile ) )
764     const CFN = "global::tools::inc::t_files.inc::hFileOpenSpecial():"
765     hFileOpenSpecial() = FALSE
766     if ( C_INFO ) then printlog( "Load (Flag): " & sFile & " (" & cFlag & ")" )
768     select case( lcase( cFlag ) )
769     case "readonly"
770         printlog( CFN & "Load file read-only: " & sFile )
771         FileOpen( "URL", sFile, "FrameName", "_default", "ReadOnly", TRUE)
772     case "astemplate"
773         printlog( CFN & "Load file as template: " & sFile )
774         FileOpen( "URL", sFile, "FrameName", "_default", "AsTemplate" , TRUE )
775     case else
776         printlog( CFN & "Load file with password: " & sFile )
777         FileOpen( "URL", sFile, "FrameName", "_default", "Password" , cFlag )
778     end select
780     if ( hFileWait( FALSE ) >= 0 ) then hFileOpenSpecial() = TRUE
782     '///</ul>
784 end function
786 '-------------------------------------------------------------------------------
788 function hFileOpenWithFilter( cFile as string, cFilter as string )
790     dim sFile as string : sFile = convertToURL( convertpath( cFile ) )
791     const CFN = "global::tools::inc::t_files.inc::hFileOpenWithFilter():"
792     hFileOpenWithFilter() = FALSE
793     if ( C_INFO ) then printlog( CFN & "Load (Filter): " & sFile & " (" & cFilter & ")" )
794     FileOpen( "URL", sFile, "FrameName", "_default", "FilterName", cFilter )
795     if ( hFileWait( FALSE ) >= 0 ) then hFileOpenWithFilter() = TRUE
797 end function
799 '-------------------------------------------------------------------------------
801 function hFileSave() as boolean
803     const CFN = "global::tools::inc::t_files.inc::hFileSave():"
804     hFileSave() = FALSE
805     if ( C_INFO ) then printlog( CFN & "Save file." )
806     FileSave( "SynchronMode", TRUE )
807     if ( hFileWait( TRUE ) >= 0 ) then hFileSave() = TRUE
809 end function
811 '-------------------------------------------------------------------------------
813 function hFileSaveAs( cFile as string ) as boolean
815     dim sFile as string : sFile = convertToURL( convertpath( cFile ) )
816     const CFN = "global::tools::inc::t_files.inc::hFileSaveAs():"
817     hFileSaveAs() = FALSE
818     if ( C_INFO ) then printlog( CFN & "Save: " & sFile )
819     FileSaveAs( "URL", sFile, "Overwrite", FALSE )
820     if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAs() = TRUE
822 end function
824 '-------------------------------------------------------------------------------
826 function hFileSaveAsKill( cFile as string ) as boolean
828     dim sFile as string : sFile = convertToURL( convertpath( cFile ) )
829     const CFN = "global::tools::inc::t_files.inc::hFileSaveAsKill():"
830     hFileSaveAsKill() = FALSE
831     if ( C_INFO ) then printlog( CFN & "Save, replacing: " & sFile )
832     FileSaveAs( "URL", sFile, "Overwrite", TRUE )
833     if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAsKill() = TRUE
835 end function
837 '-------------------------------------------------------------------------------
839 function hFileSaveAsKillWithPassword( cFile as string, cPassword as string ) as boolean
841     dim sFile as string : sFile = convertToURL( convertpath( cFile ) )
842     const CFN = "global::tools::inc::t_files.inc::hFileSaveAsKillWithPassword():"
843     hFileSaveAsKillWithPassword() = FALSE
844     if ( C_INFO ) then printlog( CFN & "Save with password, replacing: " & sFile & "::" & cPassword )
845     FileSaveAs( "URL", sFile, "Overwrite", TRUE, "Password", cPassword )
846     if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAsKillWithPassword() = TRUE
848 end function
850 '-------------------------------------------------------------------------------
852 function hFileSaveAsWithFilter( cFile as string, cFilter as string ) as boolean
854     dim sFile as string : sFile = convertToURL( convertpath( cFile ) )
855     const CFN = "global::tools::inc::t_files.inc::hFileSaveAsWithFilter():"
856     hFileSaveAsWithFilter() = FALSE
857     if ( C_INFO ) then printlog( CFN & "Save with filter: " & sFile & "::" & cFilter )
858     FileSaveAs( "URL", sFile, "FilterName", cFilter, "Overwrite", FALSE )
859     if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAsWithFilter() = TRUE
861 end function
863 '-------------------------------------------------------------------------------
865 function hFileSaveAsWithFilterKill( cFile as string, cFilter as string ) as boolean
867     dim sFile as string : sFile = convertToURL( convertpath( cFile ) )
868     const CFN = "global::tools::inc::t_files.inc::hFileSaveAsWithFilterKill():"
869     hFileSaveAsWithFilterKill() = FALSE
870     if ( C_INFO ) then printlog( CFN & "Save with filter, replacing: " & sFile & "::" & cFilter )
871     FileSaveAs( "URL", sFile, "FilterName", cFilter, "Overwrite", TRUE )
872     if ( hFileWait( TRUE ) >= 0 ) then hFileSaveAsWithFilterKill() = TRUE
874 end function
876 '-------------------------------------------------------------------------------
878 function hFileWait( optional bWarn as boolean ) as integer
880     ' Wait max 10 seconds for the FileOpen/FileSave slot to finish
881     ' Returns the time it took the slot to finish
882     ' Negaitve returnvalues are given on timeout or any blocking dialog
884     const CFN = "global::tools::inc::t_files.inc::hFileWait():"
885     const MAX_WAIT = 10
886     dim iWait as integer : iWait = 0
887     dim bWarnlog as boolean
889     if ( IsMissing( bWarn ) ) then
890         bWarnlog = TRUE
891     else
892         bWarnlog = bWarn
893     endif
895     do while( WaitSlot() <> WSFinished )
897         iWait = iWait + 1
899         ' This is the timeout
900         if ( iWait = MAX_WAIT ) then
901             iWait = -1
902             exit do
903         endif
905         ' LOAD: Security warning prevents slot from finishing
906         kontext "SecurityWarning"
907         if ( SecurityWarning.exists() ) then
908             iWait = -2
909             exit do
910         endif
912         ' LOAD: Password dialog
913         kontext "PasswordFileOpen"
914         if ( PasswordFileOpen.exists() ) then
915             iWait = -3
916             exit do
917         endif
919         ' SAVE: Password dialog
920         kontext "PasswordDlg"
921         if ( PasswordDlg.exists() ) then
922             iWait = -4
923             exit do
924         endif
925         
926         ' LOAD: Master Password Dialog
927         kontext "MasterPasswordEnter"
928         if ( MasterPasswordEnter.exists() ) then
929             iWait = -10
930             warnlog( CFN & "Master Password dialog displayed. Tests are likely to fail" )
931             exit do
932         endif
934         ' LOAD: Filter selection dialog
935         Kontext "Filterauswahl"
936         if ( FilterAuswahl.exists() ) then
937             iWait = -5
938             exit do
939         endif
941         ' LOAD: ASCII Filter Options dialog
942         kontext "ASCIIFilterOptionen"
943         if AsciiFilterOptionen.Exists() then
944             iWait = -6
945             exit do
946         end if
948         ' LOAD/SAVE: Some other dialogs that may interrupt file I/O
949         kontext "Active"
950         if ( Active.exists() ) then
951             printlog( Active.getText() )
953             ' This is most likely a warning
954             if ( Active.getButtonCount() = 1 ) then
955                 iWait = -7
956                 exit do
957             endif
959             ' This is probably the update links dialog
960             if ( Active.getButtonCount() = 2 ) then
961                 iWait = -8
962                 exit do
963             endif
965             ' This is probably the styles not matching dialog
966             if ( Active.getButtonCount() = 3 ) then
967                 iWait = -9
968                 exit do
969             endif
971         endif
973     loop
975     if ( C_INFO ) then
976         select case iWait
977         case -1   : printlog( CFN & "Timeout reached, rc = " & iWait )
978         case -2   : printlog( CFN & "Macro security warning displayed, rc = " & iWait )
979         case -3   : printlog( CFN & "Password dialog (load) displayed, rc = " & iWait )
980         case -4   : printlog( CFN & "Password dialog (save) displayed, rc = " & iWait )
981         case -5   : printlog( CFN & "Filter Selection dialog displayed, rc = " & iWait )
982         case -6   : printlog( CFN & "ASCII filter options dialog displayed, rc = " & iWait )
983         case -7   : printlog( CFN & "A dialog box is in the way (1 button), rc = " & iWait )
984         case -8   : printlog( CFN & "A dialog box is in the way (2 buttons), rc = " & iWait )
985         case -9   : printlog( CFN & "A dialog box is in the way (3 buttons), rc = " & iWait )
986         case -10  : printlog( CFN & "Master Password Dialog displayed, rc = " & iWait )
987         case else : printlog( CFN & "File I/O completed in " & iWait & " seconds" )
988         end select
989     endif
991     if ( bWarnlog and ( iWait < 0 ) ) then
992         warnlog( CFN & "The messagebox was not expected at this point" )
993     endif
995     hFileWait() = iWait
997 end function