source: trunk/UCompare.pas

Last change on this file was 1, checked in by chronos, 5 years ago
  • Added: Initial version.
File size: 2.9 KB
Line 
1unit UCompare;
2
3{$mode objfpc}{$H+}
4
5interface
6
7uses
8 Classes, SysUtils, Graphics, ExtCtrls, Contnrs;
9
10type
11 TFile = class
12
13 end;
14
15 { TTextFile }
16
17 TTextFile = class(TFile)
18 Lines: TStrings;
19 constructor Create;
20 procedure LoadFromFile(FileName: string);
21 end;
22
23 TLine = class
24 Text: string;
25 Number: Integer;
26 end;
27
28 TCompare = class
29
30 end;
31
32 { TTextCompare }
33
34 TTextCompare = class(TCompare)
35 TextFile: TTextFile;
36 Lines: TObjectList; // TLine
37 CharsPerLine: Integer;
38 WordWrap: Boolean;
39 LineNumbersWidth: Integer;
40 LineHeight: Integer;
41 procedure Rebuild;
42 procedure Render(Canvas: TCanvas; FromLine: Integer);
43 procedure Clear;
44 constructor Create;
45 destructor Destroy; override;
46 end;
47
48 TImageFile = class(TFile)
49 Image: TImage;
50 end;
51
52 TImageCompare = class(TCompare)
53
54 end;
55
56implementation
57
58{ TTextFile }
59
60constructor TTextFile.Create;
61begin
62 Lines := TStringList.Create;
63end;
64
65procedure TTextFile.LoadFromFile(FileName: string);
66begin
67 Lines.LoadFromFile(FileName);
68end;
69
70{ TTextCompare }
71
72procedure TTextCompare.Rebuild;
73var
74 I: Integer;
75 NewLine: TLine;
76 Text: string;
77begin
78 Lines.Clear;
79 for I := 0 to TextFile.Lines.Count - 1 do begin
80 Text := TextFile.Lines[I];
81 while True do begin
82 if WordWrap and (CharsPerLine > 0) and (Length(Text) > CharsPerLine) then begin
83 NewLine := TLine.Create;
84 NewLine.Text := Copy(Text, 1, CharsPerLine);
85 NewLine.Number := I + 1;
86 Lines.Add(NewLine);
87 Delete(Text, 1, CharsPerLine);
88 end else begin
89 NewLine := TLine.Create;
90 NewLine.Text := Text;
91 NewLine.Number := I + 1;
92 Lines.Add(NewLine);
93 Break;
94 end;
95 end;
96 end;
97end;
98
99procedure TTextCompare.Render(Canvas: TCanvas; FromLine: Integer);
100var
101 I: Integer;
102 CurrentLineNum: Integer;
103begin
104 Canvas.Font.Name := 'Courier New';
105 Canvas.Brush.Style := bsClear;
106 CurrentLineNum := -1;
107 for I := 0 to (Canvas.Height div LineHeight) - 1 do
108 if (FromLine + I) < Lines.Count then begin
109 if CurrentLineNum <> TLine(Lines[FromLine + I]).Number then begin
110 CurrentLineNum := TLine(Lines[FromLine + I]).Number;
111 Canvas.TextOut(0, I * LineHeight, IntToStr(CurrentLineNum));
112 end;
113 Canvas.TextOut(LineNumbersWidth, I * LineHeight, TLine(Lines[FromLine + I]).Text);
114 end;
115 Canvas.Pen.Color := clBlack;
116 Canvas.MoveTo(LineNumbersWidth - 3, 0);
117 Canvas.LineTo(LineNumbersWidth - 3, Canvas.Height);
118end;
119
120procedure TTextCompare.Clear;
121begin
122 TextFile.Lines.Clear;
123 Lines.Clear;
124end;
125
126constructor TTextCompare.Create;
127begin
128 LineHeight := 16;
129 LineNumbersWidth := 50;
130 CharsPerLine := 80;
131 TextFile := TTextFile.Create;
132 Lines := TObjectList.Create;
133end;
134
135destructor TTextCompare.Destroy;
136begin
137 FreeAndNil(Lines);
138 FreeAndNil(TextFile);
139 inherited;
140end;
141
142end.
143
Note: See TracBrowser for help on using the repository browser.