source: xtideuniversalbios/trunk/Assembly_Library/Src/Menu/Dialog/DialogFile.asm @ 105

Last change on this file since 105 was 105, checked in by aitotat, 13 years ago

Changes to Assembly Library:

  • More optimizations to reduce size.
  • Removed some utility functions to reduce size.
File size: 22.1 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Displays file dialog.
3
4
5CURRENTDIR_CHARACTERS   EQU     002Eh
6UPDIR_CHARACTERS        EQU     2E2Eh
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; DialogFile_GetFileNameWithIoInDSSI
13;   Parameters:
14;       DS:SI:  Ptr to FILE_DIALOG_IO
15;       SS:BP:  Ptr to parent MENU
16;   Returns:
17;       Nothing
18;   Corrupts registers:
19;       AX, BX, CX, DX, SI, DI
20;--------------------------------------------------------------------
21ALIGN JUMP_ALIGN
22DialogFile_GetFileNameWithIoInDSSI:
23    mov     bx, FileEventHandler
24    mov     BYTE [si+FILE_DIALOG_IO.bUserCancellation], TRUE
25    jmp     Dialog_DisplayWithDialogInputInDSSIandHandlerInBX
26
27
28;--------------------------------------------------------------------
29; FileEventHandler
30;   Common parameters for all events:
31;       BX:         Menu event (anything from MENUEVENT struct)
32;       SS:BP:      Ptr to DIALOG
33;   Common return values for all events:
34;       CF:         Set if event processed
35;                   Cleared if event not processed
36;   Corrupts registers:
37;       All
38;--------------------------------------------------------------------
39ALIGN JUMP_ALIGN
40FileEventHandler:
41    jmp     [cs:bx+.rgfnEventHandlers]
42
43
44ALIGN JUMP_ALIGN
45.ItemSelectedFromCX:
46    call    LoadItemStringBufferToESDI
47    COPY_ESDI_to_DSSI
48    call    ItemLineSplitter_GetLineToDSSIandLengthToCXfromStringInDSSIwithIndexInCX
49    jmp     ParseSelectionFromItemLineInDSSI
50
51
52ALIGN JUMP_ALIGN
53.RefreshInformation:
54    call    GetInfoLinesToCXandDialogFlagsToAX
55    mov     si, [cs:.rgszInfoStringLookup]
56    xor     bx, bx
57    xchg    dx, ax
58ALIGN JUMP_ALIGN
59.InfoLineLoop:
60    shr     dl, 1
61    jnc     SHORT .CheckNextFlag
62    mov     si, [cs:bx+.rgszInfoStringLookup]
63    push    bx
64    CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
65    pop     bx
66ALIGN JUMP_ALIGN
67.CheckNextFlag:
68    inc     bx
69    inc     bx
70    loop    .InfoLineLoop
71    stc                     ; Event processed
72    ret
73
74
75ALIGN JUMP_ALIGN
76.RefreshItemFromCX:
77    call    LoadItemStringBufferToESDI
78    mov     ax, FILE_STRING_LENGTH
79    xchg    ax, cx
80    mul     cx
81    add     di, ax
82    mov     si, di
83    mov     bx, es
84    dec     cx              ; Do not print LF at the end of file string
85    CALL_DISPLAY_LIBRARY PrintCharBufferFromBXSIwithLengthInCX
86    stc
87    ret
88
89
90ALIGN WORD_ALIGN
91.rgszInfoStringLookup:
92    dw      g_szChangeDrive
93    dw      g_szSelectDirectory
94    dw      g_szCreateNew
95
96.rgfnEventHandlers:
97istruc MENUEVENT
98    at  MENUEVENT.InitializeMenuinitFromDSSI,   dw  InitializeMenuinitFromSSBP
99    at  MENUEVENT.ExitMenu,                     dw  Dialog_EventExitMenu
100    at  MENUEVENT.IdleProcessing,               dw  Dialog_EventNotHandled
101    at  MENUEVENT.ItemHighlightedFromCX,        dw  Dialog_EventNotHandled
102    at  MENUEVENT.ItemSelectedFromCX,           dw  .ItemSelectedFromCX
103    at  MENUEVENT.KeyStrokeInAX,                dw  HandleFunctionKeyFromAH
104    at  MENUEVENT.RefreshTitle,                 dw  Dialog_EventRefreshTitle
105    at  MENUEVENT.RefreshInformation,           dw  .RefreshInformation
106    at  MENUEVENT.RefreshItemFromCX,            dw  .RefreshItemFromCX
107iend
108
109
110;--------------------------------------------------------------------
111; ReInitializeMenuinitFromSSBP
112; InitializeMenuinitFromSSBP
113;   Parameters:
114;       SS:BP:      Ptr to DIALOG
115;   Returns:
116;       Nothing
117;   Corrupts registers:
118;       All, except BP
119;--------------------------------------------------------------------
120ALIGN JUMP_ALIGN
121ReInitializeMenuinitFromSSBP:
122    call    DisplayLoadingMessageInInformationArea
123InitializeMenuinitFromSSBP:
124    call    LoadItemStringBufferToESDI
125    call    CreateStringFromCurrentDirectoryContentsToESDI
126    call    LoadItemStringBufferToESDI
127    call    SortDirectoryContentsStringFromESDIwithCountInCX
128    call    RemoveLastLFandTerminateESDIwithNull
129
130    COPY_SSBP_TO_DSSI
131    xor     ax, ax
132    call    Dialog_EventInitializeMenuinitFromDSSIwithHighlightedItemInAX
133    call    GetInfoLinesToCXandDialogFlagsToAX
134    mov     [bp+MENUINIT.bInfoLines], cl
135    CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
136    mov     [bp+MENUINIT.bHeight], ah               ; Always max height
137    mov     WORD [bp+MENU.wFirstVisibleItem], 0
138    ret
139
140
141;--------------------------------------------------------------------
142; LoadItemStringBufferToESDI
143;   Parameters:
144;       SS:BP:  Ptr to DIALOG
145;   Returns:
146;       ES:DI:  Ptr to item string buffer
147;   Corrupts registers:
148;       Nothing
149;--------------------------------------------------------------------
150ALIGN JUMP_ALIGN
151LoadItemStringBufferToESDI:
152    les     di, [bp+DIALOG.fpDialogIO]
153    les     di, [es:di+FILE_DIALOG_IO.fszItemBuffer]
154    ret
155
156
157;--------------------------------------------------------------------
158; CreateStringFromCurrentDirectoryContentsToESDI
159;   Parameters:
160;       ES:DI:  Buffer where to create item string
161;       SS:BP:  Ptr to DIALOG
162;   Returns:
163;       CX:     Number of files or directories found
164;   Corrupts registers:
165;       AX, BX, DX, SI, DI, DS
166;--------------------------------------------------------------------
167ALIGN JUMP_ALIGN
168CreateStringFromCurrentDirectoryContentsToESDI:
169    mov     bx, di
170    CALL_DISPLAY_LIBRARY PushDisplayContext
171    mov     cx, -1
172    CALL_DISPLAY_LIBRARY PrepareOffScreenBufferInESBXwithLengthInCX ; ES:DI now points to buffer
173
174    lds     si, [bp+DIALOG.fpDialogIO]
175    eMOVZX  cx, BYTE [si+FILE_DIALOG_IO.bFileAttributes]
176    lds     si, [si+FILE_DIALOG_IO.fpFileFilterString]
177    call    Directory_UpdateDTAForFirstMatchForDSSIwithAttributesInCX
178
179    call    .ClearDLifInRootDirectory
180    call    Directory_GetDiskTransferAreaAddressToDSSI
181    xor     cx, cx          ; Clear file/directory count
182    call    .FindMatchingFilesAndPrintThemToOffScreenBuffer
183
184    CALL_DISPLAY_LIBRARY PopDisplayContext
185    ret
186
187;--------------------------------------------------------------------
188; .ClearDLifInRootDirectory
189;   Parameters:
190;       SS:BP:  Ptr to DIALOG
191;       ES:DI:  Ptr to destination string buffer
192;   Returns:
193;       DL:     Cleared if in root directory
194;               Set if in any other directory
195;   Corrupts registers:
196;       AX, SI, DS
197;--------------------------------------------------------------------
198ALIGN JUMP_ALIGN
199.ClearDLifInRootDirectory:
200    COPY_ESDI_to_DSSI
201    call    Directory_WriteCurrentPathToDSSI
202    mov     dl, [si]
203    ret
204
205;--------------------------------------------------------------------
206; .FindMatchingFilesAndPrintThemToOffScreenBuffer
207;   Parameters:
208;       CX:     Initial directory count
209;       DL:     Zero if root directory selected
210;       DS:SI:  Ptr to DTA with first matching file
211;   Returns:
212;       CX:     Incremented by number of files/directories found
213;   Corrupts registers:
214;       AX, BX, DX, DI, DS
215;--------------------------------------------------------------------
216ALIGN JUMP_ALIGN
217.FindMatchingFilesAndPrintThemToOffScreenBuffer:
218    call    AppendFileFromDTAinDSSItoOffScreenBuffer
219    call    Directory_UpdateDTAForNextMatchUsingPreviousParameters
220    jnc     SHORT .FindMatchingFilesAndPrintThemToOffScreenBuffer
221    ret
222
223
224;--------------------------------------------------------------------
225; AppendFileFromDTAinDSSItoOffScreenBuffer
226;   Parameters:
227;       CX:     Files/directores found
228;       DL:     Zero if root directory selected
229;       DS:SI:  Ptr to DTA containing file information
230;   Returns:
231;       CX:     Incremented by number of files/directories found
232;   Corrupts registers:
233;       AX, BX
234;--------------------------------------------------------------------
235ALIGN JUMP_ALIGN
236AppendFileFromDTAinDSSItoOffScreenBuffer:
237    call    .FilterCurrentDirectory         ; We never want "."
238    call    .FilterUpDirectoryWhenInRoot    ; No ".." when in root directory
239    inc     cx                              ; Nothing filtered so increment files/directories
240
241    push    bp
242    push    si
243    push    dx
244    push    cx
245    call    .FormatFileOrDirectoryToBufferFromDTAinDSSI
246    pop     cx
247    pop     dx
248    pop     si
249    pop     bp
250    ret
251
252;--------------------------------------------------------------------
253; .FilterCurrentDirectory
254; .FilterUpDirectoryWhenInRoot
255;   Parameters:
256;       DL:     Zero if root directory selected
257;       DS:SI:  Ptr to DTA containing file information
258;   Returns:
259;       Nothing
260;       Returns from AppendFileToBufferInESDIfromDtaInDSSI when filtering
261;   Corrupts registers:
262;       AX
263;--------------------------------------------------------------------
264ALIGN JUMP_ALIGN
265.FilterCurrentDirectory:
266    cmp     WORD [si+DTA.szFile], CURRENTDIR_CHARACTERS
267    jne     SHORT .ReturnWithoutFiltering
268    add     sp, BYTE 2      ; Remove return address from stack
269    ret
270
271ALIGN JUMP_ALIGN
272.FilterUpDirectoryWhenInRoot:
273    test    dl, dl          ; Set ZF if root directory selected
274    jnz     SHORT .ReturnWithoutFiltering
275    cmp     WORD [si+DTA.szFile], UPDIR_CHARACTERS
276    jne     SHORT .ReturnWithoutFiltering
277    add     sp, BYTE 2      ; Remove return address from stack
278ALIGN JUMP_ALIGN, ret
279.ReturnWithoutFiltering:
280    ret
281
282;--------------------------------------------------------------------
283; .FormatFileOrDirectoryToBufferFromDTAinDSSI
284;   Parameters:
285;       DS:SI:  Ptr to DTA containing file information
286;   Returns:
287;       Nothing
288;   Corrupts registers:
289;       AX, BX, CX, DX, SI, DI, BP
290;--------------------------------------------------------------------
291ALIGN JUMP_ALIGN
292.FormatFileOrDirectoryToBufferFromDTAinDSSI:
293    mov     bp, sp
294    lea     ax, [si+DTA.szFile]
295
296    test    BYTE [si+DTA.bFileAttributes], FLG_FILEATTR_DIRECTORY
297    jnz     SHORT .FormatDirectory
298    ; Fall to .FormatFile
299
300;--------------------------------------------------------------------
301; .FormatFile
302;   Parameters:
303;       BP:     SP before pushing formatting parameters
304;       DS:AX:  Far pointer to file name
305;       DS:SI:  Ptr to DTA containing file information
306;   Returns:
307;       Nothing
308;   Corrupts registers:
309;       AX, BX, CX, DX, SI, DI
310;--------------------------------------------------------------------
311.FormatFile:
312    xchg    si, ax
313    call    String_ConvertDSSItoLowerCase
314    xchg    ax, si
315
316    ; Push parameters for file name
317    push    ax              ; Push file name offset
318    push    ds              ; Push file name segment
319
320    ; Push parameters for file size
321    mov     ax, [si+DTA.dwFileSize]
322    mov     dx, [si+DTA.dwFileSize+2]
323    xor     bx, bx
324    xor     cx, cx
325    call    Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
326    mov     cl, 'i'
327    cmp     dl, ' '
328    eCMOVE  cl, dl
329    push    ax
330    push    dx
331    push    cx
332
333    ; Format to buffer
334    mov     si, g_szFileFormat
335    jmp     SHORT .FormatStringInCSSIandReturn
336
337;--------------------------------------------------------------------
338; .FormatDirectory
339;   Parameters:
340;       BP:     SP before pushing formatting parameters
341;       DS:AX:  Far pointer to directory name
342;       DS:SI:  Ptr to DTA containing file information
343;   Returns:
344;       Nothing
345;   Corrupts registers:
346;       AX, SI, DI
347;--------------------------------------------------------------------
348ALIGN JUMP_ALIGN
349.FormatDirectory:
350    push    ax              ; Push directory name offset
351    push    ds              ; Push directory name segment
352    mov     ax, g_szSub
353    cmp     WORD [si+DTA.szFile], UPDIR_CHARACTERS
354    eCMOVE  ax, g_szUp
355    push    ax
356    mov     si, g_szDirectoryFormat
357ALIGN JUMP_ALIGN
358.FormatStringInCSSIandReturn:
359    CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
360    ret
361
362
363;--------------------------------------------------------------------
364; SortDirectoryContentsStringFromESDIwithCountInCX
365;   Parameters:
366;       CX:     Number of files and directories
367;       ES:DI:  Buffer containing directory contents string
368;       SS:BP:  Ptr to DIALOG
369;   Returns:
370;       ES:DI:  Ptr to end of directory contents string
371;   Corrupts registers:
372;       AX, BX, CX, DX, SI, DS
373;--------------------------------------------------------------------
374ALIGN JUMP_ALIGN
375SortDirectoryContentsStringFromESDIwithCountInCX:
376    COPY_ESDI_to_DSSI
377    call    .AddDirectoryContentsStringLengthToDI
378    mov     bx, .FileStringComparator
379    xchg    dx, cx
380    mov     cx, FILE_STRING_LENGTH
381    jmp     Sort_ItemsFromDSSIwithCountInDXsizeInCXandComparatorInBX
382
383ALIGN JUMP_ALIGN
384.AddDirectoryContentsStringLengthToDI:
385    mov     ax, FILE_STRING_LENGTH
386    mul     cx
387    add     di, ax
388    ret
389
390;--------------------------------------------------------------------
391; .FileStringComparator
392;   Parameters:
393;       CX:     Item size in bytes
394;       DS:SI:  Ptr to first item to compare
395;       ES:DI:  Ptr to second item to compare
396;   Returns:
397;       FLAGS:  Signed comparition between first and second item
398;   Corrupts registers:
399;       Nothing
400;--------------------------------------------------------------------
401ALIGN JUMP_ALIGN
402.FileStringComparator:
403    push    di
404    push    si
405    push    cx
406    push    bx
407
408    mov     bx, FILE_STRING_LENGTH-2            ; Zero BH
409    cmp     WORD [si], UPDIR_CHARACTERS
410    je      SHORT .ForceValueFromDSSItoBeLess
411    mov     bl, [si+bx]
412    cmp     bl, [es:di+FILE_STRING_LENGTH-2]    ; 'B' for files, 'R' for directories
413    jne     SHORT .ForceValueFromDSSItoBeMoreOrLess
414    repe cmpsb                                  ; Two directories or two files
415
416ALIGN JUMP_ALIGN
417.ReturnFromComparison:
418    pop     bx
419    pop     cx
420    pop     si
421    pop     di
422    ret
423ALIGN JUMP_ALIGN
424.ForceValueFromDSSItoBeMoreOrLess:
425    ja      SHORT .ForceValueFromDSSItoBeLess   ; Directory in SI, file in DI
426    xchg    bl, bh
427    ; Fall to ForceValueFromDSSItoBeLess
428ALIGN JUMP_ALIGN
429.ForceValueFromDSSItoBeLess:
430    cmp     bh, bl
431    jmp     SHORT .ReturnFromComparison
432
433
434;--------------------------------------------------------------------
435; RemoveLastLFandTerminateESDIwithNull
436;   Parameters:
437;       ES:DI:  Ptr to end of buffer to terminate
438;   Returns:
439;       Nothing
440;   Corrupts registers:
441;       AX
442;--------------------------------------------------------------------
443ALIGN JUMP_ALIGN
444RemoveLastLFandTerminateESDIwithNull:
445    dec     di
446    xor     ax, ax
447    stosb
448    ret
449
450
451;--------------------------------------------------------------------
452; GetInfoLinesToCXandDialogFlagsToAX
453;   Parameters:
454;       SS:BP:  Ptr to DIALOG
455;   Returns:
456;       AX:     Dialog flags
457;       CX:     Number of info lines to be displayed
458;   Corrupts registers:
459;       SI, DS
460;--------------------------------------------------------------------
461ALIGN JUMP_ALIGN
462GetInfoLinesToCXandDialogFlagsToAX:
463    xor     ax, ax
464    call    GetDialogFlagsToAL
465    jmp     Bit_GetSetCountToCXfromAX
466
467;--------------------------------------------------------------------
468; GetDialogFlagsToAL
469;   Parameters:
470;       SS:BP:  Ptr to DIALOG
471;   Returns:
472;       AL:     Dialog flags
473;   Corrupts registers:
474;       SI, DS
475;--------------------------------------------------------------------
476ALIGN JUMP_ALIGN
477GetDialogFlagsToAL:
478    lds     si, [bp+DIALOG.fpDialogIO]
479    mov     al, [si+FILE_DIALOG_IO.bDialogFlags]
480    ret
481
482
483;--------------------------------------------------------------------
484; ParseSelectionFromItemLineInDSSI
485;   Parameters:
486;       DS:SI:  Ptr to char buffer containing file or directory to be selected
487;       SS:BP:  Ptr to DIALOG
488;   Returns:
489;       Nothing
490;   Corrupts registers:
491;       All, except BP
492;--------------------------------------------------------------------
493ALIGN JUMP_ALIGN
494ParseSelectionFromItemLineInDSSI:
495    mov     ax, [si]
496    cmp     ax, UPDIR_CHARACTERS
497    je      SHORT .ChangeToUpdir
498    call    Char_IsUpperCaseLetterInAL
499    jc      SHORT .ParseAndChangeToSubdirInDSSI
500    ; Fall to .ParseAndSelectFileFromDSSI
501
502;--------------------------------------------------------------------
503; .ParseAndSelectFileFromDSSI
504;   Parameters:
505;       DS:SI:  NULL terminated string selected from dialog
506;       SS:BP:  Ptr to DIALOG
507;   Returns:
508;       Nothing (exits dialog)
509;   Corrupts registers:
510;       All, except BP
511;--------------------------------------------------------------------
512.ParseAndSelectFileFromDSSI:
513    les     di, [bp+DIALOG.fpDialogIO]
514    add     di, BYTE FILE_DIALOG_IO.szFile
515    mov     cx, FILENAME_BUFFER_SIZE-1
516    call    Memory_CopyCXbytesFromDSSItoESDI
517    xor     ax, ax
518    stosb                       ; Terminate with NULL
519    jmp     SHORT CloseFileDialogAfterSuccessfullSelection
520
521;--------------------------------------------------------------------
522; .ChangeToUpdir
523;   Parameters:
524;       SS:BP:  Ptr to DIALOG
525;   Returns:
526;       Nothing
527;   Corrupts registers:
528;       All, except BP
529;--------------------------------------------------------------------
530ALIGN JUMP_ALIGN
531.ChangeToUpdir:
532    push    cs
533    pop     ds
534    mov     si, g_szUpdir
535    jmp     SHORT .ChangeDirectoryToDSSI
536
537;--------------------------------------------------------------------
538; .ParseAndChangeToSubdirInDSSI
539;   Parameters:
540;       DS:SI:  NULL terminated string selected from dialog
541;       SS:BP:  Ptr to DIALOG
542;   Returns:
543;       Nothing
544;   Corrupts registers:
545;       All, except BP
546;--------------------------------------------------------------------
547ALIGN JUMP_ALIGN
548.ParseAndChangeToSubdirInDSSI:
549    mov     BYTE [si+12], NULL  ; Terminate with NULL (unnecessary spaces do not matter)
550.ChangeDirectoryToDSSI:
551    call    Directory_ChangeToPathFromDSSI
552    ; Fall to RefreshFilesToDisplay
553
554;--------------------------------------------------------------------
555; RefreshFilesToDisplay
556;   Parameters:
557;       SS:BP:  Ptr to DIALOG
558;   Returns:
559;       Nothing
560;   Corrupts registers:
561;       All, except BP
562;--------------------------------------------------------------------
563ALIGN JUMP_ALIGN
564RefreshFilesToDisplay:
565    call    ReInitializeMenuinitFromSSBP
566    jmp     MenuInit_RefreshMenuWindow
567
568
569;--------------------------------------------------------------------
570; HandleFunctionKeyFromAH
571;   Parameters:
572;       AH:     Scancode for function key
573;       SS:BP:  Ptr to DIALOG
574;   Returns:
575;       Nothing
576;   Corrupts registers:
577;       AX, SI, DI, BP
578;--------------------------------------------------------------------
579ALIGN JUMP_ALIGN
580HandleFunctionKeyFromAH:
581    call    GetDialogFlagsToAL
582    cmp     ah, KEY_FILEDIALOG_NEW_FILE_OR_DIR
583    je      SHORT HandleFunctionKeyForCreatingNewFileOrDirectory
584    cmp     ah, KEY_FILEDIALOG_SELECT_DIRECTORY
585    je      SHORT HandleFunctionKeyForSelectingDirectoryInsteadOfFile
586    cmp     ah, KEY_FILEDIALOG_CHANGE_DRIVE
587    je      SHORT HandleFunctionKeyForDriveChange
588ReturnWithoutHandlingKeystroke:
589    clc     ; Event not processed
590    ret
591
592
593;--------------------------------------------------------------------
594; HandleFunctionKeyForCreatingNewFileOrDirectory
595;   Parameters:
596;       AL:     File dialog flags
597;       SS:BP:  Ptr to DIALOG
598;   Returns:
599;       Closes file dialog
600;   Corrupts registers:
601;       All, except BP
602;--------------------------------------------------------------------
603ALIGN JUMP_ALIGN
604HandleFunctionKeyForCreatingNewFileOrDirectory:
605    test    al, FLG_FILEDIALOG_NEW
606    jz      SHORT ReturnWithoutHandlingKeystroke
607
608    mov     cx, STRING_DIALOG_IO_size
609    call    Memory_ReserveCXbytesFromStackToDSSI
610    call    .InitializeStringDialogIoInDSSIforInputtingFileName
611
612    CALL_MENU_LIBRARY GetStringWithIoInDSSI
613    mov     al, [si+STRING_DIALOG_IO.bUserCancellation]
614    add     sp, BYTE STRING_DIALOG_IO_size
615    test    al, al      ; User cancellation?
616    jnz     SHORT ReturnWithoutHandlingKeystroke
617    jmp     CloseFileDialogAfterSuccessfullSelection
618
619ALIGN JUMP_ALIGN
620.InitializeStringDialogIoInDSSIforInputtingFileName:
621    call    InitializeNullStringsToDialogInputInDSSI
622    mov     WORD [si+DIALOG_INPUT.fszTitle], g_szEnterNewFileOrDirectory
623    mov     WORD [si+STRING_DIALOG_IO.fnCharFilter], NULL
624    mov     WORD [si+STRING_DIALOG_IO.wBufferSize], FILENAME_BUFFER_SIZE
625    les     ax, [bp+DIALOG.fpDialogIO]
626    add     ax, BYTE FILE_DIALOG_IO.szFile
627    mov     [si+STRING_DIALOG_IO.fpReturnBuffer], ax
628    mov     [si+STRING_DIALOG_IO.fpReturnBuffer+2], es
629    ret
630
631
632;--------------------------------------------------------------------
633; HandleFunctionKeyForSelectingDirectoryInsteadOfFile
634;   Parameters:
635;       AL:     File dialog flags
636;       SS:BP:  Ptr to DIALOG
637;   Returns:
638;       Closes file dialog
639;   Corrupts registers:
640;       All, except BP
641;--------------------------------------------------------------------
642ALIGN JUMP_ALIGN
643HandleFunctionKeyForSelectingDirectoryInsteadOfFile:
644    test    al, FLG_FILEDIALOG_DIRECTORY
645    jz      SHORT ReturnWithoutHandlingKeystroke
646    ; Fall to CloseFileDialogAfterSuccessfullSelection
647
648;--------------------------------------------------------------------
649; CloseFileDialogAfterSuccessfullSelection
650;   Parameters:
651;       SS:BP:  Ptr to DIALOG
652;   Returns:
653;       Nothing (exits dialog)
654;   Corrupts registers:
655;       All, except BP
656;--------------------------------------------------------------------
657ALIGN JUMP_ALIGN
658CloseFileDialogAfterSuccessfullSelection:
659    lds     di, [bp+DIALOG.fpDialogIO]
660    mov     BYTE [di+FILE_DIALOG_IO.bUserCancellation], FALSE
661    jmp     MenuInit_CloseMenuWindow
662
663
664;--------------------------------------------------------------------
665; HandleFunctionKeyForDriveChange
666;   Parameters:
667;       AL:     File dialog flags
668;       SS:BP:  Ptr to DIALOG
669;   Returns:
670;       Nothing
671;   Corrupts registers:
672;       All, except BP
673;--------------------------------------------------------------------
674ALIGN JUMP_ALIGN
675HandleFunctionKeyForDriveChange:
676    test    al, FLG_FILEDIALOG_DRIVES
677    jz      SHORT ReturnWithoutHandlingKeystroke
678
679    call    DisplayLoadingMessageInInformationArea
680    mov     cx, DRIVE_DIALOG_IO_size
681    call    Memory_ReserveCXbytesFromStackToDSSI
682    call    .DisplayDriveSelectionDialogWithIoInDSSI
683    call    .ChangeDriveToUserSelectionFromIoInDSSI
684    add     sp, BYTE DRIVE_DIALOG_IO_size
685    ret
686
687;--------------------------------------------------------------------
688; .DisplayDriveSelectionDialogWithIoInDSSI
689;   Parameters:
690;       DS:SI:  Ptr to uninitialized DRIVE_DIALOG_IO
691;       SS:BP:  Ptr to DIALOG
692;   Returns:
693;       DS:SI:  Ptr to DRIVE_DIALOG_IO
694;   Corrupts registers:
695;       AX, DI
696;--------------------------------------------------------------------
697ALIGN JUMP_ALIGN
698.DisplayDriveSelectionDialogWithIoInDSSI:
699    call    InitializeNullStringsToDialogInputInDSSI
700    mov     WORD [si+DIALOG_INPUT.fszTitle], g_szSelectNewDrive
701    CALL_MENU_LIBRARY GetDriveWithIoInDSSI
702    ret
703
704;--------------------------------------------------------------------
705; .ChangeDriveToUserSelectionFromIoInDSSI
706;   Parameters:
707;       DS:SI:  Ptr to DRIVE_DIALOG_IO
708;       SS:BP:  Ptr to DIALOG
709;   Returns:
710;       Nothing
711;   Corrupts registers:
712;       All, except BP
713;--------------------------------------------------------------------
714ALIGN JUMP_ALIGN
715.ChangeDriveToUserSelectionFromIoInDSSI:
716    cmp     BYTE [si+DRIVE_DIALOG_IO.bUserCancellation], FALSE
717    jne     SHORT .UserCancelledDriveChange
718
719    mov     dl, [si+DRIVE_DIALOG_IO.bReturnDriveNumber]
720    call    Drive_SetDefaultFromDL
721    jmp     RefreshFilesToDisplay
722.UserCancelledDriveChange:
723    ret
724
725
726;--------------------------------------------------------------------
727; DisplayLoadingMessageInInformationArea
728;   Parameters:
729;       SS:BP:      Ptr to DIALOG
730;   Returns:
731;       Nothing
732;   Corrupts registers:
733;       AX, BX, CX, DX, SI, DI
734;--------------------------------------------------------------------
735ALIGN JUMP_ALIGN
736DisplayLoadingMessageInInformationArea:
737    call    MenuText_ClearInformationArea
738    call    MenuText_PrepareToDrawInformationArea
739    mov     si, g_szLoadingPleaseWait
740    CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
741    ret
742
743
744;--------------------------------------------------------------------
745; InitializeNullStringsToDialogInputInDSSI
746;   Parameters:
747;       DS:SI:  Ptr to DIALOG_INPUT
748;       SS:BP:  Ptr to DIALOG
749;   Returns:
750;       Nothing
751;   Corrupts registers:
752;       AX
753;--------------------------------------------------------------------
754ALIGN JUMP_ALIGN
755InitializeNullStringsToDialogInputInDSSI:
756    mov     ax, g_szNull
757    mov     [si+DIALOG_INPUT.fszTitle], ax
758    mov     [si+DIALOG_INPUT.fszTitle+2], cs
759    mov     [si+DIALOG_INPUT.fszItems], ax
760    mov     [si+DIALOG_INPUT.fszItems+2], cs
761    mov     [si+DIALOG_INPUT.fszInfo], ax
762    mov     [si+DIALOG_INPUT.fszInfo+2], cs
763    ret
Note: See TracBrowser for help on using the repository browser.