SynEdit: Highlighter, make sure to call SendHighlightChanged (even if lines where deleted, instead of scanned / HL still changed back to valid/"no scan needed")

(cherry picked from commit 031eb66656)
This commit is contained in:
Martin 2021-09-28 00:07:54 +02:00
parent 4739022418
commit d488f04626
2 changed files with 8 additions and 2 deletions

View File

@ -52,6 +52,7 @@ type
senrLineChange, // Lines modified (also triggered by senrEditAction) senrLineChange, // Lines modified (also triggered by senrEditAction)
senrLinesModified, //TStringListLinesModifiedEvent: 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) senrHighlightChanged, // used by Highlighter (invalidate and fold checks needed)
// SynEdit.SetHighlighter sends the special (-1,-1) notification
senrLineMappingChanged, // folds added/removed - virtual X/Y changed. (ACount is not used) senrLineMappingChanged, // folds added/removed - virtual X/Y changed. (ACount is not used)
// TStringListLineEditEvent // TStringListLineEditEvent
senrEditAction, // EditInsert, EditDelete, EditLineBreak, ... senrEditAction, // EditInsert, EditDelete, EditLineBreak, ...

View File

@ -1673,8 +1673,9 @@ var
StartIndex, EndIndex: Integer; StartIndex, EndIndex: Integer;
begin begin
StartIndex := CurrentRanges.NeedsReScanStartIndex; StartIndex := CurrentRanges.NeedsReScanStartIndex;
if (StartIndex < 0) or (StartIndex >= CurrentRanges.Count) then if (StartIndex < 0) then
exit; exit;
EndIndex := CurrentRanges.NeedsReScanEndIndex + 1; EndIndex := CurrentRanges.NeedsReScanEndIndex + 1;
//debugln(['=== scan ',StartIndex,' - ',EndIndex]); //debugln(['=== scan ',StartIndex,' - ',EndIndex]);
FIsScanning := True; FIsScanning := True;
@ -1683,10 +1684,14 @@ begin
finally finally
FIsScanning := False; FIsScanning := False;
end; end;
assert(CurrentRanges.NeedsReScanRealStartIndex <= StartIndex, 'TSynCustomHighlighter.ScanRanges: CurrentRanges.NeedsReScanRealStartIndex <= StartIndex');
StartIndex := CurrentRanges.NeedsReScanRealStartIndex; // include idle scanned StartIndex := CurrentRanges.NeedsReScanRealStartIndex; // include idle scanned
CurrentRanges.ClearReScanNeeded; CurrentRanges.ClearReScanNeeded;
// Invalidate one line above, since folds can change depending on next line // Invalidate one line above, since folds can change depending on next line
// TODO: only classes with end-fold-last-line // TODO: only classes with end-fold-last-line
if (StartIndex >= CurrentRanges.Count)
then CurrentLines.SendHighlightChanged(CurrentRanges.Count, 0) // No lines scanned, validate because lines are gone / Do not need the extra line
else
if StartIndex > 0 if StartIndex > 0
then CurrentLines.SendHighlightChanged(StartIndex - 1, EndIndex - StartIndex + 1) then CurrentLines.SendHighlightChanged(StartIndex - 1, EndIndex - StartIndex + 1)
else CurrentLines.SendHighlightChanged(StartIndex, EndIndex - StartIndex ); else CurrentLines.SendHighlightChanged(StartIndex, EndIndex - StartIndex );
@ -1699,7 +1704,7 @@ begin
Result := False; Result := False;
StartIndex := CurrentRanges.NeedsReScanStartIndex; StartIndex := CurrentRanges.NeedsReScanStartIndex;
if (StartIndex < 0) or (StartIndex >= CurrentRanges.Count) then if (StartIndex < 0) or (StartIndex >= CurrentRanges.Count) then
exit; exit; // If StartIndex > 0 then ScanRanges will send the notification
EndIndex := CurrentRanges.NeedsReScanEndIndex + 1; EndIndex := CurrentRanges.NeedsReScanEndIndex + 1;
RealEndIndex := EndIndex; RealEndIndex := EndIndex;