SynEdit: Trimming Spaces, fixed trim on edit

git-svn-id: trunk@19118 -
This commit is contained in:
martin 2009-03-26 16:15:34 +00:00
parent 56ae429345
commit a65594caeb

View File

@ -51,6 +51,7 @@ type
fLockList : TStringList; fLockList : TStringList;
FLineEdited: Boolean; FLineEdited: Boolean;
procedure DoCaretChanged(Sender : TObject); procedure DoCaretChanged(Sender : TObject);
Procedure LinesChanged(Sender: TSynEditStrings; AIndex, ACount : Integer);
procedure SetEnabled(const AValue : Boolean); procedure SetEnabled(const AValue : Boolean);
procedure SetTrimType(const AValue: TSynEditStringTrimmingType); procedure SetTrimType(const AValue: TSynEditStringTrimmingType);
function TrimLine(const S : String; Index: Integer; RealUndo: Boolean = False) : String; function TrimLine(const S : String; Index: Integer; RealUndo: Boolean = False) : String;
@ -282,10 +283,14 @@ begin
FLineEdited := False; FLineEdited := False;
FTrimType := settLeaveLine; FTrimType := settLeaveLine;
Inherited Create(ASynStringSource); Inherited Create(ASynStringSource);
fSynStrings.AddChangeHandler(senrLineCount, {$IFDEF FPC}@{$ENDIF}LinesChanged);
fSynStrings.AddChangeHandler(senrLineChange, {$IFDEF FPC}@{$ENDIF}LinesChanged);
end; end;
destructor TSynEditStringTrimmingList.Destroy; destructor TSynEditStringTrimmingList.Destroy;
begin begin
fSynStrings.RemoveChangeHandler(senrLineCount, {$IFDEF FPC}@{$ENDIF}LinesChanged);
fSynStrings.RemoveChangeHandler(senrLineChange, {$IFDEF FPC}@{$ENDIF}LinesChanged);
fCaret.RemoveChangeHandler(@DoCaretChanged); fCaret.RemoveChangeHandler(@DoCaretChanged);
FreeAndNil(fLockList); FreeAndNil(fLockList);
inherited Destroy; inherited Destroy;
@ -308,13 +313,13 @@ begin
exit; exit;
end; end;
FIsTrimming := True; FIsTrimming := True;
s := fSynStrings[fLineIndex]; SendNotification(senrLineChange, self, fLineIndex, 1);
fSynStrings[fLineIndex] := s; // trigger OnPutted, so the line gets repainted
if (fLineIndex <> TSynEditCaret(Sender).LinePos - 1) then begin if (fLineIndex <> TSynEditCaret(Sender).LinePos - 1) then begin
UndoList.AppendToLastChange(TSynEditUndoTrimForget.Create(FLineIndex+1, FSpaces)); UndoList.AppendToLastChange(TSynEditUndoTrimForget.Create(FLineIndex+1, FSpaces));
fSpaces := ''; fSpaces := '';
end else begin end else begin
// same line, only right of caret // same line, only right of caret
s := fSynStrings[fLineIndex];
i := TSynEditCaret(Sender).BytePos; i := TSynEditCaret(Sender).BytePos;
if i <= length(s) + 1 then if i <= length(s) + 1 then
j := 0 j := 0
@ -329,6 +334,15 @@ begin
fLineIndex := TSynEditCaret(Sender).LinePos - 1; fLineIndex := TSynEditCaret(Sender).LinePos - 1;
end; end;
procedure TSynEditStringTrimmingList.LinesChanged(Sender: TSynEditStrings; AIndex, ACount: Integer);
begin
if FIsTrimming then
exit;
FLineEdited := true;
if fLockCount = 0 then
DoCaretChanged(fCaret);
end;
procedure TSynEditStringTrimmingList.SetEnabled(const AValue : Boolean); procedure TSynEditStringTrimmingList.SetEnabled(const AValue : Boolean);
begin begin
if fEnabled = AValue then exit; if fEnabled = AValue then exit;