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

View File

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

View File

@ -42,22 +42,15 @@ type
FIsUtf8: Boolean; FIsUtf8: Boolean;
function GetIsUtf8 : Boolean; virtual; function GetIsUtf8 : Boolean; virtual;
procedure SetIsUtf8(const AValue : 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; function GetRange(Index: integer): TSynEditRange; virtual; abstract;
procedure PutRange(Index: integer; ARange: TSynEditRange); virtual; abstract; procedure PutRange(Index: integer; ARange: TSynEditRange); virtual; abstract;
function GetAttribute(const Owner: TClass; const Index: Integer): Pointer; 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 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 GetExpandedString(Index: integer): string; virtual; abstract;
function GetLengthOfLongestLine: integer; virtual; abstract; function GetLengthOfLongestLine: integer; virtual; abstract;
procedure SetTextStr(const Value: string); override; procedure SetTextStr(const Value: string); override;
property Attribute[Owner: TClass; Index: Integer]: Pointer
read GetAttribute write SetAttribute;
public public
constructor Create; constructor Create;
procedure DeleteLines(Index, NumLines: integer); virtual; abstract; procedure DeleteLines(Index, NumLines: integer); virtual; abstract;
@ -65,6 +58,9 @@ type
procedure InsertStrings(Index: integer; NewStrings: TStrings); virtual; abstract; procedure InsertStrings(Index: integer; NewStrings: TStrings); virtual; abstract;
procedure ClearRanges(ARange: TSynEditRange); 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; procedure AddChangeHandler(AReason: TSynEditNotifyReason;
AHandler: TStringListLineCountEvent); virtual; abstract; AHandler: TStringListLineCountEvent); virtual; abstract;
procedure RemoveChangeHandler(AReason: TSynEditNotifyReason; procedure RemoveChangeHandler(AReason: TSynEditNotifyReason;
@ -89,10 +85,6 @@ type
property LengthOfLongestLine: integer read GetLengthOfLongestLine; property LengthOfLongestLine: integer read GetLengthOfLongestLine;
property IsUtf8: Boolean read GetIsUtf8 write SetIsUtf8; property IsUtf8: Boolean read GetIsUtf8 write SetIsUtf8;
property Ranges[Index: integer]: TSynEditRange read GetRange write PutRange; 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; end;
{ TSynEditStringsLinked } { TSynEditStringsLinked }
@ -104,17 +96,11 @@ type
function GetIsUtf8 : Boolean; override; function GetIsUtf8 : Boolean; override;
procedure SetIsUtf8(const AValue : 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; function GetRange(Index: integer): TSynEditRange; override;
procedure PutRange(Index: integer; ARange: TSynEditRange); override; procedure PutRange(Index: integer; ARange: TSynEditRange); override;
function GetAttribute(const Owner: TClass; const Index: Integer): Pointer; override; function GetAttribute(const Owner: TClass; const Index: Integer): Pointer; override;
procedure SetAttribute(const Owner: TClass; const Index: Integer; const AValue: 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 protected
function GetCount: integer; override; function GetCount: integer; override;
function GetCapacity: integer; function GetCapacity: integer;
@ -142,24 +128,12 @@ type
procedure ClearRanges(ARange: TSynEditRange); override; 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; procedure AddChangeHandler(AReason: TSynEditNotifyReason;
AHandler: TStringListLineCountEvent); override; AHandler: TStringListLineCountEvent); override;
procedure RemoveChangeHandler(AReason: TSynEditNotifyReason; procedure RemoveChangeHandler(AReason: TSynEditNotifyReason;
AHandler: TStringListLineCountEvent); override; 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; end;
@ -363,27 +337,6 @@ begin
FSynStrings.IsUtf8 := AValue; FSynStrings.IsUtf8 := AValue;
end; 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 //Ranges
function TSynEditStringsLinked.GetRange(Index: integer): TSynEditRange; function TSynEditStringsLinked.GetRange(Index: integer): TSynEditRange;
begin begin

View File

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

View File

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