mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-01 14:00:18 +02:00
SynEdit: reduce Markup overhead
git-svn-id: trunk@25907 -
This commit is contained in:
parent
e8cd533048
commit
fd774a6bc5
@ -1802,6 +1802,7 @@ begin
|
|||||||
FOldTopView := TopView;
|
FOldTopView := TopView;
|
||||||
end;
|
end;
|
||||||
inc(FPaintLock);
|
inc(FPaintLock);
|
||||||
|
FMarkupManager.IncPaintLock;
|
||||||
FFoldedLinesView.Lock; //DecPaintLock triggers ScanFrom, and folds must wait
|
FFoldedLinesView.Lock; //DecPaintLock triggers ScanFrom, and folds must wait
|
||||||
FTrimmedLinesView.Lock; // Lock before caret
|
FTrimmedLinesView.Lock; // Lock before caret
|
||||||
FCaret.Lock;
|
FCaret.Lock;
|
||||||
@ -1827,6 +1828,7 @@ begin
|
|||||||
FCaret.Unlock; // Maybe after FFoldedLinesView
|
FCaret.Unlock; // Maybe after FFoldedLinesView
|
||||||
FTrimmedLinesView.UnLock; // Must be unlocked after caret // May Change lines
|
FTrimmedLinesView.UnLock; // Must be unlocked after caret // May Change lines
|
||||||
FFoldedLinesView.UnLock; // after ScanFrom, but before UpdateCaret
|
FFoldedLinesView.UnLock; // after ScanFrom, but before UpdateCaret
|
||||||
|
FMarkupManager.DecPaintLock;
|
||||||
Dec(FPaintLock);
|
Dec(FPaintLock);
|
||||||
if (FPaintLock = 0) and HandleAllocated then begin
|
if (FPaintLock = 0) and HandleAllocated then begin
|
||||||
ScrollAfterTopLineChanged;
|
ScrollAfterTopLineChanged;
|
||||||
@ -4111,13 +4113,13 @@ end;
|
|||||||
procedure TCustomSynEdit.CreateHandle;
|
procedure TCustomSynEdit.CreateHandle;
|
||||||
begin
|
begin
|
||||||
Application.RemoveOnIdleHandler(@IdleScanRanges);
|
Application.RemoveOnIdleHandler(@IdleScanRanges);
|
||||||
inherited CreateHandle; //SizeOrFontChanged will be called
|
DoIncPaintLock(nil);
|
||||||
ScanRanges;
|
try
|
||||||
if sfAfterLoadFromFile in fStateFlags then
|
inherited CreateHandle; //SizeOrFontChanged will be called
|
||||||
AfterLoadFromFile;
|
Include(fStateFlags, sfScrollbarChanged);
|
||||||
UpdateScrollBars;
|
finally
|
||||||
//if fStateFlags * [sfEnsureCursorPos, sfEnsureCursorPosAtResize] <> [] then
|
DoDecPaintLock(nil);
|
||||||
// EnsureCursorPosVisible;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomSynEdit.SetScrollBars(const Value: TScrollStyle);
|
procedure TCustomSynEdit.SetScrollBars(const Value: TScrollStyle);
|
||||||
@ -4648,6 +4650,7 @@ begin
|
|||||||
FHighlighter.CurrentLines := FLines; // Trailing spaces are not needed
|
FHighlighter.CurrentLines := FLines; // Trailing spaces are not needed
|
||||||
FHighlighter.ScanRanges;
|
FHighlighter.ScanRanges;
|
||||||
|
|
||||||
|
// Todo: text may not have changed
|
||||||
fMarkupManager.TextChanged(FChangedLinesStart, FChangedLinesEnd);
|
fMarkupManager.TextChanged(FChangedLinesStart, FChangedLinesEnd);
|
||||||
Topline := TopLine;
|
Topline := TopLine;
|
||||||
end;
|
end;
|
||||||
@ -5549,7 +5552,7 @@ begin
|
|||||||
fTSearch.ResetIdentChars;
|
fTSearch.ResetIdentChars;
|
||||||
end;
|
end;
|
||||||
RecalcCharExtent;
|
RecalcCharExtent;
|
||||||
ScanRanges;
|
ScanRanges; // Todo: Skip if paintlocked
|
||||||
finally
|
finally
|
||||||
DecPaintLock;
|
DecPaintLock;
|
||||||
end;
|
end;
|
||||||
@ -6484,7 +6487,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
Exclude(fStateFlags, sfAfterLoadFromFile);
|
Exclude(fStateFlags, sfAfterLoadFromFile);
|
||||||
if assigned(FFoldedLinesView) then begin
|
if assigned(FFoldedLinesView) then begin
|
||||||
// TODO: Maybe defer until after paintlock?
|
|
||||||
ScanRanges;
|
ScanRanges;
|
||||||
FFoldedLinesView.UnfoldAll;
|
FFoldedLinesView.UnfoldAll;
|
||||||
FFoldedLinesView.CollapseDefaultFolds;
|
FFoldedLinesView.CollapseDefaultFolds;
|
||||||
|
@ -61,6 +61,7 @@ type
|
|||||||
procedure SetStyle(const AValue : TFontStyles);
|
procedure SetStyle(const AValue : TFontStyles);
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
FPaintLock: Integer;
|
||||||
procedure MarkupChanged(AMarkup: TObject);
|
procedure MarkupChanged(AMarkup: TObject);
|
||||||
|
|
||||||
procedure SetInvalidateLinesMethod(const AValue : TInvalidateLines); virtual;
|
procedure SetInvalidateLinesMethod(const AValue : TInvalidateLines); virtual;
|
||||||
@ -98,6 +99,8 @@ type
|
|||||||
Procedure TextChanged(aFirstCodeLine, aLastCodeLine: Integer); virtual;
|
Procedure TextChanged(aFirstCodeLine, aLastCodeLine: Integer); virtual;
|
||||||
Procedure TempDisable;
|
Procedure TempDisable;
|
||||||
Procedure TempEnable;
|
Procedure TempEnable;
|
||||||
|
procedure IncPaintLock; virtual;
|
||||||
|
procedure DecPaintLock; virtual;
|
||||||
|
|
||||||
property MarkupInfo : TSynSelectedColor read fMarkupInfo;
|
property MarkupInfo : TSynSelectedColor read fMarkupInfo;
|
||||||
property FGColor : TColor read GetFGColor;
|
property FGColor : TColor read GetFGColor;
|
||||||
@ -129,6 +132,8 @@ type
|
|||||||
public
|
public
|
||||||
constructor Create(ASynEdit : TSynEditBase);
|
constructor Create(ASynEdit : TSynEditBase);
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
|
procedure IncPaintLock; override;
|
||||||
|
procedure DecPaintLock; override;
|
||||||
|
|
||||||
Procedure AddMarkUp(aMarkUp : TSynEditMarkup; AsFirst: Boolean = False);
|
Procedure AddMarkUp(aMarkUp : TSynEditMarkup; AsFirst: Boolean = False);
|
||||||
Procedure RemoveMarkUp(aMarkUp : TSynEditMarkup);
|
Procedure RemoveMarkUp(aMarkUp : TSynEditMarkup);
|
||||||
@ -361,6 +366,16 @@ begin
|
|||||||
dec(FTempEnable);
|
dec(FTempEnable);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TSynEditMarkup.IncPaintLock;
|
||||||
|
begin
|
||||||
|
inc(FPaintLock);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TSynEditMarkup.DecPaintLock;
|
||||||
|
begin
|
||||||
|
dec(FPaintLock);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TSynEditMarkup.PrepareMarkupForRow(aRow : Integer);
|
procedure TSynEditMarkup.PrepareMarkupForRow(aRow : Integer);
|
||||||
begin
|
begin
|
||||||
end;
|
end;
|
||||||
@ -384,6 +399,24 @@ begin
|
|||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TSynEditMarkupManager.IncPaintLock;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
inherited IncPaintLock;
|
||||||
|
for i := 0 to fMarkUpList.Count-1 do
|
||||||
|
TSynEditMarkup(fMarkUpList[i]).IncPaintLock;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TSynEditMarkupManager.DecPaintLock;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
inherited DecPaintLock;
|
||||||
|
for i := 0 to fMarkUpList.Count-1 do
|
||||||
|
TSynEditMarkup(fMarkUpList[i]).IncPaintLock;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TSynEditMarkupManager.AddMarkUp(aMarkUp : TSynEditMarkup; AsFirst: Boolean = False);
|
procedure TSynEditMarkupManager.AddMarkUp(aMarkUp : TSynEditMarkup; AsFirst: Boolean = False);
|
||||||
begin
|
begin
|
||||||
if AsFirst then
|
if AsFirst then
|
||||||
|
@ -42,6 +42,7 @@ type
|
|||||||
FBracketHighlightPos: TPoint;
|
FBracketHighlightPos: TPoint;
|
||||||
FBracketHighlightAntiPos: TPoint;
|
FBracketHighlightAntiPos: TPoint;
|
||||||
FHighlightStyle: TSynEditBracketHighlightStyle;
|
FHighlightStyle: TSynEditBracketHighlightStyle;
|
||||||
|
FNeedInvalidate: Boolean;
|
||||||
procedure SetHighlightStyle(const AValue: TSynEditBracketHighlightStyle);
|
procedure SetHighlightStyle(const AValue: TSynEditBracketHighlightStyle);
|
||||||
protected
|
protected
|
||||||
procedure FindMatchingBracketPair(PhysCaret: TPoint;
|
procedure FindMatchingBracketPair(PhysCaret: TPoint;
|
||||||
@ -53,6 +54,7 @@ type
|
|||||||
procedure DoMarkupChanged(AMarkup: TSynSelectedColor); override;
|
procedure DoMarkupChanged(AMarkup: TSynSelectedColor); override;
|
||||||
public
|
public
|
||||||
constructor Create(ASynEdit: TSynEditBase);
|
constructor Create(ASynEdit: TSynEditBase);
|
||||||
|
procedure DecPaintLock; override;
|
||||||
|
|
||||||
function GetMarkupAttributeAtRowCol(const aRow, aCol: Integer): TSynSelectedColor; override;
|
function GetMarkupAttributeAtRowCol(const aRow, aCol: Integer): TSynSelectedColor; override;
|
||||||
function GetNextMarkupColAfterRowCol(const aRow, aCol: Integer): Integer; override;
|
function GetNextMarkupColAfterRowCol(const aRow, aCol: Integer): Integer; override;
|
||||||
@ -79,6 +81,13 @@ begin
|
|||||||
MarkupInfo.StyleMask := [];
|
MarkupInfo.StyleMask := [];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TSynEditMarkupBracket.DecPaintLock;
|
||||||
|
begin
|
||||||
|
inherited DecPaintLock;
|
||||||
|
if (FPaintLock = 0) and FNeedInvalidate then
|
||||||
|
InvalidateBracketHighlight;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TSynEditMarkupBracket.SetHighlightStyle(
|
procedure TSynEditMarkupBracket.SetHighlightStyle(
|
||||||
const AValue: TSynEditBracketHighlightStyle);
|
const AValue: TSynEditBracketHighlightStyle);
|
||||||
begin
|
begin
|
||||||
@ -163,8 +172,11 @@ procedure TSynEditMarkupBracket.InvalidateBracketHighlight;
|
|||||||
var
|
var
|
||||||
NewPos, NewAntiPos, SwapPos : TPoint;
|
NewPos, NewAntiPos, SwapPos : TPoint;
|
||||||
begin
|
begin
|
||||||
if (Caret = nil) or (not SynEdit.HandleAllocated) then
|
FNeedInvalidate := True;
|
||||||
|
if (Caret = nil) or (not SynEdit.HandleAllocated) or (FPaintLock > 0) then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
|
FNeedInvalidate := False;
|
||||||
NewPos.Y:=-1;
|
NewPos.Y:=-1;
|
||||||
NewAntiPos.Y:=-1;
|
NewAntiPos.Y:=-1;
|
||||||
if eoBracketHighlight in TSynEdit(SynEdit).Options
|
if eoBracketHighlight in TSynEdit(SynEdit).Options
|
||||||
|
@ -45,6 +45,7 @@ type
|
|||||||
FHighlightPos2: TWordPoint;
|
FHighlightPos2: TWordPoint;
|
||||||
FHighlightPos3: TWordPoint;
|
FHighlightPos3: TWordPoint;
|
||||||
FHighlighter: TSynCustomHighlighter;
|
FHighlighter: TSynCustomHighlighter;
|
||||||
|
FNeedInvalidate: Boolean;
|
||||||
procedure SetHighlighter(const AValue: TSynCustomHighlighter);
|
procedure SetHighlighter(const AValue: TSynCustomHighlighter);
|
||||||
protected
|
protected
|
||||||
procedure FindMatchingWords(PhysCaret: TPoint;
|
procedure FindMatchingWords(PhysCaret: TPoint;
|
||||||
@ -57,6 +58,7 @@ type
|
|||||||
procedure InvalidateCurrentHighlight;
|
procedure InvalidateCurrentHighlight;
|
||||||
public
|
public
|
||||||
constructor Create(ASynEdit: TSynEditBase);
|
constructor Create(ASynEdit: TSynEditBase);
|
||||||
|
procedure DecPaintLock; override;
|
||||||
|
|
||||||
function GetMarkupAttributeAtRowCol(const aRow, aCol: Integer): TSynSelectedColor; override;
|
function GetMarkupAttributeAtRowCol(const aRow, aCol: Integer): TSynSelectedColor; override;
|
||||||
function GetNextMarkupColAfterRowCol(const aRow, aCol: Integer): Integer; override;
|
function GetNextMarkupColAfterRowCol(const aRow, aCol: Integer): Integer; override;
|
||||||
@ -99,6 +101,13 @@ begin
|
|||||||
MarkupInfo.StyleMask := [];
|
MarkupInfo.StyleMask := [];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TSynEditMarkupWordGroup.DecPaintLock;
|
||||||
|
begin
|
||||||
|
inherited DecPaintLock;
|
||||||
|
if (FPaintLock = 0) and FNeedInvalidate then
|
||||||
|
InvalidateCurrentHighlight;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TSynEditMarkupWordGroup.SetHighlighter(const AValue: TSynCustomHighlighter);
|
procedure TSynEditMarkupWordGroup.SetHighlighter(const AValue: TSynCustomHighlighter);
|
||||||
begin
|
begin
|
||||||
FHighlighter := AValue;
|
FHighlighter := AValue;
|
||||||
@ -319,8 +328,11 @@ procedure TSynEditMarkupWordGroup.InvalidateCurrentHighlight;
|
|||||||
var
|
var
|
||||||
NewPos, NewAntiPos, NewMiddlePos : TWordPoint;
|
NewPos, NewAntiPos, NewMiddlePos : TWordPoint;
|
||||||
begin
|
begin
|
||||||
if (Caret = nil) or (not SynEdit.HandleAllocated) then
|
FNeedInvalidate := True;
|
||||||
|
if (Caret = nil) or (not SynEdit.HandleAllocated) or (FPaintLock > 0) then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
|
FNeedInvalidate := False;
|
||||||
FindMatchingWords(Caret.LineCharPos, NewPos, NewAntiPos, NewMiddlePos);
|
FindMatchingWords(Caret.LineCharPos, NewPos, NewAntiPos, NewMiddlePos);
|
||||||
|
|
||||||
// invalidate old highlighting, if changed
|
// invalidate old highlighting, if changed
|
||||||
|
Loading…
Reference in New Issue
Block a user