From 9256d0293caf569997a5c4f004c63cbc57bb2698 Mon Sep 17 00:00:00 2001 From: martin Date: Thu, 24 Jan 2013 22:35:18 +0000 Subject: [PATCH] SynEdit, Markup: Defer work if SynEdit is not visible git-svn-id: trunk@39959 - --- components/synedit/synedit.pp | 19 ++++++++--- components/synedit/syneditmarkup.pp | 34 ++++++++++++++++---- components/synedit/syneditmarkupbracket.pp | 12 ++++++- components/synedit/syneditmarkuphighall.pp | 15 ++++++--- components/synedit/syneditmarkupwordgroup.pp | 12 ++++++- 5 files changed, 74 insertions(+), 18 deletions(-) diff --git a/components/synedit/synedit.pp b/components/synedit/synedit.pp index 33fdc1f9f5..c9fa98867d 100644 --- a/components/synedit/synedit.pp +++ b/components/synedit/synedit.pp @@ -780,6 +780,7 @@ type AnInfo: TSynEditMouseActionInfo): Boolean; protected + procedure SetVisible(Value: Boolean); override; procedure SetColor(Value: TColor); override; procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); override; @@ -3155,6 +3156,13 @@ begin end; end; +procedure TCustomSynEdit.SetVisible(Value: Boolean); +begin + inherited SetVisible(Value); + if fMarkupManager <> nil then + fMarkupManager.DoVisibleChanged(Value); +end; + procedure TCustomSynEdit.SetColor(Value: TColor); begin inherited SetColor(Value); @@ -3966,7 +3974,8 @@ begin DoDecPaintLock(Self); end; -procedure TCustomSynEdit.SetHighlightSearch(const ASearch : String; AOptions : TSynSearchOptions); +procedure TCustomSynEdit.SetHighlightSearch(const ASearch: String; + AOptions: TSynSearchOptions); begin fMarkupHighAll.SearchOptions := AOptions; fMarkupHighAll.SearchString := ASearch; @@ -4699,8 +4708,8 @@ begin Done := False; end; -procedure TCustomSynEdit.LineCountChanged(Sender: TSynEditStrings; - AIndex, ACount: Integer); +procedure TCustomSynEdit.LineCountChanged(Sender: TSynEditStrings; AIndex, + ACount: Integer); begin {$IFDEF SynFoldDebug}debugln(['FOLD-- LineCountChanged Aindex', AIndex, ' ACount=', ACount]);{$ENDIF} FBlockSelection.StickyAutoExtend := False; @@ -4735,8 +4744,8 @@ begin UpdateScrollBars; end; -procedure TCustomSynEdit.LineTextChanged(Sender: TSynEditStrings; - AIndex, ACount: Integer); +procedure TCustomSynEdit.LineTextChanged(Sender: TSynEditStrings; AIndex, + ACount: Integer); begin {$IFDEF SynFoldDebug}debugln(['FOLD-- LineTextChanged Aindex', AIndex, ' ACount=', ACount]);{$ENDIF} FBlockSelection.StickyAutoExtend := False; diff --git a/components/synedit/syneditmarkup.pp b/components/synedit/syneditmarkup.pp index 57b30f38b4..95cb08d015 100644 --- a/components/synedit/syneditmarkup.pp +++ b/components/synedit/syneditmarkup.pp @@ -79,6 +79,7 @@ type procedure DoLinesInWindoChanged(OldLinesInWindow : Integer); virtual; procedure DoTextChanged(StartLine, EndLine : Integer); virtual; // 1 based procedure DoMarkupChanged(AMarkup: TSynSelectedColor); virtual; + procedure DoVisibleChanged(AVisible: Boolean); virtual; procedure InvalidateSynLines(FirstLine, LastLine: integer); // Call Synedt to invalidate lines function ScreenRowToRow(aRow : Integer) : Integer; @@ -147,6 +148,7 @@ type destructor Destroy; override; procedure IncPaintLock; override; procedure DecPaintLock; override; + procedure DoVisibleChanged(AVisible: Boolean); override; Procedure AddMarkUp(aMarkUp : TSynEditMarkup; AsFirst: Boolean = False); Procedure RemoveMarkUp(aMarkUp : TSynEditMarkup); @@ -317,6 +319,11 @@ procedure TSynEditMarkup.DoMarkupChanged(AMarkup : TSynSelectedColor); begin end; +procedure TSynEditMarkup.DoVisibleChanged(AVisible: Boolean); +begin + // +end; + procedure TSynEditMarkup.InvalidateSynLines(FirstLine, LastLine : integer); begin if assigned(fInvalidateLinesMethod) @@ -371,7 +378,7 @@ begin inherited Destroy; end; -procedure TSynEditMarkup.FinishMarkupForRow(aRow : Integer); +procedure TSynEditMarkup.FinishMarkupForRow(aRow: Integer); begin end; @@ -415,7 +422,7 @@ begin dec(FPaintLock); end; -procedure TSynEditMarkup.PrepareMarkupForRow(aRow : Integer); +procedure TSynEditMarkup.PrepareMarkupForRow(aRow: Integer); begin end; @@ -456,7 +463,8 @@ begin TSynEditMarkup(fMarkUpList[i]).DecPaintLock; end; -procedure TSynEditMarkupManager.AddMarkUp(aMarkUp : TSynEditMarkup; AsFirst: Boolean = False); +procedure TSynEditMarkupManager.AddMarkUp(aMarkUp: TSynEditMarkup; + AsFirst: Boolean); begin if AsFirst then fMarkUpList.Insert(0, aMarkUp) @@ -486,7 +494,7 @@ begin Result := fMarkUpList.Count; end; -procedure TSynEditMarkupManager.FinishMarkupForRow(aRow : Integer); +procedure TSynEditMarkupManager.FinishMarkupForRow(aRow: Integer); var i : integer; begin @@ -504,7 +512,7 @@ begin TSynEditMarkup(fMarkUpList[i]).EndMarkup; end; -procedure TSynEditMarkupManager.PrepareMarkupForRow(aRow : Integer); +procedure TSynEditMarkupManager.PrepareMarkupForRow(aRow: Integer); var i : integer; begin @@ -527,7 +535,8 @@ begin end; function TSynEditMarkupManager.GetMarkupAttributeAtRowCol(const aRow: Integer; - const aStartCol: TLazSynDisplayTokenBound; const AnRtlInfo: TLazSynDisplayRtlInfo) : TSynSelectedColor; + const aStartCol: TLazSynDisplayTokenBound; + const AnRtlInfo: TLazSynDisplayRtlInfo): TSynSelectedColor; begin assert(false); Result := MarkupInfo; @@ -575,7 +584,8 @@ begin end; end; -procedure TSynEditMarkupManager.TextChanged(aFirstCodeLine, aLastCodeLine: Integer); +procedure TSynEditMarkupManager.TextChanged(aFirstCodeLine, + aLastCodeLine: Integer); var i : integer; begin @@ -644,6 +654,16 @@ begin TSynEditMarkup(fMarkUpList[i]).SetCaret(AValue); end; +procedure TSynEditMarkupManager.DoVisibleChanged(AVisible: Boolean); +var + i: Integer; +begin + inherited DoVisibleChanged(AVisible); + if fMarkUpList = nil then exit; + for i := 0 to fMarkUpList.Count-1 do + TSynEditMarkup(fMarkUpList[i]).DoVisibleChanged(AVisible); +end; + end. diff --git a/components/synedit/syneditmarkupbracket.pp b/components/synedit/syneditmarkupbracket.pp index 5b35dbd44a..e81eaa1bf3 100644 --- a/components/synedit/syneditmarkupbracket.pp +++ b/components/synedit/syneditmarkupbracket.pp @@ -52,6 +52,7 @@ type procedure DoLinesInWindoChanged(OldLinesInWindow : Integer); override; procedure DoTextChanged(StartLine, EndLine : Integer); override; procedure DoMarkupChanged(AMarkup: TSynSelectedColor); override; + procedure DoVisibleChanged(AVisible: Boolean); override; public constructor Create(ASynEdit: TSynEditBase); procedure DecPaintLock; override; @@ -172,12 +173,21 @@ begin InvalidateBracketHighlight; end; +procedure TSynEditMarkupBracket.DoVisibleChanged(AVisible: Boolean); +begin + inherited DoVisibleChanged(AVisible); + if SynEdit.IsVisible then + InvalidateBracketHighlight; +end; + procedure TSynEditMarkupBracket.InvalidateBracketHighlight; var NewPos, NewAntiPos, SwapPos : TPoint; begin FNeedInvalidate := True; - if (Caret = nil) or (not SynEdit.HandleAllocated) or (FPaintLock > 0) then + if (Caret = nil) or (not SynEdit.HandleAllocated) or (FPaintLock > 0) or + (not SynEdit.IsVisible) + then exit; FNeedInvalidate := False; diff --git a/components/synedit/syneditmarkuphighall.pp b/components/synedit/syneditmarkuphighall.pp index d62e45d56c..1b30bb0d44 100644 --- a/components/synedit/syneditmarkuphighall.pp +++ b/components/synedit/syneditmarkuphighall.pp @@ -110,6 +110,7 @@ type procedure DoLinesInWindoChanged(OldLinesInWindow : Integer); override; procedure DoMarkupChanged(AMarkup: TSynSelectedColor); override; procedure DoTextChanged(StartLine, EndLine: Integer); override; // 1 based + procedure DoVisibleChanged(AVisible: Boolean); override; function HasVisibleMatch: Boolean; // does not check, if in visible line range. Only Count and DideSingleMatch property MatchCount: Integer read GetMatchCount; property MarkupEnabled: Boolean read FMarkupEnabled; @@ -697,7 +698,7 @@ var FirstKeptValidIdx: Integer; // The first index, kept after the removed invalidated range p: TPoint; begin - if FPaintLock > 0 then begin + if (FPaintLock > 0) or (not SynEdit.IsVisible) then begin FNeedValidate := True; if not SkipPaint then FNeedValidatePaint := True; @@ -718,7 +719,6 @@ begin MaybeDropOldMatches; FirstKeptValidIdx := DeleteInvalidMatches; //DebugLnEnter(['>>> ValidateMatches ', FFirstInvalidLine, ' - ',FLastInvalidLine, ' Cnt=',FMatches.Count, ' Idx: ', FirstKeptValidIdx, ' ',SynEdit.Name, ' # ',fSearchString]); - FindInitialize; if not IsPosValid(FSearchedEnd) then @@ -841,14 +841,21 @@ begin InvalidateLines(StartLine, MaxInt); // EndLine); // Might be LineCount changed end; +procedure TSynEditMarkupHighlightAll.DoVisibleChanged(AVisible: Boolean); +begin + inherited DoVisibleChanged(AVisible); + if FNeedValidate and SynEdit.IsVisible then + ValidateMatches(True); +end; + function TSynEditMarkupHighlightAll.HasVisibleMatch: Boolean; begin Result := ( HideSingleMatch and (FMatches.Count > 1) ) or ( (not HideSingleMatch) and (FMatches.Count > 0) ); end; -procedure TSynEditMarkupHighlightAll.InvalidateLines(AFirstLine: Integer; ALastLine: Integer; - SkipPaint: Boolean); +procedure TSynEditMarkupHighlightAll.InvalidateLines(AFirstLine: Integer; + ALastLine: Integer; SkipPaint: Boolean); begin if AFirstLine < 1 then AFirstLine := 1; diff --git a/components/synedit/syneditmarkupwordgroup.pp b/components/synedit/syneditmarkupwordgroup.pp index 9a092642ec..9905eda295 100644 --- a/components/synedit/syneditmarkupwordgroup.pp +++ b/components/synedit/syneditmarkupwordgroup.pp @@ -56,6 +56,7 @@ type procedure DoLinesInWindoChanged(OldLinesInWindow : Integer); override; procedure DoTextChanged(StartLine, EndLine : Integer); override; procedure DoMarkupChanged(AMarkup: TSynSelectedColor); override; + procedure DoVisibleChanged(AVisible: Boolean); override; procedure InvalidateCurrentHighlight; public constructor Create(ASynEdit: TSynEditBase); @@ -329,12 +330,21 @@ begin InvalidateCurrentHighlight; end; +procedure TSynEditMarkupWordGroup.DoVisibleChanged(AVisible: Boolean); +begin + inherited DoVisibleChanged(AVisible); + if SynEdit.IsVisible then + InvalidateCurrentHighlight; +end; + procedure TSynEditMarkupWordGroup.InvalidateCurrentHighlight; var NewPos, NewAntiPos, NewMiddlePos : TWordPoint; begin FNeedInvalidate := True; - if (Caret = nil) or (not SynEdit.HandleAllocated) or (FPaintLock > 0) then + if (Caret = nil) or (not SynEdit.HandleAllocated) or (FPaintLock > 0) or + (not SynEdit.IsVisible) + then exit; FNeedInvalidate := False;