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
LastLineChanged: LongInt;
begin
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- ScanFromAfterLock; fPaintLock:=', fPaintLock, ' fHighlighterNeedsUpdateStartLine=', fHighlighterNeedsUpdateStartLine,' fHighlighterNeedsUpdateEndLine=',fHighlighterNeedsUpdateEndLine]);{$ENDIF}
if fHighlighterNeedsUpdateStartLine>0 then begin
//DebugLn('TCustomSynEdit.DecPaintLock ',dbgs(fHighlighterNeedsUpdateStartLine),'-',dbgs(fHighlighterNeedsUpdateEndLine));
if fHighlighterNeedsUpdateStartLine<=FTheLinesView.Count then begin
if fHighlighterNeedsUpdateEndLine>FTheLinesView.Count then
fHighlighterNeedsUpdateEndLine:=FTheLinesView.Count;
LastLineChanged:=fHighlighterNeedsUpdateEndLine;
// rescan all lines in range
// Note: The highlighter range of the line can be invalid as well,
// so start scan one line earlier
@ -4379,6 +4379,7 @@ end;
function TCustomSynEdit.ScanFrom(var Index: integer; AtLeastTilIndex: integer): integer;
// Index and AtLeastTilIndex are 0 based
begin
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- ScanFrom Index=', Index, ' AtLeats=', AtLeastTilIndex]);{$ENDIF}
if Index < 0 then Index := 0;
if not assigned(fHighlighter) or (Index > FTheLinesView.Count - 1) then begin
FFoldedLinesView.FixFoldingAtTextIndex(Index);
@ -4395,11 +4396,13 @@ begin
Topline := TopLine;
if Index > 0 then dec(Index);
Dec(Result);
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- ScanFrom Result=', Result]);{$ENDIF}
end;
procedure TCustomSynEdit.LineCountChanged(Sender: TSynEditStrings;
AIndex, ACount: Integer);
begin
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- LineCountChanged Aindex', AIndex, ' ACount=', ACount]);{$ENDIF}
if PaintLock>0 then begin
if (fHighlighterNeedsUpdateStartLine<1)
or (fHighlighterNeedsUpdateStartLine>AIndex+1) then
@ -4426,6 +4429,7 @@ procedure TCustomSynEdit.LineTextChanged(Sender: TSynEditStrings;
var
EndIndex: Integer;
begin
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- LineTextChanged Aindex', AIndex, ' ACount=', ACount]);{$ENDIF}
if PaintLock>0 then begin
if (fHighlighterNeedsUpdateStartLine<1)
or (fHighlighterNeedsUpdateStartLine>AIndex+1) then
@ -4460,6 +4464,7 @@ procedure TCustomSynEdit.FoldChanged(Index : integer);
var
i: Integer;
begin
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- FoldChanged; Index=', Index, ' topline=', TopLine, ' ScreenRowToRow(LinesInWindow + 1)=', ScreenRowToRow(LinesInWindow + 1)]);{$ENDIF}
TopLine := TopLine;
i := FFoldedLinesView.CollapsedLineForFoldAtLine(CaretY);
if i > 0 then begin

View File

@ -328,7 +328,6 @@ type
Line, LogX, LogX2, ELine, ELogX, ELogX2, FType: Integer;
end;
{ TSynTextFoldAVLNodeData }
function TSynTextFoldAVLNodeData.TreeDepth : integer;
@ -874,6 +873,7 @@ function TSynTextFoldAVLTree.InsertNewFold(ALine, AColumn, ACount : Integer) : T
var
r : TSynTextFoldAVLNodeData;
begin
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- InsertNewFold ALine:=', ALine, ' AColumn=', AColumn]);{$ENDIF}
r := NewNode;
r.LineOffset := ALine;
r.FoldIndex := AColumn;
@ -891,6 +891,7 @@ var
OldFold : TSynTextFoldAVLNode;
lcount: Integer;
begin
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- RemoveFoldForLine ALine:=', ALine, ' IgnoreFirst=', IgnoreFirst,' OnlyCol=',OnlyCol]);{$ENDIF}
Result := ALine;
OldFold := FindFoldForLine(ALine, true);
if (not OldFold.IsInFold) // behind last node
@ -923,6 +924,7 @@ var
OnlyNested: Boolean;
Nested: TSynTextFoldAVLNode;
begin
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- RemoveFoldForNodeAtLine: ALine:=', ALine, ' ANode.StartLine=', ANode.StartLine]);{$ENDIF}
OnlyNested := ALine >= ANode.StartLine + ANode.FullCount;
// The cfCollapsed line is one line before the fold
Result := ANode.StartLine-1; // Return the cfcollapsed that was unfolded
@ -1764,6 +1766,7 @@ begin
// ftopline is not a folded line
// so node.FoldedBefore(next node after ftopl) does apply
tpos := fTopLine + node.FoldedBefore;
{$IFDEF SYNFOLDDEBUG}debugln(['FOLD-- CalculateMaps fTopLine:=', fTopLine, ' tpos=',tpos]);{$ENDIF}
cnt := fLines.Count;
for i := 0 to fLinesInWindow do begin
if tpos > cnt then begin
@ -2236,12 +2239,16 @@ var
Procedure DoRemoveNode(var theNode: TSynTextFoldAVLNode);
var
tmpnode: TSynTextFoldAVLNode;
l: Integer;
begin
Result := True;
tmpnode := theNode.Prev;
l := theNode.StartLine;
doFoldTree.RemoveFoldForNodeAtLine(theNode, -1); // Don't touch any nested node
if tmpnode.IsInFold then theNode := tmpnode.Next
else theNode := doFoldTree.FindFirstFold;
if Assigned(fOnFoldChanged) then
fOnFoldChanged(l);
end;
var
FldLine, FldIndex, FldLen, FldCol: Integer;
@ -2318,6 +2325,7 @@ var
var
node, tmpnode: TSynTextFoldAVLNode;
begin
{$IFDEF SYNFOLDDEBUG}debugln(['>>FOLD-- FixFolding: Start=', AStart, ' AMinEnd=',AMinEnd]);{$ENDIF}
Result := false;
if fLockCount > 0 then begin
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);
CalculateMaps;
{$IFDEF SYNFOLDDEBUG}debugln(['<<FOLD-- FixFolding: DONE=', Result]);{$ENDIF}
end;
procedure TSynEditFoldedView.DoCaretChanged(Sender : TObject);
@ -2364,12 +2373,14 @@ begin
exit;
end;
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
UnFoldAtTextIndexCollapsed(i);
end;
procedure TSynEditFoldedView.LineCountChanged(Sender: TSynEditStrings; AIndex, ACount : Integer);
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
{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