209 lines
4.7 KiB
Plaintext
209 lines
4.7 KiB
Plaintext
{************************************************}
|
|
{ }
|
|
{ Turbo Pascal 6.0 }
|
|
{ Turbo Vision Demo }
|
|
{ Copyright (c) 1990 by Borland International }
|
|
{ }
|
|
{************************************************}
|
|
|
|
unit FViewer;
|
|
|
|
{$F+,O+,X+,S-,D-}
|
|
|
|
{ FileViewer object for scrolling through text files. See
|
|
TVDEMO.PAS for an example program that uses this unit.
|
|
}
|
|
|
|
interface
|
|
|
|
uses Objects, Views, Dos;
|
|
|
|
type
|
|
|
|
{ TLineCollection }
|
|
|
|
PLineCollection = ^TLineCollection;
|
|
TLineCollection = object(TCollection)
|
|
procedure FreeItem(P: Pointer); virtual;
|
|
end;
|
|
|
|
{ TFileViewer }
|
|
|
|
PFileViewer = ^TFileViewer;
|
|
TFileViewer = object(TScroller)
|
|
FileName: PString;
|
|
FileLines: PCollection;
|
|
IsValid: Boolean;
|
|
constructor Init(var Bounds: TRect; AHScrollBar, AVScrollBar: PScrollBar;
|
|
var AFileName: PathStr);
|
|
constructor Load(var S: TStream);
|
|
destructor Done; virtual;
|
|
procedure Draw; virtual;
|
|
procedure ReadFile(var FName: PathStr);
|
|
procedure SetState(AState: Word; Enable: Boolean); virtual;
|
|
procedure Store(var S: TStream);
|
|
function Valid(Command: Word): Boolean; virtual;
|
|
end;
|
|
|
|
{ TFileWindow }
|
|
|
|
PFileWindow = ^TFileWindow;
|
|
TFileWindow = object(TWindow)
|
|
constructor Init(var FileName: PathStr);
|
|
end;
|
|
|
|
const
|
|
|
|
RFileViewer: TStreamRec = (
|
|
ObjType: 10080;
|
|
VmtLink: Ofs(TypeOf(TFileViewer)^);
|
|
Load: @TFileViewer.Load;
|
|
Store: @TFileViewer.Store
|
|
);
|
|
RFileWindow: TStreamRec = (
|
|
ObjType: 10081;
|
|
VmtLink: Ofs(TypeOf(TFileWindow)^);
|
|
Load: @TFileWindow.Load;
|
|
Store: @TFileWindow.Store
|
|
);
|
|
|
|
procedure RegisterFViewer;
|
|
|
|
implementation
|
|
|
|
uses Drivers, Memory, MsgBox, App;
|
|
|
|
{ TLineCollection }
|
|
procedure TLineCollection.FreeItem(P: Pointer);
|
|
begin
|
|
DisposeStr(P);
|
|
end;
|
|
|
|
{ TFileViewer }
|
|
constructor TFileViewer.Init(var Bounds: TRect; AHScrollBar,
|
|
AVScrollBar: PScrollBar; var AFileName: PathStr);
|
|
begin
|
|
TScroller.Init(Bounds, AHScrollbar, AVScrollBar);
|
|
GrowMode := gfGrowHiX + gfGrowHiY;
|
|
FileName := nil;
|
|
ReadFile(AFileName);
|
|
end;
|
|
|
|
constructor TFileViewer.Load(var S: TStream);
|
|
var
|
|
FName: PathStr;
|
|
begin
|
|
TScroller.Load(S);
|
|
FileName := S.ReadStr;
|
|
FName := FileName^;
|
|
ReadFile(FName);
|
|
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;
|
|
|
|
procedure TFileViewer.ReadFile(var FName: PathStr);
|
|
var
|
|
FileToView: Text;
|
|
Line: String;
|
|
MaxWidth: Integer;
|
|
E: TEvent;
|
|
begin
|
|
IsValid := True;
|
|
if FileName <> nil then DisposeStr(FileName);
|
|
FileName := NewStr(FName);
|
|
FileLines := New(PLineCollection, Init(5,5));
|
|
{$I-}
|
|
Assign(FileToView, FName);
|
|
Reset(FileToView);
|
|
if IOResult <> 0 then
|
|
begin
|
|
MessageBox('Cannot open file '+FName+'.', 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+}
|
|
Limit.X := MaxWidth;
|
|
Limit.Y := FileLines^.Count;
|
|
end;
|
|
|
|
procedure TFileViewer.SetState(AState: Word; Enable: Boolean);
|
|
begin
|
|
TScroller.SetState(AState, Enable);
|
|
if Enable and (AState and sfExposed <> 0) then
|
|
SetLimit(Limit.X, Limit.Y);
|
|
end;
|
|
|
|
procedure TFileViewer.Store(var S: TStream);
|
|
begin
|
|
TScroller.Store(S);
|
|
S.WriteStr(FileName);
|
|
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;
|
|
|
|
procedure RegisterFViewer;
|
|
begin
|
|
RegisterType(RFileViewer);
|
|
RegisterType(RFileWindow);
|
|
end;
|
|
|
|
end.
|