Update ooo320-m1
[ooovba.git] / testautomation / framework / tools / includes / fileoperations.inc
blobe548ee79ccfe8ad856cb619867505f830ed2b740
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: fileoperations.inc,v $
11 '* $Revision: 1.2 $
13 '* last change: $Author: jsk $ $Date: 2008-06-20 08:03:54 $
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 : check the internal file dialog ( extended tests )
38 '\******************************************************************************
40 function hSaveLoadDelSuccess( cFile as string ) as integer
42     '///<h3>Successfully save, close, load, close and delete a file</h3>
43     '///<i>Uses</i>: framework\tools\t_stringtools.inc<br><br>
44     '///<u>Input</u>:
45     '///<ol>
46     '///+<li>Filename incl. extension (string)</li>
47     '///</ol>
48     '///<u>Returns</u>:
49     '///<ol>
50     '///+<li>Errorcode (integer)</li>
51     '///<ul>
52     '///+<li>0  = all ok</li>
53     '///+<li>1  = Saving failed</li>
54     '///+<li>2  = Closing the file failed</li> 
55     '///+<li>3  = Reloading failed</li>
56     '///+<li>4  = Closing the file failed</li>
57     '///+<li>5  = Deleting failed</li>
58     '///+<li>-1 = Post operation error</li>
59     '///</ul>
60     '///</ol>
61     '///<u>Description</u>:
62     '///<ul>
63     
64     dim brc as boolean
65     dim cFileExt as string
66         cFileExt = cFile & hGetSuffix( "current" )
67     
68     const CFN = "hSaveLoadDelSuccess::"
69     
70     printlog( "" )
71     printlog( CFN & "Enter with option: " & cFile & "/" & cFileExt )
72     
73     '///+<li>Close the navigator if it exists</li>
74     hCloseNavigator()
76     '///+<li>Save the current file, overwriting existing</li>
77     brc = hSaveFileExpectSuccess( cFile , TRUE ) ' save and overwrite
78     if ( brc ) then
80         '///+<li>Close the file</li>
81         brc = hDestroyDocument()
82         if ( brc ) then
83         
84             '///+<li>Reload the file</li>
85             brc = hLoadFileExpectSuccess( cFileExt )
86             if ( brc ) then
87             
88                 '///+<li>Close the document</li>
89                 brc = hDestroyDocument()
90                 if ( brc ) then
91                 
92                     '///+<li>Delete the file via FileOpen</li>
93                     brc = hDeleteFileViaFileOpen( cFileExt )
94                     if ( brc ) then
95                         printlog( CFN & "Save, close, load, close, delete ok" )
96                         hSaveLoadDelSuccess() = 0
97                     else
98                         warnlog( CFN & "Failed to delete file" )
99                         hSaveLoadDelSuccess() = 5
100                     endif
101                 
102                 else
103                     warnlog( CFN & "Failed to close file" ) 
104                     hSaveLoadDelSuccess() = 4
105                 endif
106             
107             else
108                 warnlog( CFN & "Failed to load file" )
109                 hSaveLoadDelSuccess() = 3
110             endif
111         
112         
113         else
114             warnlog( CFN & "Closing file failed" )
115             hSaveLoadDelSuccess() = 2
116         endif
117     
118     else
119         warnlog( CFN & "Saving failed" )
120         hSaveLoadDelSuccess() = 1
121     endif
122     
123     '///+<li>Close possible Messagebox (#i33946#)</li>
124     kontext "active"
125     if ( active.exists( 1 ) ) then
126         printlog( CFN & "Unexpected message: " & active.getText() )
127         qaerrorlog( "#i33946# - message when deleting last document in folder" )
128         active.ok()
129         hSaveLoadDelSuccess() = 6
130     endif
131     
132     '///+<li>Close document</li>
133     brc = hDestroyDocument()
135     '///</ul>
137 end function
139 '*******************************************************************************
141 function hLoadFileExpectSuccess( fpath as string ) as boolean
143     '///<h3>Load a file where failure is expected</h3>
144     '///<i>Uses</i>: framework\tools\t_stringtools.inc<br><br>
145     '///<i>This function is quite similar to hLoadFile but does much less
146     '///+ errorhandling so the information of the type of failure is a little
147     '///+ more exact</i><br><br>
148     '///<u>Input</u>:
149     '///<ol>
150     '///+<li>Filename incl. extension (string)</li>
151     '///</ol>
152     '///<u>Returns</u>:
153     '///<ol>
154     '///+<li>Errorcondition (boolean)</li>
155     '///<ul>
156     '///+<li>TRUE = File was loaded without problems</li>
157     '///+<li>FALSE = Any error</li>
158     '///</ul>
159     '///</ol>
160     '///<u>Description</u>:
161     '///<ul>
162     
163     dim brc as boolean
164         brc = true
165         
166     const CFN = "hLoadFileExpectSuccess::"
167     printlog( CFN & "Enter with option: " & fpath )
169     '///+<li>Click FileOpen (or use the menu)</li>
170     FileOpen    
172     '///+<li>Enter the filename (with extension)</li>
173     'printlog( " - Type the filepath/name into the entryfield" )
174     Kontext "OeffnenDLG"
175     if ( OeffnenDlg.exists( 1 ) ) then
176         DateiName.setText( fpath )
178         '///+<li>Click &quot;Open&quot;</li>
179         'printlog( " - Click 'Open'" )
180         oeffnen.click()    
182         '///+<li>Watch out for an unexpected messagebox<br>
183         Kontext "Active"
184         if ( Active.Exists( 1 ) ) then
185             printlog( "Unexpected active: " & active.getText() )
186             Active.OK()
188             Kontext "OeffnenDLG"
189             OeffnenDLG.cancel()
190             brc = false
191         endif
193         '///+recover in case of error so the test has a chance to continue</li>
194         ' try to recover in case of failure so the test can continue.
195         Kontext "OeffnenDLG"
196         if ( Oeffnen.exists( 1 ) ) then
197             warnlog( "The file was not opened, it doesn't appear to exist" )
198             OeffnenDLG.cancel()
199             brc = false
200         endif
201     else
202         warnlog( CFN & "File Open dialog did not open" )
203     endif
205     '///+<li>Return the errorcode</li>
206     printlog( CFN & "Exit with result: " & brc )
207     hLoadFileExpectSuccess() = brc
208     '///</ul>
209     
210 end function
212 '*******************************************************************************
214 function hLoadFileExpectFailure( fpath as string ) as boolean
216     '///<h3>Load a file where failure is expected</h3>
217     '///<i>Uses</i>: framework\tools\t_stringtools.inc<br><br>
218     '///<u>Input</u>:
219     '///<ol>
220     '///+<li>Filename incl. extension (string)</li>
221     '///</ol>
222     '///<u>Returns</u>:
223     '///<ol>
224     '///+<li>Errorcondition (boolean)</li>
225     '///<ul>
226     '///+<li>TRUE = There was an error loading the file (as expected)</li>
227     '///+<li>FALSE = The file was loaded without problems/any other error</li>
228     '///</ul>
229     '///</ol>
230     '///<u>Description</u>:
231     '///<ul>
232     
233     const CFN = "hLoadFileExpectFailure::"
235     dim brc as boolean
236         brc = true
238     printlog( CFN & "Enter with option: " & fpath )
240     '///+<li>Click FileOpen</li>
241     FileOpen    
242     Kontext "OeffnenDLG"
244     '///+<li>Enter filepath</li>
245     DateiName.setText( convertpath( fpath ) )
247     '///+<li>Click &quot;Open&quot;</li>
248     oeffnen.click()
250     '///+<li>Close the expected warning dialog, return to FileOpen</li>
251     Kontext "Active"
252     if ( Active.Exists( 1 ) ) then
253         printlog( CFN & "Expected active: " & active.getText() )
254         active.ok()
256         Kontext "OeffnenDLG"
257         if ( OeffnenDlg.exists( 1 ) ) then
258             OeffnenDLG.cancel()
259             brc = true
260         else
261             warnlog( CFN & "File Open dialog is not open" )
262             brc = false
263         endif
264     endif
266     '///+<li>Verify that we are on FileOpen dialog, set errorcondition true</li>
267     if ( brc ) then
268         Kontext "OeffnenDLG"
269         if ( Oeffnen.exists( 1 ) ) then
270             printlog( CFN & "File is not loaded, still in File/Open. Good, cancelling" )
271             OeffnenDLG.cancel()
272             brc = true
273         else
274             brc = false
275         endif
276     endif
277     
278     '///+<li>If the document is loaded, set errorcondition to false</li>
279     if ( not brc ) then
280         IsItLoaded
281         warnlog( CFN & "The file appears to have loaded correctly. Not good" )
282     
283         '///+<li>Click away possible messagebox to recover</li>
284         Kontext "Active"
285         if ( active.exists( 1 ) ) then
286             printlog( CFN & "Unexpected active: " & active.getText() )
287             Active.OK()
288         endif
289     endif 
290     
291     '///+<li>Return errorcondition</li>
292     hLoadFileExpectFailure() = brc
293     '///</ul>
294     
295 end function
297 '*******************************************************************************
299 function hSaveFileExpectSuccess( fpath as string , bReplace as boolean ) as boolean
301     '///<h3>Save a file with optional replace where success is expected</h3>
302     '///<i>Uses</i>: framework\tools\t_stringtools.inc<br><br>
303     '///<u>Input</u>:
304     '///<ol>
305     '///+<li>Filename incl. extension (string)</li>
306     '///+<li>Replace file (boolean)</li>
307     '///<ul>
308     '///+<li>TRUE = Replace the file</li>
309     '///+<li>FALSE = Do not replace the file</li>
310     '///</ul>
311     '///</ol>
312     '///<u>Returns</u>:
313     '///<ol>
314     '///+<li>Errorcondition (boolean)</li>
315     '///<ul>
316     '///+<li>TRUE = There was an error loading the file (as expected)</li>
317     '///+<li>FALSE = The file was loaded without problems/any other error</li>
318     '///</ul>
319     '///</ol>
320     '///<u>Description</u>:
321     '///<ul>
323     const CFN = "hSaveFileExpectSuccess::" 
324     dim brc as boolean
325         brc = true
326         
327     dim iDocumentCount as integer
328     
329     printlog( CFN & "Enter with options: " & fpath & ", " & bReplace )
331     '///+<li>Make sure we start from the backing window</li>
332     do while ( getDocumentCount > 0 )
333         hCloseDocument()
334     loop
337     '///+<li>Open a new document</li>
338     hCreateDocument()
340     '///+<li>Click &quot;Save As...&quot;</li>
341     FileSaveAs 
343     Kontext "SpeichernDlg"
344     if ( SpeichernDlg.exists( 1 ) ) then
346         '///+<li>Enter a filename (with extension)</li>
347         Dateiname.setText( hGetWorkPath() & fpath )
349         '///+<li>Click &quot;Save&quot;</li>
350         speichern.click()
352         '///+<li>If the file exists, say &quot;yes&quot; to replace it</li>
353         if ( bReplace ) then
354             Kontext "Active"
355             if ( active.exists( 2 ) ) then
356                 printlog( CFN & "Overwriting file" )
357                 printlog( "Message: " & active.getText() )
358                 try
359                     active.yes()
360                 catch
361                     warnlog( CFN & "Unexpected active - no YES button available." )
362                     printlog( CFN & "if any this should have been overwrite warning." )
363                 endcatch
364             endif
365         endif
367         '///+<li>Handle any unexpected errormessage with &quot;OK&quot;</li>
368         Kontext "Active"
369         if ( active.exists( 2 ) ) then
370             printlog( CFN & "Unexpected active: " & active.getText() )
371             brc = false
372             active.ok()
373         endif
374         
375         '///+<li>The FileSave dialog should be closed at this point</li>
376         kontext "SpeichernDlg"
377         if ( SpeichernDlg.exists( 1 ) ) then
378             warnlog( CFN & "File Save dialog is still open, it should be closed" )
379             SpeichernDlg.cancel()
380         endif
381     else
382         warnlog( CFN & "Failed to open File Open dialog" )
383         brc = false
384     endif
386     '///+<li>Verify that exactly one document is open</li>
387     if( getDocumentCount <> 1  ) then        
388         warnlog( CFN & "Incorrect number of open documents" )
389         brc = false
390     endif
391     
392     printlog( CFN & "Exit with result: " & brc )
393     hSaveFileExpectSuccess() = brc
394     '///</ul>
396 end function
398 '*******************************************************************************
400 function hSaveFileExpectFailure( fpath as string , errortype as integer ) as boolean
402     '///<h3>Save a file where failure is expected</h3>
403     '///<i>Uses</i>: framework\tools\t_stringtools.inc<br><br>
404     '///<u>Input</u>:
405     '///<ol>
406     '///+<li>Filename incl. extension (string)</li>
407     '///+<li>Errortype (Integer). Valid options are:</li>
408     '///<ul>
409     '///+<li>0 = Invalid characters in string</li>
410     '///+<li>1 = Filename is interpreted as device</li>
411     '///</ul>
412     '///</ol>
413     '///<u>Returns</u>:
414     '///<ol>
415     '///+<li>Errorcondition (boolean)</li>
416     '///<ul>
417     '///+<li>TRUE = <b><i>There was an error saving the file (as expected)</i></b></li>
418     '///+<li>FALSE = The file was saved without problems/any other error</li>
419     '///</ul>
420     '///</ol>
421     '///<u>Description</u>:
422     '///<ul>
423     
424     ' currently we have two different kinds of failure
425     ' 1. File cannot be saved due to invalid character(s)
426     '    This is errortype = 0
427     ' 2. File cannot be saved because the given name is interpreted as device
428     '    This is errortype = 1
429     ' This sequence tries to save a document with an invalid name. The errormsg
430     ' is closed, the filedialog cancelled and the file closed. 
431     
432     dim brc as boolean
433         brc = false
434         
435     dim cMsg as string
436         
437     const CFN = "hSaveFileExpectFailure::"
439     '///+<li>Open an new document</li>
440     hCreateDocument()
441     
442     '///+<li>Click &quot;Save As;&quot;</li>
443     printlog( "" )
444     printlog( CFN & "Enter with options: " & fpath & ", " & errortype )
445     FileSaveAs
446     
447     '///+<li>Enter the filename</li>
448     kontext "SpeichernDlg"
449     if ( SpeichernDlg.exists( 1 ) ) then
450     
451         Kontext "SpeichernDlg"
452         Dateiname.setText( fpath )
454         '///+<li>Click &quot;Save&quot;</li>
455         speichern.click()
457         '///<ul>
458         '///+<li>Handle invalid characters (Errormessages)</li>
459         select case( errortype )
460         case 0: 
461         
462                 brc = false
463         
464                 Kontext "Active"
465                 if ( Active.exists( 1 ) ) then
466                 
467                         printlog( CFN & "Check for possible overwrite warning..." )
468                         try
469                                 Active.yes()
470                                 printlog( CFN & "Closed Messagebox with <YES>" )
471                                 printlog( CFN & "This was the overwrite warning" )
472                     catch
473                     endcatch
474                 endif
476                 Kontext "Active"
477                 if ( Active.exists( 1 ) ) then
478                     cMsg = active.getText()
479                         try
480                                 Active.ok()
481                                 printlog( CFN & "Closed Save-Failure warning with <OK>" )
482                                 brc = true
483                     catch
484                         qaerrorlog( CFN & "Unknown dialog encountered, <OK> failed:" )
485                         printlog( cMSG )
486                     endcatch
487                 endif
488                 
489                 
490         case 1: 
492             Kontext "Active"
493             if ( Active.exists( 1 ) ) then
494                 printlog( CFN & "Expected active: " & active.getText() )
495                 Active.OK()
497                 Kontext "SpeichernDLG"
498                 if ( SpeichernDlg.exists( 1 ) ) then
499                     SpeichernDLG.cancel()
500                     brc = true
501                 else
502                     warnlog( CFN & "File Save dialog is missing. Bad!" )
503                     brc = false
504                 endif
505             else
506                 warnlog( CFN & "Errormessage for '/', '\' or ':' is missing" )
507                 brc = false
508             endif
509             
510         end select
512     else
513         warnlog( CFN & "Failed to open File Save dialog" )
514     endif
515     '///</ul>
517     '///+<li>Close the document</li>
518     hDestroyDocument()
519     
520     '///+<li>Return errorcondition</li>
521     printlog( CFN & "Exit with status: " & brc )
522     hSaveFileExpectFailure() = brc
523     
524     '///</ul>
525     
526 end function
528 '*******************************************************************************
530 function hCreateDirectoryExpectSuccess( dirname as string ) as boolean
532     '///<h3>Create a directory where success is expected</h3>
533     '///<i>Uses</i>: framework\tools\t_stringtools.inc<br><br>
534     '///<u>Input</u>:
535     '///<ol>
536     '///+<li>Name of the directory (string)</li>
537     '///<ul>
538     '///+<li>Relative or absolute, absolute is recommended</li>
539     '///</ul>
540     '///</ol>
541     '///<u>Returns</u>:
542     '///<ol>
543     '///+<li>Errorcondition (boolean)</li>
544     '///<ul>
545     '///+<li>TRUE = The directory wass created</li>
546     '///+<li>FALSE = On any error (Unable to create or file already exists)</li>
547     '///</ul>
548     '///</ol>
549     '///<u>Description</u>:
550     '///<ul>
551     
552     dim brc as boolean
553         brc = true
554         
555     const CFN = "hCreateDirectoryExpectSuccess::"
556     printlog( CFN & "Enter with option: " & dirname )
558     '///+<li>Click &quot;File Open&quot;</li>
559     FileOpen    
561     '///+<li>Click on &quot;New folder&quot;</li>
562     Kontext "OeffnenDlg"
563     if ( OeffnenDlg.exists( 2 ) ) then
564     
565         NeuerOrdner.click()
567         '///+<li>Enter a name for the folder into the dialog</li>
568         Kontext "NeuerOrdner"
569         if ( NeuerOrdner.exists( 1 ) ) then
570             OrdnerName.setText( dirname )
571             
572             '///+<li>Click &quot;OK&quot;</li>
573             NeuerOrdner.OK()
574         else
575             warnlog( CFN & "New folder dialog did not open." )
576             brc = false
577         endif
579         '///+<li>Handle possible messagebox (unexpected)</li>
580         Kontext "Active"
581         if Active.Exists( 1 ) then
582             printlog( CFN & "Unexpected active: " & active.getText() )
583             brc = false
584             try
585                 Active.YES()
586             catch
587                 Active.OK()
588             endcatch
589         endif
590     else
591         warnlog( CFN & "File Open dialog is not open." )
592         brc = false
593     endif
594     
595     '///+<li>Return errorcondition</li>
596     printlog( CFN & "Exit with result: " & brc )
597     hCreateDirectoryExpectSuccess() = brc
598     
599     '///</ul>
601 end function
603 '*******************************************************************************
605 function hDeleteFileViaFileOpen( cFile as String ) as boolean
607     '///<h3>Delete a file using the File Open dialog</h3>
608     '///<i>Uses</i>: framework\tools\t_stringtools.inc<br><br>
609     '///<u>Input</u>:
610     '///<ol>
611     '///+<li>Filename incl. extension (string)</li>
612     '///</ol>
613     '///<u>Returns</u>:
614     '///<ol>
615     '///+<li>Errorcondition (boolean)</li>
616     '///<ul>
617     '///+<li>TRUE = File was deleted</li>
618     '///+<li>FALSE = Any other condition</li>
619     '///</ul>
620     '///</ol>
621     '///<u>Description</u>:
622     '///<ul>
623     
624     ' This sub deletes a file by name. No errors or warnings are expected.
625     ' if everything goes well,  we're back to the originating document after
626     ' completion.
628     dim iSelectedFilePosition as integer
629     dim brc as boolean
630     
631     const CFN = "hDeleteFileViaFileOpen::"
632     printlog( CFN & "Enter with option: " & cFile )
633     
634     ' Test for wildcards - the dialog cannot handle those
635     if ( instr( cFile , "?" ) <> 0 ) then
636         warnlog( CFN & "Incorrect call to function, wildcards are not allowed" )
637         hDeleteFileViaFileOpen() = false
638         exit function
639     endif
640     
641     ' Test for wildcards - the dialog cannot handle those
642     if ( instr( cFile , "*" ) <> 0 ) then
643         warnlog( CFN & "Incorrect call to function, wildcards are not allowed" )
644         hDeleteFileViaFileOpen() = false
645         exit function
646     endif    
648     '///+<li>Click &quot;File Open&quot;</li>
649     FileOpen
650     
651     '///+<li>Look for the requested file, get the position from the filelist</li>
652     Kontext "OeffnenDLG"
653     iSelectedFilePosition = hFindFileObjectViaFileOpen( cFile )
654     
655     '///+<li>If the file exists, delete it + verify, if not: Warn and exit</li>
656     if ( iSelectedFilePosition > 0 ) then
657     
658         ' Enable for debug
659         'printlog( CFN & "Requested file: " & cFile )
660         'printlog( CFN & "Object is at..: " & iSelectedFilePosition )
661         'printlog( CFN & "Object name is: " & DateiAuswahl.getSelText()  )
662         
663         DateiAuswahl.TypeKeys( "<DELETE>" )
664     
665         ' Confirm deletion. This dialog should always pop up when deleting
666         Kontext "ConfirmDelete"
667         if ( ConfirmDelete.exists( 1 ) ) then
668             Delete.click()
669             printlog( CFN & "Deleted file: " & cFile ) 
670         else
671             warnlog( CFN & "Messagebox to confirm deletion of file is missing" )
672         endif
673     
674         ' Handle possible Warnings/Errormessages. If no errors happen, 
675         ' verify that the file has been deleted. Note that this dialog will not
676         ' change the returnvalue. 
677         Kontext "Active"
678         if( Active.exists( 1 ) ) then
679             warnlog( CFN & "Unexpected active: " & active.getText() )
680             Active.OK()
681         endif 
682         
683         ' Verify that the file does no longer exist in the filelist.
684         iSelectedFilePosition = hFindFileObjectViaFileOpen( cFile )
685         if ( iSelectedFilePosition = 0 ) then
686             brc = true
687         else
688             brc = false
689         endif
690         
691     else
692     
693         brc = false
694         warnlog( CFN & "File not found in workdir: " & cFile )
695         
696     endif
697     
698     '///+<li>Cancel the FileOpen dialog</li>
699     kontext "OeffnenDlg"
700     OeffnenDlg.cancel()
701     
702     '///+<li>Return errorcondition</li>
703     printlog( CFN & "Exit with result: " & brc )
704     hDeleteFileViaFileOpen() = brc
705     
706     '///</ul>
708 end function
710 '******************************************************************************
712 function hGetFileCountViaFileOpen() as integer
714     '///<h3>Get the number of items listed in the FilePicker (File Open)</h3>
715     '///<i>Note</i>: This function works on the current workdirectory<br><br>
716     '///<u>Input</u>:
717     '///<ol>
718     '///+<li>Nothing</li>
719     '///</ol>
720     '///<u>Returns</u>:
721     '///<ol>
722     '///+<li>Number of items listed in filepicker</li>
723     '///</ol>
724     '///<u>Description</u>:
725     '///<ul>
726     
727     '///+<li>Click &quot;File open&quot;</li>
728     FileOpen
729     
730     '///+<li>Retrieve the number of items in the filepicker window</li>
731     Kontext "OeffnenDLG"
732     hGetFileCountViaFileOpen() = DateiAuswahl.getItemCount()
733     
734     '///+<li>Close &quot;File Open&quot;</li>
735     OeffnenDLG.cancel()
736     '///</ul>    
738 end function
740 '*******************************************************************************
742 function hNameGen_append( iDecChar as long ) as string
744     '///<h3>Create a filename with specified character at the end</h3>
745     '///<u>Input</u>:
746     '///<ol>
747     '///+<li>Character as number (integer)</li>
748     '///<ul>
749     '///+<li>Only positive numbers are allowed</li>
750     '///+<li>Respect integer boundaries</li>
751     '///</ul>
752     '///</ol>
753     '///<u>Returns</u>:
754     '///<ol>
755     '///+<li>A filename containing a special character at the end (before suffix)</li>
756     '///</ol>
757     '///<u>Description</u>:
758     '///<ul>
760     dim cFile as string
761     const CFN = "hNameGen_append::"
763     '///+<li>Create a string &quot;test&quot;, append ascii char</li>
764     cFile = "test" & CHR$( iDecChar )
765     printlog( CFN & "ASCII " & iDecChar & " appended, len = " & len( cFile ) )
766     if ( len( cFile ) <> 5 ) then
767         warnlog( CFN & "Character not appended" )
768     endif
770     '///+<li>Return the new filename</li>
771     hNameGen_append() = cFile
772     
773     '///</ul>
775 end function
777 '*******************************************************************************
779 function hNameGen_lead( iDecChar as long ) as string
781     '///<h3>Create a filename with specified character at the beginning</h3>
782     '///<u>Input</u>:
783     '///<ol>
784     '///+<li>Character as number (integer)</li>
785     '///<ul>
786     '///+<li>Only positive numbers are allowed</li>
787     '///+<li>Respect integer boundaries</li>
788     '///</ul>
789     '///</ol>
790     '///<u>Returns</u>:
791     '///<ol>
792     '///+<li>A filename containing a special character at the beginning</li>
793     '///</ol>
794     '///<u>Description</u>:
795     '///<ul>
796    
797     dim cFile as string
798     const CFN = "hNameGen_lead::"
800     '///+<li>Create a string beginning with ascii char and append &quot;test&quot</li>
801     cFile = CHR$( iDecChar ) & "test"
802     printlog( CFN & "ASCII " & iDecChar & " prepended, len = " & len( cFile ) )
803     if ( len( cFile ) <> 5 ) then
804         warnlog( CFN & "Character not prepended" )
805     endif
807     '///+<li>Return the new filename</li>
808     hNamegen_lead() = cFile
809     
810     '///</ul>
812 end function
814 '*******************************************************************************
816 function hGetRelPath( cStartDir, cFileName as String ) as string
818     '///<h3>Remove the absolute component from a path specification</h3>
819     '///<i>Usually you do not need this function, avoid using it</i><br><br>
820     '///<u>Input</u>:
821     '///<ol>
822     '///+<li>Absolute part of a filespec (startdirectory) (string)</li>
823     '///<ul>
824     '///+<li>e.g. &quot;/home/oscar/mydir&quot;</li>
825     '///</ul>
826     '///+<li>Fully qualified path to the file/directory (string)</li>
827     '///<ul>
828     '///+<li>e.g. &quot;/home/oscar/mydir/somedir/myfile.txt&quot;</li>
829     '///</ul>
830     '///</ol>
831     '///<u>Returns</u>:
832     '///<ol>
833     '///+<li>Remaining part of the fully qualified path minus startdirectory (string)</li>
834     '///<ul>
835     '///+<li>e.g. &quot;/somedir/myfile.txt&quot;</li>
836     '///</ul>
837     '///</ol>
838     '///<u>Description</u>:
839     '///<ul>
841     '///+<li>Find the end of startdir within the FQ filename</li>
842     hGetRelPath() = mid( cFileName , len( cStartDir + 1 ) )
843     '///</ul>
845 end function
847 '*******************************************************************************
849 function hFindFileObjectViaFileOpen( cName as string ) as integer
851     '///<h3>Get the position of a filesystem object in filelist of fileopen dialog</h3>
852     '///<i>Note that the filepicker must be open in order to use this function.<br>
853     '///The object with the given name is selected when leaving the function.</i><br>
854     '///<u>Input</u>:
855     '///<ol>
856     '///+<li>Filename incl. extension (string) but without any pathseparator</li>
857     '///</ol>
858     '///<u>Returns</u>:
859     '///<ol>
860     '///+<li>Position of the object in the filepicker list</li>
861     '///<ul>
862     '///+<li>0: Object not found</li>
863     '///+<li>&gt; 0: Position</li>
864     '///</ul>
865     '///</ol>
866     '///<u>Description</u>:
867     '///<ul>
868     
869     const CFN = "hFindFileObjectViaFileOpen::"
871     dim iCurrentObject as integer
872     dim cCurrentName as string
873     dim iFileOpenItemCount as integer
874     dim iPos as integer
875         iPos = 0
876     dim cPath as string
877         cPath = cName
879     dim iPathItems as integer
880     dim asPathList( 100 ) as string
881     
882     printlog( CFN & "Enter with option (File): " & cName )
884     '///+<li>If a fully qualified path has been provided we have to split it up</li>
885     iPathItems = DirNameList( cPath, asPathList() )
886     'printlog( CFN & "iPathItems (new): " & iPathItems )
888     if ( iPathItems > 3 ) then
889         cName = asPathList( iPathItems )
890         printlog( CFN & "CNAME from plist: " & cName )
892         '///+<li>And walk to the directory</li>
893         cPath = left( cPath , ( len ( cPath ) - len( cName ) ) - 1 )
894         printlog( CFN & "CPATH from plist: " & cPath )
896         kontext "OeffnenDlg"
897         if ( OeffnenDlg.exists( 1 ) ) then
898             Dateiname.setText( cPath )
899             Oeffnen.click()
900         else
901             warnlog( CFN & "File Open dialog is not open" )
902             hFindFileObjectViaFileOpen() = 0
903             exit function
904         endif
905     endif
906         
907     '///+<li>get the number of items in the filepicker</li>
908     kontext "OeffnenDlg"
909     iFileOpenItemCount = DateiAuswahl.getItemCount()
910     
911     '///+<li>Jump to the first item in the filelist and select it with SPACE</li>
912     DateiAuswahl.typeKeys( "<HOME>" )
913     DateiAuswahl.typeKeys( "<SPACE>" )
914     
915     '///+<li>Navigate through the list until we find the requested object</li>
916     for iCurrentObject = 1 to iFileOpenItemCount
917     
918         cCurrentName = DateiAuswahl.getSelText()
919     
920         if ( cCurrentName = cName ) then
921             iPos = iCurrentObject
922             exit for
923         endif
924         
925         DateiAuswahl.typeKeys( "<DOWN>" )
926         
927     next iCurrentObject
928     
929     '///+<li>Print some info to the log</li>
930     if ( iPos > 0 ) then
931         printlog( CFN & "Exit: Found item [" & cName & "] at pos: " & iPos )
932     else
933         printlog( CFN & "Exit: Requested item [" & cName & "] was not found." )
934     endif
935     
936     '///+<li>return the position or 0 on failure</li>
937     hFindFileObjectViaFileOpen() = iPos
938     '///</ul>
939     
940 end function