home *** CD-ROM | disk | FTP | other *** search
/ HomeWare 14 / HOMEWARE14.bin / prog / totsrc11.arj / TOTDIR.PAS < prev    next >
Pascal/Delphi Source File  |  1993-05-04  |  23KB  |  860 lines

  1. {               Copyright 1991 TechnoJock Software, Inc.               }
  2. {                          All Rights Reserved                         }
  3. {                         Restricted by License                        }
  4.  
  5. {                             Build # 1.10                             }
  6.  
  7. Unit totDIR;
  8. {$I TOTFLAGS.INC}
  9.  
  10. {
  11.  Development Notes:
  12.          1.00a    3/25/91   Allowed typing of filename when no files
  13.                             in list.
  14.          1.00b    5/18/91   Added DIRinit to interface
  15.          1.00c    2/04/92   Trapped for ? * chars in path
  16. }
  17.  
  18. INTERFACE
  19.  
  20. uses DOS,CRT,
  21.      totIO1, totIO2, totLINK, totSTR, totSYS, totWIN,
  22.      totINPUT, totFAST, totMISC, totMsg;
  23.  
  24. CONST
  25.    SignalUpdateDirField  =  10;   {Signal ID}
  26.    SignalUpdateFileField =  11;
  27.    ReadMessage: string[20] = 'Reading files...';
  28.    SortMessage: string[20] = 'Sorting files...';
  29.  
  30. TYPE
  31.  
  32. pDirDLLOBJ = ^DirDLLOBJ;
  33. DirDLLOBJ = object (DLLOBJ)
  34.    vShowDrives: boolean;
  35.    {methods ...}
  36.    constructor Init;
  37.    procedure   FillList;
  38.    procedure   SetDrives(On:boolean);
  39.    function    GetStr(Node:DLLNodePtr;Start,Finish: longint):string;  VIRTUAL;
  40.    destructor  Done;
  41. end; {DirDLLOBJ}
  42.  
  43. pFilesFieldOBJ = ^FilesFieldOBJ;
  44. FilesFieldOBJ = object (ListIOOBJ)
  45.    vFileList: ^FileDLLOBJ;
  46.    vSortCode: byte;
  47.    vSortOrder: boolean;
  48.    {methods ...}
  49.    constructor Init;
  50.    procedure   SetFileDetails(FileMasks:string; FileAttrib: word);
  51.    procedure   SetSortDetails(SortCode: byte; SortOrder: boolean);
  52.    procedure   FillList;
  53.    function    GetChosenFile: string;
  54.    function    Select(K:word; X,Y:byte):TAction;                       VIRTUAL;
  55.    procedure   ShowItemDetails(HiPick: integer);                       VIRTUAL;
  56.    function    GetString(Pick:integer): string;                        VIRTUAL;
  57.    function    SelectPick(InKey:word;X,Y:byte): tAction;               VIRTUAL;
  58.    procedure   HandleSignal(var BaseSig:tSignal; var NewSig:tSignal);  VIRTUAL;
  59.    destructor  Done;                                                   VIRTUAL;
  60. end; {FilesFieldOBJ}
  61.  
  62. pDirFieldOBJ = ^DirFieldOBJ;
  63. DirFieldOBJ = object (ListIOOBJ)
  64.    vDirList: ^DirDLLOBJ;
  65.    {methods ...}
  66.    constructor Init;
  67.    procedure   FillList;
  68.    procedure   ReadDir(Status:tStatus);
  69.    function    Select(K:word; X,Y:byte):TAction;                       VIRTUAL;
  70.    function    GetString(Pick:integer): string;                        VIRTUAL;
  71.    function    SelectPick(InKey:word;X,Y:byte): tAction;               VIRTUAL;
  72.    procedure   RaiseSignal(var TheSig:tSignal);                        VIRTUAL;
  73.    procedure   HandleSignal(var BaseSig:tSignal; var NewSig:tSignal);  VIRTUAL;
  74.    destructor  Done;                                                   VIRTUAL;
  75. end; {DirFieldOBJ}
  76.  
  77. pFileInputFieldOBJ = ^FileInputFieldOBJ;
  78. FileInputFieldOBJ = object (LateralIOOBJ)
  79.    vChangeDir: boolean;
  80.    vChangeMask: boolean;
  81.    vLastInput: string;
  82.    {methods ...}
  83.    constructor Init;
  84.    procedure   SetLastValue(Mask:string);
  85.    procedure   WriteLabel(Status:tStatus);                             VIRTUAL;
  86.    function    ProcessEnter:tAction;                                   VIRTUAL;
  87.    procedure   RaiseSignal(var TheSig:tSignal);                        VIRTUAL;
  88.    procedure   ShutdownSignal(var BaseSig:tSignal);                    VIRTUAL;
  89.    function    Suspend:boolean;                                        VIRTUAL;
  90.    destructor  Done;                                                   VIRTUAL;
  91. end; {FileInputFieldOBJ}
  92.  
  93. pDirWinOBJ = ^DirWinOBJ;
  94. DirWinOBJ = object
  95.    vFileSpec: ^FileInputFieldOBJ;
  96.    vFileList: ^FilesFieldOBJ;
  97.    vDirList: ^DirFieldOBJ;
  98.    vOK:  Strip3DIOOBJ;
  99.    vCancel: Strip3DIOOBJ;
  100.    vHelp: Strip3DIOOBJ;
  101.    vControl: ControlKeysIOOBJ;
  102.    vManager: WinFormOBJ;
  103.    vOldDir: string[80];
  104.    vStartDir: string[80];
  105.    vEndDir: string[80];
  106.    {methods ...}
  107.    constructor Init;
  108.    function    Action: pWinFormOBJ;
  109.    function    Go: tAction;
  110.    procedure   SetFileDetails(StartDir:string; FileMasks:string; FileAttrib: word);
  111.    procedure   SetSortDetails(SortCode: byte; SortOrder: boolean);
  112.    function    Win: MoveWinPtr;
  113.    function    FilenameTyped:boolean;
  114.    function    GetChosenFile: string;
  115.    destructor  Done;                                                   VIRTUAL;
  116. end; {DirWinOBJ}
  117.  
  118. procedure DIRInit;
  119. IMPLEMENTATION
  120. var Floppies: byte;
  121. {|||||||||||||||||||||||||||||||||||||||||||||}
  122. {                                             }
  123. {     M i s c.  P r o c s   &   F u n c s     }
  124. {                                             }
  125. {|||||||||||||||||||||||||||||||||||||||||||||}
  126. procedure WriteFullDir;
  127. {}
  128. var Str:string;
  129. begin
  130.    GetDir(0,Str);
  131.    Screen.WritePlain(1,17,padleft(Str,45,' '));
  132. end; {WriteFullDir}
  133.  
  134. {$F+}
  135. procedure DirHelp(ID:word);
  136. {}
  137. var  HelpWin: MessageOBJ;
  138. begin
  139.    with HelpWin do
  140.    begin
  141.       Init(1,'File Load Help');
  142.       AddLine('Enter a filename (or file mask) in the Name ');
  143.       Addline('box, or TAB to the file list and select a');
  144.       Addline('file from the list by pressing Enter or ');
  145.       AddLine('double clicking the mouse.');
  146.       AddLine('');
  147.       AddLine('To change directories, TAB to the Directories');
  148.       AddLine('list and select one.');
  149.       AddLine('');
  150.       Show;
  151.       Done;
  152.    end;
  153. end; {DirHelp}
  154. {$IFNDEF OVERLAY}
  155.   {$F-}
  156. {$ENDIF}
  157. {|||||||||||||||||||||||||||||||||||||||||||}
  158. {                                           }
  159. {     D i r D L L O b j   M E T H O D S     }
  160. {                                           }
  161. {|||||||||||||||||||||||||||||||||||||||||||}
  162. constructor DirDLLOBJ.Init;
  163. {}
  164. begin
  165.    DLLOBJ.Init;
  166.    vShowDrives := true;
  167. end; {DirDLLOBJ.Init}
  168.  
  169. procedure DirDLLOBJ.SetDrives(On:boolean);
  170. {}
  171. begin
  172.    vShowDrives := On;
  173. end; {DirDLLOBJ.SetDrives}
  174.  
  175. procedure DirDLLOBJ.FillList;
  176. {}
  177. var
  178.   DirInfo: SearchRec;
  179.   Drive: string;
  180.   I : integer;
  181.   Result: longint;
  182.   Ecode : integer;
  183.   ActiveDrive: integer;
  184. begin
  185.    if vStartNodePtr <> Nil then
  186.       EmptyList;
  187.    FindFirst('*.*', AnyFile, DirInfo);
  188.    while DOSError = 0 do
  189.    begin
  190.       if ((DirInfo.Attr and Directory) = Directory)
  191.       and (DirInfo.Name <> '.') then
  192.       begin
  193.          Drive := '['+DirInfo.Name+']';
  194.          Ecode := Add(Drive,succ(length(Drive)));
  195.          if Ecode = 0 then
  196.             vActiveNodePtr^.SetStatus(0,true);  {indicates directory change}
  197.       end;
  198.       FindNext(DirInfo);
  199.    end;
  200.    if vShowDrives then  {get active drives}
  201.    begin
  202.       {$I-}
  203.       getdir(0,Drive);
  204.       {$I-}
  205.       if IOResult = 0 then
  206.          ActiveDrive := ord(Drive[1]) - 64
  207.       else
  208.          ActiveDrive := 0;
  209.       if (Floppies >= 1) and (ActiveDrive <> 1) then
  210.       begin
  211.          Drive := '[ -A- ]';
  212.          Ecode := Add(Drive,8);
  213.       end;
  214.       if (Floppies >= 2) and (ActiveDrive <> 2) then
  215.       begin
  216.          Drive := '[ -B- ]';
  217.          Ecode := Add(Drive,8);
  218.       end;
  219.       for I := 3 to 26 do {test all letters}
  220.       begin
  221.          Result := DiskSize(I);
  222.          if (Result <> -1) and (ActiveDrive <> I) then {valid drive}
  223.          begin
  224.             Drive := '[ -'+char(I+64)+'- ]';
  225.             Ecode := Add(Drive,8);
  226.          end;
  227.       end;
  228.    end;
  229.    Jump(1);
  230. end; {DirDLLOBJ.FillList}
  231.  
  232. function DirDLLOBJ.GetStr(Node:DLLNodePtr;Start,Finish: longint):string;
  233. {ignores Start and Finish parameters}
  234. var temp : string;
  235. begin
  236.    if (Node = Nil)
  237.    or (Node^.vDataPtr = Nil)
  238.    or (Node^.vSize = 0)  then
  239.       GetStr := ''
  240.    else
  241.    begin
  242.       Move(mem[seg(Node^.vDataPtr^):ofs(Node^.vDataPtr^)],Temp[0],15);
  243.       GetStr := Temp;
  244.    end;
  245. end; {DirDLLOBJ.GetStr}
  246.  
  247. destructor DirDLLOBJ.Done;
  248. {}
  249. begin
  250.    DLLOBJ.Done;
  251. end; {DirDLLOBJ.Done}
  252. {||||||||||||||||||||||||||||||||||||||||||||||||||||}
  253. {                                                    }
  254. {     F i l e s F i e l d O B J   M e t h o d s      }
  255. {                                                    }
  256. {||||||||||||||||||||||||||||||||||||||||||||||||||||}
  257. constructor FilesFieldOBJ.Init;
  258. {}
  259. begin
  260.    ListIOOBJ.Init(3,4,13,12,'Files:');
  261.    new(vFileList,Init);
  262.    vSortCode := 0;
  263.    vSortOrder := true;
  264. end; {FilesFieldOBJ.Init}
  265.  
  266. procedure FilesFieldOBJ.SetFileDetails(FileMasks:string; FileAttrib: word);
  267. {}
  268. begin
  269.    vFileList^.SetFileDetails(FileMasks,FileAttrib);
  270. end; {FilesFieldOBJ.SetFileDetails}
  271.  
  272. procedure FilesFieldOBJ.ShowItemDetails(HiPick: integer);
  273. {}
  274. var FileInfo: tFileInfo;
  275. begin
  276.    vFileList^.GetFileRecord(FileInfo,HiPick);
  277.    if FileInfo.FileName = NoFiles then
  278.      Screen.WritePlain(1,18,replicate(45,' '))
  279.    else
  280.      Screen.WritePlain(1,18,padleft(LongName(FileInfo),45,' '));
  281. end; {FilesFieldOBJ.ShowItemDetails}
  282.  
  283. procedure FilesFieldObj.FillList;
  284. {}
  285. begin
  286.    Screen.WritePlain(1,18,padleft(ReadMessage,45,' '));
  287.    vFileList^.FillList;
  288.    Screen.WritePlain(1,18,padleft(SortMessage,45,' '));
  289.    vFileList^.Sort(vSortCode,vSortOrder);
  290.    vListAssigned := true;
  291.    vTotPicks := vFileList^.TotalNodes;
  292. end;  {FilesFieldObj.AssignList}
  293.  
  294. function FilesFieldOBJ.GetString(Pick:integer): string;
  295. {}
  296. var
  297.   TempPtr : DLLNodePtr;
  298. begin
  299.    TempPtr := vFileList^.NodePtr(Pick);
  300.    if TempPtr <> Nil then
  301.       vFileList^.ShiftActiveNode(TempPtr,Pick);
  302.    GetString := vFileList^.GetStr(TempPtr,0,0);
  303. end; {FilesFieldOBJ.GetString}
  304.  
  305. function FilesFieldOBJ.SelectPick(InKey:word;X,Y:byte):tAction;
  306. {}
  307. var SP: tAction;
  308. begin
  309.   if (Inkey = 523) and (TargetPick(X,Y) <> 0) then  {select the new pick}
  310.   begin
  311.      MouseChoose(X,Y);
  312.      SP := Finished;
  313.   end
  314.   else if (Inkey = 13) then
  315.      SP := Finished
  316.   else
  317.      SP := none;
  318.   if (SP = Finished) and (GetString(vFileList^.ActiveNodeNumber) = NoFiles) then
  319.      SP := none;
  320.   SelectPick := SP;
  321. end; {FilesFieldOBJ.SelectPick}
  322.  
  323. function FilesFieldOBJ.Select(K:word; X,Y:byte):TAction;
  324. {}
  325. var New: byte;
  326. begin
  327.    vScrollBarOn := (vTotPicks >= vRows);
  328.    vActiveField := true;
  329.    Display(HiStatus);
  330.    WriteLabel(HiStatus);
  331.    WriteMessage;
  332.    if (K = 513) or (K=523) then
  333.    begin
  334.       if vScrollBarOn and (X = vBorder.X2) then
  335.         {nothing for now}
  336.       else
  337.       begin
  338.          New := HitItem(Y);
  339.          if New > 0 then
  340.          begin
  341.             WriteItem(vActivePick,false);
  342.             vActivePick := New;
  343.             WriteItem(vActivePick,true);
  344.             if (K=523) then
  345.             begin
  346.                Select := SelectPick(K,X,Y);
  347.                exit;
  348.             end;   
  349.          end;
  350.       end;
  351.    end;
  352.    Select := none;
  353. end; {FilesFieldOBJ.Select}
  354.  
  355. procedure FilesFieldOBJ.SetSortDetails(SortCode: byte; SortOrder: boolean);
  356. {}
  357. begin
  358.    vSortCode := SortCode;
  359.    vSortOrder := SortOrder;
  360. end; {FilesFieldOBJ.SetSortDetails}
  361.  
  362. procedure FilesFieldOBJ.HandleSignal(var BaseSig:tSignal; var NewSig:tSignal);
  363. {}
  364. var
  365.   Len : byte;
  366.   NewMask: string;
  367. begin
  368.    if BaseSig.ID = SignalUpdateFileField then
  369.    begin
  370.       if (BaseSig.MSGtype = 0) then {new filemask}
  371.       begin
  372.          move(BaseSig.MsgPtr^,Len,1);
  373.          if len > 0 then
  374.          begin
  375.             move(BaseSig.MsgPtr^,NewMask,succ(Len));
  376.             Screen.WritePlain(1,18,padleft(ReadMessage,45,' '));
  377.             vFileList^.FillNewMask(NewMask);
  378.             Screen.WritePlain(1,18,padleft(SortMessage,45,' '));
  379.             vFileList^.Sort(vSortCode,vSortOrder);
  380.          end;
  381.       end
  382.       else
  383.          FillList;
  384.       vTopPick := 1;
  385.       vTotPicks := vFileList^.TotalNodes;
  386.       vActivePick := 1;
  387.       Display(Norm);
  388.       BaseSig.ID := 0; {All Done!}
  389.    end;
  390. end; {FilesFieldOBJ.HandleSignal}
  391.  
  392. function FilesFieldOBJ.GetChosenFile:string;
  393. {}
  394. begin
  395.    GetChosenFile := GetString(vTopPick + pred(vActivePick));
  396. end; {FilesFieldOBJ.GetChosenFile}
  397.  
  398. destructor FilesFieldOBJ.Done;
  399. {}
  400. begin
  401.    ListIOOBJ.Done;
  402.    dispose(vFileList,Done);
  403. end; {FilesFieldOBJ.Done}
  404. {||||||||||||||||||||||||||||||||||||||||||||||||}
  405. {                                                }
  406. {     D i r F i e l d O B J   M e t h o d s      }
  407. {                                                }
  408. {||||||||||||||||||||||||||||||||||||||||||||||||}
  409. constructor DirFieldOBJ.Init;
  410. {}
  411. begin
  412.    ListIOOBJ.Init(18,4,15,12,('Directories:'));
  413.    new(vDirList,Init);
  414. end; {DirFieldOBJ.Init}
  415.  
  416. function DirFieldOBJ.GetString(Pick:integer): string;
  417. {}
  418. var
  419.   TempPtr : DLLNodePtr;
  420. begin
  421.    TempPtr := vDirList^.NodePtr(Pick);
  422.    if TempPtr <> Nil then
  423.       vDirList^.ShiftActiveNode(TempPtr,Pick);
  424.    GetString := vDirList^.GetStr(TempPtr,0,0);
  425. end; {DirFieldOBJ.GetString}
  426.  
  427. procedure DirFieldOBJ.RaiseSignal(var TheSig:tSignal);
  428. {}
  429. begin
  430.    with TheSig do
  431.    begin
  432.       ID := SignalUpdateFileField;
  433.       MsgType := 99;
  434.    end;
  435. end; {DirFieldOBJ.RaiseSignal}
  436.  
  437. procedure DirFieldOBJ.HandleSignal(var BaseSig:tSignal; var NewSig:tSignal);
  438. {}
  439. begin
  440.    if (BaseSig.ID = SignalUpdateDirField) then
  441.    begin
  442.       ReadDir(Norm);
  443.       BaseSig.ID := 0; {All Done!}
  444.    end;
  445. end; {DirFieldOBJ.HandleSignal}
  446.  
  447. procedure DirFieldOBJ.FillList;
  448. {}
  449. begin
  450.    vDirList^.FillList;
  451.    vTopPick := 1;
  452.    vTotPicks := vDirList^.TotalNodes;
  453.    vActivePick := 1;
  454.    vListAssigned := true;
  455. end; {DirFieldOBJ.FillList}
  456.  
  457. procedure DirFieldOBJ.ReadDir(Status:tStatus);
  458. {}
  459. begin
  460.    FillList;
  461.    Display(Status);
  462. end; {DirFieldOBJ.ReadDir}
  463.  
  464. function DirFieldOBJ.SelectPick(InKey:word;X,Y:byte):tAction;
  465. {}
  466. var
  467.   TempPtr : DLLNodePtr;
  468.   NewDir : string;
  469. begin
  470.   if (Inkey = 523) then  {select the new pick}
  471.   begin
  472.      if TargetPick(X,Y) <> 0 then
  473.         MouseChoose(X,Y)
  474.      else
  475.      begin
  476.         SelectPick := none;
  477.         exit;
  478.      end;
  479.   end;
  480.   {change to the new drive/directory and display the new list}
  481.   NewDir := GetString(pred(vTopPick)+vActivePick);
  482.   TempPtr := vDirList^.NodePtr(pred(vTopPick)+vActivePick);
  483.   if TempPtr^.GetStatus(0) then {directory}
  484.   begin
  485.      delete(NewDir,1,1);  {remove []}
  486.      delete(NewDir,length(NewDir),1);
  487.   end
  488.   else
  489.   begin
  490.      NewDir := NewDir[4]+':';
  491.   end;
  492. {$I-}
  493.   ChDir(NewDir);
  494. {$I+}
  495.   if IOResult = 0 then
  496.   begin
  497.      WriteFullDir;
  498.      ReadDir(HiStatus);
  499.      vScrollBarOn := vTotPicks > vRows;
  500.      {now raise a signal to load a new directory}
  501.      SelectPick := Signal;
  502.   end
  503.   else
  504.      SelectPick := none;
  505. end; {DirFieldOBJ.SelectPick}
  506.  
  507. function DirFieldOBJ.Select(K:word; X,Y:byte):TAction;
  508. {}
  509. var New: byte;
  510. begin
  511.    vScrollBarOn := (vTotPicks >= vRows);
  512.    vActiveField := true;
  513.    Display(HiStatus);
  514.    WriteLabel(HiStatus);
  515.    WriteMessage;
  516.    if (K = 513) or (K=523) then
  517.    begin
  518.       if vScrollBarOn and (X = vBorder.X2) then
  519.         {nothing for now}
  520.       else
  521.       begin
  522.          New := HitItem(Y);
  523.          if New > 0 then
  524.          begin
  525.             WriteItem(vActivePick,false);
  526.             vActivePick := New;
  527.             WriteItem(vActivePick,true);
  528.             if (K=523) then
  529.             begin
  530.                Select := SelectPick(K,X,Y);
  531.                exit;
  532.             end;   
  533.          end;
  534.       end;
  535.    end;
  536.    Select := none;
  537. end; {DirFieldOBJ.Select}
  538.  
  539. destructor DirFieldOBJ.Done;
  540. {}
  541. begin
  542.    ListIOOBJ.Done;
  543.    dispose(vDirList,Done);
  544. end; {DirFieldOBJ.Done}
  545. {||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}
  546. {                                                            }
  547. {     F i l e I n p u t F i e l d O B J   M e t h o d s      }
  548. {                                                            }
  549. {||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||}
  550. constructor FileInputFieldOBJ.Init;
  551. {}
  552. begin
  553.    LateralIOOBJ.Init(3,2,30,75);
  554.    vRules := EraseDefault;
  555.    vInputStr := '*.*';
  556.    vLastInput := vInputStr;
  557.    vChangeDir := false; 
  558.    vChangeMask := false;
  559.    SetPadChar(' ');
  560. end; {FileInputFieldOBJ.Init}
  561.  
  562. procedure FileInputFieldOBJ.SetLastValue(Mask:string);
  563. {}
  564. begin
  565.    vLastInput := Mask;
  566. end; {FileInputFieldOBJ.SetLastValue}
  567.  
  568. procedure FileInputFieldOBJ.WriteLabel(Status:tStatus);
  569. {}
  570. var
  571.   Norm,Hi: byte;
  572. begin
  573.    AssignColors(IOTOT^.vLabel,IOTOT^.vField,Status,Hi,Norm);
  574.    if (Hi = 0) or (Norm = 0) then
  575.       Screen.WritePlain(vBoundary.X1,pred(vBoundary.Y1),'Name:')
  576.    else
  577.       Screen.WriteHi(vBoundary.X1,pred(vBoundary.Y1),Hi,Norm,'Name:');
  578. end; {FileInputFieldOBJ.WriteLabel}
  579.  
  580. function FileInputFieldOBJ.ProcessEnter: tAction;
  581. {if a file is specified, finish, otherwise raise a signal}
  582. var
  583.   D,N,E,FN : string;
  584. begin
  585.    vChangeDir  := false;
  586.    vChangeMask := false;
  587.    if vInputStr = '' then
  588.    begin
  589.       vInputStr := '*.*';
  590.       vChangeMask := true;
  591.    end
  592.    else
  593.    begin
  594.       FSplit(vInputStr,D,N,E);
  595.       FN := N+E;
  596.       if  (pos('*',vInputStr) = 0)     {1.00c}
  597.       and (pos('?',vInputStr) = 0)
  598.       and (FN <> '') then {a real filename was entered}
  599.       begin
  600.          ProcessEnter := Finished;
  601.          exit;
  602.       end
  603.       else
  604.       begin
  605.          if D <> '' then
  606.          begin
  607.             if  (D[length(D)] = '\')
  608.             and  not ((length(D) = 3) and (pos(':',D) = 2) )
  609.             and (D <> '\') then
  610.                delete(D,length(D),1);
  611.             {$I-}
  612.             chdir(D);
  613.             {$I+}
  614.             if IOResult = 0 then
  615.             begin
  616.                WriteFullDir;
  617.                vChangeDir := true;
  618.             end;
  619.             if FN = '' then
  620.                vInputStr := '*.*'
  621.             else
  622.                vInputStr := FN;
  623.             vChangeMask := true;
  624.          end
  625.          else  {must have entered one or more wildcard file names}
  626.             vChangeMask := true;
  627.       end;
  628.    end;
  629.    CursorHome;
  630.    Display(HiStatus);
  631.    vLastInput := vInputStr;
  632.    ProcessEnter := signal;
  633. end; {FileInputFieldOBJ.ProcessEnter}
  634.  
  635. procedure FileInputFieldOBJ.RaiseSignal(var TheSig:tSignal);
  636. {}
  637. begin
  638.    with TheSig do
  639.    begin
  640.       if vChangeDir then
  641.       begin
  642.          ID := SignalUpdateDirField;
  643.          MsgType := 99;
  644.          vChangeDir := false;
  645.       end
  646.       else
  647.       begin
  648.          ID := SignalUpdateFileField;
  649.          MsgType := 0;
  650.          MsgPtr := @vInputStr;
  651.          vChangeMask := false;
  652.       end;
  653.    end;
  654. end; {FileInputFieldOBJ.RaiseSignal}
  655.  
  656. procedure FileInputFieldOBJ.ShutdownSignal(var BaseSig:tSignal);
  657. {}
  658. begin
  659.    with BaseSig do
  660.    begin
  661.       if vChangeMask then
  662.       begin
  663.          ID := SignalUpdateFileField;
  664.          MsgType := 0;
  665.          MsgPtr := @vInputStr;
  666.          vChangeMask := false;
  667.       end;
  668.    end;
  669.    MoveCursor;
  670. end; {FileInputFieldOBJ.ShutdownSignal}
  671.  
  672. function FileInputFieldOBJ.Suspend:boolean;
  673. {}
  674. begin
  675.    Suspend := LateralIOOBJ.Suspend;
  676.    if (vLastInput <> vInputStr)
  677.    and ( (pos('*',vInputStr) > 0) or (pos('?',vInputStr) > 0))  {1.00a}
  678.        then
  679.    begin
  680.       Suspend := false;
  681.       Key.StuffBuffer(13);
  682.       Key.StuffBuffer(9);
  683.    end;
  684. end; {FileInputFieldOBJ.Suspend}
  685.  
  686. destructor FileInputFieldOBJ.Done;
  687. {}
  688. begin
  689.    LateralIOOBJ.Done;
  690. end; {FileInputFieldOBJ.Done}
  691. {||||||||||||||||||||||||||||||||||||||||||||}
  692. {                                            }
  693. {     D i r W i n O B J   M e t h o d s      }
  694. {                                            }
  695. {||||||||||||||||||||||||||||||||||||||||||||}
  696. constructor DirWinOBJ.Init;
  697. {}
  698. begin
  699.    new(vFileSpec,Init);
  700.    new(vFileList,Init);
  701.    new(vDirList,Init);
  702.    vOK.Init(35,2,'   ~O~K   ',Finished);
  703.    vOK.SetHotKey(280); {Alt-O}
  704.    vCancel.Init(35,5,' ~C~ancel ',Escaped);
  705.    vCancel.SetHotkey(302); {Alt-C}
  706.    vHelp.Init(35,8,'  ~H~elp  ',Help);
  707.    vHelp.SetHotkey(291); {Alt-H}
  708.    vControl.Init; {Tab, STab, F10, Esc}
  709.    vStartDir := '';
  710.    vFileSpec^.SetID(1);
  711.    vFileList^.SetID(2);
  712.    vDirList^.SetID(3);
  713.    vOK.SetID(4);
  714.    vCancel.SetID(5);
  715.    vHelp.SetID(HelpID);
  716.    with vManager do
  717.    begin
  718.       Init;
  719.       Win^.SetSize(18,3,63,22,1);
  720.       Win^.SetTitle(' Choose a file ');
  721.       AddItem(vControl);
  722.       AddItem(vFileSpec^);
  723.       AddItem(vFileList^);
  724.       AddItem(vDirList^);
  725.       AddItem(vOK);
  726.       AddItem(vCancel);
  727.       AddItem(vHelp);
  728.       SetHelpHook(DirHelp);
  729.    end;
  730. end; {DirWinOBJ.Init}
  731.  
  732. function DirWinOBJ.Win:MoveWinPtr;
  733. {}
  734. begin
  735.    Win := vManager.Win;
  736. end; {DirWinOBJ.Win}
  737.  
  738. function DirWinOBJ.Action: pWinFormOBJ;
  739. {}
  740. begin
  741.    Action := @vManager;
  742. end; {DirWinOBJ.Action}
  743.  
  744. procedure DirWinOBJ.SetFileDetails(StartDir:string; FileMasks:string; FileAttrib: word);
  745. {}
  746. begin
  747.    vStartDir := StartDir;
  748.    vFileList^.SetFileDetails(FileMasks,FileAttrib);
  749.    vFileSpec^.SetValue(FileMasks);
  750.    vFileSpec^.SetLastValue(FileMasks);
  751. end; {DirWinOBJ.SetFileDetails}
  752.  
  753. procedure DirWinOBJ.SetSortDetails(SortCode: byte; SortOrder: boolean);
  754. {}
  755. begin
  756.    vFileList^.SetSortDetails(SortCode,SortOrder);
  757. end; {DirWinOBJ.SetSortDetails}
  758.  
  759. function DirWinOBJ.FilenameTyped:boolean;                {1.00a}
  760. {}
  761. var
  762.   Str: string;
  763. begin
  764.    Str := vFileSpec^.GetValue;
  765.    FilenameTyped := (pos('*',Str) = 0)
  766.                     and (pos('?',Str) = 0)
  767.                     and (Str <> '');
  768. end; {DirWinOBJ.FilenameTyped}
  769.  
  770. function DirWinOBJ.Go: tAction;
  771. {}
  772. var
  773.    Visible,kDouble: boolean;
  774.    Result: tAction;
  775. begin
  776.    Visible:= Mouse.Visible;
  777.    kDouble := Key.GetDouble;
  778.    if not kDouble then
  779.       Key.SetDouble(true);
  780.    getdir(0,vOldDir);
  781.    if vStartDir <> '' then
  782.    begin
  783.       {$I-}
  784.       chdir(vStartDir);
  785.       {$I+}
  786.       if IOResult <> 0 then
  787.          {whogivesashit};
  788.    end;
  789.    vManager.Draw;
  790.    vFileList^.FillList;
  791.    vDirList^.FillList;
  792.    WriteFullDir;
  793.    if not Visible then
  794.       Mouse.Show;
  795.    repeat
  796.       Result := vManager.Go;
  797.    until (Result <> Finished) or
  798.          ( (Result = Finished) and (                       {1.00a}
  799.                                    FilenameTyped
  800.                                    or
  801.                                    ((vFileList^.GetChosenFile=NoFiles) = false)
  802.                                   )
  803.          );
  804.    Go := Result;
  805.    vManager.Win^.Remove;
  806.    getdir(0,vEndDir);
  807.    {$I-}
  808.    chdir(vOldDir);
  809.    {$I+}
  810.    if IOResult <> 0 then
  811.       {whogivesashit};
  812.    Key.SetDouble(kDouble);
  813.    if not Visible then
  814.       Mouse.Hide;
  815. end; {DirWinOBJ.Go}
  816.  
  817. function DirWinOBJ.GetChosenFile:string;
  818. {}
  819. begin
  820.    if FilenameTyped then                                       {1.00a}
  821.      GetChosenFile := vFileSpec^.GetValue
  822.    else
  823.      GetChosenFile := SlashedDirectory(vEndDir)+vFileList^.GetChosenFile;
  824. end; {DirWinOBJ.GetChosenFile}
  825.  
  826. destructor DirWinOBJ.Done;
  827. {}
  828. begin
  829.    dispose(vFileSpec,Done);
  830.    dispose(vFileList,Done);
  831.    dispose(vDirList,Done);
  832.    vOK.Done;
  833.    vCancel.Done;
  834.    vHelp.Done;
  835.    vControl.Done;
  836.    vManager.Done;
  837. end; {DirWinOBJ.Done}
  838. {|||||||||||||||||||||||||||||||||||||||||||||||}
  839. {                                               }
  840. {     U N I T   I N I T I A L I Z A T I O N     }
  841. {                                               }
  842. {|||||||||||||||||||||||||||||||||||||||||||||||}
  843. procedure DIRInit;
  844. {initilizes objects and global variables}
  845. var Equip: EquipObj;
  846. begin
  847.    Equip.Init;
  848.    Floppies := Equip.FloppyDrives;
  849. end;
  850.  
  851. {end of unit - add initialization routines below}
  852. {$IFNDEF OVERLAY}
  853. begin
  854.    DIRInit;
  855. {$ENDIF}
  856. end.
  857.  
  858.  
  859.  
  860.