SynEdit: Fixed some issues with not redrawing when folded

git-svn-id: trunk@20621 -
This commit is contained in:
martin 2009-06-13 23:51:58 +00:00
parent 2401f2c20c
commit 00e3b0160c
2 changed files with 18 additions and 2 deletions

View File

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

View File

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