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

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

Changes to Assembly Library:
Drive selection moved to own dialog from File Dialog.
File Dialog now displays loading text for better usability in slow systems.
Moved some functions from Memory.asm to new Registers.asm.

File size: 22.3 KB
RevLine 
[41]1; File name : DialogFile.asm
2; Project name : Assembly Library
3; Created date : 6.9.2010
[54]4; Last update : 24.10.2010
[41]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
[54]51 call Registers_CopyESDItoDSSI
[52]52 call ItemLineSplitter_GetLineToDSSIandLengthToCXfromStringInDSSIwithIndexInCX
[41]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
[53]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
[41]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_EventNotHandled
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
[53]110 at MENUEVENT.RefreshItemFromCX, dw .RefreshItemFromCX
[41]111iend
112
113
114;--------------------------------------------------------------------
[54]115; ReInitializeMenuinitFromSSBP
[41]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
[54]125ReInitializeMenuinitFromSSBP:
126 call DisplayLoadingMessageInInformationArea
[41]127InitializeMenuinitFromSSBP:
128 call LoadItemStringBufferToESDI
129 call CreateStringFromCurrentDirectoryContentsToESDI
[46]130 call LoadItemStringBufferToESDI
131 call SortDirectoryContentsStringFromESDIwithCountInCX
[53]132 call RemoveLastLFandTerminateESDIwithNull
[54]133
134 call Registers_CopySSBPtoDSSI
[52]135 xor ax, ax
136 call Dialog_EventInitializeMenuinitFromDSSIwithHighlightedItemInAX
[41]137 call GetInfoLinesToCXandDialogFlagsToAX
138 mov [bp+MENUINIT.bInfoLines], cl
139 CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
140 mov [bp+MENUINIT.bHeight], ah ; Always max height
[52]141 mov WORD [bp+MENU.wFirstVisibleItem], 0
[41]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:
[46]167; CX: Number of files or directories found
[41]168; Corrupts registers:
[53]169; AX, BX, DX, SI, DI, DS
[41]170;--------------------------------------------------------------------
171ALIGN JUMP_ALIGN
172CreateStringFromCurrentDirectoryContentsToESDI:
[53]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
[41]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
[53]182
[41]183 call .ClearDLifInRootDirectory
184 call Directory_GetDiskTransferAreaAddressToDSSI
[46]185 xor cx, cx ; Clear file/directory count
[53]186 call .FindMatchingFilesAndPrintThemToOffScreenBuffer
[41]187
[53]188 CALL_DISPLAY_LIBRARY PopDisplayContext
189 ret
[41]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:
[54]204 call Registers_CopyESDItoDSSI
[41]205 call Directory_WriteCurrentPathToDSSI
206 mov dl, [si]
207 ret
208
209;--------------------------------------------------------------------
[53]210; .FindMatchingFilesAndPrintThemToOffScreenBuffer
[41]211; Parameters:
[53]212; CX: Initial directory count
213; DL: Zero if root directory selected
214; DS:SI: Ptr to DTA with first matching file
[41]215; Returns:
[53]216; CX: Incremented by number of files/directories found
[41]217; Corrupts registers:
[53]218; AX, BX, DX, DI, DS
[41]219;--------------------------------------------------------------------
220ALIGN JUMP_ALIGN
[53]221.FindMatchingFilesAndPrintThemToOffScreenBuffer:
222 call AppendFileFromDTAinDSSItoOffScreenBuffer
223 call Directory_UpdateDTAForNextMatchUsingPreviousParameters
224 jnc SHORT .FindMatchingFilesAndPrintThemToOffScreenBuffer
[41]225 ret
226
[46]227
[41]228;--------------------------------------------------------------------
[53]229; AppendFileFromDTAinDSSItoOffScreenBuffer
[41]230; Parameters:
[46]231; CX: Files/directores found
[41]232; DL: Zero if root directory selected
233; DS:SI: Ptr to DTA containing file information
234; Returns:
[46]235; CX: Incremented by number of files/directories found
[41]236; Corrupts registers:
[53]237; AX, BX
[41]238;--------------------------------------------------------------------
239ALIGN JUMP_ALIGN
[53]240AppendFileFromDTAinDSSItoOffScreenBuffer:
[41]241 call .FilterCurrentDirectory ; We never want "."
242 call .FilterUpDirectoryWhenInRoot ; No ".." when in root directory
[46]243 inc cx ; Nothing filtered so increment files/directories
[41]244
245 push bp
246 push si
[53]247 push dx
[46]248 push cx
[41]249 call .FormatFileOrDirectoryToBufferFromDTAinDSSI
[46]250 pop cx
[53]251 pop dx
[41]252 pop si
253 pop bp
254 ret
255
256;--------------------------------------------------------------------
[53]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;--------------------------------------------------------------------
[41]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
[46]302 ; Fall to .FormatFile
[41]303
[46]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:
[53]313; AX, BX, CX, DX, SI, DI
[46]314;--------------------------------------------------------------------
315.FormatFile:
316 xchg si, ax
[53]317 call String_ConvertDSSItoLowerCase
[46]318 xchg ax, si
[52]319
320 ; Push parameters for file name
[53]321 push ax ; Push file name offset
322 push ds ; Push file name segment
[46]323
324 ; Push parameters for file size
[41]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
[46]336
337 ; Format to buffer
[41]338 mov si, g_szFileFormat
339 jmp SHORT .FormatStringInCSSIandReturn
340
[46]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:
[53]350; AX, SI, DI
[46]351;--------------------------------------------------------------------
[41]352ALIGN JUMP_ALIGN
353.FormatDirectory:
[46]354 push ax ; Push directory name offset
355 push ds ; Push directory name segment
[41]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;--------------------------------------------------------------------
[46]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:
[53]374; ES:DI: Ptr to end of directory contents string
[46]375; Corrupts registers:
[53]376; AX, BX, CX, DX, SI, DS
[46]377;--------------------------------------------------------------------
378ALIGN JUMP_ALIGN
379SortDirectoryContentsStringFromESDIwithCountInCX:
[54]380 call Registers_CopyESDItoDSSI
[53]381 call .AddDirectoryContentsStringLengthToDI
[46]382 mov bx, .FileStringComparator
383 xchg dx, cx
384 mov cx, FILE_STRING_LENGTH
385 jmp Sort_ItemsFromDSSIwithCountInDXsizeInCXandComparatorInBX
386
[53]387ALIGN JUMP_ALIGN
388.AddDirectoryContentsStringLengthToDI:
389 mov ax, FILE_STRING_LENGTH
390 mul cx
391 add di, ax
392 ret
393
[46]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;--------------------------------------------------------------------
[54]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;--------------------------------------------------------------------
[41]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:
[46]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
[41]505
506;--------------------------------------------------------------------
[46]507; .ParseAndSelectFileFromDSSI
[41]508; Parameters:
[46]509; DS:SI: NULL terminated string selected from dialog
[41]510; SS:BP: Ptr to DIALOG
511; Returns:
512; Nothing (exits dialog)
513; Corrupts registers:
514; All, except BP
515;--------------------------------------------------------------------
[46]516.ParseAndSelectFileFromDSSI:
[41]517 les di, [bp+DIALOG.fpDialogIO]
518 add di, BYTE FILE_DIALOG_IO.szFile
519 mov cx, FILENAME_BUFFER_SIZE-1
[50]520 call Memory_CopyCXbytesFromDSSItoESDI
[41]521 xor ax, ax
522 stosb ; Terminate with NULL
[50]523 jmp SHORT CloseFileDialogAfterSuccessfullSelection
[41]524
525;--------------------------------------------------------------------
[46]526; .ChangeToUpdir
[41]527; Parameters:
528; SS:BP: Ptr to DIALOG
529; Returns:
530; Nothing
531; Corrupts registers:
532; All, except BP
533;--------------------------------------------------------------------
534ALIGN JUMP_ALIGN
[46]535.ChangeToUpdir:
[51]536 push cs
537 pop ds
[46]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:
[41]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:
[54]569 call ReInitializeMenuinitFromSSBP
[41]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
[54]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
[41]690
691;--------------------------------------------------------------------
[54]692; .DisplayDriveSelectionDialogWithIoInDSSI
[41]693; Parameters:
[54]694; DS:SI: Ptr to uninitialized DRIVE_DIALOG_IO
[41]695; SS:BP: Ptr to DIALOG
696; Returns:
[54]697; DS:SI: Ptr to DRIVE_DIALOG_IO
[41]698; Corrupts registers:
[54]699; AX, DI
[41]700;--------------------------------------------------------------------
701ALIGN JUMP_ALIGN
[54]702.DisplayDriveSelectionDialogWithIoInDSSI:
[41]703 call InitializeNullStringsToDialogInputInDSSI
704 mov WORD [si+DIALOG_INPUT.fszTitle], g_szSelectNewDrive
[54]705 CALL_MENU_LIBRARY GetDriveWithIoInDSSI
706 ret
[41]707
708;--------------------------------------------------------------------
[54]709; .ChangeDriveToUserSelectionFromIoInDSSI
[41]710; Parameters:
[54]711; DS:SI: Ptr to DRIVE_DIALOG_IO
[41]712; SS:BP: Ptr to DIALOG
713; Returns:
714; Nothing
715; Corrupts registers:
[54]716; All, except BP
[41]717;--------------------------------------------------------------------
718ALIGN JUMP_ALIGN
[54]719.ChangeDriveToUserSelectionFromIoInDSSI:
720 cmp BYTE [si+DRIVE_DIALOG_IO.bUserCancellation], FALSE
721 jne SHORT .UserCancelledDriveChange
[41]722
[54]723 mov dl, [si+DRIVE_DIALOG_IO.bReturnDriveNumber]
724 call Drive_SetDefaultFromDL
725 jmp RefreshFilesToDisplay
726.UserCancelledDriveChange:
[41]727 ret
728
729
730;--------------------------------------------------------------------
[54]731; DisplayLoadingMessageInInformationArea
[53]732; Parameters:
[54]733; SS:BP: Ptr to DIALOG
[53]734; Returns:
735; Nothing
736; Corrupts registers:
[54]737; AX, BX, CX, DX, SI, DI
[53]738;--------------------------------------------------------------------
739ALIGN JUMP_ALIGN
[54]740DisplayLoadingMessageInInformationArea:
741 call MenuText_ClearInformationArea
742 call MenuText_PrepareToDrawInformationArea
743 mov si, g_szLoadingPleaseWait
744 CALL_DISPLAY_LIBRARY PrintNullTerminatedStringFromCSSI
[53]745 ret
746
747
748;--------------------------------------------------------------------
[41]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.