SynEdit: Caret, minor optimization. Do not register callbacks, unless needed.

git-svn-id: trunk@39695 -
This commit is contained in:
martin 2012-12-30 12:50:37 +00:00
parent cdadce87e0
commit 1f2700f715

View File

@ -171,6 +171,9 @@ type
{ TSynEditCaret } { TSynEditCaret }
TSynEditCaretFlag = (scLinesEditedRegistered);
TSynEditCaretFlags = set of TSynEditCaretFlag;
TSynEditCaret = class(TSynEditPointBase) TSynEditCaret = class(TSynEditPointBase)
private private
FAllowPastEOL: Boolean; FAllowPastEOL: Boolean;
@ -178,17 +181,22 @@ type
FForcePastEOL: Integer; FForcePastEOL: Integer;
FForceAdjustToNextChar: Integer; FForceAdjustToNextChar: Integer;
FKeepCaretX: Boolean; FKeepCaretX: Boolean;
FLinePos: Integer; // 1 based FLinePos: Integer; // 1 based
FCharPos: Integer; // 1 based FCharPos: Integer; // 1 based
FLastCharPos: Integer; // used by KeepCaretX FLastCharPos: Integer; // used by KeepCaretX
FBytePos, FBytePosOffset: Integer; // 1 based FBytePos, FBytePosOffset: Integer; // 1 based
FOldLinePos: Integer; // 1 based FOldLinePos: Integer; // 1 based
FOldCharPos: Integer; // 1 based FOldCharPos: Integer; // 1 based
FAdjustToNextChar: Boolean; FAdjustToNextChar: Boolean;
FMaxLeftChar: TMaxLeftCharFunc; FMaxLeftChar: TMaxLeftCharFunc;
FChangeOnTouch: Boolean; FChangeOnTouch: Boolean;
FSkipTabs: Boolean; FSkipTabs: Boolean;
FTouched: Boolean; FTouched: Boolean;
FFlags: TSynEditCaretFlags;
procedure AdjustToChar; procedure AdjustToChar;
procedure UpdateBytePos; procedure UpdateBytePos;
@ -197,7 +205,7 @@ type
procedure InternalSetLineCharPos(NewLine, NewCharPos: Integer; procedure InternalSetLineCharPos(NewLine, NewCharPos: Integer;
KeepLastCharPos: Boolean = False; KeepLastCharPos: Boolean = False;
ForceSet: Boolean = False); ForceSet: Boolean = False);
procedure setCharPos(const AValue: Integer); procedure SetCharPos(const AValue: Integer);
procedure SetAllowPastEOL(const AValue: Boolean); procedure SetAllowPastEOL(const AValue: Boolean);
procedure SetKeepCaretX(const AValue: Boolean); procedure SetKeepCaretX(const AValue: Boolean);
procedure setLinePos(const AValue: Integer); procedure setLinePos(const AValue: Integer);
@ -211,6 +219,7 @@ type
function GetLineText: string; function GetLineText: string;
procedure SetLineText(const AValue : string); procedure SetLineText(const AValue : string);
procedure SetSkipTabs(const AValue: Boolean); procedure SetSkipTabs(const AValue: Boolean);
procedure RegisterLinesEditedHandler;
protected protected
procedure SetLines(const AValue: TSynEditStrings); override; procedure SetLines(const AValue: TSynEditStrings); override;
procedure DoLock; override; procedure DoLock; override;
@ -452,8 +461,10 @@ end;
procedure TSynEditCaret.IncAutoMoveOnEdit; procedure TSynEditCaret.IncAutoMoveOnEdit;
begin begin
if FAutoMoveOnEdit =0 then if FAutoMoveOnEdit = 0 then begin
RegisterLinesEditedHandler;
UpdateBytePos; UpdateBytePos;
end;
inc(FAutoMoveOnEdit); inc(FAutoMoveOnEdit);
end; end;
@ -621,7 +632,7 @@ begin
Result := Point(FOldCharPos, FOldLinePos); Result := Point(FOldCharPos, FOldLinePos);
end; end;
procedure TSynEditCaret.setCharPos(const AValue : Integer); procedure TSynEditCaret.SetCharPos(const AValue : Integer);
begin begin
InternalSetLineCharPos(FLinePos, AValue); InternalSetLineCharPos(FLinePos, AValue);
end; end;
@ -756,14 +767,23 @@ begin
end; end;
end; end;
procedure TSynEditCaret.RegisterLinesEditedHandler;
begin
if (scLinesEditedRegistered in FFlags) or (FLines = nil) then
exit;
Include(FFlags, scLinesEditedRegistered);
FLines.AddEditHandler(@DoLinesEdited);
end;
procedure TSynEditCaret.SetLines(const AValue: TSynEditStrings); procedure TSynEditCaret.SetLines(const AValue: TSynEditStrings);
begin begin
if FLines = AValue then exit; if FLines = AValue then exit;
if FLines <> nil then if (FLines <> nil) then
FLines.RemoveEditHandler(@DoLinesEdited); FLines.RemoveEditHandler(@DoLinesEdited);
Exclude(FFlags, scLinesEditedRegistered);
inherited SetLines(AValue); inherited SetLines(AValue);
if FLines <> nil then if FAutoMoveOnEdit > 0 then
FLines.AddEditHandler(@DoLinesEdited); RegisterLinesEditedHandler;
end; end;
procedure TSynEditCaret.DoLock; procedure TSynEditCaret.DoLock;