home *** CD-ROM | disk | FTP | other *** search
- {************************************************}
- { }
- { 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.
-