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 -
This commit is contained in:
maxim 2017-08-01 22:41:16 +00:00
parent f313d9def0
commit 8f8abcc6b9
10 changed files with 71 additions and 45 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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