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

Last change on this file since 70 was 58, checked in by Tomi Tilli, 14 years ago

Changes to Assembly Library:

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