mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-26 16:07:17 +01:00
SynEdit: Fixed some issues with not redrawing when folded
git-svn-id: trunk@20621 -
This commit is contained in:
parent
2401f2c20c
commit
00e3b0160c
@ -1688,12 +1688,12 @@ procedure TCustomSynEdit.ScanFromAfterLock;
|
|||||||
var
|
var
|
||||||
LastLineChanged: LongInt;
|
LastLineChanged: LongInt;
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- ScanFromAfterLock; fPaintLock:=', fPaintLock, ' fHighlighterNeedsUpdateStartLine=', fHighlighterNeedsUpdateStartLine,' fHighlighterNeedsUpdateEndLine=',fHighlighterNeedsUpdateEndLine]);{$ENDIF}
|
||||||
if fHighlighterNeedsUpdateStartLine>0 then begin
|
if fHighlighterNeedsUpdateStartLine>0 then begin
|
||||||
//DebugLn('TCustomSynEdit.DecPaintLock ',dbgs(fHighlighterNeedsUpdateStartLine),'-',dbgs(fHighlighterNeedsUpdateEndLine));
|
//DebugLn('TCustomSynEdit.DecPaintLock ',dbgs(fHighlighterNeedsUpdateStartLine),'-',dbgs(fHighlighterNeedsUpdateEndLine));
|
||||||
if fHighlighterNeedsUpdateStartLine<=FTheLinesView.Count then begin
|
if fHighlighterNeedsUpdateStartLine<=FTheLinesView.Count then begin
|
||||||
if fHighlighterNeedsUpdateEndLine>FTheLinesView.Count then
|
if fHighlighterNeedsUpdateEndLine>FTheLinesView.Count then
|
||||||
fHighlighterNeedsUpdateEndLine:=FTheLinesView.Count;
|
fHighlighterNeedsUpdateEndLine:=FTheLinesView.Count;
|
||||||
LastLineChanged:=fHighlighterNeedsUpdateEndLine;
|
|
||||||
// rescan all lines in range
|
// rescan all lines in range
|
||||||
// Note: The highlighter range of the line can be invalid as well,
|
// Note: The highlighter range of the line can be invalid as well,
|
||||||
// so start scan one line earlier
|
// so start scan one line earlier
|
||||||
@ -4379,6 +4379,7 @@ end;
|
|||||||
function TCustomSynEdit.ScanFrom(var Index: integer; AtLeastTilIndex: integer): integer;
|
function TCustomSynEdit.ScanFrom(var Index: integer; AtLeastTilIndex: integer): integer;
|
||||||
// Index and AtLeastTilIndex are 0 based
|
// Index and AtLeastTilIndex are 0 based
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- ScanFrom Index=', Index, ' AtLeats=', AtLeastTilIndex]);{$ENDIF}
|
||||||
if Index < 0 then Index := 0;
|
if Index < 0 then Index := 0;
|
||||||
if not assigned(fHighlighter) or (Index > FTheLinesView.Count - 1) then begin
|
if not assigned(fHighlighter) or (Index > FTheLinesView.Count - 1) then begin
|
||||||
FFoldedLinesView.FixFoldingAtTextIndex(Index);
|
FFoldedLinesView.FixFoldingAtTextIndex(Index);
|
||||||
@ -4395,11 +4396,13 @@ begin
|
|||||||
Topline := TopLine;
|
Topline := TopLine;
|
||||||
if Index > 0 then dec(Index);
|
if Index > 0 then dec(Index);
|
||||||
Dec(Result);
|
Dec(Result);
|
||||||
|
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- ScanFrom Result=', Result]);{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomSynEdit.LineCountChanged(Sender: TSynEditStrings;
|
procedure TCustomSynEdit.LineCountChanged(Sender: TSynEditStrings;
|
||||||
AIndex, ACount: Integer);
|
AIndex, ACount: Integer);
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- LineCountChanged Aindex', AIndex, ' ACount=', ACount]);{$ENDIF}
|
||||||
if PaintLock>0 then begin
|
if PaintLock>0 then begin
|
||||||
if (fHighlighterNeedsUpdateStartLine<1)
|
if (fHighlighterNeedsUpdateStartLine<1)
|
||||||
or (fHighlighterNeedsUpdateStartLine>AIndex+1) then
|
or (fHighlighterNeedsUpdateStartLine>AIndex+1) then
|
||||||
@ -4426,6 +4429,7 @@ procedure TCustomSynEdit.LineTextChanged(Sender: TSynEditStrings;
|
|||||||
var
|
var
|
||||||
EndIndex: Integer;
|
EndIndex: Integer;
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- LineTextChanged Aindex', AIndex, ' ACount=', ACount]);{$ENDIF}
|
||||||
if PaintLock>0 then begin
|
if PaintLock>0 then begin
|
||||||
if (fHighlighterNeedsUpdateStartLine<1)
|
if (fHighlighterNeedsUpdateStartLine<1)
|
||||||
or (fHighlighterNeedsUpdateStartLine>AIndex+1) then
|
or (fHighlighterNeedsUpdateStartLine>AIndex+1) then
|
||||||
@ -4460,6 +4464,7 @@ procedure TCustomSynEdit.FoldChanged(Index : integer);
|
|||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- FoldChanged; Index=', Index, ' topline=', TopLine, ' ScreenRowToRow(LinesInWindow + 1)=', ScreenRowToRow(LinesInWindow + 1)]);{$ENDIF}
|
||||||
TopLine := TopLine;
|
TopLine := TopLine;
|
||||||
i := FFoldedLinesView.CollapsedLineForFoldAtLine(CaretY);
|
i := FFoldedLinesView.CollapsedLineForFoldAtLine(CaretY);
|
||||||
if i > 0 then begin
|
if i > 0 then begin
|
||||||
|
|||||||
@ -328,7 +328,6 @@ type
|
|||||||
Line, LogX, LogX2, ELine, ELogX, ELogX2, FType: Integer;
|
Line, LogX, LogX2, ELine, ELogX, ELogX2, FType: Integer;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
{ TSynTextFoldAVLNodeData }
|
{ TSynTextFoldAVLNodeData }
|
||||||
|
|
||||||
function TSynTextFoldAVLNodeData.TreeDepth : integer;
|
function TSynTextFoldAVLNodeData.TreeDepth : integer;
|
||||||
@ -874,6 +873,7 @@ function TSynTextFoldAVLTree.InsertNewFold(ALine, AColumn, ACount : Integer) : T
|
|||||||
var
|
var
|
||||||
r : TSynTextFoldAVLNodeData;
|
r : TSynTextFoldAVLNodeData;
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- InsertNewFold ALine:=', ALine, ' AColumn=', AColumn]);{$ENDIF}
|
||||||
r := NewNode;
|
r := NewNode;
|
||||||
r.LineOffset := ALine;
|
r.LineOffset := ALine;
|
||||||
r.FoldIndex := AColumn;
|
r.FoldIndex := AColumn;
|
||||||
@ -891,6 +891,7 @@ var
|
|||||||
OldFold : TSynTextFoldAVLNode;
|
OldFold : TSynTextFoldAVLNode;
|
||||||
lcount: Integer;
|
lcount: Integer;
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- RemoveFoldForLine ALine:=', ALine, ' IgnoreFirst=', IgnoreFirst,' OnlyCol=',OnlyCol]);{$ENDIF}
|
||||||
Result := ALine;
|
Result := ALine;
|
||||||
OldFold := FindFoldForLine(ALine, true);
|
OldFold := FindFoldForLine(ALine, true);
|
||||||
if (not OldFold.IsInFold) // behind last node
|
if (not OldFold.IsInFold) // behind last node
|
||||||
@ -923,6 +924,7 @@ var
|
|||||||
OnlyNested: Boolean;
|
OnlyNested: Boolean;
|
||||||
Nested: TSynTextFoldAVLNode;
|
Nested: TSynTextFoldAVLNode;
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- RemoveFoldForNodeAtLine: ALine:=', ALine, ' ANode.StartLine=', ANode.StartLine]);{$ENDIF}
|
||||||
OnlyNested := ALine >= ANode.StartLine + ANode.FullCount;
|
OnlyNested := ALine >= ANode.StartLine + ANode.FullCount;
|
||||||
// The cfCollapsed line is one line before the fold
|
// The cfCollapsed line is one line before the fold
|
||||||
Result := ANode.StartLine-1; // Return the cfcollapsed that was unfolded
|
Result := ANode.StartLine-1; // Return the cfcollapsed that was unfolded
|
||||||
@ -1764,6 +1766,7 @@ begin
|
|||||||
// ftopline is not a folded line
|
// ftopline is not a folded line
|
||||||
// so node.FoldedBefore(next node after ftopl) does apply
|
// so node.FoldedBefore(next node after ftopl) does apply
|
||||||
tpos := fTopLine + node.FoldedBefore;
|
tpos := fTopLine + node.FoldedBefore;
|
||||||
|
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- CalculateMaps fTopLine:=', fTopLine, ' tpos=',tpos]);{$ENDIF}
|
||||||
cnt := fLines.Count;
|
cnt := fLines.Count;
|
||||||
for i := 0 to fLinesInWindow do begin
|
for i := 0 to fLinesInWindow do begin
|
||||||
if tpos > cnt then begin
|
if tpos > cnt then begin
|
||||||
@ -2236,12 +2239,16 @@ var
|
|||||||
Procedure DoRemoveNode(var theNode: TSynTextFoldAVLNode);
|
Procedure DoRemoveNode(var theNode: TSynTextFoldAVLNode);
|
||||||
var
|
var
|
||||||
tmpnode: TSynTextFoldAVLNode;
|
tmpnode: TSynTextFoldAVLNode;
|
||||||
|
l: Integer;
|
||||||
begin
|
begin
|
||||||
Result := True;
|
Result := True;
|
||||||
tmpnode := theNode.Prev;
|
tmpnode := theNode.Prev;
|
||||||
|
l := theNode.StartLine;
|
||||||
doFoldTree.RemoveFoldForNodeAtLine(theNode, -1); // Don't touch any nested node
|
doFoldTree.RemoveFoldForNodeAtLine(theNode, -1); // Don't touch any nested node
|
||||||
if tmpnode.IsInFold then theNode := tmpnode.Next
|
if tmpnode.IsInFold then theNode := tmpnode.Next
|
||||||
else theNode := doFoldTree.FindFirstFold;
|
else theNode := doFoldTree.FindFirstFold;
|
||||||
|
if Assigned(fOnFoldChanged) then
|
||||||
|
fOnFoldChanged(l);
|
||||||
end;
|
end;
|
||||||
var
|
var
|
||||||
FldLine, FldIndex, FldLen, FldCol: Integer;
|
FldLine, FldIndex, FldLen, FldCol: Integer;
|
||||||
@ -2318,6 +2325,7 @@ var
|
|||||||
var
|
var
|
||||||
node, tmpnode: TSynTextFoldAVLNode;
|
node, tmpnode: TSynTextFoldAVLNode;
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF SYNFOLDDEBUG}debugln(['>>FOLD-- FixFolding: Start=', AStart, ' AMinEnd=',AMinEnd]);{$ENDIF}
|
||||||
Result := false;
|
Result := false;
|
||||||
if fLockCount > 0 then begin
|
if fLockCount > 0 then begin
|
||||||
fNeedCaretCheck := true; // We may be here as a result of lines deleted/inserted
|
fNeedCaretCheck := true; // We may be here as a result of lines deleted/inserted
|
||||||
@ -2353,6 +2361,7 @@ begin
|
|||||||
|
|
||||||
Result := DoFixFolding(AStart, AMinEnd, 0, aFoldTree, node);
|
Result := DoFixFolding(AStart, AMinEnd, 0, aFoldTree, node);
|
||||||
CalculateMaps;
|
CalculateMaps;
|
||||||
|
{$IFDEF SYNFOLDDEBUG}debugln(['<<FOLD-- FixFolding: DONE=', Result]);{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynEditFoldedView.DoCaretChanged(Sender : TObject);
|
procedure TSynEditFoldedView.DoCaretChanged(Sender : TObject);
|
||||||
@ -2364,12 +2373,14 @@ begin
|
|||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
i := TSynEditCaret(Sender).LinePos-1;
|
i := TSynEditCaret(Sender).LinePos-1;
|
||||||
|
{$IFDEF SYNFOLDDEBUG}if FoldedAtTextIndex[i] then debugln(['FOLD-- DoCaretChanged about to unfold at Index=', i]);{$ENDIF}
|
||||||
if FoldedAtTextIndex[i] then
|
if FoldedAtTextIndex[i] then
|
||||||
UnFoldAtTextIndexCollapsed(i);
|
UnFoldAtTextIndexCollapsed(i);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSynEditFoldedView.LineCountChanged(Sender: TSynEditStrings; AIndex, ACount : Integer);
|
procedure TSynEditFoldedView.LineCountChanged(Sender: TSynEditStrings; AIndex, ACount : Integer);
|
||||||
begin
|
begin
|
||||||
|
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- LineCountChanged AIndex=', AIndex, ' Acount=',ACount]);{$ENDIF}
|
||||||
// no need for fix folding => synedit will be called, and scanlines will call fixfolding
|
// no need for fix folding => synedit will be called, and scanlines will call fixfolding
|
||||||
{TODO: a "need fix folding" flag => to ensure it will be called if synedit doesnt}
|
{TODO: a "need fix folding" flag => to ensure it will be called if synedit doesnt}
|
||||||
if (fLockCount > 0) and (AIndex < max(fNeedFixFrom, fNeedFixMinEnd)) then begin
|
if (fLockCount > 0) and (AIndex < max(fNeedFixFrom, fNeedFixMinEnd)) then begin
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user