SynEdit: reduce Markup overhead

git-svn-id: trunk@25907 -
This commit is contained in:
martin 2010-06-04 23:06:44 +00:00
parent e8cd533048
commit fd774a6bc5
4 changed files with 71 additions and 12 deletions

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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