source: xtideuniversalbios/tags/v2.0.0_beta_2/Assembly_Library/Src/Menu/Dialog/DialogFile.asm@ 565

Last change on this file since 565 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.