{************************************************} { } { Turbo Pascal 6.0 } { Turbo Vision browser program } { } { Copyright (c) 1990 by Borland International } { } {************************************************} {$X+} program FileView; {$M 16384,16384,655360} uses Dos, Objects, Drivers, Memory, Views, Menus, Dialogs, StdDlg, MsgBox, App; const cmFileOpen = 100; cmChangeDir = 101; hlChangeDir = cmChangeDir; { History list ID for change dir box } type { TLineCollection } PLineCollection = ^TLineCollection; TLineCollection = object(TCollection) procedure FreeItem(P: Pointer); virtual; end; { TFileViewer } PFileViewer = ^TFileViewer; TFileViewer = object(TScroller) FileLines: PCollection; IsValid: Boolean; constructor Init(var Bounds: TRect; AHScrollBar, AVScrollBar: PScrollBar; var FileName: PathStr); destructor Done; virtual; procedure Draw; virtual; function Valid(Command: Word): Boolean; virtual; end; { TFileWindow } PFileWindow = ^TFileWindow; TFileWindow = object(TWindow) constructor Init(var FileName: PathStr); end; { TFileViewerApp } PFileViewerApp = ^TFileViewerApp; TFileViewerApp = object(TApplication) procedure HandleEvent(var Event: TEvent); virtual; procedure InitMenuBar; virtual; procedure InitStatusLine; virtual; procedure OutOfMemory; virtual; end; { TLineCollection } procedure TLineCollection.FreeItem(P: Pointer); begin DisposeStr(P); end; { TFileViewer } constructor TFileViewer.Init(var Bounds: TRect; AHScrollBar, AVScrollBar: PScrollBar; var FileName: PathStr); var FileToView: Text; Line: String; MaxWidth: Integer; begin TScroller.Init(Bounds, AHScrollbar, AVScrollBar); GrowMode := gfGrowHiX + gfGrowHiY; IsValid := True; FileLines := New(PLineCollection, Init(5,5)); {$I-} Assign(FileToView, FileName); Reset(FileToView); if IOResult <> 0 then begin MessageBox('Cannot open file '+Filename+'.', nil, mfError + mfOkButton); IsValid := False; end else begin MaxWidth := 0; while not Eof(FileToView) and not LowMemory do begin Readln(FileToView, Line); if Length(Line) > MaxWidth then MaxWidth := Length(Line); FileLines^.Insert(NewStr(Line)); end; Close(FileToView); end; {$I+} SetLimit(MaxWidth, FileLines^.Count); end; destructor TFileViewer.Done; begin Dispose(FileLines, Done); TScroller.Done; end; procedure TFileViewer.Draw; var B: TDrawBuffer; C: Byte; I: Integer; S: String; P: PString; begin C := GetColor(1); for I := 0 to Size.Y - 1 do begin MoveChar(B, ' ', C, Size.X); if Delta.Y + I < FileLines^.Count then begin P := FileLines^.At(Delta.Y + I); if P <> nil then S := Copy(P^, Delta.X + 1, Size.X) else S := ''; MoveStr(B, S, C); end; WriteLine(0, I, Size.X, 1, B); end; end; function TFileViewer.Valid(Command: Word): Boolean; begin Valid := IsValid; end; { TFileWindow } constructor TFileWindow.Init(var FileName: PathStr); const WinNumber: Integer = 1; var R: TRect; begin Desktop^.GetExtent(R); TWindow.Init(R, Filename, WinNumber); Options := Options or ofTileable; Inc(WinNumber); GetExtent(R); R.Grow(-1, -1); Insert(New(PFileViewer, Init(R, StandardScrollBar(sbHorizontal + sbHandleKeyboard), StandardScrollBar(sbVertical + sbHandleKeyboard), Filename))); end; { TFileViewerApp } procedure TFileViewerApp.HandleEvent(var Event: TEvent); procedure FileOpen; var D: PFileDialog; FileName: PathStr; W: PWindow; begin D := PFileDialog(ValidView(New(PFileDialog, Init('*.*', 'Open a File', '~N~ame', fdOpenButton, 100)))); if D <> nil then begin if Desktop^.ExecView(D) <> cmCancel then begin D^.GetFileName(FileName); W := PWindow(ValidView(New(PFileWindow,Init(FileName)))); if W <> nil then Desktop^.Insert(W); end; Dispose(D, Done); end; end; procedure ChangeDir; var D: PChDirDialog; begin D := PChDirDialog(ValidView(New(PChDirDialog, Init(0, hlChangeDir)))); if D <> nil then begin DeskTop^.ExecView(D); Dispose(D, Done); end; end; procedure Tile; var R: TRect; begin Desktop^.GetExtent(R); Desktop^.Tile(R); end; procedure Cascade; var R: TRect; begin Desktop^.GetExtent(R); Desktop^.Cascade(R); end; begin TApplication.HandleEvent(Event); case Event.What of evCommand: begin case Event.Command of cmFileOpen: FileOpen; cmChangeDir: ChangeDir; cmCascade: Cascade; cmTile: Tile; else Exit; end; ClearEvent(Event); end; end; end; procedure TFileViewerApp.InitMenuBar; var R: TRect; begin GetExtent(R); R.B.Y := R.A.Y+1; MenuBar := New(PMenuBar, Init(R, NewMenu( NewSubMenu('~F~ile', 100, NewMenu( NewItem('~O~pen...', 'F3', kbF3, cmFileOpen, hcNoContext, NewItem('~C~hange dir...', '', kbNoKey, cmChangeDir, hcNoContext, NewItem('E~x~it', 'Alt-X', kbAltX, cmQuit, hcNoContext, nil)))), NewSubMenu('~W~indows', hcNoContext, NewMenu( NewItem('~R~esize/move','Ctrl-F5', kbCtrlF5,cmResize, hcNoContext, NewItem('~Z~oom', 'F5', kbF5, cmZoom, hcNoContext, NewItem('~N~ext', 'F6', kbF6, cmNext, hcNoContext, NewItem('~C~lose', 'Alt-F3', kbAltF3, cmClose, hcNoContext, NewItem('~T~ile', '', kbNoKey, cmTile, hcNoContext, NewItem('C~a~scade', '', kbNoKey, cmCascade, hcNoContext, nil))))))), nil))))); end; procedure TFileViewerApp.InitStatusLine; var R: TRect; begin GetExtent(R); R.A.Y := R.B.Y - 1; StatusLine := New(PStatusLine, Init(R, NewStatusDef(0, $FFFF, NewStatusKey('', kbF10, cmMenu, NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit, NewStatusKey('~F3~ Open', kbF3, cmFileOpen, NewStatusKey('~F5~ Zoom', kbF5, cmZoom, NewStatusKey('~Alt-F3~ Close', kbAltF3, cmClose, nil))))), nil))); end; procedure TFileViewerApp.OutOfMemory; var D: PDialog; R: TRect; C: Word; begin MessageBox('Not enough memory available to complete operation.', nil, mfError + mfOkButton); end; var FileViewerApp: TFileViewerApp; begin FileViewerApp.Init; FileViewerApp.Run; FileViewerApp.Done; end.