SynEdit: Refactor/Cleanup

git-svn-id: trunk@18119 -
This commit is contained in:
martin 2009-01-04 22:47:37 +00:00
parent e9be67479b
commit 435391d80e
5 changed files with 135 additions and 343 deletions

View File

@ -515,8 +515,6 @@ type
{$IFDEF SYN_LAZARUS}
function LeftSpaces(const Line: string; Physical: boolean): Integer;
{$ENDIF}
procedure LinesChanging(Sender: TObject);
procedure LinesChanged(Sender: TObject);
procedure LockUndo;
procedure MoveCaretAndSelection(
{$IFDEF SYN_LAZARUS}const {$ENDIF}ptBefore, ptAfter: TPoint;
@ -534,8 +532,7 @@ type
procedure PrimarySelectionRequest(const RequestedFormatID: TClipboardFormat;
Data: TStream);
{$ENDIF}
function ScanFrom(Index: integer
{$IFDEF SYN_LAZARUS}; AtLeastTilIndex: integer = -1{$ENDIF}): integer;
function ScanFrom(Index: integer; AtLeastTilIndex: integer = -1): integer;
procedure ScrollTimerHandler(Sender: TObject);
procedure SelectedColorsChanged(Sender: TObject);
procedure DoBlockSelectionChanged(Sender: TObject);
@ -633,11 +630,11 @@ type
{$IFDEF SYN_LAZARUS}
procedure KeyUp(var Key : Word; Shift : TShiftState); override;
{$ENDIF}
procedure ListAdded(Index: integer); //mh 2000-10-10
Procedure LineCountChanged(Sender: TSynEditStrings; AIndex, ACount : Integer);
Procedure LineTextChanged(Sender: TSynEditStrings; AIndex, ACount : Integer);
procedure LinesChanging(Sender: TObject);
procedure LinesChanged(Sender: TObject);
procedure ListCleared(Sender: TObject);
procedure ListDeleted(Index: integer);
procedure ListInserted(Index: integer);
procedure ListPutted(Index: integer);
{$IFDEF SYN_LAZARUS}
procedure FoldChanged(Index: integer);
function GetTopView : Integer;
@ -1293,10 +1290,10 @@ var
BufSize: integer;
{$ELSE}
Mem: HGLOBAL;
Failed: boolean;
{$ENDIF}
P: PChar;
SLen: integer;
Failed: boolean;
begin
if SText = '' then exit;
SLen := Length(SText);
@ -1418,15 +1415,14 @@ begin
FTheLinesView := FTabbedLinesView;
fCaret.Lines := TSynEditStrings(FTheLinesView);
TSynEditStringList(fLines).AddChangeHandler(senrLineCount,
{$IFDEF FPC}@{$ENDIF}LineCountChanged);
TSynEditStringList(fLines).AddChangeHandler(senrLineChange,
{$IFDEF FPC}@{$ENDIF}LineTextChanged);
with TSynEditStringList(fLines) do begin
OnAdded := {$IFDEF FPC}@{$ENDIF}ListAdded;
OnChange := {$IFDEF FPC}@{$ENDIF}LinesChanged;
OnChanging := {$IFDEF FPC}@{$ENDIF}LinesChanging;
OnCleared := {$IFDEF FPC}@{$ENDIF}ListCleared;
OnDeleted := {$IFDEF FPC}@{$ENDIF}ListDeleted;
OnInserted := {$IFDEF FPC}@{$ENDIF}ListInserted;
OnPutted := {$IFDEF FPC}@{$ENDIF}ListPutted;
// OnScanRanges := {$IFDEF FPC}@{$ENDIF}ListScanRanges;
end;
fFontDummy := TFont.Create;
@ -2112,6 +2108,7 @@ begin
if fLastControlIsPressed<>(GetKeyShiftState=[SYNEDIT_LINK_MODIFIER]) then
UpdateCtrlMouse;
end;
{$ENDIF}
procedure TCustomSynEdit.Loaded;
@ -4860,33 +4857,27 @@ begin
Update;
end;
function TCustomSynEdit.ScanFrom(Index: integer
{$IFDEF SYN_LAZARUS}; AtLeastTilIndex: integer{$ENDIF}): integer;
function TCustomSynEdit.ScanFrom(Index: integer; AtLeastTilIndex: integer): integer;
// Index and AtLeastTilIndex are 0 based
{$IFDEF SYN_LAZARUS}
var
FixFStart: Integer;
LastLineDiffers : Boolean;
procedure SetCodeFoldAttributes;
begin
TSynEditStrings(Lines).FoldMinLevel[Result-1] := fHighlighter.MinimumCodeFoldBlockLevel;
TSynEditStrings(Lines).FoldEndLevel[Result-1] := fHighlighter.CurrentCodeFoldBlockLevel;
FFoldedLinesView.FoldMinLevel[Result-1] := fHighlighter.MinimumCodeFoldBlockLevel;
FFoldedLinesView.FoldEndLevel[Result-1] := fHighlighter.CurrentCodeFoldBlockLevel;
if (fHighlighter.LastLineCodeFoldLevelFix <> 0) and (result > 1) then begin
TSynEditStrings(Lines).FoldEndLevel[Result-2] :=
TSynEditStrings(Lines).FoldEndLevel[Result-2] + fHighlighter.LastLineCodeFoldLevelFix;
if TSynEditStrings(Lines).FoldMinLevel[Result-2] > TSynEditStrings(Lines).FoldEndLevel[Result-2] then
TSynEditStrings(Lines).FoldMinLevel[Result-2] := TSynEditStrings(Lines).FoldEndLevel[Result-2];
FFoldedLinesView.FoldEndLevel[Result-2] :=
FFoldedLinesView.FoldEndLevel[Result-2] + fHighlighter.LastLineCodeFoldLevelFix;
if FFoldedLinesView.FoldMinLevel[Result-2] > FFoldedLinesView.FoldEndLevel[Result-2] then
FFoldedLinesView.FoldMinLevel[Result-2] := FFoldedLinesView.FoldEndLevel[Result-2];
if Result - 1 < FixFStart then FixFStart := Result - 1;
end;
end;
{$ENDIF}
begin
{$IFDEF SYN_LAZARUS}
if Index < 0 then Index := 0;
{$ENDIF}
Result := Index;
{$IFDEF SYN_LAZARUS}
if not assigned(fHighlighter) or (Index > Lines.Count - 1) then begin
FFoldedLinesView.FixFoldingAtTextIndex(Index);
fMarkupManager.TextChangedScreen(Max(RowToScreenRow(Index+1), 0), LinesInWindow+1);
@ -4900,7 +4891,6 @@ begin
fHighlighter.ReSetRange;
TSynEditStrings(Lines).Ranges[0] := fHighlighter.GetRange;
end;
{$ENDIF}
if Index >= Lines.Count - 1 then begin
FFoldedLinesView.FixFoldingAtTextIndex(Index);
fMarkupManager.TextChangedScreen(Max(RowToScreenRow(Index+1), 0), LinesInWindow+1);
@ -4911,30 +4901,22 @@ begin
fHighlighter.SetLine(Lines[Result], Result);
inc(Result);
fHighlighter.NextToEol;
{$IFDEF SYN_LAZARUS}
LastLineDiffers := True;
while (fHighlighter.GetRange <> TSynEditStrings(Lines).Ranges[Result])
or (fHighlighter.LastLineCodeFoldLevelFix <> 0)
or (TSynEditStrings(Lines).FoldMinLevel[Result-1] <> fHighlighter.MinimumCodeFoldBlockLevel)
or (TSynEditStrings(Lines).FoldEndLevel[Result-1] <> fHighlighter.CurrentCodeFoldBlockLevel)
or (FFoldedLinesView.FoldMinLevel[Result-1] <> fHighlighter.MinimumCodeFoldBlockLevel)
or (FFoldedLinesView.FoldEndLevel[Result-1] <> fHighlighter.CurrentCodeFoldBlockLevel)
or LastLineDiffers or (Result<=AtLeastTilIndex+1)
{$ELSE}
while (fHighlighter.GetRange <> TSynEditStringList(Lines).Ranges[Result])
{$ENDIF}
do begin
//debugln(['TSynCustomHighlighter.ScanFrom WHILE Y=',Result,' Level=',fHighlighter.CurrentCodeFoldBlockLevel,' ScannedLine="',Lines[Result-1],'"']);
{$IFDEF SYN_LAZARUS}
LastLineDiffers := (fHighlighter.GetRange <> TSynEditStrings(Lines).Ranges[Result])
or (fHighlighter.LastLineCodeFoldLevelFix <> 0)
or (TSynEditStrings(Lines).FoldMinLevel[Result-1] <> fHighlighter.MinimumCodeFoldBlockLevel)
or (TSynEditStrings(Lines).FoldEndLevel[Result-1] <> fHighlighter.CurrentCodeFoldBlockLevel);
or (FFoldedLinesView.FoldMinLevel[Result-1] <> fHighlighter.MinimumCodeFoldBlockLevel)
or (FFoldedLinesView.FoldEndLevel[Result-1] <> fHighlighter.CurrentCodeFoldBlockLevel);
TSynEditStrings(Lines).Ranges[Result] := fHighlighter.GetRange;
SetCodeFoldAttributes;
//if (Result and $fff)=0 then
// debugln('TCustomSynEdit.ScanFrom A Line=', dbgs(Result),' Index=',dbgs(Index),' MinLevel=',dbgs(CodeFoldMinLevel),' EndLevel=',dbgs(CodeFoldEndLevel),' CodeFoldType=',dbgs(ord(CodeFoldType)),' ',dbgs(length(Lines[Result-1])));
{$ELSE}
TSynEditStringList(Lines).Ranges[Result-1] := fHighlighter.GetRange;
{$ENDIF}
fHighlighter.SetLine(Lines[Result], Result);
//debugln(['TSynCustomHighlighter.ScanFrom SetLine Y=',Result,' Level=',fHighlighter.CurrentCodeFoldBlockLevel,' Line="',Lines[Result],'"']);
fHighlighter.NextToEol;
@ -4943,7 +4925,6 @@ begin
if Result = Lines.Count then
break;
end;
{$IFDEF SYN_LAZARUS}
// at least one line changed
// => update code fold attributes of last scanned line
if (Result>Index+1) and (Result<=Lines.Count) then
@ -4953,55 +4934,33 @@ begin
Min(RowToScreenRow(Result), LinesInWindow+1));
Topline := TopLine;
if FixFStart < index then Invalidate;
{$ENDIF}
Dec(Result);
end;
{begin} //mh 2000-10-10
(*
procedure TCustomSynEdit.ListAdded(Sender: TObject);
var
LastIndex: Integer;
procedure TCustomSynEdit.LineCountChanged(Sender: TSynEditStrings; AIndex, ACount: Integer);
begin
if Assigned(fHighlighter) then begin
if Lines.Count > 1 then begin
LastIndex := Lines.Count - 1;
fHighlighter.SetRange(Lines.Objects[LastIndex - 1]);
fHighlighter.SetLine(Lines[LastIndex - 1], LastIndex - 1);
fHighlighter.NextToEol;
Lines.Objects[LastIndex] := fHighlighter.GetRange;
end else begin
fHighlighter.ReSetRange;
Lines.Objects[0] := fHighlighter.GetRange;
end;
end;
LastIndex := Lines.Count;
InvalidateLine(LastIndex);
*)
procedure TCustomSynEdit.ListAdded(Index: integer);
// Index is 0 based
begin
//debugln('TCustomSynEdit.ListAdded ',dbgs(Index),' ',dbgs(Assigned(fHighlighter)));
{$IFDEF SYN_LAZARUS}
ScanFrom(Index - 1);
{$ELSE}
if Assigned(fHighlighter) then begin
if (Index > 0) then begin
// the current line was added, start scanning from the prior line
fHighlighter.SetRange(TSynEditStringList(Lines).Ranges[Index - 1]);
ScanFrom(Index - 1);
end else begin
fHighlighter.ResetRange;
TSynEditStringList(Lines).Ranges[0] := fHighlighter.GetRange;
if (Lines.Count > 1) then
ScanFrom(0);
end;
end;
{$ENDIF}
InvalidateLines(Index + 1, -1);
InvalidateGutterLines(Index + 1, -1);
ScanFrom(AIndex - 1, Min(AIndex, AIndex + ACount));
InvalidateLines(AIndex + 1, -1);
InvalidateGutterLines(AIndex + 1, -1);
end;
procedure TCustomSynEdit.LineTextChanged(Sender: TSynEditStrings; AIndex, ACount: Integer);
var
EndIndex: Integer;
begin
if PaintLock>0 then begin
if (fHighlighterNeedsUpdateStartLine<1)
or (fHighlighterNeedsUpdateStartLine>AIndex+1) then
fHighlighterNeedsUpdateStartLine:=AIndex+1;
if (fHighlighterNeedsUpdateEndLine<1)
or (fHighlighterNeedsUpdateEndLine<AIndex+1) then
fHighlighterNeedsUpdateEndLine:=AIndex+1;
exit;
end;
EndIndex:=ScanFrom(AIndex) + 1;
InvalidateLines(AIndex + 1, EndIndex);
InvalidateGutterLines(AIndex + 1, EndIndex);
end;
{end} //mh 2000-10-10
procedure TCustomSynEdit.ListCleared(Sender: TObject);
begin
@ -5018,92 +4977,6 @@ begin
Include(fStatusChanges, scAll);
end;
procedure TCustomSynEdit.ListDeleted(Index: Integer);
// Index is 0 based
begin
{$IFDEF SYN_LAZARUS}
ScanFrom(Index - 1);
{$ELSE}
if Assigned(fHighlighter) and (Lines.Count >= 1) then begin
if (Index > 0) then begin
// start scanning from prior line
{begin} //mh 2000-10-10
//DebugLn(['TCustomSynEdit.ListDeleted A Index=',Index]);
fHighlighter.SetRange(TSynEditStringList(Lines).Ranges[Index - 1]);
ScanFrom(Index - 1);
end else begin
//DebugLn(['TCustomSynEdit.ListDeleted B Index=',Index]);
fHighlighter.ResetRange;
TSynEditStringList(Lines).Ranges[0] := fHighlighter.GetRange;
{end} //mh 2000-10-10
if (Lines.Count > 1) then
ScanFrom(0);
end;
end;
{$ENDIF}
InvalidateLines(Index + 1, -1);
InvalidateGutterLines(Index + 1, -1);
end;
procedure TCustomSynEdit.ListInserted(Index: Integer);
// Index is 0 based
begin
{$IFDEF SYN_LAZARUS}
ScanFrom(Index - 1);
{$ELSE}
if Assigned(fHighlighter) and (Lines.Count >= 1) then begin
if (Index > 0) then begin
// start scanning from prior line
{begin} //mh 2000-10-10
// the line and the range of the line
//DebugLn(['TCustomSynEdit.ListInserted A Index=',Index]);
fHighlighter.SetRange(TSynEditStringList(Lines).Ranges[Index - 1]);
ScanFrom(Index - 1);
end else begin
//DebugLn(['TCustomSynEdit.ListInserted B Index=',Index]);
fHighlighter.ReSetRange;
TSynEditStringList(Lines).Ranges[0] := fHighlighter.GetRange;
{end} //mh 2000-10-10
if (Lines.Count > 1) then
ScanFrom(0);
end;
end;
{$ENDIF}
InvalidateLines(Index + 1, -1);
InvalidateGutterLines(Index + 1, -1);
end;
procedure TCustomSynEdit.ListPutted(Index: Integer);
// Index is 0 based
{$IFDEF SYN_LAZARUS}
var
EndIndex: Integer;
{$ENDIF}
begin
//DebugLn(['TCustomSynEdit.ListPutted Index=',Index,' PaintLock=',PaintLock]);
{$IFDEF SYN_LAZARUS}
if PaintLock>0 then begin
if (fHighlighterNeedsUpdateStartLine<1)
or (fHighlighterNeedsUpdateStartLine>Index+1) then
fHighlighterNeedsUpdateStartLine:=Index+1;
if (fHighlighterNeedsUpdateEndLine<1)
or (fHighlighterNeedsUpdateEndLine<Index+1) then
fHighlighterNeedsUpdateEndLine:=Index+1;
exit;
end;
EndIndex:=ScanFrom(Index) + 1;
InvalidateLines(Index + 1, EndIndex);
InvalidateGutterLines(Index + 1, EndIndex);
{$ELSE}
if Assigned(fHighlighter) then begin
// fHighlighter.SetRange(Lines.Objects[Index]);
fHighlighter.SetRange(TSynEditStringList(Lines).Ranges[Index]); //mh 2000-10-10
InvalidateLines(Index + 1, ScanFrom(Index) + 1);
end else
InvalidateLines(Index + 1, Index + 1);
{$ENDIF}
end;
{$IFDEF SYN_LAZARUS}
procedure TCustomSynEdit.FoldChanged(Index : integer);
var

View File

@ -163,10 +163,13 @@ type
*ViewPos = Line (1-based) in the array of viewable/visible lines
*TextIndex = Line (0-based) in the complete text(folded and unfolded)
}
TSynEditFoldMinClass = class end; // For RegisterAttribute
TSynEditFoldEndClass = class end; // For RegisterAttribute
{ TSynEditFoldedView }
TSynEditFoldedView = class {TODO: Make a base class, that just maps everything one to one}
TSynEditFoldedView = class // TODO: class(TSynEditStringsLinked)
private
fCaret: TSynEditCaret;
fLines : TSynEditStrings;
@ -183,6 +186,8 @@ type
function GetCount : integer;
function GetDrawDivider(Index : integer) : Boolean;
function GetFoldEndLevel(Index: integer): integer;
function GetFoldMinLevel(Index: integer): integer;
function GetFoldNestLevel(index : Integer): integer;
function GetLines(index : Integer) : String;
function GetDisplayNumber(index : Integer) : Integer;
@ -191,6 +196,8 @@ type
function GetFoldType(index : Integer) : TSynEditCodeFoldType;
function IsFolded(index : integer) : Boolean; // TextIndex
procedure PutRange(Index : integer; const AValue : TSynEditRange);
procedure SetFoldEndLevel(Index: integer; const AValue: integer);
procedure SetFoldMinLevel(Index: integer; const AValue: integer);
procedure SetTopLine(const ALine : integer);
function GetTopTextIndex : integer;
procedure SetTopTextIndex(const AIndex : integer);
@ -202,6 +209,7 @@ type
procedure DoCaretChanged(Sender : TObject);
Procedure LineCountChanged(Sender: TSynEditStrings; AIndex, ACount : Integer);
Procedure LineTextChanged(Sender: TSynEditStrings; AIndex, ACount : Integer);
Procedure LinesInsertedAtTextIndex(AStartIndex, ALineCount : Integer;
SkipFixFolding : Boolean = False);
Procedure LinesInsertedAtViewPos(AStartPos, ALineCount : Integer;
@ -275,6 +283,12 @@ type
property OnFoldChanged: TFoldChangedEvent (* reports 1-based line *) {TODO: synedit expects 0 based }
read fOnFoldChanged write fOnFoldChanged;
public
// TextIndex
property FoldMinLevel[Index: integer]: integer read GetFoldMinLevel
write SetFoldMinLevel;
property FoldEndLevel[Index: integer]: integer read GetFoldEndLevel
write SetFoldEndLevel;
end;
@ -1392,13 +1406,16 @@ end;
constructor TSynEditFoldedView.Create(aTextView : TSynEditStrings; ACaret: TSynEditCaret);
begin
fLines := aTextView;
flines.RegisterAttribute(TSynEditFoldMinClass, SizeOf(Integer));
flines.RegisterAttribute(TSynEditFoldEndClass, SizeOf(Integer));
fCaret := ACaret;
fCaret.AddChangeHandler({$IFDEF FPC}@{$ENDIF}DoCaretChanged);
fLines := aTextView;
fFoldTree := TSynTextFoldAVLTree.Create;
fTopLine := 0;
fLinesInWindow := -1;
fLines.AddChangeHandler(senrLineCount, {$IFDEF FPC}@{$ENDIF}LineCountChanged);
fLines.AddChangeHandler(senrLineChange, {$IFDEF FPC}@{$ENDIF}LineTextChanged);
end;
destructor TSynEditFoldedView.Destroy;
@ -1537,16 +1554,16 @@ end;
function TSynEditFoldedView.GetDrawDivider(Index : integer) : Boolean;
begin
result := (FoldType[Index] in [cfEnd])
and (fLines.FoldEndLevel[TextIndex[index]] < CFDividerDrawLevel);
and (FoldEndLevel[TextIndex[index]] < CFDividerDrawLevel);
end;
function TSynEditFoldedView.GetFoldNestLevel(index : Integer): integer;
begin
if (index < 0) or (index > fLinesInWindow) then exit(-1);
if (fFoldTypeList[index] = cfEnd) and (fTextIndexList[index] > 0) then
Result := fLines.FoldEndLevel[fTextIndexList[index]-1]
Result := FoldEndLevel[fTextIndexList[index]-1]
else
Result := fLines.FoldEndLevel[fTextIndexList[index]];
Result := FoldEndLevel[fTextIndexList[index]];
end;
(* Topline *)
@ -1597,13 +1614,13 @@ begin
if (node.IsInFold) and (tpos+1 = node.StartLine)
then fFoldTypeList[i] := cfCollapsed
else
if fLines.FoldEndLevel[tpos-1] > fLines.FoldMinLevel[tpos-1]
if FoldEndLevel[tpos-1] > FoldMinLevel[tpos-1]
then fFoldTypeList[i] := cfExpanded
else
if (tpos > 1) and (fLines.FoldEndLevel[tpos-2] > fLines.FoldMinLevel[tpos-1])
if (tpos > 1) and (FoldEndLevel[tpos-2] > FoldMinLevel[tpos-1])
then fFoldTypeList[i] := cfEnd
else
if fLines.FoldEndLevel[tpos-1] > 0
if FoldEndLevel[tpos-1] > 0
then fFoldTypeList[i] := cfContinue
else fFoldTypeList[i] := cfNone;
@ -1660,6 +1677,34 @@ begin
end;
(* Folding *)
procedure TSynEditFoldedView.SetFoldEndLevel(Index: integer; const AValue: integer);
begin
if (Index >= 0) and (Index < fLines.Count) then
fLines.Attribute[TSynEditFoldEndClass, Index] := Pointer(PtrUInt(AValue));
end;
procedure TSynEditFoldedView.SetFoldMinLevel(Index: integer; const AValue: integer);
begin
if (Index >= 0) and (Index < fLines.Count) then
fLines.Attribute[TSynEditFoldMinClass, Index] := Pointer(PtrUInt(AValue));
end;
function TSynEditFoldedView.GetFoldEndLevel(Index: integer): integer;
begin
if (Index >= 0) and (Index < fLines.Count) then
Result := Integer(fLines.Attribute[TSynEditFoldEndClass, Index])
else
Result := 0;
end;
function TSynEditFoldedView.GetFoldMinLevel(Index: integer): integer;
begin
if (Index >= 0) and (Index < fLines.Count) then
Result := Integer(fLines.Attribute[TSynEditFoldMinClass, Index])
else
Result := 0;
end;
procedure TSynEditFoldedView.FoldAtLine(AStartLine : Integer);
begin
FoldAtViewPos(AStartLine + fTopLine);
@ -1676,11 +1721,11 @@ var
begin
cnt := fLines.Count;
// AStartLine is 1-based // FoldEndLevel is 0-based
lvl := fLines.FoldEndLevel[ALine];
lvl := FoldEndLevel[ALine];
i := ALine+1;
while (i < cnt) and (fLines.FoldMinLevel[i] >= lvl) do inc(i);
while (i < cnt) and (FoldMinLevel[i] >= lvl) do inc(i);
// check if fold last line of block (not mixed "end begin")
if (i < cnt) and (fLines.FoldEndLevel[i] <= fLines.FoldMinLevel[i]) then inc(i);
if (i < cnt) and (FoldEndLevel[i] <= FoldMinLevel[i]) then inc(i);
Result := i-ALine-1;
end;
@ -1741,8 +1786,8 @@ begin
fFoldTree.Clear;
i := 0;
while i < fLines.Count do begin
if (fLines.FoldEndLevel[i] > fLines.FoldMinLevel[i])
and (fLines.FoldEndLevel[i] > StartLevel) then begin
if (FoldEndLevel[i] > FoldMinLevel[i])
and (FoldEndLevel[i] > StartLevel) then begin
l := LengthForFoldAtTextIndex(i);
// i is 0-based
// FoldTree is 1-based AND first line remains visble
@ -1807,7 +1852,7 @@ begin
LastCount := cnt;
// look at the 0-based cfCollapsed (visible) Line
if not(fLines.FoldEndLevel[line -1] > fLines.FoldMinLevel[line - 1]) then begin
if not(FoldEndLevel[line -1] > FoldMinLevel[line - 1]) then begin
// the Fold-Begin of this node has gone
tmpnode := node.Prev;
aFoldTree.RemoveFoldForNodeAtLine(node, -1); // Don't touch any nested node
@ -1852,6 +1897,7 @@ end;
procedure TSynEditFoldedView.LineCountChanged(Sender: TSynEditStrings; AIndex, ACount : Integer);
begin
LineTextChanged(Sender, AIndex, ACount);
// 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
@ -1864,6 +1910,16 @@ begin
else LinesInsertedAtTextIndex(AIndex, ACount, true);
end;
procedure TSynEditFoldedView.LineTextChanged(Sender: TSynEditStrings; AIndex, ACount: Integer);
var
i: integer;
begin
for i := AIndex to AIndex + ACount - 1 do begin
FoldMinLevel[Count-1]:=-1;
FoldEndLevel[Count-1]:=-1;
end;
end;
procedure TSynEditFoldedView.FixFoldingAtTextIndex(AStartIndex: Integer; AMinEndLine : Integer);
begin
FixFolding(AStartIndex + 1, AMinEndLine, fFoldTree);
@ -1877,8 +1933,8 @@ begin
Result := -1;
i := ALine-1;
if (i>0) and (fLines.FoldMinLevel[i] < fLines.FoldEndLevel[i-1])then begin
if fLines.FoldMinLevel[i] < fLines.FoldEndLevel[i] then begin
if (i>0) and (FoldMinLevel[i] < FoldEndLevel[i-1])then begin
if FoldMinLevel[i] < FoldEndLevel[i] then begin
// this is a combined "end begin" line
node := fFoldTree.FindFoldForLine(ALine, true);
if node.IsInFold and (node.StartLine = ALine +1) then
@ -1888,8 +1944,8 @@ begin
// this is a "end" line
dec(i);
end;
l := fLines.FoldEndLevel[i];
end else if fLines.FoldEndLevel[i] = 0 then
l := FoldEndLevel[i];
end else if FoldEndLevel[i] = 0 then
exit
else begin
// check if current line is cfCollapsed
@ -1897,12 +1953,12 @@ begin
if node.IsInFold and (node.StartLine = ALine +1) then
dec(i);
if i < 0 then exit;
l := fLines.FoldEndLevel[i]
l := FoldEndLevel[i]
end;
while (i > 0) and (fLines.FoldMinLevel[i] >= l) do
while (i > 0) and (FoldMinLevel[i] >= l) do
dec(i);
if (fLines.FoldEndLevel[i] > 0) then // TODO, check for collapsed at index = 0
if (FoldEndLevel[i] > 0) then // TODO, check for collapsed at index = 0
Result := i + 1;
end;

View File

@ -42,22 +42,15 @@ type
FIsUtf8: Boolean;
function GetIsUtf8 : Boolean; virtual;
procedure SetIsUtf8(const AValue : Boolean); virtual;
function GetFoldEndLevel(Index: integer): integer; virtual; abstract;
function GetFoldMinLevel(Index: integer): integer; virtual; abstract;
procedure SetFoldEndLevel(Index: integer; const AValue: integer); virtual; abstract;
procedure SetFoldMinLevel(Index: integer; const AValue: integer); virtual; abstract;
function GetRange(Index: integer): TSynEditRange; virtual; abstract;
procedure PutRange(Index: integer; ARange: TSynEditRange); virtual; abstract;
function GetAttribute(const Owner: TClass; const Index: Integer): Pointer; virtual; abstract;
procedure SetAttribute(const Owner: TClass; const Index: Integer; const AValue: Pointer); virtual; abstract;
procedure RegisterAttribute(const Index: TClass; const Size: Word); virtual; abstract;
function GetExpandedString(Index: integer): string; virtual; abstract;
function GetLengthOfLongestLine: integer; virtual; abstract;
procedure SetTextStr(const Value: string); override;
property Attribute[Owner: TClass; Index: Integer]: Pointer
read GetAttribute write SetAttribute;
public
constructor Create;
procedure DeleteLines(Index, NumLines: integer); virtual; abstract;
@ -65,6 +58,9 @@ type
procedure InsertStrings(Index: integer; NewStrings: TStrings); virtual; abstract;
procedure ClearRanges(ARange: TSynEditRange); virtual; abstract;
procedure RegisterAttribute(const Index: TClass; const Size: Word); virtual; abstract;
property Attribute[Owner: TClass; Index: Integer]: Pointer
read GetAttribute write SetAttribute;
procedure AddChangeHandler(AReason: TSynEditNotifyReason;
AHandler: TStringListLineCountEvent); virtual; abstract;
procedure RemoveChangeHandler(AReason: TSynEditNotifyReason;
@ -89,10 +85,6 @@ type
property LengthOfLongestLine: integer read GetLengthOfLongestLine;
property IsUtf8: Boolean read GetIsUtf8 write SetIsUtf8;
property Ranges[Index: integer]: TSynEditRange read GetRange write PutRange;
property FoldMinLevel[Index: integer]: integer read GetFoldMinLevel
write SetFoldMinLevel;
property FoldEndLevel[Index: integer]: integer read GetFoldEndLevel
write SetFoldEndLevel;
end;
{ TSynEditStringsLinked }
@ -104,17 +96,11 @@ type
function GetIsUtf8 : Boolean; override;
procedure SetIsUtf8(const AValue : Boolean); override;
function GetFoldEndLevel(Index: integer): integer; override;
function GetFoldMinLevel(Index: integer): integer; override;
procedure SetFoldEndLevel(Index: integer; const AValue: integer); override;
procedure SetFoldMinLevel(Index: integer; const AValue: integer); override;
function GetRange(Index: integer): TSynEditRange; override;
procedure PutRange(Index: integer; ARange: TSynEditRange); override;
function GetAttribute(const Owner: TClass; const Index: Integer): Pointer; override;
procedure SetAttribute(const Owner: TClass; const Index: Integer; const AValue: Pointer); override;
// Size: 0 = Bit (TODO); 1..8 Size In Byte "SizeOf()"
procedure RegisterAttribute(const Index: TClass; const Size: Word); override;
protected
function GetCount: integer; override;
function GetCapacity: integer;
@ -142,24 +128,12 @@ type
procedure ClearRanges(ARange: TSynEditRange); override;
// Size: 0 = Bit (TODO); 1..8 Size In Byte "SizeOf()"
procedure RegisterAttribute(const Index: TClass; const Size: Word); override;
procedure AddChangeHandler(AReason: TSynEditNotifyReason;
AHandler: TStringListLineCountEvent); override;
procedure RemoveChangeHandler(AReason: TSynEditNotifyReason;
AHandler: TStringListLineCountEvent); override;
(* public
// Byte to Char
function LogicalToPhysicalPos(const p: TPoint): TPoint;
function LogicalToPhysicalCol(const Line: string;
LogicalPos: integer): integer;
function LogicalToPhysicalCol(Line: PChar; LineLen: integer;
LogicalPos, StartBytePos, StartPhysicalPos: integer): integer;
// Char to Byte
function PhysicalToLogicalPos(const p: TPoint): TPoint;
function PhysicalToLogicalCol(const Line: string;
PhysicalPos: integer): integer;
function PhysicalToLogicalCol(const Line: string;
PhysicalPos, StartBytePos, StartPhysicalPos: integer): integer;
*)
end;
@ -363,27 +337,6 @@ begin
FSynStrings.IsUtf8 := AValue;
end;
//Fold
function TSynEditStringsLinked.GetFoldEndLevel(Index: integer): integer;
begin
Result:= fSynStrings.FoldEndLevel[Index];
end;
function TSynEditStringsLinked.GetFoldMinLevel(Index: integer): integer;
begin
Result:= fSynStrings.FoldMinLevel[Index];
end;
procedure TSynEditStringsLinked.SetFoldEndLevel(Index: integer; const AValue: integer);
begin
fSynStrings.FoldEndLevel[Index] := AValue;
end;
procedure TSynEditStringsLinked.SetFoldMinLevel(Index: integer; const AValue: integer);
begin
fSynStrings.FoldMinLevel[Index] := AValue;
end;
//Ranges
function TSynEditStringsLinked.GetRange(Index: integer): TSynEditRange;
begin

View File

@ -57,14 +57,8 @@ type
{$ENDIF}
TSynEditRangeClass = class end; // For Register
TSynEditFlagsClass = class end; // For Register
TSynEditFoldMinClass = class end; // For Register
TSynEditFoldEndClass = class end; // For Register
TSynEditExpLenClass = class end; // For Register
TSynEditStringFlag = (
sfHasTabs, //
sfHasNoTabs, //
sfExpandedLengthUnknown, //
sfModified, // a line is modified and not saved after
sfSaved // a line is modified and saved after
);
@ -161,19 +155,9 @@ type
Procedure SetAttributeSize(NewSize: Integer);
procedure SetFlags(Index: Integer; const AValue: TSynEditStringFlags);
protected
fOnAdded: TStringListIndexEvent;
fOnCleared: TNotifyEvent;
fOnDeleted: TStringListIndexEvent;
fOnInserted: TStringListIndexEvent;
fOnPutted: TStringListIndexEvent;
function GetExpandedString(Index: integer): string; override;
function GetLengthOfLongestLine: integer; override;
{$IFDEF SYN_LAZARUS}
function GetFoldEndLevel(Index: integer): integer; override;
function GetFoldMinLevel(Index: integer): integer; override;
procedure SetFoldEndLevel(Index: integer; const AValue: integer); override;
procedure SetFoldMinLevel(Index: integer; const AValue: integer); override;
{$ENDIF}
function GetRange(Index: integer): TSynEditRange; {$IFDEF SYN_LAZARUS}override;{$ENDIF}
procedure PutRange(Index: integer; ARange: TSynEditRange); {$IFDEF SYN_LAZARUS}override;{$ENDIF}
function GetAttribute(const Owner: TClass; const Index: Integer): Pointer; override;
@ -217,25 +201,16 @@ type
procedure RemoveChangeHandler(AReason: TSynEditNotifyReason;
AHandler: TStringListLineCountEvent); override;
public
property DosFileFormat: boolean read fDosFileFormat write fDosFileFormat;
property DosFileFormat: boolean read fDosFileFormat write fDosFileFormat;
{begin} //mh 2000-10-19
property ExpandedStrings[Index: integer]: string read GetExpandedString;
property LengthOfLongestLine: integer read GetLengthOfLongestLine;
{end} //mh 2000-10-19
property Ranges[Index: integer]: TSynEditRange read GetRange write PutRange;
property OnAdded: TStringListIndexEvent read fOnAdded write fOnAdded;
property OnChange: TNotifyEvent read fOnChange write fOnChange;
property OnChanging: TNotifyEvent read fOnChanging write fOnChanging;
property OnCleared: TNotifyEvent read fOnCleared write fOnCleared;
property OnDeleted: TStringListIndexEvent read fOnDeleted write fOnDeleted;
property OnInserted: TStringListIndexEvent read fOnInserted
write fOnInserted;
property OnPutted: TStringListIndexEvent read fOnPutted write fOnPutted;
{$IFDEF SYN_LAZARUS}
property FoldMinLevel[Index: integer]: integer read GetFoldMinLevel
write SetFoldMinLevel;
property FoldEndLevel[Index: integer]: integer read GetFoldEndLevel
write SetFoldEndLevel;
property Flags[Index: Integer]: TSynEditStringFlags read GetFlags
write SetFlags;
{$ENDIF}
@ -312,12 +287,11 @@ type
implementation
{$IFNDEF FPC}
{$IFDEF SYN_COMPILER_3_UP} //mh 2000-10-18
{$IFDEF SYN_COMPILER_3_UP}
resourcestring
{$ELSE}
{$ELSE}
const
{$ENDIF}
{$ENDIF}
{$ELSE}
const
{$ENDIF}
@ -539,9 +513,6 @@ begin
SetAttributeSize(0);
RegisterAttribute(TSynEditRangeClass, SizeOf(Pointer));
RegisterAttribute(TSynEditFlagsClass, SizeOf(TSynEditStringFlag));
RegisterAttribute(TSynEditFoldMinClass, SizeOf(Integer));
RegisterAttribute(TSynEditFoldEndClass, SizeOf(Integer));
RegisterAttribute(TSynEditExpLenClass, SizeOf(Integer));
fDosFileFormat := TRUE;
{begin} //mh 2000-10-19
fIndexOfLongestLine := -1;
@ -567,8 +538,6 @@ begin
Result := Count;
InsertItem(Result, S);
FLineRangeNotificationList.CallRangeNotifyEvents(self, Result, Count - Result);
if Assigned(fOnAdded) then
fOnAdded(Result);
EndUpdate;
end;
@ -592,16 +561,9 @@ begin
Objects[Count-1] := AStrings.Objects[i];
end;
SetAttribute(TSynEditRangeClass, Count-1, NullRange);
SetAttribute(TSynEditExpLenClass, Count-1, Pointer(-1));
Flags[Count-1] := [sfExpandedLengthUnknown];
{$IFDEF SYN_LAZARUS}
FoldMinLevel[Count-1]:=0;
FoldEndLevel[Count-1]:=0;
{$ENDIF}
Flags[Count-1] := [];
end;
FLineRangeNotificationList.CallRangeNotifyEvents(self, FirstAdded, Count - FirstAdded);
if Assigned(fOnAdded) then
fOnAdded(FirstAdded);
finally
EndUpdate;
end;
@ -636,8 +598,6 @@ begin
SetCount(Count - 1);
fIndexOfLongestLine := -1; //mh 2000-10-19
FLineRangeNotificationList.CallRangeNotifyEvents(self, Index, -1);
if Assigned(fOnDeleted) then
fOnDeleted(Index);
EndUpdate;
end;
@ -662,8 +622,6 @@ begin
end;
SetCount(Count - NumLines);
FLineRangeNotificationList.CallRangeNotifyEvents(self, Index, -NumLines);
if Assigned(fOnDeleted) then
fOnDeleted(Index);
end;
end;
{end} // DJLP 2000-11-01
@ -695,36 +653,6 @@ begin
else
Result := [];
end;
function TSynEditStringList.GetFoldEndLevel(Index: integer): integer;
begin
if (Index >= 0) and (Index < Count) then
Result := Integer(GetAttribute(TSynEditFoldEndClass, Index))
else
Result := 0;
end;
function TSynEditStringList.GetFoldMinLevel(Index: integer): integer;
begin
if (Index >= 0) and (Index < Count) then
Result := Integer(GetAttribute(TSynEditFoldMinClass, Index))
else
Result := 0;
end;
procedure TSynEditStringList.SetFoldEndLevel(Index: integer;
const AValue: integer);
begin
if (Index >= 0) and (Index < Count) then
SetAttribute(TSynEditFoldEndClass, Index, Pointer(PtrUInt(AValue)));
end;
procedure TSynEditStringList.SetFoldMinLevel(Index: integer;
const AValue: integer);
begin
if (Index >= 0) and (Index < Count) then
SetAttribute(TSynEditFoldMinClass, Index, Pointer(PtrUInt(AValue)));
end;
{$ENDIF}
function TSynEditStringList.Get(Index: integer): string;
@ -823,8 +751,6 @@ begin
{$ENDIF}
InsertItem(Index, S);
FLineRangeNotificationList.CallRangeNotifyEvents(self, Index, Count - OldCnt);
if Assigned(fOnInserted) then
fOnInserted(Index);
EndUpdate;
end;
@ -840,12 +766,7 @@ begin
fList[Index] := S;
FList.Objects[Index] := nil;
Ranges[Index] := NullRange;
SetAttribute(TSynEditExpLenClass, Index, Pointer(-1));
Flags[Index] := [sfExpandedLengthUnknown];
{$IFDEF SYN_LAZARUS}
FoldMinLevel[Index]:=0;
FoldEndLevel[Index]:=0;
{$ENDIF}
Flags[Index] := [];
EndUpdate;
end;
@ -861,8 +782,6 @@ begin
FList.Move(Index, Index + NumLines, Count-Index);
SetCount(Count + NumLines);
FLineRangeNotificationList.CallRangeNotifyEvents(self, Index, NumLines);
if Assigned(fOnAdded) then
fOnAdded(Index);
finally
EndUpdate;
end;
@ -909,8 +828,6 @@ begin
end;
procedure TSynEditStringList.Put(Index: integer; const S: string);
var
f: TSynEditStringFlags;
begin
if (Index = 0) and (Count = 0) then
Add(S)
@ -919,15 +836,8 @@ begin
ListIndexOutOfBounds(Index);
BeginUpdate;
fIndexOfLongestLine := -1;
f := Flags[Index];
Include(f, sfExpandedLengthUnknown);
Exclude(f, sfHasTabs);
Exclude(f, sfHasNoTabs);
Flags[Index] := f;
FList[Index] := S;
if Assigned(fOnPutted) then
fOnPutted(Index);
FLineChangeNotificationList.CallRangeNotifyEvents(self, Index, 1);
FLineChangeNotificationList.CallRangeNotifyEvents(self, Index, 1);
EndUpdate;
end;
end;

View File

@ -63,7 +63,7 @@ constructor TSynEditStringTabExpander.Create(ASynStringSource: TSynEditStrings);
begin
FIndexOfLongestLine := -1;
inherited Create(ASynStringSource);
RegisterAttribute(TSynEditStringTabExpander, SizeOf(Integer));
fSynStrings.RegisterAttribute(TSynEditStringTabExpander, SizeOf(Integer));
TabWidth := 8;
fSynStrings.AddChangeHandler(senrLineCount, {$IFDEF FPC}@{$ENDIF}LineCountChanged);
fSynStrings.AddChangeHandler(senrLineChange, {$IFDEF FPC}@{$ENDIF}LineCountChanged);