diff --git a/components/synedit/synedit.pp b/components/synedit/synedit.pp index 56ec1b0449..e699665262 100644 --- a/components/synedit/synedit.pp +++ b/components/synedit/synedit.pp @@ -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; diff --git a/components/synedit/syneditmarkup.pp b/components/synedit/syneditmarkup.pp index f4e1e21c51..db9f3303ea 100644 --- a/components/synedit/syneditmarkup.pp +++ b/components/synedit/syneditmarkup.pp @@ -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 diff --git a/components/synedit/syneditmarkupbracket.pp b/components/synedit/syneditmarkupbracket.pp index d817359b8c..b6054e43d4 100644 --- a/components/synedit/syneditmarkupbracket.pp +++ b/components/synedit/syneditmarkupbracket.pp @@ -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 diff --git a/components/synedit/syneditmarkupwordgroup.pp b/components/synedit/syneditmarkupwordgroup.pp index 33f4b20766..6c73b9bacd 100644 --- a/components/synedit/syneditmarkupwordgroup.pp +++ b/components/synedit/syneditmarkupwordgroup.pp @@ -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