{ filesel.inc by Kari Lammassaari 1997 } { Uses: - readvram.inc - wrtvram.inc - fillvram.inc - msxdos2.inc - blink.inc - txtwin.inc - readstr2.inc - filename.inc } { REM filesel.inc DOES NOT WORK with Turbo Pascal 3.3 due to the BUG in the pointer operations of TP 3.3 } Function FileSelect(Column:Byte):StringType; Const Row = 1; Type DirListPtrType = ^DirListType; DirListType = Record Next :DirListPtrType; Previous :DirListPtrType; FileName :FileNameType; Attribute:Byte; End; { Pointer = ^Byte;} Var Origx,OrigY,OrigDrv :Byte; DirListPtr,DlistPtr :DirListPtrType; FileListPtr,FlistPtr :DirListPtrType; FileFilter :FileNameType; CurrentDirectory :StringType; FileName :StringType; CurDirWindowPtr :Pointer; DriveWindowPtr :Pointer; DriveSt :String[39]; DriveCount :Byte; FileNameWindowPtr :Pointer; SubDirWindowPtr :Pointer; FileWindowPtr :Pointer; i,WindowNumber :Integer; Ch :Char; Function CreateFileList(FileFilter:StringType):DirListPtrType; Var FileListPtr,Apu,Viitta,Root :DirListPtrType; Begin FindFirst(FileFilter,Directory+System+Archive+Hidden+ReadOnly ,Fib); If MsxIOResult <> 0 Then Begin CreateFileList := Nil; Exit; End; New(FileListPtr); Root := FileListPtr; FileListPtr^.Previous := Nil; FileListPtr^.Next := Nil; FileListPtr^.Attribute := Fib.FileAttribute; FileListPtr^.FileName := AsciiZToString(Fib.FileName); If (FilelistPtr^.Attribute And Directory) <> Directory Then PadFileName(FileListPtr^.FileName) Else FileListPtr^.Filename := Copy(FileListPtr^.FileName+' ',1,12); While MsxIOResult = 0 Do Begin FindNext(Fib); If MsxIOResult = 0 Then Begin Apu := FileListPtr; New(FileListPtr); Apu^.Next := FileListPtr; FileListPtr^.Next := Nil; FileListPtr^.Previous := Apu; FileListPtr^.FileName := AsciiZToString(Fib.FileName); FileListPtr^.Attribute := Fib.FileAttribute; If (FilelistPtr^.Attribute And Directory) <> Directory Then PadFileName(FileListPtr^.FileName) Else FileListPtr^.Filename := Copy(FileListPtr^.FileName+' ',1,12); End; {If} End; CreateFileList := Root; End; {CreateFileList} Procedure RemoveFromList(Attribute:Byte;Var ListPtr:DirListPtrType); Var Viitta,apu :DirListPtrType; Begin If ListPtr = Nil Then Exit; Viitta :=ListPtr; While Viitta <> Nil Do Begin Apu := Viitta^.Next; If (Viitta^.Attribute And Attribute) = Attribute Then Begin If (Viitta^.Next = Nil) And (Viitta^.Previous = Nil) Then Begin {The only item in list } Dispose(Viitta); ListPtr := Nil; Exit; End; If Viitta^.Previous = Nil Then {First in list } Begin ListPtr := Apu; ListPtr^.Previous := Nil; Dispose(Viitta); End Else If Viitta^.Next = Nil Then {Last in list } Begin Viitta^.Previous^.Next := Nil; Dispose(Viitta); Exit; {last item ,All done } End { In the middle of list } Else Begin Viitta^.Previous^.Next := Viitta^.Next; Viitta^.Next^.Previous := Viitta^.Previous; Dispose(Viitta); End; End; {If attribute ..} Viitta := apu; End; {While} End; {removefromlist} Procedure RenumberList(ListPtr:DirListPtrType); Var Viitta :DirListPtrType; Index :Integer; {Reversal index , last is 1.} Begin Viitta := ListPtr; If Viitta = Nil Then Exit; While Viitta^.Next <> Nil Do Viitta := Viitta^.Next; {Find top} Index := 1; While Viitta <> Nil Do Begin Viitta^.Attribute := Index; Index := Index +1 ; Viitta := Viitta^.Previous; End; End; {RenumberList} Procedure DisposeFilelist(Var ListRoot:DirListPtrType); Var Viitta,apu :DirListPtrType; Begin If ListRoot = Nil Then Exit; Viitta := ListRoot; While Viitta <> Nil Do Begin apu := Viitta^.next; Dispose(Viitta); Viitta := apu; End; ListRoot := Nil; End; Function CreateDirList:DirListPtrType; Var DirListPtr,Apu,Viitta,DRoot :DirListPtrType; Begin If FileListPtr = Nil Then Begin CreateDirList := Nil; Exit; End; Viitta := FileListPtr; New(DirListPtr); DirListPtr^.Previous := Nil; DirListPtr^.Next := Nil; DRoot := DirListPtr; While Viitta <> Nil Do Begin If (Viitta^.Attribute And Directory) = Directory Then Begin Apu := DirListPtr; New(DirListPtr); DirlistPtr^.Next := Nil; DirListPtr^.Previous :=Apu; Apu^.Next := DirListPtr; If Pos(' .',Viitta^.FileName) = 0 Then Apu^.FileName := Viitta^.FileName Else If Pos('..',Viitta^.FileName) <> 0 Then Apu^.FileName := '.. ' Else Apu^.FileName := '. '; End; Viitta := Viitta^.Next; End; If DRoot^.Next = Nil Then DRoot := Nil {No directories found} Else Apu^.Next := Nil; Dispose(DirListPtr); {Remove last , empty item} CreateDirList := DRoot; End; {CreateDirList} Procedure DisposeDirList(Var ListRoot:DirListPtrType); Var Viitta,apu :DirListPtrType; Begin If ListRoot = Nil Then Exit; Viitta := ListRoot; While Viitta <> Nil Do Begin apu := Viitta^.next; Dispose(Viitta); Viitta := apu; End; ListRoot := Nil; End; Procedure UpdateFileList(pt:DirListPtrType); Var i :Byte; Viitta :DirListPtrType; at :Integer Absolute FileWindowPtr; Begin Mem[at+5] := 1; Viitta := pt; For i := 1 to 13 Do Begin If Viitta <> Nil Then Begin WritelnWindow(FileWindowPtr,' '+Viitta^.FileName+' '); Viitta := Viitta^.Next; End Else WritelnWindow(FileWindowPtr,' '); End; Mem[at+5] := 1; End; Procedure UpdateDirList(pt:DirListPtrType); Var i :Byte; Viitta :DirListPtrType; at :Integer Absolute SubDirWindowPtr; Begin Mem[at+5] := 1; Viitta := pt; For i := 1 to 13 Do Begin If Viitta <> Nil Then Begin WritelnWindow(SubDirWindowPtr,' '+Viitta^.FileName+'