ADD: Encoding support to internal differ tool

This commit is contained in:
Alexander Koblov 2011-01-04 12:08:24 +00:00
commit 52f6a53c9a
4 changed files with 262 additions and 11 deletions

View file

@ -1,7 +1,7 @@
object frmDiffer: TfrmDiffer
Left = 157
Left = 158
Height = 370
Top = 60
Top = 152
Width = 760
Caption = 'Compare files'
ClientHeight = 350
@ -11,7 +11,7 @@ object frmDiffer: TfrmDiffer
OnDestroy = FormDestroy
OnResize = FormResize
Position = poDefault
LCLVersion = '0.9.31'
LCLVersion = '0.9.29'
object ToolBar: TToolBar
Left = 0
Height = 26
@ -178,6 +178,7 @@ object frmDiffer: TfrmDiffer
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
}
NumGlyphs = 0
OnClick = btnLeftEncodingClick
end
object btnLeftSave: TSpeedButton
AnchorSideLeft.Control = pnlLeftBox
@ -369,6 +370,7 @@ object frmDiffer: TfrmDiffer
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
}
NumGlyphs = 0
OnClick = btnRightEncodingClick
end
object btnRightSave: TSpeedButton
AnchorSideLeft.Control = pnlRightBox
@ -843,10 +845,140 @@ object frmDiffer: TfrmDiffer
end
object miSaveLeftAs: TMenuItem
Action = actSaveLeftAs
Bitmap.Data = {
C6070000424DC607000000000000360000002800000016000000160000000100
2000000000009007000064000000640000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000004864720036546523FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF0000000000000000000000000000000000000000000000
00006279867E364246FF44778DFB252D34FF757575FF787878FF787878FF7878
78FF787878FF787878FF787878FF1A191BFF19191BFF1D1C1FFF1F1F21EFFFFF
FF00000000000000000000000000000000000000000000000000567181049DBC
CAFF7AB8CCFF3C92AEFF1F6E89FF161517FF181719FF8A8A8AFF909090FF9090
90FF909090FF343336FF201F21FF4E4D51FF212023FFFFFFFF00000000000000
000000000000000000000000000000000000FFFFFF0088A1AFFFB0CAD6FF2C3A
3EFF0B96C1FF0C6885FF070707FF404040FF9C9C9CFF9F9F9FFF9F9F9FFF3F3E
41FF252426FF58575AFF252426FFFFFFFF000000000000000000000000000000
00000000000000000000FFFFFF004E606CFF2C9ABDFF242C2FFF213136FF0BA3
D2FF0C5166FF2B2B2BFF606060FFAEAEAEFFAEAEAEFF414042FF272728FF4443
46FF2A292BFFFFFFFF0000000000000000000000000000000000000000000000
0000FFFFFF002E2D30FF298FB2FF1695BDFF252829FF18343DFF0EADDFFF2E5E
6CFF424242FF959595FFD3D3D3FF272629FF242326FF464549FF2E2D30FFFFFF
FF00000000000000000000000000000000000000000000000000FFFFFF003130
32FF494B4FFF46ADCEFF1582A5FF262626FF0E3845FF0CABDDFF173641FF1D1C
1DFF3D3D3FFF4B4A4DFF4B4A4DFF4B4A4DFF313032FFFFFFFF00000000000000
000000000000000000000000000000000000FFFFFF00333335FF4F4E51FF4A51
56FF67C6E4FF4E899CFF252525FF094558FF0DA4D5FF1E2F36FF252426FF4847
49FF4F4E51FF4F4E51FF333335FFFFFFFF000000000000000000000000000000
00000000000000000000FFFFFF00363537FF535254FFE8DED4FFCCD0C9FF84DC
F7FF54808CFF252525FF12617AFF1CA6D1FF666867FF827B74FFDDD1C7FF5352
54FF363537FFFFFFFF0000000000000000000000000000000000000000000000
0000FFFFFF00383739FF565557FFF1EAE2FFB8A28BFF979D92FF71D8F7FF3456
5FFF1D1D1DFF117390FF2199BCFF5E5449FF9F9A94FF555456FF383739FFFFFF
FF00000000000000000000000000000000000000000000000000FFFFFF003B3A
3BFF5A595BFFF7F3EEFFF7F3EFFFF7F3EFFFAFCFD7FF33CAF9FF2C454CFF1518
19FF178BB0FF3DA2C1FF8F8B88FF464546FF3B3A3BFFFFFFFF00000000000000
000000000000000000000000000000000000FFFFFF003D3C3DFF5D5C5EFFFDFC
FBFFFBF9F8FFFBF9F9FFFBF9F8FF94C3D1FF32C4F1FF27363BFF0E171AFF1598
C1FF57A6BEFF3D3C3EFF3B3A3BFFFFFFFF000000000000000000000000000000
00000000000000000000FFFFFF003F3E40FF616062FFFDFAF9FFCFB69CFFCFB6
9CFFCFB69CFFCFB69CFF5E9FABFF2EB3DBFF242B2DFF0B1C21FF11A0CDFF2E60
7AFF3E3D3FFFFFFFFF0000000000000000000000000000000000000000000000
0000FFFFFF00414042FF59595AFFFAF4F1FFFAF4F0FFFAF4F0FFFAF4F0FFFAF4
F1FFF9F5F2FF55C6E9FF36AFD4FF1E2020FF1D2B85FF05079AFF3A394FFFFFFF
FF00000000000000000000000000000000000000000000000000FFFFFF004B4B
4CEF444344FFB9B4B3FFB9B4B3FFB9B4B3FFB9B4B3FFB9B6B4FFBBB6B4FFB6B6
B5FF34B6DEFF446AC0FF1B1BCEFF1111A3FF4A4A4DEFFFFFFF00000000000000
000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00186FAB174345
D3D63A3ACFB25353D418FFFFFF00FFFFFF000000000000000000000000000000
00000000000000000000
}
OnClick = actSaveLeftAsExecute
end
object miSaveRightAs: TMenuItem
Action = actSaveRightAs
Bitmap.Data = {
C6070000424DC607000000000000360000002800000016000000160000000100
2000000000009007000064000000640000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000004864720036546523FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF0000000000000000000000000000000000000000000000
00006279867E364246FF44778DFB252D34FF757575FF787878FF787878FF7878
78FF787878FF787878FF787878FF1A191BFF19191BFF1D1C1FFF1F1F21EFFFFF
FF00000000000000000000000000000000000000000000000000567181049DBC
CAFF7AB8CCFF3C92AEFF1F6E89FF161517FF181719FF8A8A8AFF909090FF9090
90FF909090FF343336FF201F21FF4E4D51FF212023FFFFFFFF00000000000000
000000000000000000000000000000000000FFFFFF0088A1AFFFB0CAD6FF2C3A
3EFF0B96C1FF0C6885FF070707FF404040FF9C9C9CFF9F9F9FFF9F9F9FFF3F3E
41FF252426FF58575AFF252426FFFFFFFF000000000000000000000000000000
00000000000000000000FFFFFF004E606CFF2C9ABDFF242C2FFF213136FF0BA3
D2FF0C5166FF2B2B2BFF606060FFAEAEAEFFAEAEAEFF414042FF272728FF4443
46FF2A292BFFFFFFFF0000000000000000000000000000000000000000000000
0000FFFFFF002E2D30FF298FB2FF1695BDFF252829FF18343DFF0EADDFFF2E5E
6CFF424242FF959595FFD3D3D3FF272629FF242326FF464549FF2E2D30FFFFFF
FF00000000000000000000000000000000000000000000000000FFFFFF003130
32FF494B4FFF46ADCEFF1582A5FF262626FF0E3845FF0CABDDFF173641FF1D1C
1DFF3D3D3FFF4B4A4DFF4B4A4DFF4B4A4DFF313032FFFFFFFF00000000000000
000000000000000000000000000000000000FFFFFF00333335FF4F4E51FF4A51
56FF67C6E4FF4E899CFF252525FF094558FF0DA4D5FF1E2F36FF252426FF4847
49FF4F4E51FF4F4E51FF333335FFFFFFFF000000000000000000000000000000
00000000000000000000FFFFFF00363537FF535254FFE8DED4FFCCD0C9FF84DC
F7FF54808CFF252525FF12617AFF1CA6D1FF666867FF827B74FFDDD1C7FF5352
54FF363537FFFFFFFF0000000000000000000000000000000000000000000000
0000FFFFFF00383739FF565557FFF1EAE2FFB8A28BFF979D92FF71D8F7FF3456
5FFF1D1D1DFF117390FF2199BCFF5E5449FF9F9A94FF555456FF383739FFFFFF
FF00000000000000000000000000000000000000000000000000FFFFFF003B3A
3BFF5A595BFFF7F3EEFFF7F3EFFFF7F3EFFFAFCFD7FF33CAF9FF2C454CFF1518
19FF178BB0FF3DA2C1FF8F8B88FF464546FF3B3A3BFFFFFFFF00000000000000
000000000000000000000000000000000000FFFFFF003D3C3DFF5D5C5EFFFDFC
FBFFFBF9F8FFFBF9F9FFFBF9F8FF94C3D1FF32C4F1FF27363BFF0E171AFF1598
C1FF57A6BEFF3D3C3EFF3B3A3BFFFFFFFF000000000000000000000000000000
00000000000000000000FFFFFF003F3E40FF616062FFFDFAF9FFCFB69CFFCFB6
9CFFCFB69CFFCFB69CFF5E9FABFF2EB3DBFF242B2DFF0B1C21FF11A0CDFF2E60
7AFF3E3D3FFFFFFFFF0000000000000000000000000000000000000000000000
0000FFFFFF00414042FF59595AFFFAF4F1FFFAF4F0FFFAF4F0FFFAF4F0FFFAF4
F1FFF9F5F2FF55C6E9FF36AFD4FF1E2020FF1D2B85FF05079AFF3A394FFFFFFF
FF00000000000000000000000000000000000000000000000000FFFFFF004B4B
4CEF444344FFB9B4B3FFB9B4B3FFB9B4B3FFB9B4B3FFB9B6B4FFBBB6B4FFB6B6
B5FF34B6DEFF446AC0FF1B1BCEFF1111A3FF4A4A4DEFFFFFFF00000000000000
000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00186FAB174345
D3D63A3ACFB25353D418FFFFFF00FFFFFF000000000000000000000000000000
00000000000000000000
}
OnClick = actSaveRightAsExecute
end
object miDivider6: TMenuItem
@ -1425,6 +1557,18 @@ object frmDiffer: TfrmDiffer
OnClick = actCopyRightToLeftExecute
end
end
object miEncoding: TMenuItem
Caption = 'Encoding'
object miEncodingLeft: TMenuItem
Caption = 'Left'
end
object miEncodingRight: TMenuItem
Caption = 'Right'
end
end
object miAbout: TMenuItem
Caption = 'About'
end
end
object ActionList: TActionList
Images = ImageList
@ -2621,4 +2765,12 @@ object frmDiffer: TfrmDiffer
OnClick = actEditSelectAllExecute
end
end
object pmEncodingLeft: TPopupMenu
left = 256
top = 144
end
object pmEncodingRight: TPopupMenu
left = 319
top = 144
end
end

View file

@ -1,4 +1,4 @@
TFRMDIFFER.CAPTION=Compare files
TFRMDIFFER.FRMDIFFER.CAPTION=Compare files
TFRMDIFFER.MNUFILE.CAPTION=File
TFRMDIFFER.MIDIVIDER7.CAPTION=-
TFRMDIFFER.MIDIVIDER6.CAPTION=-
@ -13,6 +13,10 @@ TFRMDIFFER.MNUACTIONS.CAPTION=&Actions
TFRMDIFFER.MIDIVIDER1.CAPTION=-
TFRMDIFFER.MIDIVIDER2.CAPTION=-
TFRMDIFFER.MIDIVIDER5.CAPTION=-
TFRMDIFFER.MIENCODING.CAPTION=Encoding
TFRMDIFFER.MIENCODINGLEFT.CAPTION=Left
TFRMDIFFER.MIENCODINGRIGHT.CAPTION=Right
TFRMDIFFER.MIABOUT.CAPTION=About
TFRMDIFFER.ACTSAVE.CAPTION=Save
TFRMDIFFER.ACTSAVEAS.CAPTION=Save as...
TFRMDIFFER.ACTSTARTCOMPARE.CAPTION=Compare

View file

@ -3,7 +3,7 @@
-------------------------------------------------------------------------
Internal diff and merge tool
Copyright (C) 2010 Koblov Alexander (Alexx2000@mail.ru)
Copyright (C) 2010-2011 Koblov Alexander (Alexx2000@mail.ru)
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
@ -72,6 +72,10 @@ type
edtFileNameRight: TFileNameEdit;
ImageList: TImageList;
MainMenu: TMainMenu;
miEncodingRight: TMenuItem;
miEncodingLeft: TMenuItem;
miAbout: TMenuItem;
miEncoding: TMenuItem;
miSaveRightAs: TMenuItem;
miSaveLeftAs: TMenuItem;
miCopyContext: TMenuItem;
@ -132,6 +136,8 @@ type
btnLeftSaveAs: TSpeedButton;
btnRightSave: TSpeedButton;
btnRightSaveAs: TSpeedButton;
pmEncodingLeft: TPopupMenu;
pmEncodingRight: TPopupMenu;
Splitter: TSplitter;
StatusBar: TStatusBar;
ToolBar: TToolBar;
@ -173,6 +179,8 @@ type
procedure actSaveRightExecute(Sender: TObject);
procedure actStartCompareExecute(Sender: TObject);
procedure actKeepScrollingExecute(Sender: TObject);
procedure btnLeftEncodingClick(Sender: TObject);
procedure btnRightEncodingClick(Sender: TObject);
procedure edtFileNameLeftAcceptFileName(Sender: TObject; var Value: String);
procedure edtFileNameRightAcceptFileName(Sender: TObject; var Value: String);
procedure FormCreate(Sender: TObject);
@ -185,12 +193,18 @@ type
SynDiffEditRight: TSynDiffEdit;
HashListLeft,
HashListRight: TList;
EncodingList: TStringList;
procedure Clear(bLeft, bRight: Boolean);
procedure BuildHashList(bLeft, bRight: Boolean);
procedure ChooseEncoding(SynDiffEdit: TSynDiffEdit);
procedure ChooseEncoding(MenuItem: TMenuItem; Encoding: String);
procedure FillEncodingMenu(TheOwner: TMenuItem; MenuHandler: TNotifyEvent; GroupIndex: LongInt);
procedure LoadFromFile(SynDiffEdit: TSynDiffEdit; const FileName: UTF8String);
procedure SaveToFile(SynDiffEdit: TSynDiffEdit; const FileName: UTF8String);
procedure OpenFileLeft(const FileName: UTF8String);
procedure OpenFileRight(const FileName: UTF8String);
procedure SetEncodingLeft(Sender: TObject);
procedure SetEncodingRight(Sender: TObject);
procedure SynDiffEditEnter(Sender: TObject);
procedure SynDiffEditLeftStatusChange(Sender: TObject; Changes: TSynStatusChanges);
procedure SynDiffEditRightStatusChange(Sender: TObject; Changes: TSynStatusChanges);
@ -433,6 +447,9 @@ end;
procedure TfrmDiffer.actBinaryCompareExecute(Sender: TObject);
begin
miEncoding.Enabled:= not actBinaryCompare.Checked;
btnLeftEncoding.Enabled:= not actBinaryCompare.Checked;
btnRightEncoding.Enabled:= not actBinaryCompare.Checked;
if actBinaryCompare.Checked then
begin
SynDiffEditLeft.Lines.Clear;
@ -559,6 +576,16 @@ begin
end;
procedure TfrmDiffer.btnLeftEncodingClick(Sender: TObject);
begin
pmEncodingLeft.PopUp(Mouse.CursorPos.X, Mouse.CursorPos.Y);
end;
procedure TfrmDiffer.btnRightEncodingClick(Sender: TObject);
begin
pmEncodingRight.PopUp(Mouse.CursorPos.X, Mouse.CursorPos.Y);
end;
procedure TfrmDiffer.edtFileNameLeftAcceptFileName(Sender: TObject;
var Value: String);
begin
@ -594,6 +621,14 @@ begin
SynDiffEditActive:= SynDiffEditLeft;
// Initialize property storage
InitPropStorage(Self);
// Fill encoding menu
EncodingList:= TStringList.Create;
GetSupportedEncodings(EncodingList);
FillEncodingMenu(miEncodingLeft, @SetEncodingLeft, 1);
FillEncodingMenu(miEncodingRight, @SetEncodingRight, 2);
FillEncodingMenu(pmEncodingLeft.Items, @SetEncodingLeft, 1);
FillEncodingMenu(pmEncodingRight.Items, @SetEncodingRight, 2);
EncodingList.Free;
end;
procedure TfrmDiffer.FormDestroy(Sender: TObject);
@ -650,17 +685,60 @@ begin
actStartCompare.Enabled := (HashListLeft.Count > 0) and (HashListRight.Count > 0);
end;
procedure TfrmDiffer.ChooseEncoding(SynDiffEdit: TSynDiffEdit);
begin
if SynDiffEdit = SynDiffEditLeft then
begin
ChooseEncoding(miEncodingLeft, SynDiffEdit.Encoding);
ChooseEncoding(pmEncodingLeft.Items, SynDiffEdit.Encoding);
end
else
begin
ChooseEncoding(miEncodingRight, SynDiffEdit.Encoding);
ChooseEncoding(pmEncodingRight.Items, SynDiffEdit.Encoding);
end;
end;
procedure TfrmDiffer.ChooseEncoding(MenuItem: TMenuItem; Encoding: String);
var
I: Integer;
begin
Encoding:= NormalizeEncoding(Encoding);
for I:= 0 to MenuItem.Count - 1 do
if SameText(NormalizeEncoding(MenuItem.Items[I].Caption), Encoding) then
MenuItem.Items[I].Checked:= True;
end;
procedure TfrmDiffer.FillEncodingMenu(TheOwner: TMenuItem;
MenuHandler: TNotifyEvent; GroupIndex: LongInt);
var
I: Integer;
mi: TMenuItem;
begin
for I:= 0 to EncodingList.Count - 1 do
begin
mi:= TMenuItem.Create(TheOwner);
mi.Caption:= EncodingList[I];
mi.RadioItem:= True;
mi.GroupIndex:= GroupIndex;
mi.OnClick:= MenuHandler;
TheOwner.Add(mi);
end;
end;
procedure TfrmDiffer.LoadFromFile(SynDiffEdit: TSynDiffEdit; const FileName: UTF8String);
var
Encoding: AnsiString;
fsFileStream: TFileStreamEx = nil;
begin
fsFileStream:= TFileStreamEx.Create(FileName, fmOpenRead or fmShareDenyNone);
try
SynDiffEdit.Lines.LoadFromStream(fsFileStream);
if Encoding = EmptyStr then
Encoding:= GuessEncoding(SynDiffEdit.Lines.Text);
SynDiffEdit.Lines.Text:= ConvertEncoding(SynDiffEdit.Lines.Text, Encoding, EncodingUTF8);
if Length(SynDiffEdit.Encoding) = 0 then
begin
SynDiffEdit.Encoding:= GuessEncoding(SynDiffEdit.Lines.Text);
ChooseEncoding(SynDiffEdit);
end;
SynDiffEdit.Lines.Text:= ConvertEncoding(SynDiffEdit.Lines.Text, SynDiffEdit.Encoding, EncodingUTF8);
finally
fsFileStream.Free;
end;
@ -669,7 +747,6 @@ end;
procedure TfrmDiffer.SaveToFile(SynDiffEdit: TSynDiffEdit;
const FileName: UTF8String);
var
Encoding: AnsiString;
slStringList: TStringListEx;
begin
slStringList:= TStringListEx.Create;
@ -678,7 +755,7 @@ begin
// remove fake lines
SynDiffEdit.RemoveFakeLines(slStringList);
// restore encoding
slStringList.Text:= ConvertEncoding(slStringList.Text, EncodingUTF8, Encoding);
slStringList.Text:= ConvertEncoding(slStringList.Text, EncodingUTF8, SynDiffEdit.Encoding);
// save to file
slStringList.SaveToFile(FileName);
SynDiffEdit.Modified:= False; // needed for the undo stack
@ -721,6 +798,22 @@ begin
end;
end;
procedure TfrmDiffer.SetEncodingLeft(Sender: TObject);
begin
SynDiffEditLeft.Encoding:= (Sender as TMenuItem).Caption;
ChooseEncoding(miEncodingLeft, SynDiffEditLeft.Encoding);
ChooseEncoding(pmEncodingLeft.Items, SynDiffEditLeft.Encoding);
actReload.Execute;
end;
procedure TfrmDiffer.SetEncodingRight(Sender: TObject);
begin
SynDiffEditRight.Encoding:= (Sender as TMenuItem).Caption;
ChooseEncoding(miEncodingRight, SynDiffEditRight.Encoding);
ChooseEncoding(pmEncodingRight.Items, SynDiffEditRight.Encoding);
actReload.Execute;
end;
procedure TfrmDiffer.SynDiffEditEnter(Sender: TObject);
begin
SynDiffEditActive:= (Sender as TSynDiffEdit);

View file

@ -75,6 +75,7 @@ type
FDiff: TDiff;
FSpecialLineMarkupEvent: TSpecialLineMarkupEvent;
FDiffCount: Integer;
FEncoding: String;
private
function GetDiffCount: Integer;
function GetDiffKind(Index: Integer): TChangeKind;
@ -97,6 +98,7 @@ type
property DiffKind[Index: Integer]: TChangeKind read GetDiffKind;
property DiffCount: Integer read GetDiffCount;
property LineNumber[Index: Integer]: PtrInt read GetLineNumber write SetLineNumber;
property Encoding: String read FEncoding write FEncoding;
published
property OnStatusChange;
end;