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

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

Changes to Assembly Library:

  • Some utility functions are now included only when including menu dialogs.
File size: 22.2 KB
RevLine 
[41]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
[106]47    call    Registers_CopyESDItoDSSI
[52]48    call    ItemLineSplitter_GetLineToDSSIandLengthToCXfromStringInDSSIwithIndexInCX
[41]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
[53]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
[41]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
[58]99    at  MENUEVENT.ExitMenu,                     dw  Dialog_EventExitMenu
[41]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
[53]106    at  MENUEVENT.RefreshItemFromCX,            dw  .RefreshItemFromCX
[41]107iend
108
109
110;--------------------------------------------------------------------
[54]111; ReInitializeMenuinitFromSSBP
[41]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
[54]121ReInitializeMenuinitFromSSBP:
122    call    DisplayLoadingMessageInInformationArea
[41]123InitializeMenuinitFromSSBP:
124    call    LoadItemStringBufferToESDI
125    call    CreateStringFromCurrentDirectoryContentsToESDI
[46]126    call    LoadItemStringBufferToESDI
127    call    SortDirectoryContentsStringFromESDIwithCountInCX
[53]128    call    RemoveLastLFandTerminateESDIwithNull
[54]129
[106]130    call    Registers_CopySSBPtoDSSI
[52]131    xor     ax, ax
132    call    Dialog_EventInitializeMenuinitFromDSSIwithHighlightedItemInAX
[41]133    call    GetInfoLinesToCXandDialogFlagsToAX
134    mov     [bp+MENUINIT.bInfoLines], cl
135    CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
136    mov     [bp+MENUINIT.bHeight], ah               ; Always max height
[52]137    mov     WORD [bp+MENU.wFirstVisibleItem], 0
[41]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:
[46]163;       CX:     Number of files or directories found
[41]164;   Corrupts registers:
[53]165;       AX, BX, DX, SI, DI, DS
[41]166;--------------------------------------------------------------------
167ALIGN JUMP_ALIGN
168CreateStringFromCurrentDirectoryContentsToESDI:
[53]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
[41]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
[53]178
[41]179    call    .ClearDLifInRootDirectory
180    call    Directory_GetDiskTransferAreaAddressToDSSI
[46]181    xor     cx, cx          ; Clear file/directory count
[53]182    call    .FindMatchingFilesAndPrintThemToOffScreenBuffer
[41]183
[53]184    CALL_DISPLAY_LIBRARY PopDisplayContext
185    ret
[41]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:
[106]200    call    Registers_CopyESDItoDSSI
[41]201    call    Directory_WriteCurrentPathToDSSI
202    mov     dl, [si]
203    ret
204
205;--------------------------------------------------------------------
[53]206; .FindMatchingFilesAndPrintThemToOffScreenBuffer
[41]207;   Parameters:
[53]208;       CX:     Initial directory count
209;       DL:     Zero if root directory selected
210;       DS:SI:  Ptr to DTA with first matching file
[41]211;   Returns:
[53]212;       CX:     Incremented by number of files/directories found
[41]213;   Corrupts registers:
[53]214;       AX, BX, DX, DI, DS
[41]215;--------------------------------------------------------------------
216ALIGN JUMP_ALIGN
[53]217.FindMatchingFilesAndPrintThemToOffScreenBuffer:
218    call    AppendFileFromDTAinDSSItoOffScreenBuffer
219    call    Directory_UpdateDTAForNextMatchUsingPreviousParameters
220    jnc     SHORT .FindMatchingFilesAndPrintThemToOffScreenBuffer
[41]221    ret
222
[46]223
[41]224;--------------------------------------------------------------------
[53]225; AppendFileFromDTAinDSSItoOffScreenBuffer
[41]226;   Parameters:
[46]227;       CX:     Files/directores found
[41]228;       DL:     Zero if root directory selected
229;       DS:SI:  Ptr to DTA containing file information
230;   Returns:
[46]231;       CX:     Incremented by number of files/directories found
[41]232;   Corrupts registers:
[53]233;       AX, BX
[41]234;--------------------------------------------------------------------
235ALIGN JUMP_ALIGN
[53]236AppendFileFromDTAinDSSItoOffScreenBuffer:
[41]237    call    .FilterCurrentDirectory         ; We never want "."
238    call    .FilterUpDirectoryWhenInRoot    ; No ".." when in root directory
[46]239    inc     cx                              ; Nothing filtered so increment files/directories
[41]240
241    push    bp
242    push    si
[53]243    push    dx
[46]244    push    cx
[41]245    call    .FormatFileOrDirectoryToBufferFromDTAinDSSI
[46]246    pop     cx
[53]247    pop     dx
[41]248    pop     si
249    pop     bp
250    ret
251
252;--------------------------------------------------------------------
[53]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;--------------------------------------------------------------------
[41]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
[46]298    ; Fall to .FormatFile
[41]299
[46]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:
[53]309;       AX, BX, CX, DX, SI, DI
[46]310;--------------------------------------------------------------------
311.FormatFile:
312    xchg    si, ax
[53]313    call    String_ConvertDSSItoLowerCase
[46]314    xchg    ax, si
[52]315
316    ; Push parameters for file name
[53]317    push    ax              ; Push file name offset
318    push    ds              ; Push file name segment
[46]319
320    ; Push parameters for file size
[41]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
[46]332
333    ; Format to buffer
[41]334    mov     si, g_szFileFormat
335    jmp     SHORT .FormatStringInCSSIandReturn
336
[46]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:
[53]346;       AX, SI, DI
[46]347;--------------------------------------------------------------------
[41]348ALIGN JUMP_ALIGN
349.FormatDirectory:
[46]350    push    ax              ; Push directory name offset
351    push    ds              ; Push directory name segment
[41]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;--------------------------------------------------------------------
[46]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:
[53]370;       ES:DI:  Ptr to end of directory contents string
[46]371;   Corrupts registers:
[53]372;       AX, BX, CX, DX, SI, DS
[46]373;--------------------------------------------------------------------
374ALIGN JUMP_ALIGN
375SortDirectoryContentsStringFromESDIwithCountInCX:
[106]376    call    Registers_CopyESDItoDSSI
[53]377    call    .AddDirectoryContentsStringLengthToDI
[46]378    mov     bx, .FileStringComparator
379    xchg    dx, cx
380    mov     cx, FILE_STRING_LENGTH
381    jmp     Sort_ItemsFromDSSIwithCountInDXsizeInCXandComparatorInBX
382
[53]383ALIGN JUMP_ALIGN
384.AddDirectoryContentsStringLengthToDI:
385    mov     ax, FILE_STRING_LENGTH
386    mul     cx
387    add     di, ax
388    ret
389
[46]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;--------------------------------------------------------------------
[54]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;--------------------------------------------------------------------
[41]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:
[46]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
[41]501
502;--------------------------------------------------------------------
[46]503; .ParseAndSelectFileFromDSSI
[41]504;   Parameters:
[46]505;       DS:SI:  NULL terminated string selected from dialog
[41]506;       SS:BP:  Ptr to DIALOG
507;   Returns:
508;       Nothing (exits dialog)
509;   Corrupts registers:
510;       All, except BP
511;--------------------------------------------------------------------
[46]512.ParseAndSelectFileFromDSSI:
[41]513    les     di, [bp+DIALOG.fpDialogIO]
514    add     di, BYTE FILE_DIALOG_IO.szFile
515    mov     cx, FILENAME_BUFFER_SIZE-1
[50]516    call    Memory_CopyCXbytesFromDSSItoESDI
[41]517    xor     ax, ax
518    stosb                       ; Terminate with NULL
[50]519    jmp     SHORT CloseFileDialogAfterSuccessfullSelection
[41]520
521;--------------------------------------------------------------------
[46]522; .ChangeToUpdir
[41]523;   Parameters:
524;       SS:BP:  Ptr to DIALOG
525;   Returns:
526;       Nothing
527;   Corrupts registers:
528;       All, except BP
529;--------------------------------------------------------------------
530ALIGN JUMP_ALIGN
[46]531.ChangeToUpdir:
[51]532    push    cs
533    pop     ds
[46]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:
[41]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:
[54]565    call    ReInitializeMenuinitFromSSBP
[41]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
[54]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
[41]686
687;--------------------------------------------------------------------
[54]688; .DisplayDriveSelectionDialogWithIoInDSSI
[41]689;   Parameters:
[54]690;       DS:SI:  Ptr to uninitialized DRIVE_DIALOG_IO
[41]691;       SS:BP:  Ptr to DIALOG
692;   Returns:
[54]693;       DS:SI:  Ptr to DRIVE_DIALOG_IO
[41]694;   Corrupts registers:
[54]695;       AX, DI
[41]696;--------------------------------------------------------------------
697ALIGN JUMP_ALIGN
[54]698.DisplayDriveSelectionDialogWithIoInDSSI:
[41]699    call    InitializeNullStringsToDialogInputInDSSI
700    mov     WORD [si+DIALOG_INPUT.fszTitle], g_szSelectNewDrive
[54]701    CALL_MENU_LIBRARY GetDriveWithIoInDSSI
702    ret
[41]703
704;--------------------------------------------------------------------
[54]705; .ChangeDriveToUserSelectionFromIoInDSSI
[41]706;   Parameters:
[54]707;       DS:SI:  Ptr to DRIVE_DIALOG_IO
[41]708;       SS:BP:  Ptr to DIALOG
709;   Returns:
710;       Nothing
711;   Corrupts registers:
[54]712;       All, except BP
[41]713;--------------------------------------------------------------------
714ALIGN JUMP_ALIGN
[54]715.ChangeDriveToUserSelectionFromIoInDSSI:
716    cmp     BYTE [si+DRIVE_DIALOG_IO.bUserCancellation], FALSE
717    jne     SHORT .UserCancelledDriveChange
[41]718
[54]719    mov     dl, [si+DRIVE_DIALOG_IO.bReturnDriveNumber]
720    call    Drive_SetDefaultFromDL
721    jmp     RefreshFilesToDisplay
722.UserCancelledDriveChange:
[41]723    ret
724
725
726;--------------------------------------------------------------------
[54]727; DisplayLoadingMessageInInformationArea
[53]728;   Parameters:
[54]729;       SS:BP:      Ptr to DIALOG
[53]730;   Returns:
731;       Nothing
732;   Corrupts registers:
[54]733;       AX, BX, CX, DX, SI, DI
[53]734;--------------------------------------------------------------------
735ALIGN JUMP_ALIGN
[54]736DisplayLoadingMessageInInformationArea:
737    call    MenuText_ClearInformationArea
738    call    MenuText_PrepareToDrawInformationArea
739    mov     si, g_szLoadingPleaseWait
740    CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
[53]741    ret
742
743
744;--------------------------------------------------------------------
[41]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.