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

View File

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