SynEdit: Fixes for undo with trim-spaces

git-svn-id: trunk@18122 -
This commit is contained in:
martin 2009-01-05 00:27:50 +00:00
parent 1da8f90a7f
commit c920e5366f
2 changed files with 33 additions and 19 deletions

View File

@ -5697,6 +5697,8 @@ begin
{$IFDEF SYN_LAZARUS}crTrimSpace,{$ENDIF} {$IFDEF SYN_LAZARUS}crTrimSpace,{$ENDIF}
crSilentDelete, crSilentDeleteAfterCursor: //mh 2000-10-30 crSilentDelete, crSilentDeleteAfterCursor: //mh 2000-10-30
begin begin
if Item.fChangeReason = crTrimSpace then
FTrimmedLinesView.UndoTrimmedSpaces := true;
// If there's no selection, we have to set // If there's no selection, we have to set
// the Caret's position manually. // the Caret's position manually.
if Item.fChangeSelMode = smColumn then if Item.fChangeSelMode = smColumn then
@ -5724,6 +5726,7 @@ begin
fRedoList.AddChange(Item.fChangeReason, Item.fChangeStartPos, fRedoList.AddChange(Item.fChangeReason, Item.fChangeStartPos,
Item.fChangeEndPos, '', Item.fChangeSelMode); Item.fChangeEndPos, '', Item.fChangeSelMode);
EnsureCursorPosVisible; EnsureCursorPosVisible;
FTrimmedLinesView.UndoTrimmedSpaces := False;
end; end;
crTrimRealSpace: crTrimRealSpace:
FTrimmedLinesView.UndoRealSpaces(Item); FTrimmedLinesView.UndoRealSpaces(Item);
@ -5796,6 +5799,7 @@ begin
end; end;
end; end;
finally finally
FTrimmedLinesView.UndoTrimmedSpaces := False;
FBlockSelection.SelectionMode := OldSelMode; FBlockSelection.SelectionMode := OldSelMode;
FBlockSelection.ActiveSelectionMode := Item.fChangeSelMode; FBlockSelection.ActiveSelectionMode := Item.fChangeSelMode;
if ChangeScrollPastEol then //mh 2000-10-30 if ChangeScrollPastEol then //mh 2000-10-30

View File

@ -43,6 +43,7 @@ type
fLineText: String; fLineText: String;
fLineIndex: Integer; fLineIndex: Integer;
fEnabled: Boolean; fEnabled: Boolean;
FUndoTrimmedSpaces: Boolean;
fLockCount: Integer; fLockCount: Integer;
fLockList : TStringList; fLockList : TStringList;
procedure DoCaretChanged(Sender : TObject); procedure DoCaretChanged(Sender : TObject);
@ -79,6 +80,7 @@ type
procedure ForceTrim; // for redo; redo can not wait for UnLock procedure ForceTrim; // for redo; redo can not wait for UnLock
procedure UndoRealSpaces(Item: TSynEditUndoItem); procedure UndoRealSpaces(Item: TSynEditUndoItem);
property Enabled : Boolean read fEnabled write SetEnabled; property Enabled : Boolean read fEnabled write SetEnabled;
property UndoTrimmedSpaces: Boolean read FUndoTrimmedSpaces write FUndoTrimmedSpaces;
property UndoList: TSynEditUndoList read fUndoList write fUndoList; property UndoList: TSynEditUndoList read fUndoList write fUndoList;
end; end;
@ -95,6 +97,7 @@ begin
fLineIndex:= -1; fLineIndex:= -1;
fSpaces := ''; fSpaces := '';
fEnabled:=false; fEnabled:=false;
FUndoTrimmedSpaces := False;
Inherited Create(ASynStringSource); Inherited Create(ASynStringSource);
end; end;
@ -136,6 +139,8 @@ procedure TSynEditStringTrimmingList.UndoRealSpaces(Item: TSynEditUndoItem);
var var
i: Integer; i: Integer;
begin begin
if length(fSynStrings.Strings[Item.fChangeStartPos.y-1]) + 1 <> Item.fChangeStartPos.x then
exit;
fSynStrings.Strings[Item.fChangeStartPos.y-1] fSynStrings.Strings[Item.fChangeStartPos.y-1]
:= copy(fSynStrings.Strings[Item.fChangeStartPos.y-1], := copy(fSynStrings.Strings[Item.fChangeStartPos.y-1],
1, Item.fChangeStartPos.x-1) + Item.fChangeStr; 1, Item.fChangeStartPos.x-1) + Item.fChangeStr;
@ -150,26 +155,31 @@ var
l, i:integer; l, i:integer;
temp: String; temp: String;
begin begin
if (not fEnabled) or (fUndoList.IsLocked) then exit(s); if (not fEnabled) then exit(s);
if RealUndo then begin If (fUndoList.IsLocked and not UndoTrimmedSpaces) then begin
temp := fSynStrings.Strings[Index]; result := s;
l := length(temp); temp := '';
i:= l; end else begin
while (i>0) and (temp[i] in [#9, ' ']) do dec(i); if RealUndo then begin
// Add RealSpaceUndo temp := fSynStrings.Strings[Index];
if i < l then l := length(temp);
fUndoList.AddChange(crTrimRealSpace, Point(i+1, Index+1), i:= l;
Point(l, Index+1), copy(temp, i+1, l-i), smNormal); while (i>0) and (temp[i] in [#9, ' ']) do dec(i);
end; // Add RealSpaceUndo
if i < l then
fUndoList.AddChange(crTrimRealSpace, Point(i+1, Index+1),
Point(l, Index+1), copy(temp, i+1, l-i), smNormal);
end;
l := length(s); l := length(s);
i := l; i := l;
while (i>0) and (s[i] in [#9, ' ']) do dec(i); while (i>0) and (s[i] in [#9, ' ']) do dec(i);
temp := copy(s, i+1, l-i); temp := copy(s, i+1, l-i);
if i=l then if i=l then
result := s // No need to make a copy result := s // No need to make a copy
else else
result := copy(s, 1, i); result := copy(s, 1, i);
end;
if fLockCount > 0 then begin if fLockCount > 0 then begin
i := fLockList.IndexOfObject(TObject(pointer(Index))); i := fLockList.IndexOfObject(TObject(pointer(Index)));