mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-02 17:01:35 +02:00
SynEdit: Fixed an issue with undo trim spaces while locked (only relevant to syncron edit with multi line fields)
git-svn-id: trunk@20937 -
This commit is contained in:
parent
b83b08576a
commit
bceb570e54
@ -53,12 +53,13 @@ type
|
|||||||
FLineEdited: Boolean;
|
FLineEdited: Boolean;
|
||||||
procedure DoCaretChanged(Sender : TObject);
|
procedure DoCaretChanged(Sender : TObject);
|
||||||
Procedure LinesChanged(Sender: TSynEditStrings; AIndex, ACount : Integer);
|
Procedure LinesChanged(Sender: TSynEditStrings; AIndex, ACount : Integer);
|
||||||
|
Procedure LineCountChanged(Sender: TSynEditStrings; AIndex, ACount : Integer);
|
||||||
|
procedure DoLinesChanged(Index, N: 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;
|
||||||
procedure StoreSpacesForLine(const Index: Integer; const SpaceStr, LineStr: String);
|
procedure StoreSpacesForLine(const Index: Integer; const SpaceStr, LineStr: String);
|
||||||
function Spaces(Index: Integer) : String;
|
function Spaces(Index: Integer) : String;
|
||||||
procedure DoLinesChanged(Index, N: integer);
|
|
||||||
procedure TrimAfterLock;
|
procedure TrimAfterLock;
|
||||||
procedure EditInsertTrim(LogX, LogY: Integer; AText: String);
|
procedure EditInsertTrim(LogX, LogY: Integer; AText: String);
|
||||||
function EditDeleteTrim(LogX, LogY, ByteLen: Integer): String;
|
function EditDeleteTrim(LogX, LogY, ByteLen: Integer): String;
|
||||||
@ -325,13 +326,13 @@ begin
|
|||||||
FLineEdited := False;
|
FLineEdited := False;
|
||||||
FTrimType := settLeaveLine;
|
FTrimType := settLeaveLine;
|
||||||
Inherited Create(ASynStringSource);
|
Inherited Create(ASynStringSource);
|
||||||
fSynStrings.AddChangeHandler(senrLineCount, {$IFDEF FPC}@{$ENDIF}LinesChanged);
|
fSynStrings.AddChangeHandler(senrLineCount, {$IFDEF FPC}@{$ENDIF}LineCountChanged);
|
||||||
fSynStrings.AddChangeHandler(senrLineChange, {$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(senrLineCount, {$IFDEF FPC}@{$ENDIF}LineCountChanged);
|
||||||
fSynStrings.RemoveChangeHandler(senrLineChange, {$IFDEF FPC}@{$ENDIF}LinesChanged);
|
fSynStrings.RemoveChangeHandler(senrLineChange, {$IFDEF FPC}@{$ENDIF}LinesChanged);
|
||||||
fCaret.RemoveChangeHandler(@DoCaretChanged);
|
fCaret.RemoveChangeHandler(@DoCaretChanged);
|
||||||
FreeAndNil(fLockList);
|
FreeAndNil(fLockList);
|
||||||
@ -396,6 +397,34 @@ begin
|
|||||||
DoCaretChanged(fCaret);
|
DoCaretChanged(fCaret);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TSynEditStringTrimmingList.LineCountChanged(Sender: TSynEditStrings;
|
||||||
|
AIndex, ACount: Integer);
|
||||||
|
begin
|
||||||
|
DoLinesChanged(AIndex, ACount);
|
||||||
|
LinesChanged(Sender, AIndex, ACount);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TSynEditStringTrimmingList.DoLinesChanged(Index, N : integer);
|
||||||
|
var
|
||||||
|
i, j: Integer;
|
||||||
|
begin
|
||||||
|
if (not fEnabled) then exit;
|
||||||
|
if fLockCount > 0 then begin
|
||||||
|
for i := fLockList.Count-1 downto 0 do begin
|
||||||
|
j := Integer(Pointer(fLockList.Objects[i]));
|
||||||
|
if (j >= Index) and (j < Index - N) then
|
||||||
|
fLockList.Delete(i)
|
||||||
|
else if j >= Index then
|
||||||
|
fLockList.Objects[i] := TObject(Pointer(j + N));
|
||||||
|
end;
|
||||||
|
end else begin
|
||||||
|
if (fLineIndex >= Index) and (fLineIndex < Index - N) then
|
||||||
|
fLineIndex:=-1
|
||||||
|
else if fLineIndex > Index then
|
||||||
|
inc(fLineIndex, N);
|
||||||
|
end;
|
||||||
|
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;
|
||||||
@ -485,27 +514,6 @@ begin
|
|||||||
Result:= fSpaces;
|
Result:= fSpaces;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynEditStringTrimmingList.DoLinesChanged(Index, N : integer);
|
|
||||||
var
|
|
||||||
i, j: Integer;
|
|
||||||
begin
|
|
||||||
if (not fEnabled) then exit;
|
|
||||||
if fLockCount > 0 then begin
|
|
||||||
for i := fLockList.Count-1 downto 0 do begin
|
|
||||||
j := Integer(Pointer(fLockList.Objects[i]));
|
|
||||||
if (j >= Index) and (j < Index - N) then
|
|
||||||
fLockList.Delete(i)
|
|
||||||
else if j >= Index then
|
|
||||||
fLockList.Objects[i] := TObject(Pointer(j + N));
|
|
||||||
end;
|
|
||||||
end else begin
|
|
||||||
if (fLineIndex >= Index) and (fLineIndex < Index - N) then
|
|
||||||
fLineIndex:=-1
|
|
||||||
else if fLineIndex > Index then
|
|
||||||
inc(fLineIndex, N);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TSynEditStringTrimmingList.Lock;
|
procedure TSynEditStringTrimmingList.Lock;
|
||||||
begin
|
begin
|
||||||
if (fLockCount = 0) and (fLineIndex >= 0) and Enabled then begin
|
if (fLockCount = 0) and (fLineIndex >= 0) and Enabled then begin
|
||||||
@ -602,7 +610,6 @@ var
|
|||||||
begin
|
begin
|
||||||
FLineEdited := True;
|
FLineEdited := True;
|
||||||
c := fSynStrings.Count;
|
c := fSynStrings.Count;
|
||||||
DoLinesChanged(c, 1);
|
|
||||||
Result := fSynStrings.Add(TrimLine(S, c));
|
Result := fSynStrings.Add(TrimLine(S, c));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -611,7 +618,6 @@ var
|
|||||||
i, c : Integer;
|
i, c : Integer;
|
||||||
begin
|
begin
|
||||||
c := fSynStrings.Count;
|
c := fSynStrings.Count;
|
||||||
DoLinesChanged(c, AStrings.Count);
|
|
||||||
for i := 0 to AStrings.Count-1 do
|
for i := 0 to AStrings.Count-1 do
|
||||||
AStrings[i] := TrimLine(AStrings[i], c + i);
|
AStrings[i] := TrimLine(AStrings[i], c + i);
|
||||||
fSynStrings.AddStrings(AStrings);
|
fSynStrings.AddStrings(AStrings);
|
||||||
@ -628,7 +634,6 @@ begin
|
|||||||
FLineEdited := True;
|
FLineEdited := True;
|
||||||
TrimLine('', Index, True);
|
TrimLine('', Index, True);
|
||||||
fSynStrings.Delete(Index);
|
fSynStrings.Delete(Index);
|
||||||
DoLinesChanged(Index, -1);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynEditStringTrimmingList.DeleteLines(Index, NumLines : integer);
|
procedure TSynEditStringTrimmingList.DeleteLines(Index, NumLines : integer);
|
||||||
@ -639,20 +644,17 @@ begin
|
|||||||
for i := 0 to NumLines-1 do
|
for i := 0 to NumLines-1 do
|
||||||
TrimLine('', Index+i, True);
|
TrimLine('', Index+i, True);
|
||||||
fSynStrings.DeleteLines(Index, NumLines);
|
fSynStrings.DeleteLines(Index, NumLines);
|
||||||
DoLinesChanged(Index, -NumLines);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynEditStringTrimmingList.Insert(Index : integer; const S : string);
|
procedure TSynEditStringTrimmingList.Insert(Index : integer; const S : string);
|
||||||
begin
|
begin
|
||||||
FLineEdited := True;
|
FLineEdited := True;
|
||||||
DoLinesChanged(Index, 1);
|
|
||||||
fSynStrings.Insert(Index, TrimLine(S, Index));
|
fSynStrings.Insert(Index, TrimLine(S, Index));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynEditStringTrimmingList.InsertLines(Index, NumLines : integer);
|
procedure TSynEditStringTrimmingList.InsertLines(Index, NumLines : integer);
|
||||||
begin
|
begin
|
||||||
FLineEdited := True;
|
FLineEdited := True;
|
||||||
DoLinesChanged(Index, NumLines);
|
|
||||||
fSynStrings.InsertLines(Index, NumLines);
|
fSynStrings.InsertLines(Index, NumLines);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -661,7 +663,6 @@ var
|
|||||||
i : Integer;
|
i : Integer;
|
||||||
begin
|
begin
|
||||||
FLineEdited := True;
|
FLineEdited := True;
|
||||||
DoLinesChanged(Index, NewStrings.Count);
|
|
||||||
for i := 0 to NewStrings.Count-1 do
|
for i := 0 to NewStrings.Count-1 do
|
||||||
NewStrings[i] := TrimLine(NewStrings[i], Index+i, True);
|
NewStrings[i] := TrimLine(NewStrings[i], Index+i, True);
|
||||||
fSynStrings.InsertStrings(Index, NewStrings);
|
fSynStrings.InsertStrings(Index, NewStrings);
|
||||||
@ -864,7 +865,6 @@ begin
|
|||||||
s := EditDeleteTrim(1, LogY, length(s));
|
s := EditDeleteTrim(1, LogY, length(s));
|
||||||
fSynStrings.EditLineBreak(LogX, LogY);
|
fSynStrings.EditLineBreak(LogX, LogY);
|
||||||
end;
|
end;
|
||||||
DoLinesChanged(LogY, 1);
|
|
||||||
UpdateLineText(LogY + 1);
|
UpdateLineText(LogY + 1);
|
||||||
EditInsertTrim(1, LogY + 1, s);
|
EditInsertTrim(1, LogY + 1, s);
|
||||||
// Trim any existing (commited/real) spaces
|
// Trim any existing (commited/real) spaces
|
||||||
@ -891,7 +891,6 @@ begin
|
|||||||
s := EditDeleteTrim(1, LogY + 1, length(Spaces(LogY))); // next line
|
s := EditDeleteTrim(1, LogY + 1, length(Spaces(LogY))); // next line
|
||||||
//Todo: if FillText isSpacesOnly AND NextLineIsSpacesOnly => add direct to trailing
|
//Todo: if FillText isSpacesOnly AND NextLineIsSpacesOnly => add direct to trailing
|
||||||
fSynStrings.EditLineJoin(LogY, FillText);
|
fSynStrings.EditLineJoin(LogY, FillText);
|
||||||
DoLinesChanged(LogY - 1, -1);
|
|
||||||
UpdateLineText(LogY);
|
UpdateLineText(LogY);
|
||||||
EditInsertTrim(1, LogY, s);
|
EditInsertTrim(1, LogY, s);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user