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

Last change on this file since 376 was 376, checked in by gregli@…, 12 years ago

WIDE checkin... Added copyright and license information to sorce files, as per the GPL instructions for usage.

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-2012 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    CALL_DISPLAY_LIBRARY PopDisplayContext
200    ret
201
202;--------------------------------------------------------------------
203; .ClearDLifInRootDirectory
204;   Parameters:
205;       SS:BP:  Ptr to DIALOG
206;       ES:DI:  Ptr to destination string buffer
207;   Returns:
208;       DL:     Cleared if in root directory
209;               Set if in any other directory
210;   Corrupts registers:
211;       AX, SI, DS
212;--------------------------------------------------------------------
213ALIGN JUMP_ALIGN
214.ClearDLifInRootDirectory:
215    call    Registers_CopyESDItoDSSI
216    call    Directory_WriteCurrentPathToDSSI
217    mov     dl, [si]
218    ret
219
220;--------------------------------------------------------------------
221; .FindMatchingFilesAndPrintThemToOffScreenBuffer
222;   Parameters:
223;       CX:     Initial directory count
224;       DL:     Zero if root directory selected
225;       DS:SI:  Ptr to DTA with first matching file
226;   Returns:
227;       CX:     Incremented by number of files/directories found
228;   Corrupts registers:
229;       AX, BX, DX, DI, DS
230;--------------------------------------------------------------------
231ALIGN JUMP_ALIGN
232.FindMatchingFilesAndPrintThemToOffScreenBuffer:
233    call    AppendFileFromDTAinDSSItoOffScreenBuffer
234    call    Directory_UpdateDTAForNextMatchUsingPreviousParameters
235    jnc     SHORT .FindMatchingFilesAndPrintThemToOffScreenBuffer
236    ret
237
238
239;--------------------------------------------------------------------
240; AppendFileFromDTAinDSSItoOffScreenBuffer
241;   Parameters:
242;       CX:     Files/directores found
243;       DL:     Zero if root directory selected
244;       DS:SI:  Ptr to DTA containing file information
245;   Returns:
246;       CX:     Incremented by number of files/directories found
247;   Corrupts registers:
248;       AX, BX
249;--------------------------------------------------------------------
250ALIGN JUMP_ALIGN
251AppendFileFromDTAinDSSItoOffScreenBuffer:
252    call    .FilterCurrentDirectory         ; We never want "."
253    call    .FilterUpDirectoryWhenInRoot    ; No ".." when in root directory
254    inc     cx                              ; Nothing filtered so increment files/directories
255
256    push    bp
257    push    si
258    push    dx
259    push    cx
260    call    .FormatFileOrDirectoryToBufferFromDTAinDSSI
261    pop     cx
262    pop     dx
263    pop     si
264    pop     bp
265    ret
266
267;--------------------------------------------------------------------
268; .FilterCurrentDirectory
269; .FilterUpDirectoryWhenInRoot
270;   Parameters:
271;       DL:     Zero if root directory selected
272;       DS:SI:  Ptr to DTA containing file information
273;   Returns:
274;       Nothing
275;       Returns from AppendFileToBufferInESDIfromDtaInDSSI when filtering
276;   Corrupts registers:
277;       AX
278;--------------------------------------------------------------------
279ALIGN JUMP_ALIGN
280.FilterCurrentDirectory:
281    cmp     WORD [si+DTA.szFile], CURRENTDIR_CHARACTERS
282    je      SHORT .DoFilter
283    ret
284
285ALIGN JUMP_ALIGN
286.FilterUpDirectoryWhenInRoot:
287    test    dl, dl          ; Set ZF if root directory selected
288    jnz     SHORT .ReturnWithoutFiltering
289    cmp     WORD [si+DTA.szFile], UPDIR_CHARACTERS
290    jne     SHORT .ReturnWithoutFiltering
291.DoFilter:
292    add     sp, BYTE 2      ; Remove return address from stack
293ALIGN JUMP_ALIGN, ret
294.ReturnWithoutFiltering:
295    ret
296
297;--------------------------------------------------------------------
298; .FormatFileOrDirectoryToBufferFromDTAinDSSI
299;   Parameters:
300;       DS:SI:  Ptr to DTA containing file information
301;   Returns:
302;       Nothing
303;   Corrupts registers:
304;       AX, BX, CX, DX, SI, DI, BP
305;--------------------------------------------------------------------
306ALIGN JUMP_ALIGN
307.FormatFileOrDirectoryToBufferFromDTAinDSSI:
308    mov     bp, sp
309    lea     ax, [si+DTA.szFile]
310
311    test    BYTE [si+DTA.bFileAttributes], FLG_FILEATTR_DIRECTORY
312    jnz     SHORT .FormatDirectory
313    ; Fall to .FormatFile
314
315;--------------------------------------------------------------------
316; .FormatFile
317;   Parameters:
318;       BP:     SP before pushing formatting parameters
319;       DS:AX:  Far pointer to file name
320;       DS:SI:  Ptr to DTA containing file information
321;   Returns:
322;       Nothing
323;   Corrupts registers:
324;       AX, BX, CX, DX, SI, DI
325;--------------------------------------------------------------------
326.FormatFile:
327    xchg    si, ax
328    call    String_ConvertDSSItoLowerCase
329    xchg    ax, si
330
331    ; Push parameters for file name
332    push    ax              ; Push file name offset
333    push    ds              ; Push file name segment
334
335    ; Push parameters for file size
336    mov     ax, [si+DTA.dwFileSize]
337    mov     dx, [si+DTA.dwFileSize+2]
338    xor     bx, bx
339    xor     cx, cx
340    call    Size_GetSizeToAXAndCharToDLfromBXDXAXwithMagnitudeInCX
341    mov     cl, 'i'
342    cmp     dl, ' '
343    eCMOVE  cl, dl
344    push    ax
345    push    dx
346    push    cx
347
348    ; Format to buffer
349    mov     si, g_szFileFormat
350    jmp     SHORT .FormatStringInCSSIandReturn
351
352;--------------------------------------------------------------------
353; .FormatDirectory
354;   Parameters:
355;       BP:     SP before pushing formatting parameters
356;       DS:AX:  Far pointer to directory name
357;       DS:SI:  Ptr to DTA containing file information
358;   Returns:
359;       Nothing
360;   Corrupts registers:
361;       AX, SI, DI
362;--------------------------------------------------------------------
363ALIGN JUMP_ALIGN
364.FormatDirectory:
365    push    ax              ; Push directory name offset
366    push    ds              ; Push directory name segment
367    mov     ax, g_szSub
368    cmp     WORD [si+DTA.szFile], UPDIR_CHARACTERS
369    eCMOVE  ax, g_szUp
370    push    ax
371    mov     si, g_szDirectoryFormat
372ALIGN JUMP_ALIGN
373.FormatStringInCSSIandReturn:
374    CALL_DISPLAY_LIBRARY FormatNullTerminatedStringFromCSSI
375    ret
376
377
378;--------------------------------------------------------------------
379; SortDirectoryContentsStringFromESDIwithCountInCX
380;   Parameters:
381;       CX:     Number of files and directories
382;       ES:DI:  Buffer containing directory contents string
383;       SS:BP:  Ptr to DIALOG
384;   Returns:
385;       ES:DI:  Ptr to end of directory contents string
386;   Corrupts registers:
387;       AX, BX, CX, DX, SI, DS
388;--------------------------------------------------------------------
389ALIGN JUMP_ALIGN
390SortDirectoryContentsStringFromESDIwithCountInCX:
391    call    Registers_CopyESDItoDSSI
392
393    ; Add directory contents string length to DI
394    mov     ax, FILE_STRING_LENGTH
395    push    ax
396    mul     cx
397    add     di, ax
398
399    mov     dx, cx
400    pop     cx
401    mov     bx, .FileStringComparator
402    jmp     Sort_ItemsFromDSSIwithCountInDXsizeInCXandComparatorInBX
403
404;--------------------------------------------------------------------
405; .FileStringComparator
406;   Parameters:
407;       CX:     Item size in bytes
408;       DS:SI:  Ptr to first item to compare
409;       ES:DI:  Ptr to second item to compare
410;   Returns:
411;       FLAGS:  Signed comparison between first and second item
412;   Corrupts registers:
413;       Nothing
414;--------------------------------------------------------------------
415ALIGN JUMP_ALIGN
416.FileStringComparator:
417    push    di
418    push    si
419    push    cx
420    push    bx
421
422    mov     bx, FILE_STRING_LENGTH-2            ; Zero BH
423    cmp     WORD [si], UPDIR_CHARACTERS
424    je      SHORT .ForceValueFromDSSItoBeLess
425    mov     bl, [si+bx]
426    cmp     bl, [es:di+FILE_STRING_LENGTH-2]    ; 'B' for files, 'R' for directories
427    jne     SHORT .ForceValueFromDSSItoBeMoreOrLess
428    repe cmpsb                                  ; Two directories or two files
429
430ALIGN JUMP_ALIGN
431.ReturnFromComparison:
432    pop     bx
433    pop     cx
434    pop     si
435    pop     di
436    ret
437ALIGN JUMP_ALIGN
438.ForceValueFromDSSItoBeMoreOrLess:
439    ja      SHORT .ForceValueFromDSSItoBeLess   ; Directory in SI, file in DI
440    xchg    bl, bh
441    ; Fall to ForceValueFromDSSItoBeLess
442ALIGN JUMP_ALIGN
443.ForceValueFromDSSItoBeLess:
444    cmp     bh, bl
445    jmp     SHORT .ReturnFromComparison
446
447
448;--------------------------------------------------------------------
449; RemoveLastLFandTerminateESDIwithNull
450;   Parameters:
451;       ES:DI:  Ptr to end of buffer to terminate
452;   Returns:
453;       Nothing
454;   Corrupts registers:
455;       AX
456;--------------------------------------------------------------------
457ALIGN JUMP_ALIGN
458RemoveLastLFandTerminateESDIwithNull:
459    dec     di
460    xor     ax, ax
461    stosb
462    ret
463
464
465;--------------------------------------------------------------------
466; GetInfoLinesToCXandDialogFlagsToAX
467;   Parameters:
468;       SS:BP:  Ptr to DIALOG
469;   Returns:
470;       AX:     Dialog flags
471;       CX:     Number of info lines to be displayed
472;   Corrupts registers:
473;       SI, DS
474;--------------------------------------------------------------------
475ALIGN JUMP_ALIGN
476GetInfoLinesToCXandDialogFlagsToAX:
477    xor     ax, ax
478    call    GetDialogFlagsToAL
479    jmp     Bit_GetSetCountToCXfromAX
480
481;--------------------------------------------------------------------
482; GetDialogFlagsToAL
483;   Parameters:
484;       SS:BP:  Ptr to DIALOG
485;   Returns:
486;       AL:     Dialog flags
487;   Corrupts registers:
488;       SI, DS
489;--------------------------------------------------------------------
490ALIGN JUMP_ALIGN
491GetDialogFlagsToAL:
492    lds     si, [bp+DIALOG.fpDialogIO]
493    mov     al, [si+FILE_DIALOG_IO.bDialogFlags]
494    ret
495
496
497;--------------------------------------------------------------------
498; ParseSelectionFromItemLineInDSSI
499;   Parameters:
500;       DS:SI:  Ptr to char buffer containing file or directory to be selected
501;       SS:BP:  Ptr to DIALOG
502;   Returns:
503;       Nothing
504;   Corrupts registers:
505;       All, except BP
506;--------------------------------------------------------------------
507ALIGN JUMP_ALIGN
508ParseSelectionFromItemLineInDSSI:
509    mov     ax, [si]
510    cmp     ax, UPDIR_CHARACTERS
511    je      SHORT .ChangeToUpdir
512    call    Char_IsUpperCaseLetterInAL
513    jc      SHORT .ParseAndChangeToSubdirInDSSI
514    call    Char_IsDecimalDigitInAL
515    jc      SHORT .ParseAndChangeToSubdirInDSSI ; Assume subdir and check for errors
516    ; Fall to .ParseAndSelectFileFromDSSI
517
518;--------------------------------------------------------------------
519; .ParseAndSelectFileFromDSSI
520;   Parameters:
521;       DS:SI:  NULL terminated string selected from dialog
522;       SS:BP:  Ptr to DIALOG
523;   Returns:
524;       Nothing (exits dialog)
525;   Corrupts registers:
526;       All, except BP
527;--------------------------------------------------------------------
528.ParseAndSelectFileFromDSSI:
529    les     di, [bp+DIALOG.fpDialogIO]
530    add     di, BYTE FILE_DIALOG_IO.szFile
531    mov     cx, FILENAME_BUFFER_SIZE-1
532    call    Memory_CopyCXbytesFromDSSItoESDI
533    xor     ax, ax
534    stosb                       ; Terminate with NULL
535    jmp     SHORT CloseFileDialogAfterSuccessfulSelection
536
537;--------------------------------------------------------------------
538; .ChangeToUpdir
539;   Parameters:
540;       SS:BP:  Ptr to DIALOG
541;   Returns:
542;       Nothing
543;   Corrupts registers:
544;       All, except BP
545;--------------------------------------------------------------------
546ALIGN JUMP_ALIGN
547.ChangeToUpdir:
548    push    cs
549    pop     ds
550    mov     si, g_szUpdir
551    jmp     SHORT .ChangeDirectoryToDSSI
552
553;--------------------------------------------------------------------
554; .ParseAndChangeToSubdirInDSSI
555;   Parameters:
556;       DS:SI:  NULL terminated string selected from dialog
557;       SS:BP:  Ptr to DIALOG
558;   Returns:
559;       Nothing
560;   Corrupts registers:
561;       All, except BP
562;--------------------------------------------------------------------
563ALIGN JUMP_ALIGN
564.ParseAndChangeToSubdirInDSSI:
565    mov     BYTE [si+12], NULL  ; Terminate with NULL (unnecessary spaces do not matter)
566.ChangeDirectoryToDSSI:
567    call    Directory_ChangeToPathFromDSSI
568    jc      SHORT .ParseAndSelectFileFromDSSI   ; Must have been a file starting with number
569    ; Fall to RefreshFilesToDisplay
570
571;--------------------------------------------------------------------
572; RefreshFilesToDisplay
573;   Parameters:
574;       SS:BP:  Ptr to DIALOG
575;   Returns:
576;       Nothing
577;   Corrupts registers:
578;       All, except BP
579;--------------------------------------------------------------------
580ALIGN JUMP_ALIGN
581RefreshFilesToDisplay:
582    call    ReInitializeMenuinitFromSSBP
583    jmp     MenuInit_RefreshMenuWindow
584
585
586;--------------------------------------------------------------------
587; HandleFunctionKeyFromAH
588;   Parameters:
589;       AH:     Scancode for function key
590;       SS:BP:  Ptr to DIALOG
591;   Returns:
592;       Nothing
593;   Corrupts registers:
594;       AX, SI, DI, BP
595;--------------------------------------------------------------------
596ALIGN JUMP_ALIGN
597HandleFunctionKeyFromAH:
598    call    GetDialogFlagsToAL
599    cmp     ah, KEY_FILEDIALOG_NEW_FILE_OR_DIR
600    je      SHORT HandleFunctionKeyForCreatingNewFileOrDirectory
601    cmp     ah, KEY_FILEDIALOG_SELECT_DIRECTORY
602    je      SHORT HandleFunctionKeyForSelectingDirectoryInsteadOfFile
603    cmp     ah, KEY_FILEDIALOG_CHANGE_DRIVE
604    je      SHORT HandleFunctionKeyForDriveChange
605ReturnWithoutHandlingKeystroke:
606    clc     ; Event not processed
607    ret
608
609
610;--------------------------------------------------------------------
611; HandleFunctionKeyForCreatingNewFileOrDirectory
612;   Parameters:
613;       AL:     File dialog flags
614;       SS:BP:  Ptr to DIALOG
615;   Returns:
616;       Closes file dialog
617;   Corrupts registers:
618;       All, except BP
619;--------------------------------------------------------------------
620ALIGN JUMP_ALIGN
621HandleFunctionKeyForCreatingNewFileOrDirectory:
622    test    al, FLG_FILEDIALOG_NEW
623    jz      SHORT ReturnWithoutHandlingKeystroke
624
625    mov     cx, STRING_DIALOG_IO_size
626    call    Memory_ReserveCXbytesFromStackToDSSI
627    call    .InitializeStringDialogIoInDSSIforInputtingFileName
628
629    CALL_MENU_LIBRARY GetStringWithIoInDSSI
630    mov     al, [si+STRING_DIALOG_IO.bUserCancellation]
631    add     sp, BYTE STRING_DIALOG_IO_size
632    test    al, al      ; User cancellation?
633    jnz     SHORT ReturnWithoutHandlingKeystroke
634    jmp     CloseFileDialogAfterSuccessfulSelection
635
636ALIGN JUMP_ALIGN
637.InitializeStringDialogIoInDSSIforInputtingFileName:
638    call    InitializeNullStringsToDialogInputInDSSI
639    mov     WORD [si+DIALOG_INPUT.fszTitle], g_szEnterNewFileOrDirectory
640    mov     WORD [si+STRING_DIALOG_IO.fnCharFilter], NULL
641    mov     WORD [si+STRING_DIALOG_IO.wBufferSize], FILENAME_BUFFER_SIZE
642    les     ax, [bp+DIALOG.fpDialogIO]
643    add     ax, BYTE FILE_DIALOG_IO.szFile
644    mov     [si+STRING_DIALOG_IO.fpReturnBuffer], ax
645    mov     [si+STRING_DIALOG_IO.fpReturnBuffer+2], es
646    ret
647
648
649;--------------------------------------------------------------------
650; HandleFunctionKeyForSelectingDirectoryInsteadOfFile
651;   Parameters:
652;       AL:     File dialog flags
653;       SS:BP:  Ptr to DIALOG
654;   Returns:
655;       Closes file dialog
656;   Corrupts registers:
657;       All, except BP
658;--------------------------------------------------------------------
659ALIGN JUMP_ALIGN
660HandleFunctionKeyForSelectingDirectoryInsteadOfFile:
661    test    al, FLG_FILEDIALOG_DIRECTORY
662    jz      SHORT ReturnWithoutHandlingKeystroke
663    ; Fall to CloseFileDialogAfterSuccessfulSelection
664
665;--------------------------------------------------------------------
666; CloseFileDialogAfterSuccessfulSelection
667;   Parameters:
668;       SS:BP:  Ptr to DIALOG
669;   Returns:
670;       Nothing (exits dialog)
671;   Corrupts registers:
672;       All, except BP
673;--------------------------------------------------------------------
674ALIGN JUMP_ALIGN
675CloseFileDialogAfterSuccessfulSelection:
676    lds     di, [bp+DIALOG.fpDialogIO]
677    mov     BYTE [di+FILE_DIALOG_IO.bUserCancellation], FALSE
678    jmp     MenuInit_CloseMenuWindow
679
680
681;--------------------------------------------------------------------
682; HandleFunctionKeyForDriveChange
683;   Parameters:
684;       AL:     File dialog flags
685;       SS:BP:  Ptr to DIALOG
686;   Returns:
687;       Nothing
688;   Corrupts registers:
689;       All, except BP
690;--------------------------------------------------------------------
691ALIGN JUMP_ALIGN
692HandleFunctionKeyForDriveChange:
693    test    al, FLG_FILEDIALOG_DRIVES
694    jz      SHORT ReturnWithoutHandlingKeystroke
695
696    call    DisplayLoadingMessageInInformationArea
697    mov     cx, DRIVE_DIALOG_IO_size
698    call    Memory_ReserveCXbytesFromStackToDSSI
699    call    .DisplayDriveSelectionDialogWithIoInDSSI
700    call    .ChangeDriveToUserSelectionFromIoInDSSI
701    add     sp, BYTE DRIVE_DIALOG_IO_size
702    ret
703
704;--------------------------------------------------------------------
705; .DisplayDriveSelectionDialogWithIoInDSSI
706;   Parameters:
707;       DS:SI:  Ptr to uninitialized DRIVE_DIALOG_IO
708;       SS:BP:  Ptr to DIALOG
709;   Returns:
710;       DS:SI:  Ptr to DRIVE_DIALOG_IO
711;   Corrupts registers:
712;       AX, DI
713;--------------------------------------------------------------------
714ALIGN JUMP_ALIGN
715.DisplayDriveSelectionDialogWithIoInDSSI:
716    call    InitializeNullStringsToDialogInputInDSSI
717    mov     WORD [si+DIALOG_INPUT.fszTitle], g_szSelectNewDrive
718    CALL_MENU_LIBRARY GetDriveWithIoInDSSI
719    ret
720
721;--------------------------------------------------------------------
722; .ChangeDriveToUserSelectionFromIoInDSSI
723;   Parameters:
724;       DS:SI:  Ptr to DRIVE_DIALOG_IO
725;       SS:BP:  Ptr to DIALOG
726;   Returns:
727;       Nothing
728;   Corrupts registers:
729;       All, except BP
730;--------------------------------------------------------------------
731ALIGN JUMP_ALIGN
732.ChangeDriveToUserSelectionFromIoInDSSI:
733    cmp     BYTE [si+DRIVE_DIALOG_IO.bUserCancellation], FALSE
734    jne     SHORT .UserCancelledDriveChange
735
736    mov     dl, [si+DRIVE_DIALOG_IO.bReturnDriveNumber]
737    call    Drive_SetDefaultFromDL
738    jmp     RefreshFilesToDisplay
739.UserCancelledDriveChange:
740    ret
741
742
743;--------------------------------------------------------------------
744; DisplayLoadingMessageInInformationArea
745;   Parameters:
746;       SS:BP:      Ptr to DIALOG
747;   Returns:
748;       Nothing
749;   Corrupts registers:
750;       AX, BX, CX, DX, SI, DI
751;--------------------------------------------------------------------
752ALIGN JUMP_ALIGN
753DisplayLoadingMessageInInformationArea:
754    call    MenuText_ClearInformationArea
755    call    MenuText_PrepareToDrawInformationArea
756    mov     si, g_szLoadingPleaseWait
757    CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
758    ret
759
760
761;--------------------------------------------------------------------
762; InitializeNullStringsToDialogInputInDSSI
763;   Parameters:
764;       DS:SI:  Ptr to DIALOG_INPUT
765;       SS:BP:  Ptr to DIALOG
766;   Returns:
767;       Nothing
768;   Corrupts registers:
769;       AX
770;--------------------------------------------------------------------
771ALIGN JUMP_ALIGN
772InitializeNullStringsToDialogInputInDSSI:
773    mov     ax, g_szNull
774    mov     [si+DIALOG_INPUT.fszTitle], ax
775    mov     [si+DIALOG_INPUT.fszTitle+2], cs
776    mov     [si+DIALOG_INPUT.fszItems], ax
777    mov     [si+DIALOG_INPUT.fszItems+2], cs
778    mov     [si+DIALOG_INPUT.fszInfo], ax
779    mov     [si+DIALOG_INPUT.fszInfo+2], cs
780    ret
Note: See TracBrowser for help on using the repository browser.