From 8f8abcc6b9dffdec12b2b7a5686b20ed0fcea5f1 Mon Sep 17 00:00:00 2001 From: maxim Date: Tue, 1 Aug 2017 22:41:16 +0000 Subject: [PATCH] Merged revision(s) 55604 #11a202ca0f, 55606 #c02c9089b0, 55613 #5e2dd67c2e from trunk: SynEdit: assert correct method types ........ SynEdit: fix range error. Issue #0032067 Patch by Pascal R. ........ SynEdit: fix crash in fold structure code TLazSynEditNestedFoldsList. Issue #0032223 ........ git-svn-id: branches/fixes_1_8@55628 - --- components/synedit/lazsynedittext.pas | 16 ++++++++++----- .../synedit/synedithighlighterfoldbase.pas | 20 ++++++++++++++++--- components/synedit/syneditmarks.pp | 7 ++++++- components/synedit/syneditmarkupifdef.pp | 8 ++++---- components/synedit/synedittextbuffer.pp | 9 +++++---- components/synedit/syngutterlinenumber.pp | 8 ++++---- components/synedit/syngutterlineoverview.pp | 20 +++++++++---------- components/synedit/synpluginmulticaret.pp | 4 ++-- .../synedit/synpluginsyncronizededitbase.pp | 8 ++++---- ide/sourcesyneditor.pas | 16 +++++++-------- 10 files changed, 71 insertions(+), 45 deletions(-) diff --git a/components/synedit/lazsynedittext.pas b/components/synedit/lazsynedittext.pas index 6c9dcc5b82..aca41b3b7d 100644 --- a/components/synedit/lazsynedittext.pas +++ b/components/synedit/lazsynedittext.pas @@ -50,7 +50,7 @@ type TSynEditNotifyReason = ( // TStringListLineCountEvent senrLineCount, // Lines Inserted or Deleted (if not empty, they will trigger senrLineChange too) senrLineChange, // Lines modified (also triggered by senrEditAction) - senrLinesModified, // Send once in "EndUpdate". Modified, inserted or deleted + senrLinesModified, //TStringListLinesModifiedEvent: Send once in "EndUpdate". Modified, inserted or deleted senrHighlightChanged, // used by Highlighter (invalidate and fold checks needed) // TStringListLineEditEvent senrEditAction, // EditInsert, EditDelete, EditLineBreak, ... @@ -280,6 +280,12 @@ type procedure DoGetPhysicalCharWidths(Line: PChar; LineLen, Index: Integer; PWidths: PPhysicalCharWidth); virtual; abstract; function GetDisplayView: TLazSynDisplayView; virtual; + + procedure AddGenericHandler(AReason: TSynEditNotifyReason; + AHandler: TMethod); virtual; abstract; + procedure RemoveGenericHandler(AReason: TSynEditNotifyReason; + AHandler: TMethod); virtual; abstract; + public constructor Create; destructor Destroy; override; @@ -292,8 +298,6 @@ type procedure InsertLines(Index, NumLines: integer); virtual; abstract; procedure InsertStrings(Index: integer; NewStrings: TStrings); virtual; abstract; - procedure AddGenericHandler(AReason: TSynEditNotifyReason; - AHandler: TMethod); virtual; abstract; procedure AddModifiedHandler(AReason: TSynEditNotifyReason; AHandler: TStringListLinesModifiedEvent); procedure AddChangeHandler(AReason: TSynEditNotifyReason; @@ -301,8 +305,6 @@ type procedure AddNotifyHandler(AReason: TSynEditNotifyReason; AHandler: TNotifyEvent); - procedure RemoveGenericHandler(AReason: TSynEditNotifyReason; - AHandler: TMethod); virtual; abstract; procedure RemoveModifiedHandler(AReason: TSynEditNotifyReason; AHandler: TStringListLinesModifiedEvent); procedure RemoveChangeHandler(AReason: TSynEditNotifyReason; @@ -988,12 +990,14 @@ end; procedure TSynEditStrings.AddChangeHandler(AReason: TSynEditNotifyReason; AHandler: TStringListLineCountEvent); begin + assert(AReason in [senrLineCount, senrLineChange, senrHighlightChanged], 'AddChangeHandler'); AddGenericHandler(AReason, TMethod(AHandler)); end; procedure TSynEditStrings.AddNotifyHandler(AReason: TSynEditNotifyReason; AHandler: TNotifyEvent); begin + assert(AReason in [senrCleared..senrTextBufferChanged], 'AddNotifyHandler'); AddGenericHandler(AReason, TMethod(AHandler)); end; @@ -1007,12 +1011,14 @@ end; procedure TSynEditStrings.RemoveChangeHandler(AReason: TSynEditNotifyReason; AHandler: TStringListLineCountEvent); begin + assert(AReason in [senrLineCount, senrLineChange, senrHighlightChanged], 'RemoveChangeHandler'); RemoveGenericHandler(AReason, TMethod(AHandler)); end; procedure TSynEditStrings.RemoveNotifyHandler(AReason: TSynEditNotifyReason; AHandler: TNotifyEvent); begin + assert(AReason in [senrCleared..senrTextBufferChanged], 'RemoveNotifyHandler'); RemoveGenericHandler(AReason, TMethod(AHandler)); end; diff --git a/components/synedit/synedithighlighterfoldbase.pas b/components/synedit/synedithighlighterfoldbase.pas index 383ee730dc..56bb0bda05 100644 --- a/components/synedit/synedithighlighterfoldbase.pas +++ b/components/synedit/synedithighlighterfoldbase.pas @@ -632,10 +632,10 @@ function dbgs(ANode: TSynFoldNodeInfo): string; begin with ANode do if sfaInvalid in FoldAction then - Result := Format('L=%3d I=%d X=%2d-%2d Fld=%d-%d Nst=%d-%d FT=%d FTC=%d Grp=%d A=%s', + Result := Format('L=%3d I=%d X=%2d-%2d Fld=%d-%d Nst=%d-%d FT=%2d FTC=%2d Grp=%d A=%s', [LineIndex, NodeIndex, 0, 0, 0, 0, 0, 0, 0, 0, 0, dbgs(FoldAction)]) else - Result := Format('L=%3d I=%d X=%2d-%2d Fld=%d-%d Nst=%d-%d FT=%d FTC=%d Grp=%d A=%s', + Result := Format('L=%3d I=%d X=%2d-%2d Fld=%d-%d Nst=%d-%d FT=%2d FTC=%2d Grp=%d A=%s', [LineIndex, NodeIndex, LogXStart, LogXEnd, FoldLvlStart, FoldLvlEnd, NestLvlStart, NestLvlEnd, PtrUInt(FoldType), PtrUInt(FoldTypeCompatible), FoldGroup, @@ -682,8 +682,16 @@ begin end; function dbgs(ANestInfo: TLazSynEditNestedFoldsListEntry): String; +var + i: Integer; begin - Result := 'LineIdx='+dbgs(ANestInfo.LineIdx)+' '+dbgs(ANestInfo.HNode); + Result := Format('LineIdx:%4d', [ANestInfo.LineIdx ]) + +' HNode: '+dbgs(ANestInfo.HNode) + +' | PrevCnt: '+dbgs(length(ANestInfo.PrevNodeAtSameLevel)) + +' MinLvl: ['; + for i := 0 to high(ANestInfo.FGroupMinLevels) do + Result := Result+inttostr(ANestInfo.FGroupMinLevels[i])+','; + Result := Result+']'; end; { TLazSynFoldNodeInfoList } @@ -1243,6 +1251,9 @@ var c1 := FGroupEndLevelsAtEval[i] - l; FGroupEndLevelsAtEval[i] := l; c := c + c1; + end + else begin + FPreviousNestInfo[pcnt].FGroupMinLevels[i] := FGroupEndLevelsAtEval[i]; end; dec(i); end; @@ -1252,6 +1263,9 @@ var if (l < FGroupEndLevelsAtEval[0]) then begin c := FGroupEndLevelsAtEval[0] - l; FGroupEndLevelsAtEval[0] := l; + end + else begin + FPreviousNestInfo[pcnt].FGroupMinLevels[0] := FGroupEndLevelsAtEval[0]; end; end; diff --git a/components/synedit/syneditmarks.pp b/components/synedit/syneditmarks.pp index f219d739e5..fc2360d9f9 100644 --- a/components/synedit/syneditmarks.pp +++ b/components/synedit/syneditmarks.pp @@ -594,7 +594,12 @@ begin if Result <> 0 then exit; - Result := PtrInt(m2) - PtrInt(m1); + if Mark2 > Mark1 then + Result := 1 + else if Mark1 > Mark2 then + Result := -1 + else + Result := 0; end; procedure TSynEditMarkLine.Sort(PrimaryOrder: TSynEditMarkSortOrder; diff --git a/components/synedit/syneditmarkupifdef.pp b/components/synedit/syneditmarkupifdef.pp index 2dfa9bff3b..2f2cf91632 100644 --- a/components/synedit/syneditmarkupifdef.pp +++ b/components/synedit/syneditmarkupifdef.pp @@ -3925,8 +3925,8 @@ end; procedure TSynEditMarkupIfDef.SetLines(const AValue: TSynEditStrings); begin if Lines <> nil then begin - Lines.RemoveGenericHandler(senrTextBufferChanged, TMethod(@DoBufferChanged)); - Lines.RemoveGenericHandler(senrTextBufferChanging, TMethod(@DoBufferChanging)); + Lines.RemoveNotifyHandler(senrTextBufferChanged, @DoBufferChanged); + Lines.RemoveNotifyHandler(senrTextBufferChanging, @DoBufferChanging); //FLines.RemoveEditHandler(@DoLinesEdited); // FLines.RemoveChangeHandler(senrHighlightChanged, @DoHighlightChanged); end; @@ -3936,8 +3936,8 @@ begin FOuterLines.Lines := AValue; if Lines <> nil then begin - Lines.AddGenericHandler(senrTextBufferChanged, TMethod(@DoBufferChanged)); - Lines.AddGenericHandler(senrTextBufferChanging, TMethod(@DoBufferChanging)); + Lines.AddNotifyHandler(senrTextBufferChanged, @DoBufferChanged); + Lines.AddNotifyHandler(senrTextBufferChanging, @DoBufferChanging); //FLines.AddChangeHandler(senrHighlightChanged, @DoHighlightChanged); // FLines.AddEditHandler(@DoLinesEdited); end; diff --git a/components/synedit/synedittextbuffer.pp b/components/synedit/synedittextbuffer.pp index a2b8a0f259..36bc7b0014 100644 --- a/components/synedit/synedittextbuffer.pp +++ b/components/synedit/synedittextbuffer.pp @@ -205,6 +205,11 @@ type function LogicPosIsCombining(const AChar: PChar): Boolean; inline; function GetDisplayView: TLazSynDisplayView; override; + + procedure AddGenericHandler(AReason: TSynEditNotifyReason; + AHandler: TMethod); override; + procedure RemoveGenericHandler(AReason: TSynEditNotifyReason; + AHandler: TMethod); override; public constructor Create; destructor Destroy; override; @@ -219,10 +224,6 @@ type function GetPChar(ALineIndex: Integer; out ALen: Integer): PChar; override; // experimental procedure MarkModified(AFirst, ALast: Integer); procedure MarkSaved; - procedure AddGenericHandler(AReason: TSynEditNotifyReason; - AHandler: TMethod); override; - procedure RemoveGenericHandler(AReason: TSynEditNotifyReason; - AHandler: TMethod); override; procedure SendNotification(AReason: TSynEditNotifyReason; ASender: TSynEditStrings; aIndex, aCount: Integer); override; procedure SendNotification(AReason: TSynEditNotifyReason; diff --git a/components/synedit/syngutterlinenumber.pp b/components/synedit/syngutterlinenumber.pp index 3ee85f0138..7cad86c67d 100644 --- a/components/synedit/syngutterlinenumber.pp +++ b/components/synedit/syngutterlinenumber.pp @@ -76,8 +76,8 @@ procedure TSynGutterLineNumber.Init; begin inherited Init; FTextDrawer := Gutter.TextDrawer; - TSynEditStringList(TextBuffer).AddGenericHandler(senrLineCount, TMethod(@LineCountChanged)); - TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanged, TMethod(@BufferChanged)); + TSynEditStringList(TextBuffer).AddChangeHandler(senrLineCount, @LineCountChanged); + TSynEditStringList(TextBuffer).AddNotifyHandler(senrTextBufferChanged, @BufferChanged); FTextDrawer.RegisterOnFontChangeHandler(@FontChanged); LineCountchanged(nil, 0, 0); end; @@ -196,8 +196,8 @@ end; procedure TSynGutterLineNumber.BufferChanged(Sender: TObject); begin TSynEditStringList(Sender).RemoveHanlders(self); - TSynEditStringList(TextBuffer).AddGenericHandler(senrLineCount, TMethod(@LineCountChanged)); - TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanged, TMethod(@BufferChanged)); + TSynEditStringList(TextBuffer).AddChangeHandler(senrLineCount, @LineCountChanged); + TSynEditStringList(TextBuffer).AddNotifyHandler(senrTextBufferChanged, @BufferChanged); LineCountChanged(nil, 0, 0); end; diff --git a/components/synedit/syngutterlineoverview.pp b/components/synedit/syngutterlineoverview.pp index 5c8983b3b7..aa0e496136 100644 --- a/components/synedit/syngutterlineoverview.pp +++ b/components/synedit/syngutterlineoverview.pp @@ -1112,7 +1112,7 @@ procedure TSynGutterLOvProviderModifiedLines.BufferChanged(Sender: TObject); begin TSynEditStringList(Sender).RemoveHanlders(self); TSynEditStringList(TextBuffer).AddModifiedHandler(senrLinesModified, @LineModified); - TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanged, TMethod(@BufferChanged)); + TSynEditStringList(TextBuffer).AddNotifyHandler(senrTextBufferChanged, @BufferChanged); end; procedure TSynGutterLOvProviderModifiedLines.LineModified(Sender: TSynEditStrings; aIndex, @@ -1145,7 +1145,7 @@ constructor TSynGutterLOvProviderModifiedLines.Create(AOwner: TComponent); begin inherited Create(AOwner); TSynEditStringList(TextBuffer).AddModifiedHandler(senrLinesModified, @LineModified); - TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanged, TMethod(@BufferChanged)); + TSynEditStringList(TextBuffer).AddNotifyHandler(senrTextBufferChanged, @BufferChanged); TCustomSynEdit(SynEdit).RegisterStatusChangedHandler(@SynStatusChanged, [scModified]); FFirstTextLineChanged := -1; FLastTextLineChanged := -1; @@ -1257,8 +1257,8 @@ var i: Integer; begin TSynEditStringList(Sender).RemoveHanlders(self); - TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanging, TMethod(@BufferChanging)); - TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanged, TMethod(@BufferChanged)); + TSynEditStringList(TextBuffer).AddNotifyHandler(senrTextBufferChanging, @BufferChanging); + TSynEditStringList(TextBuffer).AddNotifyHandler(senrTextBufferChanged, @BufferChanged); TCustomSynEdit(SynEdit).Marks.RegisterChangeHandler(@DoMarkChange, [smcrAdded, smcrRemoved, smcrLine, smcrVisible, smcrChanged]); @@ -1278,8 +1278,8 @@ var begin inherited Create(AOwner); Color := clBlue; - TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanging, TMethod(@BufferChanging)); - TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanged, TMethod(@BufferChanged)); + TSynEditStringList(TextBuffer).AddNotifyHandler(senrTextBufferChanging, @BufferChanging); + TSynEditStringList(TextBuffer).AddNotifyHandler(senrTextBufferChanged, @BufferChanged); TCustomSynEdit(SynEdit).Marks.RegisterChangeHandler(@DoMarkChange, [smcrAdded, smcrRemoved, smcrLine, smcrVisible, smcrChanged]); @@ -1316,8 +1316,8 @@ end; procedure TSynGutterLineOverview.Init; begin inherited Init; - TSynEditStringList(TextBuffer).AddGenericHandler(senrLineCount, TMethod(@LineCountChanged)); - TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanged, TMethod(@BufferChanged)); + TSynEditStringList(TextBuffer).AddChangeHandler(senrLineCount, @LineCountChanged); + TSynEditStringList(TextBuffer).AddNotifyHandler(senrTextBufferChanged, @BufferChanged); FWinControl := TSynChildWinControl.Create(Self); FWinControl.Parent := SynEdit; FWinControl.DoubleBuffered := SynEdit.DoubleBuffered; @@ -1353,8 +1353,8 @@ end; procedure TSynGutterLineOverview.BufferChanged(Sender: TObject); begin TSynEditStringList(Sender).RemoveHanlders(self); - TSynEditStringList(TextBuffer).AddGenericHandler(senrLineCount, TMethod(@LineCountChanged)); - TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanged, TMethod(@BufferChanged)); + TSynEditStringList(TextBuffer).AddChangeHandler(senrLineCount, @LineCountChanged); + TSynEditStringList(TextBuffer).AddNotifyHandler(senrTextBufferChanged, @BufferChanged); LineCountChanged(nil, 0, 0); end; diff --git a/components/synedit/synpluginmulticaret.pp b/components/synedit/synpluginmulticaret.pp index 225400b872..9529860f56 100644 --- a/components/synedit/synpluginmulticaret.pp +++ b/components/synedit/synpluginmulticaret.pp @@ -1692,14 +1692,14 @@ begin ViewedTextBuffer.RemoveNotifyHandler(senrAfterDecPaintLock, @DoAfterDecPaintLock); ViewedTextBuffer.RemoveNotifyHandler(senrBeforeIncPaintLock, @DoBeforeIncPaintLock); ViewedTextBuffer.RemoveEditHandler(@DoLinesEdited); - ViewedTextBuffer.RemoveGenericHandler(senrTextBufferChanged, TMethod(@DoBufferChanged)); + ViewedTextBuffer.RemoveNotifyHandler(senrTextBufferChanged, @DoBufferChanged); end; end; procedure TSynPluginMultiCaretBase.DoEditorAdded(AValue: TCustomSynEdit); begin if Editor <> nil then begin - ViewedTextBuffer.AddGenericHandler(senrTextBufferChanged, TMethod(@DoBufferChanged)); + ViewedTextBuffer.AddNotifyHandler(senrTextBufferChanged, @DoBufferChanged); ViewedTextBuffer.AddEditHandler(@DoLinesEdited); ViewedTextBuffer.AddNotifyHandler(senrBeforeIncPaintLock, @DoBeforeIncPaintLock); ViewedTextBuffer.AddNotifyHandler(senrAfterDecPaintLock, @DoAfterDecPaintLock); diff --git a/components/synedit/synpluginsyncronizededitbase.pp b/components/synedit/synpluginsyncronizededitbase.pp index 486f8cd56f..a39c677043 100644 --- a/components/synedit/synpluginsyncronizededitbase.pp +++ b/components/synedit/synpluginsyncronizededitbase.pp @@ -774,8 +774,8 @@ begin Active := False; if Editor <> nil then begin if not FTextBufferChanging then begin - ViewedTextBuffer.RemoveGenericHandler(senrTextBufferChanging, TMethod(@DoBufferChanging)); - ViewedTextBuffer.RemoveGenericHandler(senrTextBufferChanged, TMethod(@DoBufferChanged)); + ViewedTextBuffer.RemoveNotifyHandler(senrTextBufferChanging, @DoBufferChanging); + ViewedTextBuffer.RemoveNotifyHandler(senrTextBufferChanged, @DoBufferChanged); end; ViewedTextBuffer.RemoveEditHandler(@DoLinesEdited); ViewedTextBuffer.RemoveNotifyHandler(senrAfterIncPaintLock, @DoIncPaintLock); @@ -810,8 +810,8 @@ begin ViewedTextBuffer.AddNotifyHandler(senrAfterIncPaintLock, @DoIncPaintLock); ViewedTextBuffer.AddNotifyHandler(senrBeforeDecPaintLock, @DoDecPaintLock); if not FTextBufferChanging then begin - ViewedTextBuffer.AddGenericHandler(senrTextBufferChanging, TMethod(@DoBufferChanging)); - ViewedTextBuffer.AddGenericHandler(senrTextBufferChanged, TMethod(@DoBufferChanged)); + ViewedTextBuffer.AddNotifyHandler(senrTextBufferChanging, @DoBufferChanging); + ViewedTextBuffer.AddNotifyHandler(senrTextBufferChanged, @DoBufferChanged); end; end; end; diff --git a/ide/sourcesyneditor.pas b/ide/sourcesyneditor.pas index 4fa7d0ef7d..9d043a7a3c 100644 --- a/ide/sourcesyneditor.pas +++ b/ide/sourcesyneditor.pas @@ -1858,10 +1858,10 @@ end; procedure TIDESynGutterLOvProviderPascal.BufferChanged(Sender: TObject); begin TSynEditStringList(Sender).RemoveHanlders(self); - TSynEditStringList(TextBuffer).AddGenericHandler(senrHighlightChanged, - TMethod(@HighlightChanged)); - TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanged, - TMethod(@BufferChanged)); + TSynEditStringList(TextBuffer).AddChangeHandler(senrHighlightChanged, + @HighlightChanged); + TSynEditStringList(TextBuffer).AddNotifyHandler(senrTextBufferChanged, + @BufferChanged); //LineCountChanged(nil, 0, 0); HighlightChanged(nil,-1,-1); end; @@ -2038,10 +2038,10 @@ begin SingleLine := False; Color := $D4D4D4; Color2 := $E8E8E8; - TSynEditStringList(TextBuffer).AddGenericHandler(senrHighlightChanged, - TMethod(@HighlightChanged)); - TSynEditStringList(TextBuffer).AddGenericHandler(senrTextBufferChanged, - TMethod(@BufferChanged)); + TSynEditStringList(TextBuffer).AddChangeHandler(senrHighlightChanged, + @HighlightChanged); + TSynEditStringList(TextBuffer).AddNotifyHandler(senrTextBufferChanged, + @BufferChanged); end; destructor TIDESynGutterLOvProviderPascal.Destroy;