source: tags/1.4.0/Forms/UFormCompare.pas

Last change on this file was 134, checked in by chronos, 3 years ago
  • Modified: UDataFile unit moved into Common package and TDataFile class made TComponent descendant.
File size: 9.7 KB
Line 
1unit UFormCompare;
2
3interface
4
5uses
6 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
7 UVCard, Diff, LCLType, LCLIntf, ComCtrls, Buttons, Menus, ActnList, SynEdit,
8 SynEditMiscClasses, SynHighlighterPosition, SynEditHighlighter, UCommon,
9 USynEditEx;
10
11type
12
13 { TFormCompare }
14
15 TFormCompare = class(TForm)
16 ASwitchSides: TAction;
17 AReloadFiles: TAction;
18 AFileOpenLeft: TAction;
19 AFileOpenRight: TAction;
20 ActionList1: TActionList;
21 EditLeftFileName: TEdit;
22 EditRightFileName: TEdit;
23 MainMenu1: TMainMenu;
24 MenuItem1: TMenuItem;
25 MenuItem2: TMenuItem;
26 MenuItem3: TMenuItem;
27 MenuItem4: TMenuItem;
28 MenuItem5: TMenuItem;
29 MenuItemClose: TMenuItem;
30 OpenDialogSide: TOpenDialog;
31 PanelLeft: TPanel;
32 PanelRight: TPanel;
33 SpeedButtonOpenLeft: TSpeedButton;
34 SpeedButtonOpenRight: TSpeedButton;
35 Splitter1: TSplitter;
36 SynEditLeft: TSynEditEx;
37 SynEditRight: TSynEditEx;
38 procedure AFileOpenLeftExecute(Sender: TObject);
39 procedure AFileOpenRightExecute(Sender: TObject);
40 procedure AReloadFilesExecute(Sender: TObject);
41 procedure ASwitchSidesExecute(Sender: TObject);
42 procedure FormActivate(Sender: TObject);
43 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
44 procedure FormCreate(Sender: TObject);
45 procedure FormDestroy(Sender: TObject);
46 procedure FormResize(Sender: TObject);
47 procedure FormShow(Sender: TObject);
48 procedure MenuItemCloseClick(Sender: TObject);
49 procedure SynEditLeftChange(Sender: TObject);
50 procedure SynEditLeftScroll(Sender: TObject);
51 procedure SynEditRightChange(Sender: TObject);
52 procedure SynEditRightScroll(Sender: TObject);
53 private
54 FLeftSide: string;
55 FRightSide: string;
56 Diff: TDiff;
57 HighlighterLeft: TSynPositionHighlighter;
58 HighlighterRight: TSynPositionHighlighter;
59 AttrAdded: TtkTokenKind;
60 AttrDeleted: TtkTokenKind;
61 AttrModified: TtkTokenKind;
62 LastWidth: Integer;
63 procedure SetLeftSide(AValue: string);
64 procedure SetRightSide(AValue: string);
65 procedure ReloadContent;
66 procedure UpdateInterface;
67 procedure UpdateHighlight;
68 function LoadFile(AFileName: string): string;
69 public
70 procedure LoadFileLeft(FileName: string);
71 procedure LoadFileRight(FileName: string);
72 property LeftSide: string read FLeftSide write SetLeftSide;
73 property RightSide: string read FRightSide write SetRightSide;
74 end;
75
76var
77 FormCompare: TFormCompare;
78
79
80implementation
81
82{$R *.lfm}
83
84uses
85 UCore, UVCardFile;
86
87{ TFormCompare }
88
89procedure TFormCompare.FormClose(Sender: TObject; var CloseAction: TCloseAction
90 );
91begin
92 Core.PersistentForm1.Save(Self);
93end;
94
95procedure TFormCompare.ASwitchSidesExecute(Sender: TObject);
96var
97 TempFileName: string;
98 TempContent: string;
99begin
100 TempContent := SynEditLeft.Text;
101 SynEditLeft.Text := SynEditRight.Text;
102 SynEditRight.Text := TempContent;
103
104 TempFileName := EditLeftFileName.Text;
105 EditLeftFileName.Text := EditRightFileName.Text;
106 EditRightFileName.Text := TempFileName;
107
108 UpdateInterface;
109 UpdateHighlight;
110end;
111
112procedure TFormCompare.FormActivate(Sender: TObject);
113begin
114 if LastWidth = -1 then LastWidth := Width;
115end;
116
117procedure TFormCompare.AReloadFilesExecute(Sender: TObject);
118begin
119 LoadFileLeft(EditLeftFileName.Text);
120 LoadFileRight(EditRightFileName.Text);
121 UpdateHighlight;
122 UpdateInterface;
123end;
124
125procedure TFormCompare.AFileOpenLeftExecute(Sender: TObject);
126begin
127 OpenDialogSide.InitialDir := ExtractFileDir(EditLeftFileName.Text);
128 OpenDialogSide.FileName := ExtractFileName(EditLeftFileName.Text);
129 if OpenDialogSide.Execute then begin
130 EditLeftFileName.Text := OpenDialogSide.FileName;
131 SynEditLeft.Text := LoadFileToStr(OpenDialogSide.FileName);
132 end;
133end;
134
135procedure TFormCompare.AFileOpenRightExecute(Sender: TObject);
136begin
137 OpenDialogSide.InitialDir := ExtractFileDir(EditRightFileName.Text);
138 OpenDialogSide.FileName := ExtractFileName(EditRightFileName.Text);
139 if OpenDialogSide.Execute then begin
140 EditRightFileName.Text := OpenDialogSide.FileName;
141 SynEditRight.Text := LoadFileToStr(OpenDialogSide.FileName);
142 end;
143 UpdateHighlight;
144end;
145
146procedure TFormCompare.FormCreate(Sender: TObject);
147begin
148 Core.Translator.TranslateComponentRecursive(Self);
149 Core.ThemeManager1.UseTheme(Self);
150 Diff := TDiff.Create(Self);
151
152 HighlighterLeft := TSynPositionHighlighter.Create(Self);
153 with HighlighterLeft do begin
154 AttrAdded := CreateTokenID('Added', clNone, clLightGreen, []);
155 AttrDeleted := CreateTokenID('Deleted', clNone, clLightBlue, []);
156 AttrModified := CreateTokenID('Modified', clNone, clLightRed, []);
157 end;
158 SynEditLeft.Highlighter := HighlighterLeft;
159
160 HighlighterRight := TSynPositionHighlighter.Create(Self);
161 with HighlighterRight do begin
162 AttrAdded := CreateTokenID('Added', clNone, clLightGreen, []);
163 AttrDeleted := CreateTokenID('Deleted', clNone, clLightBlue, []);
164 AttrModified := CreateTokenID('Modified', clNone, clLightRed, []);
165 end;
166 SynEditRight.Highlighter := HighlighterRight;
167
168 LastWidth := -1;
169end;
170
171procedure TFormCompare.FormDestroy(Sender: TObject);
172begin
173 FreeAndNil(HighlighterLeft);
174 FreeAndNil(HighlighterRight);
175 FreeAndNil(Diff);
176end;
177
178procedure TFormCompare.FormResize(Sender: TObject);
179var
180 LastHandler: TNotifyEvent;
181 NewPanelWidth: Integer;
182const
183 MaxRatio = 0.8;
184begin
185 if LastWidth <> -1 then begin
186 LastHandler := PanelLeft.OnResize;
187 try
188 PanelLeft.OnResize := nil;
189 NewPanelWidth := Round((PanelLeft.Width / LastWidth) * Width);
190 if NewPanelWidth > Round(Width * MaxRatio) then NewPanelWidth := Round(Width * MaxRatio);
191 PanelLeft.Width := NewPanelWidth;
192 finally
193 PanelLeft.OnResize := LastHandler;
194 end;
195 LastWidth := Width;
196 end;
197end;
198
199procedure TFormCompare.FormShow(Sender: TObject);
200begin
201 Core.PersistentForm1.Load(Self);
202 UpdateInterface;
203 ReloadContent;
204end;
205
206procedure TFormCompare.MenuItemCloseClick(Sender: TObject);
207begin
208 Close;
209end;
210
211procedure TFormCompare.SynEditLeftChange(Sender: TObject);
212begin
213 UpdateHighlight;
214end;
215
216procedure TFormCompare.SynEditLeftScroll(Sender: TObject);
217begin
218 SynEditRight.TopLine := SynEditLeft.TopLine;
219end;
220
221procedure TFormCompare.SynEditRightChange(Sender: TObject);
222begin
223 UpdateHighlight;
224end;
225
226procedure TFormCompare.SynEditRightScroll(Sender: TObject);
227begin
228 SynEditLeft.TopLine := SynEditRight.TopLine;
229end;
230
231procedure TFormCompare.SetLeftSide(AValue: string);
232begin
233 if FLeftSide = AValue then Exit;
234 FLeftSide := AValue;
235end;
236
237procedure TFormCompare.SetRightSide(AValue: string);
238begin
239 if FRightSide = AValue then Exit;
240 FRightSide := AValue;
241end;
242
243procedure TFormCompare.ReloadContent;
244begin
245 UpdateHighlight;
246end;
247
248procedure TFormCompare.UpdateInterface;
249begin
250end;
251
252procedure TFormCompare.UpdateHighlight;
253var
254 LeftText: string;
255 RightText: string;
256 I: Integer;
257 LastKind: TChangeKind;
258 P1: TPoint;
259 P2: TPoint;
260 Rec: TCompareRec;
261 NextToken1: TtkTokenKind;
262 NextToken2: TtkTokenKind;
263begin
264 LeftText := SynEditLeft.Lines.Text;
265 RightText := SynEditRight.Lines.Text;
266
267 Diff.Execute(PChar(LeftText), PChar(RightText), Length(LeftText), Length(RightText));
268
269 HighlighterLeft.ClearAllTokens;
270 HighlighterRight.ClearAllTokens;
271 LeftText := '';
272 RightText := '';
273 LastKind := ckNone;
274 P1 := Point(1, 0);
275 P2 := Point(1, 0);
276 NextToken1 := tkText;
277 NextToken2 := tkText;
278 for I := 0 to Diff.Count - 1 do
279 with Diff.Compares[I] do begin
280 Rec := Diff.Compares[I];
281 if Rec.Chr1 = LineEnding then begin
282 if NextToken1 <> tkText then begin
283 HighlighterLeft.AddToken(P1.Y, 0, NextToken1);
284 NextToken1 := tkText;
285 end;
286 Inc(P1.Y);
287 P1.X := 0;
288 LeftText := LeftText + Rec.Chr1;
289 end else begin
290 if Kind = ckAdd then LeftText := LeftText + ' '
291 else LeftText := LeftText + Rec.chr1;
292 if Kind <> LastKind then begin
293 HighlighterLeft.AddToken(P1.Y, P1.X, NextToken1);
294 if Kind = ckNone then NextToken1 := tkText
295 //else if Kind = ckAdd then NextToken1 := AttrAdded
296 else if Kind = ckDelete then NextToken1 := AttrDeleted
297 else if Kind = ckModify then NextToken1 := AttrModified;
298 end;
299 Inc(P1.X);
300 end;
301
302 if Rec.Chr2 = LineEnding then begin
303 if NextToken2 <> tkText then begin
304 HighlighterRight.AddToken(P2.Y, 0, NextToken2);
305 NextToken2 := tkText;
306 end;
307 Inc(P2.Y);
308 P2.X := 0;
309 RightText := RightText + Rec.Chr2;
310 end else begin
311 if Kind = ckDelete then RightText := RightText + ' '
312 else RightText := RightText + Rec.Chr2;
313 if Kind <> LastKind then begin
314 HighlighterRight.AddToken(P2.Y, P2.X, NextToken2);
315 if Kind = ckNone then NextToken2 := tkText
316 else if Kind = ckAdd then NextToken2 := AttrAdded
317 //else if Kind = ckDelete then NextToken2 := AttrDeleted
318 else if Kind = ckModify then NextToken2 := AttrModified;
319 end;
320 Inc(P2.X);
321 end;
322
323 LastKind := Kind;
324 end;
325
326 //SynEditLeft.Lines.Text := LeftText;
327 //SynEditRight.Lines.Text := RightText;
328end;
329
330function TFormCompare.LoadFile(AFileName: string): string;
331var
332 Ext: string;
333begin
334 Ext := ExtractFileExt(AFileName);
335 if Ext = VCardFileExt then begin
336 with TVCardFile.Create(nil) do
337 try
338 LoadFromFile(AFileName);
339 Result := VCard.AsString;
340 finally
341 Free;
342 end;
343 end else Result := LoadFileToStr(AFileName);
344end;
345
346procedure TFormCompare.LoadFileLeft(FileName: string);
347begin
348 EditLeftFileName.Text := FileName;
349 LeftSide := LoadFile(FileName);
350 SynEditLeft.Text := LeftSide;
351end;
352
353procedure TFormCompare.LoadFileRight(FileName: string);
354begin
355 EditRightFileName.Text := FileName;
356 RightSide := LoadFile(FileName);
357 SynEditRight.Text := RightSide;
358end;
359
360end.
361
Note: See TracBrowser for help on using the repository browser.