SynEdit: TrimSpaces would mark the editor as modified. They also could add an "undo last caret move" (Bug #12949)

git-svn-id: trunk@18231 -
This commit is contained in:
martin 2009-01-10 02:21:08 +00:00
parent 5612e34a33
commit fc746d62ba
3 changed files with 50 additions and 13 deletions

View File

@ -597,6 +597,7 @@ type
{$IFNDEF SYN_LAZARUS}
procedure TrimmedSetLine(ALine: integer; ALineText: string);
{$ENDIF}
procedure UpdateModified;
procedure UndoRedoAdded(Sender: TObject);
procedure UnlockUndo;
procedure UpdateCaret;
@ -5550,7 +5551,11 @@ begin
{end} //mh 2000-11-20
end;
{$IFDEF SYN_LAZARUS}
crTrimSpace: FTrimmedLinesView.ForceTrim;
crTrimSpace:
begin
FTrimmedLinesView.ForceTrim;
UpdateModified;
end;
{$ENDIF}
crTrimRealSpace:
begin
@ -9900,23 +9905,25 @@ begin
end;
end;
procedure TCustomSynEdit.UndoRedoAdded(Sender: TObject);
var
Item: TSynEditUndoItem;
procedure TCustomSynEdit.UpdateModified;
begin
// Modified := TRUE;
{$IFDEF SYN_LAZARUS}
Item := TSynEditUndoList(Sender).PeekItem;
if Item <> nil then
TSynEditStringList(fLines).MarkModified(Item.ChangeStartPos.y - 1,
Item.ChangeEndPos.y - 1, Sender = fUndoList, Item.fChangeReason);
if fUndoList.UnModifiedMarkerExists then
Modified:=not fUndoList.IsTopMarkedAsUnmodified
else if fRedoList.UnModifiedMarkerExists then
Modified:=not fRedoList.IsTopMarkedAsUnmodified
else
{$ENDIF}
Modified := fUndoList.CanUndo or fUndoList.FullUndoImpossible; //mh 2000-10-03
end;
procedure TCustomSynEdit.UndoRedoAdded(Sender: TObject);
var
Item: TSynEditUndoItem;
begin
Item := TSynEditUndoList(Sender).PeekItem;
if Item <> nil then
TSynEditStringList(fLines).MarkModified(Item.ChangeStartPos.y - 1,
Item.ChangeEndPos.y - 1, Sender = fUndoList, Item.fChangeReason);
UpdateModified;
// we have to clear the redo information, since adding undo info removes
// the necessary context to undo earlier edit actions
if (Sender = fUndoList) and not (sfInsideRedo in fStateFlags) then //mh 2000-10-30

View File

@ -259,6 +259,8 @@ type
destructor Destroy; override;
procedure AddChange(AReason: TSynChangeReason; AStart, AEnd: TPoint;
ChangeText: string; SelMode: TSynSelectionMode);
procedure AppendToLastChange(AReason: TSynChangeReason; AStart, AEnd: TPoint;
ChangeText: string; SelMode: TSynSelectionMode);
procedure BeginBlock; //sbs 2000-11-19
procedure Clear;
procedure EndBlock; //sbs 2000-11-19
@ -1071,6 +1073,34 @@ begin
end;
end;
procedure TSynEditUndoList.AppendToLastChange(AReason: TSynChangeReason; AStart,
AEnd: TPoint; ChangeText: string; SelMode: TSynSelectionMode);
var
NewItem: TSynEditUndoItem;
begin
if (fLockCount = 0) and (PeekItem <> nil) then begin
if (fItems.Count = fUnModifiedItem) then
inc(fUnModifiedItem);
NewItem := TSynEditUndoItem.Create;
try
with NewItem do begin
fChangeReason := AReason;
fChangeSelMode := SelMode;
fChangeStartPos := AStart;
fChangeEndPos := AEnd;
fChangeStr := ChangeText;
fChangeNumber := PeekItem.fChangeNumber;
end;
//PushItem(NewItem);
fItems.Add(NewItem);
EnsureMaxEntries;
except
NewItem.Free;
raise;
end;
end;
end;
{begin} //sbs 2000-11-19
procedure TSynEditUndoList.BeginBlock;
begin

View File

@ -123,7 +123,7 @@ begin
and (fLockCount = 0) then begin
s := fSynStrings[fLineIndex];
fSynStrings[fLineIndex] := s; // trigger OnPutted, so the line gets repainted
fUndoList.AddChange(crTrimSpace, Point(1+length(s), fLineIndex+1),
fUndoList.AppendToLastChange(crTrimSpace, Point(1+length(s), fLineIndex+1),
Point(1+length(s)+length(fSpaces), fLineIndex+1), fSpaces, smNormal);
end;
FIsTrimming := False;
@ -278,7 +278,7 @@ begin
ltext := fSynStrings[index];
llen := length(ltext);
fSynStrings[index] := ltext; // trigger OnPutted, so the line gets repainted
fUndoList.AddChange(crTrimSpace, Point(1+llen, index+1),
fUndoList.AppendToLastChange(crTrimSpace, Point(1+llen, index+1),
Point(1+llen+slen, index+1), fLockList[i], smNormal);
end;
end;