home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / files / fileman / fm / fm.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-08-23  |  11.4 KB  |  374 lines

  1. {
  2. --------------------------------------------------------------------------
  3.                        F i l e    I n f o r m a t i o n
  4.  
  5. * DESCRIPTION
  6. FileManager (version 1.0) by Jim Zwick provides a visual display of DOS
  7. directories and their contents, and it permits files to be copied, moved,
  8. renamed, erased, printed and viewed by highlighting the files on the
  9. display and picking commands from a menu. Files to be printed can be
  10. spooled using the DOS 3.X print spooler from within FM. Written in
  11. Trubo Pascal 4.0.
  12.  
  13. * ASSOCIATED FILES
  14. FM.PAS
  15. FM.DOC
  16. FM.EXE
  17. FM.TPU
  18. FMFILE.PAS
  19. FMINPUT.PAS
  20. FMSCREEN.PAS
  21. FMUTEST.EXE
  22. FMUTEST.PAS
  23. FMVIEW.PAS
  24.  
  25. ==========================================================================
  26. }
  27. {$B-}    { Boolean short-circuit evaluation on }         { Program: FM.PAS    }
  28. {$S-}    { Stack checking off }                          { Author:  Jim Zwick }
  29. {$I-}    { I/O checking off }                            { Version: 1.0       }
  30. {$V+}    { Strict String parameter checking on }         { Date:    03-04-88  }
  31. {$R-}    { Range checking off }
  32.                                { To remove dOs option from FM comment out the }
  33. {$DEFINE MemLimited}           { MemLimited definition.  To compile as a Unit }
  34. (* {$DEFINE FMasUNIT} *)       { Remove commenting from FMasUNIT definition.  }
  35.                                { When compiling as a Unit, be careful to      }
  36.                                { comment out MemLimited if you have not set   }
  37.                                { a low maximum heap in your main program.     }
  38. {$IFDEF FMasUNIT}
  39. UNIT FM;
  40. INTERFACE
  41. {$ELSE}
  42. {$IFDEF MemLimited}                            { Heap can be increased for    }
  43. {$M 8192,0,65536}  { 8K Stack, 64K Heap }      { larger View buffer but this  }
  44. {$ENDIF}                                       { will reduce memory available }
  45. PROGRAM FM;                                    { when you exit to DOS from    }
  46. {$ENDIF}                                       { within FM.                   }
  47.  
  48. Uses
  49.   Crt,
  50.   Dos,
  51.   FMScreen,
  52.   FMInput,
  53.   FMFile,
  54.   FMView;
  55.  
  56. {$IFDEF FMasUNIT}
  57.   PROCEDURE FileManager;
  58.  
  59. IMPLEMENTATION
  60. {$ENDIF}
  61.  
  62.   CONST
  63.     Reading  : STRING[21] = 'Reading Directory ...';
  64.     HotPrint = #153;
  65.   VAR
  66.     DisplayStart : INTEGER;
  67.     DisplayEnd   : INTEGER;
  68.     i, Marker    : INTEGER;
  69.     ListCount    : WORD;
  70.     X, Y, Col    : BYTE;
  71.     Reply        : CHAR;
  72.     SpOk         : BOOLEAN;
  73.  
  74.   { ------------------------------------------------------------------------- }
  75.  
  76.   PROCEDURE Help;
  77.   VAR
  78.     Reply : CHAR;
  79.   BEGIN
  80.     WOpen(4);
  81.     ClrScr;
  82.     CursorOn(FALSE);
  83.     WRITELN(' mArk   - Mark files to Copy, Move or Erase');
  84.     WRITELN(' Copy   - Copy marked files');
  85.     WRITELN(' Move   - Move marked files');
  86.     WRITELN(' Erase  - Erase marked files');
  87.     WRITELN(' Rename - Rename current file');
  88.     WRITELN(' View   - View current file');
  89.     WRITELN(' Print  - Use DOS 3.xx print spooler (PRINT');
  90.     WRITELN('    must be installed before starting FM)');
  91.     WRITELN(' Alt-P  - Send current file to print spool');
  92.     WRITELN(' Spec   - Change File Spec');
  93.     WRITELN(' Dir    - Change Directories');
  94. {$IFDEF MemLimited}
  95.     WRITELN(' dOs    - Exit temporarily to DOS');
  96. {$ENDIF}
  97.       WRITE(' <Esc>  - EXIT');
  98.     Reply := GetKey(#27, FALSE);
  99.     WClose;
  100.   END;
  101.   { ------------------------------------------------------------------------- }
  102.  
  103.   PROCEDURE DisplayFileNames(Start : INTEGER);
  104.   VAR
  105.     X, Y, Col    : BYTE;
  106.     DisplayCount : BYTE;
  107.     TempFRec     : FilePtr;
  108.     ScrAttr      : WORD;
  109.   BEGIN
  110.     ClrScr;
  111.     GotoXY(2, 1);
  112.     WRITE(DiskFree(0), ' Bytes Free');
  113.     GotoXY(2, 2);    WRITE('Directory: ', CurrDir);
  114.     GotoXY(2, 3);    WRITE('File Spec: ', Mask);
  115. {$IFDEF MemLimited}
  116.     GotoXY(6, 22);
  117.     WRITE(
  118.       'mArk   Copy   Move   Erase   Rename   View   Print   Spec   Dir   dOs');
  119. {$ELSE}
  120.     GotoXY(9, 22);
  121.     WRITE('mArk   Copy   Move   Erase   Rename   View   Print   Spec   Dir');
  122. {$ENDIF}
  123.     IF (ListCount = 0) THEN
  124.       BEGIN
  125.         GotoXY(4, 5);
  126.         WRITE('No Matching Files');
  127.       END
  128.     ELSE
  129.       BEGIN
  130.         Y := 5;
  131.         DisplayCount := 0;
  132.         Col := 0;
  133.         TempFRec := FirstFile;
  134.         WHILE (TempFRec^.FNum < Start) DO TempFRec := TempFRec^.Next;
  135.         REPEAT
  136.           Inc(DisplayCount);
  137.           Inc(Col);
  138.           CASE Col OF
  139.             1 : X := 4;
  140.             2 : X := 19;
  141.             3 : X := 34;
  142.             4 : X := 49;
  143.             5 : X := 64;
  144.           END;
  145.           IF (TempFRec^.Mark) THEN ScrAttr := ReverseVid
  146.           ELSE ScrAttr := NormalVid;
  147.           DisplayLine(SUCC(X), SUCC(Y), LENGTH(TempFRec^.Key),
  148.             ScrAttr, TempFRec^.Key);
  149.           DisplayEnd := TempFRec^.FNum;
  150.           TempFRec := TempFRec^.Next;
  151.           IF (Col = 5) THEN
  152.             BEGIN
  153.               Col := 0;
  154.               Inc(Y);
  155.             END;
  156.         UNTIL (DisplayCount = 80) OR (TempFRec = NIL);
  157.         CurrFile := FirstFile;
  158.         WHILE (CurrFile^.FNum < Marker) DO CurrFile := CurrFile^.Next;
  159.       END;
  160.   END;
  161.   { ------------------------------------------------------------------------- }
  162.  
  163.   PROCEDURE GetMask;
  164.   VAR
  165.     St : Str80;
  166.   BEGIN
  167.     St := Mask;
  168.     ReadStr(13, 3, 12, St);
  169.     Mask := St;
  170.     GotoXY(13, 3);  WRITE(Mask);
  171.   END;
  172.   { ------------------------------------------------------------------------- }
  173.  
  174.   PROCEDURE GetNewList;
  175.   BEGIN
  176.     GotoXY(2, 4);   WRITE(Reading);
  177.     GetFilesList(Mask, FirstFile, LastFile, ListCount);
  178.     DisplayStart := 1;
  179.     Marker := 1;
  180.     Col := 1;
  181.     Y := 5;
  182.     DisplayFileNames(1);
  183.   END;
  184.   { ------------------------------------------------------------------------- }
  185.  
  186.   PROCEDURE OpenFileManager;
  187.   BEGIN
  188.     StartX := WhereX;
  189.     StartY := WhereY;
  190.     WOpen(2);
  191.     ClrScr;
  192.     GetCurrDir;
  193.     GetNewList;
  194.   END;
  195.   { ------------------------------------------------------------------------- }
  196.  
  197. {$IFDEF FMasUNIT}
  198. PROCEDURE FileManager;
  199. {$ENDIF}
  200.  
  201. BEGIN
  202.   Mask := '*.*';
  203.   OpenFileManager;
  204.   REPEAT
  205.     GotoXY(69, 1);       WRITE(ListCount:3, ' Files');
  206.     HIGHVIDEO;
  207. {$IFDEF MemLimited}
  208.     GotoXY(7, 22);       WRITE('A');
  209.     GotoXY(13, 22);      WRITE('C');
  210.     GotoXY(20, 22);      WRITE('M');
  211.     GotoXY(27, 22);      WRITE('E');
  212.     GotoXY(35, 22);      WRITE('R');
  213.     GotoXY(44, 22);      WRITE('V');
  214.     GotoXY(51, 22);      IF SpoolOK THEN WRITE('P');
  215.     GotoXY(59, 22);      WRITE('S');
  216.     GotoXY(66, 22);      WRITE('D');
  217.     GotoXY(73, 22);      WRITE('O');
  218. {$ELSE}
  219.     GotoXY(10, 22);       WRITE('A');
  220.     GotoXY(16, 22);      WRITE('C');
  221.     GotoXY(23, 22);      WRITE('M');
  222.     GotoXY(30, 22);      WRITE('E');
  223.     GotoXY(38, 22);      WRITE('R');
  224.     GotoXY(47, 22);      WRITE('V');
  225.     GotoXY(54, 22);      IF SpoolOK THEN WRITE('P');
  226.     GotoXY(62, 22);      WRITE('S');
  227.     GotoXY(69, 22);      WRITE('D');
  228. {$ENDIF}
  229.     LOWVIDEO;
  230.     CASE Col OF
  231.       1 : X := 4;
  232.       2 : X := 19;
  233.       3 : X := 34;
  234.       4 : X := 49;
  235.       5 : X := 64;
  236.     END;
  237.     IF (ListCount > 0) THEN
  238.       BEGIN
  239.         Marker := CurrFile^.FNum;
  240.         DisplayLine(SUCC(X), SUCC(Y), LENGTH(CurrFile^.Key),
  241.           ReverseVid, CurrFile^.Key);
  242.       END
  243.     ELSE Marker := 1;
  244.     GotoXY(X, Y);
  245.     CursorOn(TRUE);
  246. {$IFDEF MemLimited}
  247.     Reply := GetKey(#0+#27+'ACMERVPSDO', TRUE);
  248. {$ELSE}
  249.     Reply := GetKey(#0+#27+'ACMERVPSD', TRUE);
  250. {$ENDIF}
  251.     IF (NOT CurrFile^.Mark) AND (ListCount > 0) AND (Reply <> F1) THEN
  252.       BEGIN
  253.         GotoXY(X, Y);
  254.         WRITE(CurrFile^.Key);        { Remove highlighting from unmarked file }
  255.         GotoXY(X, Y);
  256.       END;
  257.     IF (ListCount > 0) THEN                { Avoid dereferencing NIL pointers }
  258.       CASE Reply OF
  259.         Up : IF (Y > 5) THEN
  260.                BEGIN
  261.                  Dec(Y);
  262.                  i := 0;
  263.                  WHILE (i < 5) DO
  264.                    BEGIN
  265.                      CurrFile := CurrFile^.Last;
  266.                      Inc(i);
  267.                    END;
  268.                END;
  269.          Down : IF ((CurrFile^.FNum + 5) <= DisplayEnd) THEN
  270.                   BEGIN
  271.                     Inc(Y);
  272.                     i := 0;
  273.                     WHILE (i < 5) DO
  274.                       BEGIN
  275.                         CurrFile := CurrFile^.Next;
  276.                         Inc(i);
  277.                       END;
  278.                   END;
  279.          Left : IF (CurrFile^.FNum > DisplayStart) THEN
  280.                   BEGIN
  281.                     CurrFile := CurrFile^.Last;
  282.                     IF (Col > 1) THEN Dec(Col)
  283.                     ELSE
  284.                       BEGIN
  285.                         Col := 5;
  286.                         Dec(Y);
  287.                       END;
  288.                   END;
  289.          Right : IF (CurrFile^.FNum < DisplayEnd) THEN
  290.                    BEGIN
  291.                      CurrFile := CurrFile^.Next;
  292.                      IF (Col < 5) THEN Inc(Col)
  293.                      ELSE
  294.                        BEGIN
  295.                          Col := 1;
  296.                          Inc(Y);
  297.                        END;
  298.                    END;
  299.           PgUp : IF (DisplayStart > FirstFile^.FNum) THEN
  300.                    BEGIN
  301.                      DisplayStart := DisplayStart - 80;
  302.                      Marker := DisplayStart;
  303.                      Col := 1;
  304.                      Y := 5;
  305.                      DisplayFileNames(DisplayStart);
  306.                    END;
  307.           PgDn : IF (DisplayEnd < LastFile^.FNum) THEN
  308.                    BEGIN
  309.                      DisplayStart := DisplayStart + 80;
  310.                      Marker := DisplayStart;
  311.                      Col := 1;
  312.                      Y := 5;
  313.                      DisplayFileNames(DisplayStart);
  314.                    END;
  315.           'E' : BEGIN
  316.                   EraseFile;
  317.                   GetNewList;
  318.                 END;
  319.           'A' : CurrFile^.Mark := NOT CurrFile^.Mark;
  320.      HotPrint : IF SpoolOK THEN
  321.                   BEGIN
  322.                     SpoolFile(CurrDir + CurrFile^.Key, SpOK);
  323.                     IF NOT SpOk THEN
  324.                       WritePrompt(2, 4, 'ERROR Submitting File to Spool');
  325.                   END;
  326.           'M' : BEGIN
  327.                   MoveFile;
  328.                   GetNewList;
  329.                 END;
  330.           'C' : BEGIN
  331.                   CopyFile;
  332.                   GetNewList;
  333.                 END;
  334.           'R' : BEGIN
  335.                   DisplayLine(SUCC(X), SUCC(Y), LENGTH(CurrFile^.Key),
  336.                     ReverseVid, CurrFile^.Key);
  337.                   RenameFile;
  338.                   GetNewList;
  339.                 END;
  340.           'V' : View(CurrFile^.Key);
  341.       END;
  342.     CASE Reply OF
  343.       'S' : BEGIN
  344.               GetMask;
  345.               GetNewList;
  346.             END;
  347.       'D' : BEGIN
  348.               GetNewDirectory;
  349.               GetNewList;
  350.             END;
  351.       'P' : IF SpoolOK THEN ControlSpool;
  352. {$IFDEF MemLimited}
  353.       'O' : BEGIN
  354.               WClose;
  355.               WHILE (FirstFile <> NIL) DO
  356.                 DeleteFile(FirstFile, LastFile, FirstFile^.Key);
  357.               WRITELN;
  358.               WRITE('Type EXIT to return to File Manager...');
  359.               EXEC(EnvSearch('COMSPEC'), '');
  360.               OpenFileManager;       { Use of EnvSearch allows loading of 2nd }
  361.             END;                     { copy of COMMAND.COM from any drive.    }
  362. {$ENDIF}
  363.        F1 : Help;
  364.     END;
  365.   UNTIL (Reply = #27);
  366.   WClose;
  367.  
  368. {$IFDEF FMasUNIT}
  369. END;
  370. {$ENDIF}
  371.  
  372. END.
  373. 
  374.