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

Last change on this file since 526 was 526, checked in by krille_n_@…, 11 years ago

Changes:

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