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;
end;
inc(FPaintLock);
FMarkupManager.IncPaintLock;
FFoldedLinesView.Lock; //DecPaintLock triggers ScanFrom, and folds must wait
FTrimmedLinesView.Lock; // Lock before caret
FCaret.Lock;
@ -1827,6 +1828,7 @@ begin
FCaret.Unlock; // Maybe after FFoldedLinesView
FTrimmedLinesView.UnLock; // Must be unlocked after caret // May Change lines
FFoldedLinesView.UnLock; // after ScanFrom, but before UpdateCaret
FMarkupManager.DecPaintLock;
Dec(FPaintLock);
if (FPaintLock = 0) and HandleAllocated then begin
ScrollAfterTopLineChanged;
@ -4111,13 +4113,13 @@ end;
procedure TCustomSynEdit.CreateHandle;
begin
Application.RemoveOnIdleHandler(@IdleScanRanges);
inherited CreateHandle; //SizeOrFontChanged will be called
ScanRanges;
if sfAfterLoadFromFile in fStateFlags then
AfterLoadFromFile;
UpdateScrollBars;
//if fStateFlags * [sfEnsureCursorPos, sfEnsureCursorPosAtResize] <> [] then
// EnsureCursorPosVisible;
DoIncPaintLock(nil);
try
inherited CreateHandle; //SizeOrFontChanged will be called
Include(fStateFlags, sfScrollbarChanged);
finally
DoDecPaintLock(nil);
end;
end;
procedure TCustomSynEdit.SetScrollBars(const Value: TScrollStyle);
@ -4648,6 +4650,7 @@ begin
FHighlighter.CurrentLines := FLines; // Trailing spaces are not needed
FHighlighter.ScanRanges;
// Todo: text may not have changed
fMarkupManager.TextChanged(FChangedLinesStart, FChangedLinesEnd);
Topline := TopLine;
end;
@ -5549,7 +5552,7 @@ begin
fTSearch.ResetIdentChars;
end;
RecalcCharExtent;
ScanRanges;
ScanRanges; // Todo: Skip if paintlocked
finally
DecPaintLock;
end;
@ -6484,7 +6487,6 @@ begin
end;
Exclude(fStateFlags, sfAfterLoadFromFile);
if assigned(FFoldedLinesView) then begin
// TODO: Maybe defer until after paintlock?
ScanRanges;
FFoldedLinesView.UnfoldAll;
FFoldedLinesView.CollapseDefaultFolds;

View File

@ -61,6 +61,7 @@ type
procedure SetStyle(const AValue : TFontStyles);
protected
FPaintLock: Integer;
procedure MarkupChanged(AMarkup: TObject);
procedure SetInvalidateLinesMethod(const AValue : TInvalidateLines); virtual;
@ -98,6 +99,8 @@ type
Procedure TextChanged(aFirstCodeLine, aLastCodeLine: Integer); virtual;
Procedure TempDisable;
Procedure TempEnable;
procedure IncPaintLock; virtual;
procedure DecPaintLock; virtual;
property MarkupInfo : TSynSelectedColor read fMarkupInfo;
property FGColor : TColor read GetFGColor;
@ -129,7 +132,9 @@ type
public
constructor Create(ASynEdit : TSynEditBase);
destructor Destroy; override;
procedure IncPaintLock; override;
procedure DecPaintLock; override;
Procedure AddMarkUp(aMarkUp : TSynEditMarkup; AsFirst: Boolean = False);
Procedure RemoveMarkUp(aMarkUp : TSynEditMarkup);
function Count: Integer;
@ -361,6 +366,16 @@ begin
dec(FTempEnable);
end;
procedure TSynEditMarkup.IncPaintLock;
begin
inc(FPaintLock);
end;
procedure TSynEditMarkup.DecPaintLock;
begin
dec(FPaintLock);
end;
procedure TSynEditMarkup.PrepareMarkupForRow(aRow : Integer);
begin
end;
@ -384,6 +399,24 @@ begin
inherited Destroy;
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);
begin
if AsFirst then

View File

@ -42,6 +42,7 @@ type
FBracketHighlightPos: TPoint;
FBracketHighlightAntiPos: TPoint;
FHighlightStyle: TSynEditBracketHighlightStyle;
FNeedInvalidate: Boolean;
procedure SetHighlightStyle(const AValue: TSynEditBracketHighlightStyle);
protected
procedure FindMatchingBracketPair(PhysCaret: TPoint;
@ -53,6 +54,7 @@ type
procedure DoMarkupChanged(AMarkup: TSynSelectedColor); override;
public
constructor Create(ASynEdit: TSynEditBase);
procedure DecPaintLock; override;
function GetMarkupAttributeAtRowCol(const aRow, aCol: Integer): TSynSelectedColor; override;
function GetNextMarkupColAfterRowCol(const aRow, aCol: Integer): Integer; override;
@ -79,6 +81,13 @@ begin
MarkupInfo.StyleMask := [];
end;
procedure TSynEditMarkupBracket.DecPaintLock;
begin
inherited DecPaintLock;
if (FPaintLock = 0) and FNeedInvalidate then
InvalidateBracketHighlight;
end;
procedure TSynEditMarkupBracket.SetHighlightStyle(
const AValue: TSynEditBracketHighlightStyle);
begin
@ -163,8 +172,11 @@ procedure TSynEditMarkupBracket.InvalidateBracketHighlight;
var
NewPos, NewAntiPos, SwapPos : TPoint;
begin
if (Caret = nil) or (not SynEdit.HandleAllocated) then
FNeedInvalidate := True;
if (Caret = nil) or (not SynEdit.HandleAllocated) or (FPaintLock > 0) then
exit;
FNeedInvalidate := False;
NewPos.Y:=-1;
NewAntiPos.Y:=-1;
if eoBracketHighlight in TSynEdit(SynEdit).Options

View File

@ -45,6 +45,7 @@ type
FHighlightPos2: TWordPoint;
FHighlightPos3: TWordPoint;
FHighlighter: TSynCustomHighlighter;
FNeedInvalidate: Boolean;
procedure SetHighlighter(const AValue: TSynCustomHighlighter);
protected
procedure FindMatchingWords(PhysCaret: TPoint;
@ -57,6 +58,7 @@ type
procedure InvalidateCurrentHighlight;
public
constructor Create(ASynEdit: TSynEditBase);
procedure DecPaintLock; override;
function GetMarkupAttributeAtRowCol(const aRow, aCol: Integer): TSynSelectedColor; override;
function GetNextMarkupColAfterRowCol(const aRow, aCol: Integer): Integer; override;
@ -99,6 +101,13 @@ begin
MarkupInfo.StyleMask := [];
end;
procedure TSynEditMarkupWordGroup.DecPaintLock;
begin
inherited DecPaintLock;
if (FPaintLock = 0) and FNeedInvalidate then
InvalidateCurrentHighlight;
end;
procedure TSynEditMarkupWordGroup.SetHighlighter(const AValue: TSynCustomHighlighter);
begin
FHighlighter := AValue;
@ -319,8 +328,11 @@ procedure TSynEditMarkupWordGroup.InvalidateCurrentHighlight;
var
NewPos, NewAntiPos, NewMiddlePos : TWordPoint;
begin
if (Caret = nil) or (not SynEdit.HandleAllocated) then
FNeedInvalidate := True;
if (Caret = nil) or (not SynEdit.HandleAllocated) or (FPaintLock > 0) then
exit;
FNeedInvalidate := False;
FindMatchingWords(Caret.LineCharPos, NewPos, NewAntiPos, NewMiddlePos);
// invalidate old highlighting, if changed