home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 March / Chip_1998-03_cd.bin / zkuste / delphi / WhiteAnts / CMPNAMES.ZIP / TEXTSTRM.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1997-01-20  |  9.5 KB  |  424 lines

  1. unit TextStrm;
  2.  
  3. interface
  4.  
  5. uses Classes, SysUtils;
  6.  
  7. type
  8.   TTextMode = (tmOpenRead, tmOpenWrite, tmOpenReadWrite, tmCreate, tmAppend);
  9.  
  10.  
  11. type
  12.   TTextStream = class(TObject)
  13.   public
  14.     function EndOfFile: Boolean; virtual; abstract;
  15.     procedure NewLine;
  16.     function ReadLine: String; virtual; abstract;
  17.     procedure Reset; virtual; abstract;
  18.     procedure WriteLine(const S: String); virtual; abstract;
  19.     procedure WriteLnFmt(const S: String; const Pars: array of const);
  20.   end;
  21.  
  22. type
  23.   TTextFilter = class (TTextStream)
  24.   private
  25.     FOwnsBase: Boolean;
  26.     FTextStream: TTextStream;
  27.   protected
  28.     function GetTextStream: TTextStream;
  29.     procedure SetTextStream(Value: TTextStream);
  30.   public
  31.     constructor Create(ATextStream: TTextStream; AOwnsBase: Boolean);
  32.     destructor Destroy; override;
  33.     function EndOfFile: Boolean; override;
  34.     function ReadLine: String; override;
  35.     procedure Reset; override;
  36.     procedure WriteLine(const Line: String); override;
  37.     property OwnsBase: Boolean read FOwnsBase write FOwnsBase;
  38.     property TextStream: TTextStream read GetTextStream write SetTextStream;
  39.   end;
  40.  
  41. type
  42.   TTextFile = class(TTextStream)
  43.   private
  44.     FMode: TTextMode;
  45.     FText: Text;
  46.   public
  47.     constructor Create(const FileName: String; Mode: TTextMode);
  48.     destructor Destroy; override;
  49.     function EndOfFile: Boolean; override;
  50.     function ReadLine: String; override;
  51.     procedure Reset; override;
  52.     procedure WriteLine(const Line: String); override;
  53.   end;
  54.  
  55. type
  56.   TStringsText = class (TTextStream)
  57.   private
  58.     FCurLine: Integer;
  59.     FStrings: TStrings;
  60.   protected
  61.     procedure SetStrings(Value: TStrings); virtual;
  62.   public
  63.     constructor Create(AStrings: TStrings);
  64.     destructor Destroy; override;
  65.     function EndOfFile: Boolean; override;
  66.     function LineCnt: Integer;
  67.     function ReadLine: String; override;
  68.     procedure Reset; override;
  69.     procedure WriteLine(const Line: String); override;
  70.     property Strings: TStrings read FStrings write SetStrings;
  71.   end;
  72.  
  73. type
  74.   EClipTextStreamError = class (Exception);
  75.  
  76.   TClipbrdTextStream = class(TTextStream)
  77.   private
  78.     FLines: TStringList;
  79.     FLinePos: Word;
  80.     FMode: TTextMode;
  81.     procedure ReadFromClipboard;
  82.     procedure WriteToClipboard;
  83.   public
  84.     constructor Create(Mode: TTextMode);
  85.     destructor Destroy; override;
  86.     function EndOfFile: Boolean; override;
  87.     function ReadLine: String; override;
  88.     procedure Reset; override;
  89.     procedure WriteLine(const S: String); override;
  90.   end;
  91.  
  92. type
  93.   TIndentFilter = class (TTextFilter)
  94.   private
  95.     FIndention: Integer;
  96.     procedure SetIndention(Value: Integer);
  97.   public
  98.     constructor Create(ATextStream: TTextStream; AIndention: Integer; AOwnsBase: Boolean);
  99.     function ReadLine: String; override;
  100.     procedure WriteLine(const Line: String); override;
  101.     property Indention: Integer read FIndention write SetIndention;
  102.   end;
  103.  
  104. implementation
  105.  
  106. uses WinTypes, WinProcs, Clipbrd, StrUtils, NumUtils;
  107.  
  108. {
  109. ************************************** TTextStream **************************************
  110. }
  111. procedure TTextStream.NewLine;
  112. begin
  113.   WriteLine('');
  114. end;
  115.  
  116. procedure TTextStream.WriteLnFmt(const S: String; const Pars: array of const);
  117. begin
  118.   WriteLine(Format(S, Pars));
  119. end;
  120.  
  121. {
  122. ************************************** TTextFilter **************************************
  123. }
  124. constructor TTextFilter.Create(ATextStream: TTextStream; AOwnsBase: Boolean);
  125. begin
  126.   inherited Create;
  127.   TextStream := ATextStream;
  128.   OwnsBase := AOwnsBase;
  129. end;
  130.  
  131. destructor TTextFilter.Destroy;
  132. begin
  133.   TextStream := nil;
  134.   inherited Destroy;
  135. end;
  136.  
  137. function TTextFilter.EndOfFile: Boolean;
  138. begin
  139.   Result := TextStream.EndOfFile;
  140. end;
  141.  
  142. function TTextFilter.GetTextStream: TTextStream;
  143. begin
  144.   Result := FTextStream;
  145. end;
  146.  
  147. function TTextFilter.ReadLine: String;
  148. begin
  149.   Result := TextStream.ReadLine;
  150. end;
  151.  
  152. procedure TTextFilter.Reset;
  153. begin
  154.   TextStream.Reset;
  155. end;
  156.  
  157. procedure TTextFilter.SetTextStream(Value: TTextStream);
  158. begin
  159.   if Value <> FTextStream then
  160.   begin
  161.     if OwnsBase then FTextStream.Free;
  162.     FTextStream := Value;
  163.   end;
  164. end;
  165.  
  166. procedure TTextFilter.WriteLine(const Line: String);
  167. begin
  168.   TextStream.WriteLine(Line);
  169. end;
  170.  
  171. {
  172. ********************************** TTextFile **********************************
  173. }
  174. constructor TTextFile.Create(const FileName: String; Mode: TTextMode);
  175. begin
  176.   inherited Create;
  177.   FMode := Mode;
  178.   case FMode of
  179.     tmOpenRead:
  180.        begin
  181.          AssignFile(FText, FileName);
  182.          SYSTEM.Reset(FText);
  183.        end;
  184.     tmOpenWrite, tmCreate:
  185.        begin
  186.          AssignFile(FText, FileName);
  187.          Rewrite(FText);
  188.        end;
  189.     tmAppend:
  190.        begin
  191.          AssignFile(FText, FileName);
  192.          Append(FText);
  193.        end;
  194.   else
  195.     raise EInOutError.Create('Illegal Mode for TextFile');
  196.   end;
  197. end;
  198.  
  199. destructor TTextFile.Destroy;
  200. begin
  201.   CloseFile(FText);
  202.   inherited Destroy;
  203. end;
  204.  
  205. function TTextFile.EndOfFile: Boolean;
  206. begin
  207.   Result := EOF(FText);
  208. end;
  209.  
  210. function TTextFile.ReadLine: String;
  211. begin
  212.   ReadLn(FText, Result);
  213. end;
  214.  
  215. procedure TTextFile.Reset;
  216. begin
  217.   SYSTEM.Reset(FText);
  218. end;
  219.  
  220. procedure TTextFile.WriteLine(const Line: String);
  221. begin
  222.   WriteLn(FText, Line);
  223. end;
  224.  
  225. {
  226. ************************************** TStringsText **************************************
  227. }
  228. constructor TStringsText.Create(AStrings: TStrings);
  229. begin
  230.   inherited Create;
  231.   Strings := AStrings;
  232. end;
  233.  
  234. destructor TStringsText.Destroy;
  235. begin
  236.   Strings := nil;
  237.   inherited Destroy;
  238. end;
  239.  
  240. function TStringsText.EndOfFile: Boolean;
  241. begin
  242.   Result := FCurLine = LineCnt;
  243. end;
  244.  
  245. function TStringsText.LineCnt: Integer;
  246. begin
  247.   if Assigned(FStrings) then
  248.     Result := FStrings.Count
  249.   else
  250.     Result := 0;
  251. end;
  252.  
  253. function TStringsText.ReadLine: String;
  254. begin
  255.   if FCurLine < LineCnt then
  256.   begin
  257.     Result := FStrings[FCurLine];
  258.     Inc(FCurLine);
  259.   end
  260.   else
  261.    Result := '';
  262. end;
  263.  
  264. procedure TStringsText.Reset;
  265. begin
  266.   FCurLine := 0;
  267. end;
  268.  
  269. procedure TStringsText.SetStrings(Value: TStrings);
  270. begin
  271.   if FStrings <> Value then
  272.   begin
  273.     if Assigned(FStrings) then FStrings.EndUpdate;
  274.     FStrings := Value;
  275.     if Assigned(FStrings) then FStrings.BeginUpdate;
  276.     Reset;
  277.   end;
  278. end;
  279.  
  280. procedure TStringsText.WriteLine(const Line: String);
  281. begin
  282.   if Assigned(FStrings) then
  283.   begin
  284.     if FCurLine < FStrings.Count then
  285.       FStrings[FCurLine] := Line
  286.     else
  287.       FStrings.Add(Line);
  288.     Inc(FCurLine);
  289.   end;
  290. end;
  291.  
  292. {
  293. ************************* TClipbrdTextStream **********************************
  294. }
  295. constructor TClipbrdTextStream.Create(Mode: TTextMode);
  296. var ASize: LongInt;
  297. begin
  298.   if Mode in [tmOpenReadWrite] then
  299.     raise EInOutError.Create('Illegal mode for clipboard text stream');
  300.   inherited Create;
  301.   FMode := Mode;
  302.   FLines := TStringList.Create;
  303.   FLinePos := 0;
  304.   if FMode in [tmOpenRead, tmAppend] then ReadFromClipboard;
  305.   if FMode = tmAppend then FLinePos := FLines.Count;
  306. end;
  307.  
  308. destructor TClipbrdTextStream.Destroy;
  309. begin
  310.   if FMode in [tmOpenWrite, tmCreate, tmAppend] then WriteToClipboard;
  311.   FLines.Free;
  312.   inherited Destroy;
  313. end;
  314.  
  315. function TClipbrdTextStream.EndOfFile: Boolean;
  316. begin
  317.   if FMode in [tmOpenWrite, tmCreate, tmAppend] then
  318.     Result := True
  319.   else
  320.     Result := FLinePos = FLines.Count;
  321. end;
  322.  
  323. function TClipbrdTextStream.ReadLine: String;
  324. begin
  325.   if FMode = tmOpenRead then
  326.     if FLinePos >= FLines.Count then
  327.       Result := ''
  328.     else
  329.     begin
  330.       Result := FLines[FLinePos];
  331.       Inc(FLinePos);
  332.     end
  333.   else
  334.     raise EInOutError.Create('Can not read from write only stream')
  335. end;
  336.  
  337. procedure TClipbrdTextStream.ReadFromClipboard;
  338. var Buf: PChar;
  339.     Data: THandle;
  340.     DataPtr: Pointer;
  341.     Size: Longint;
  342. begin
  343.   FLinePos := 0;
  344.   if Clipboard.HasFormat(CF_TEXT) then
  345.   begin
  346.     GetMem(Buf, MaxInt);
  347.     try
  348.       Clipboard.GetTextBuf(Buf, MaxInt);
  349.       FLines.SetText(Buf);
  350.     finally
  351.       FreeMem(Buf, MaxInt);
  352.     end;
  353.   end;
  354. end;
  355.  
  356. procedure TClipbrdTextStream.Reset;
  357. begin
  358.   FLinePos := 0;
  359.   if FMode <> tmOpenRead then FLines.Clear;
  360. end;
  361.  
  362. procedure TClipbrdTextStream.WriteLine(const S: String);
  363. begin
  364.   if FMode <> tmOpenRead then
  365.   begin
  366.     FLines.Add(S);
  367.     Inc(FLinePos);
  368.   end
  369.   else
  370.     raise EInOutError.Create('Can not read from to write only stream')
  371. end;
  372.  
  373. procedure TClipbrdTextStream.WriteToClipboard;
  374. var
  375.   I: Integer;
  376.   Buf: PChar;
  377.   Data: THandle;
  378.   DataPtr: Pointer;
  379.   Size: LongInt;
  380. begin
  381.   Clipboard.Open;
  382.   try
  383.     { Write text }
  384.     if (FLines.Count > 0) then
  385.     begin
  386.       Buf := FLines.GetText; { allocated by Lines }
  387.       try
  388.         Clipboard.SetTextBuf(Buf);
  389.       finally
  390.         StrDispose(Buf); { Free here }
  391.       end;
  392.     end;
  393.   finally
  394.     Clipboard.Close;
  395.   end;
  396. end;
  397.  
  398. {
  399. ************************************* TIndentFilter **************************************
  400. }
  401. constructor TIndentFilter.Create(ATextStream: TTextStream; AIndention: Integer;
  402.     AOwnsBase: Boolean);
  403. begin
  404.   inherited Create(ATextStream, AOwnsBase);
  405.   SetIndention(AIndention);
  406. end;
  407.  
  408. function TIndentFilter.ReadLine: String;
  409. begin
  410.   Result := BlankString(FIndention) + inherited ReadLine;
  411. end;
  412.  
  413. procedure TIndentFilter.SetIndention(Value: Integer);
  414. begin
  415.   FIndention := Max2Int(0, Value);
  416. end;
  417.  
  418. procedure TIndentFilter.WriteLine(const Line: String);
  419. begin
  420.   inherited WriteLine(BlankString(FIndention) + Line);
  421. end;
  422.  
  423. end.
  424.