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

Last change on this file since 101 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
RevLine 
[41]1; File name : DialogFile.asm
2; Project name : Assembly Library
3; Created date : 6.9.2010
[58]4; Last update : 18.11.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
[58]103 at MENUEVENT.ExitMenu, dw Dialog_EventExitMenu
[41]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.