home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / TPASCAL3.ZIP / TVDEMOS.ZIP / FILEVIEW.PAS < prev    next >
Pascal/Delphi Source File  |  1991-06-11  |  7KB  |  279 lines

  1. {************************************************}
  2. {                                                }
  3. {   Turbo Pascal 6.0                             }
  4. {   Turbo Vision browser program                 }
  5. {                                                }
  6. {   Copyright (c) 1990 by Borland International  }
  7. {                                                }
  8. {************************************************}
  9.  
  10. {$X+}
  11.  
  12. program FileView;
  13.  
  14. {$M 16384,16384,655360}
  15.  
  16. uses
  17.   Dos, Objects, Drivers, Memory, Views, Menus, Dialogs, StdDlg, MsgBox, App;
  18.  
  19. const
  20.   cmFileOpen  = 100;
  21.   cmChangeDir = 101;
  22.   hlChangeDir = cmChangeDir;     { History list ID for change dir box }
  23.  
  24. type
  25.  
  26.   { TLineCollection }
  27.  
  28.   PLineCollection = ^TLineCollection;
  29.   TLineCollection = object(TCollection)
  30.     procedure FreeItem(P: Pointer); virtual;
  31.   end;
  32.  
  33.   { TFileViewer }
  34.  
  35.   PFileViewer = ^TFileViewer;
  36.   TFileViewer = object(TScroller)
  37.     FileLines: PCollection;
  38.     IsValid: Boolean;
  39.     constructor Init(var Bounds: TRect; AHScrollBar, AVScrollBar: PScrollBar;
  40.       var FileName: PathStr);
  41.     destructor Done; virtual;
  42.     procedure Draw; virtual;
  43.     function Valid(Command: Word): Boolean; virtual;
  44.   end;
  45.  
  46.   { TFileWindow }
  47.  
  48.   PFileWindow = ^TFileWindow;
  49.   TFileWindow = object(TWindow)
  50.     constructor Init(var FileName: PathStr);
  51.   end;
  52.  
  53.   { TFileViewerApp }
  54.  
  55.   PFileViewerApp = ^TFileViewerApp;
  56.   TFileViewerApp = object(TApplication)
  57.     procedure HandleEvent(var Event: TEvent); virtual;
  58.     procedure InitMenuBar; virtual;
  59.     procedure InitStatusLine; virtual;
  60.     procedure OutOfMemory; virtual;
  61.   end;
  62.  
  63. { TLineCollection }
  64. procedure TLineCollection.FreeItem(P: Pointer);
  65. begin
  66.   DisposeStr(P);
  67. end;
  68.  
  69. { TFileViewer }
  70. constructor TFileViewer.Init(var Bounds: TRect; AHScrollBar,
  71.   AVScrollBar: PScrollBar; var FileName: PathStr);
  72. var
  73.   FileToView: Text;
  74.   Line: String;
  75.   MaxWidth: Integer;
  76.  
  77. begin
  78.   TScroller.Init(Bounds, AHScrollbar, AVScrollBar);
  79.   GrowMode := gfGrowHiX + gfGrowHiY;
  80.   IsValid := True;
  81.   FileLines := New(PLineCollection, Init(5,5));
  82.   {$I-}
  83.   Assign(FileToView, FileName);
  84.   Reset(FileToView);
  85.   if IOResult <> 0 then
  86.   begin
  87.     MessageBox('Cannot open file '+Filename+'.', nil, mfError + mfOkButton);
  88.     IsValid := False;
  89.   end
  90.   else
  91.   begin
  92.     MaxWidth := 0;
  93.     while not Eof(FileToView) and not LowMemory do
  94.     begin
  95.       Readln(FileToView, Line);
  96.       if Length(Line) > MaxWidth then MaxWidth := Length(Line);
  97.       FileLines^.Insert(NewStr(Line));
  98.     end;
  99.     Close(FileToView);
  100.   end;
  101.   {$I+}
  102.   SetLimit(MaxWidth, FileLines^.Count);
  103. end;
  104.  
  105. destructor TFileViewer.Done;
  106. begin
  107.   Dispose(FileLines, Done);
  108.   TScroller.Done;
  109. end;
  110.  
  111. procedure TFileViewer.Draw;
  112. var
  113.   B: TDrawBuffer;
  114.   C: Byte;
  115.   I: Integer;
  116.   S: String;
  117.   P: PString;
  118. begin
  119.   C := GetColor(1);
  120.   for I := 0 to Size.Y - 1 do
  121.   begin
  122.     MoveChar(B, ' ', C, Size.X);
  123.     if Delta.Y + I < FileLines^.Count then
  124.     begin
  125.       P := FileLines^.At(Delta.Y + I);
  126.       if P <> nil then S := Copy(P^, Delta.X + 1, Size.X)
  127.       else S := '';
  128.       MoveStr(B, S, C);
  129.     end;
  130.     WriteLine(0, I, Size.X, 1, B);
  131.   end;
  132. end;
  133.  
  134. function TFileViewer.Valid(Command: Word): Boolean;
  135. begin
  136.   Valid := IsValid;
  137. end;
  138.  
  139. { TFileWindow }
  140. constructor TFileWindow.Init(var FileName: PathStr);
  141. const
  142.   WinNumber: Integer = 1;
  143. var
  144.   R: TRect;
  145. begin
  146.   Desktop^.GetExtent(R);
  147.   TWindow.Init(R, Filename, WinNumber);
  148.   Options := Options or ofTileable;
  149.   Inc(WinNumber);
  150.   GetExtent(R);
  151.   R.Grow(-1, -1);
  152.   Insert(New(PFileViewer, Init(R,
  153.     StandardScrollBar(sbHorizontal + sbHandleKeyboard),
  154.     StandardScrollBar(sbVertical + sbHandleKeyboard), Filename)));
  155. end;
  156.  
  157. { TFileViewerApp }
  158. procedure TFileViewerApp.HandleEvent(var Event: TEvent);
  159.  
  160. procedure FileOpen;
  161. var
  162.   D: PFileDialog;
  163.   FileName: PathStr;
  164.   W: PWindow;
  165. begin
  166.   D := PFileDialog(ValidView(New(PFileDialog, Init('*.*', 'Open a File',
  167.     '~N~ame', fdOpenButton, 100))));
  168.   if D <> nil then
  169.   begin
  170.     if Desktop^.ExecView(D) <> cmCancel then
  171.     begin
  172.       D^.GetFileName(FileName);
  173.       W := PWindow(ValidView(New(PFileWindow,Init(FileName))));
  174.       if W <> nil then Desktop^.Insert(W);
  175.     end;
  176.     Dispose(D, Done);
  177.   end;
  178. end;
  179.  
  180. procedure ChangeDir;
  181. var
  182.   D: PChDirDialog;
  183. begin
  184.   D := PChDirDialog(ValidView(New(PChDirDialog, Init(0, hlChangeDir))));
  185.   if D <> nil then
  186.   begin
  187.     DeskTop^.ExecView(D);
  188.     Dispose(D, Done);
  189.   end;
  190. end;
  191.  
  192. procedure Tile;
  193. var
  194.   R: TRect;
  195. begin
  196.   Desktop^.GetExtent(R);
  197.   Desktop^.Tile(R);
  198. end;
  199.  
  200. procedure Cascade;
  201. var
  202.   R: TRect;
  203. begin
  204.   Desktop^.GetExtent(R);
  205.   Desktop^.Cascade(R);
  206. end;
  207.  
  208. begin
  209.   TApplication.HandleEvent(Event);
  210.   case Event.What of
  211.     evCommand:
  212.       begin
  213.         case Event.Command of
  214.           cmFileOpen: FileOpen;
  215.           cmChangeDir: ChangeDir;
  216.           cmCascade: Cascade;
  217.           cmTile: Tile;
  218.         else
  219.           Exit;
  220.         end;
  221.         ClearEvent(Event);
  222.       end;
  223.   end;
  224. end;
  225.  
  226. procedure TFileViewerApp.InitMenuBar;
  227. var
  228.   R: TRect;
  229. begin
  230.   GetExtent(R);
  231.   R.B.Y := R.A.Y+1;
  232.   MenuBar := New(PMenuBar, Init(R, NewMenu(
  233.     NewSubMenu('~F~ile', 100, NewMenu(
  234.       NewItem('~O~pen...', 'F3', kbF3, cmFileOpen, hcNoContext,
  235.       NewItem('~C~hange dir...', '', kbNoKey, cmChangeDir, hcNoContext,
  236.       NewItem('E~x~it', 'Alt-X', kbAltX, cmQuit, hcNoContext, nil)))),
  237.     NewSubMenu('~W~indows', hcNoContext, NewMenu(
  238.       NewItem('~R~esize/move','Ctrl-F5', kbCtrlF5,cmResize, hcNoContext,
  239.       NewItem('~Z~oom', 'F5', kbF5, cmZoom, hcNoContext,
  240.       NewItem('~N~ext', 'F6', kbF6, cmNext, hcNoContext,
  241.       NewItem('~C~lose', 'Alt-F3', kbAltF3, cmClose, hcNoContext,
  242.       NewItem('~T~ile', '', kbNoKey, cmTile, hcNoContext,
  243.       NewItem('C~a~scade', '', kbNoKey, cmCascade, hcNoContext, nil))))))), nil)))));
  244. end;
  245.  
  246. procedure TFileViewerApp.InitStatusLine;
  247. var
  248.   R: TRect;
  249. begin
  250.   GetExtent(R);
  251.   R.A.Y := R.B.Y - 1;
  252.   StatusLine := New(PStatusLine, Init(R,
  253.     NewStatusDef(0, $FFFF,
  254.       NewStatusKey('', kbF10, cmMenu,
  255.       NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit,
  256.       NewStatusKey('~F3~ Open', kbF3, cmFileOpen,
  257.       NewStatusKey('~F5~ Zoom', kbF5, cmZoom,
  258.       NewStatusKey('~Alt-F3~ Close', kbAltF3, cmClose, nil))))), nil)));
  259. end;
  260.  
  261. procedure TFileViewerApp.OutOfMemory;
  262. var
  263.   D: PDialog;
  264.   R: TRect;
  265.   C: Word;
  266. begin
  267.   MessageBox('Not enough memory available to complete operation.',
  268.     nil, mfError + mfOkButton);
  269. end;
  270.  
  271. var
  272.   FileViewerApp: TFileViewerApp;
  273.  
  274. begin
  275.   FileViewerApp.Init;
  276.   FileViewerApp.Run;
  277.   FileViewerApp.Done;
  278. end.
  279.