SynEdit: HighLighter, move count for nested and folded both into base class (prepare re-use by other HL) by x2nie

git-svn-id: trunk@52162 -
This commit is contained in:
martin 2016-04-11 01:00:42 +00:00
parent 7b63a5d48d
commit af42b4185f
2 changed files with 39 additions and 63 deletions

View File

@ -255,6 +255,7 @@ type
TSynCustomHighlighterRange = class
private
// TODO: either reduce to one level, or create subclass for 2nd level
FCodeFoldStackSize: integer; // EndLevel
FNestFoldStackSize: integer; // EndLevel
FMinimumCodeFoldBlockLevel: integer;
@ -278,7 +279,7 @@ type
property CodeFoldStackSize: integer read FCodeFoldStackSize; // excl disabled, only IncreaseLevel
property MinimumCodeFoldBlockLevel: integer
read FMinimumCodeFoldBlockLevel write FMinimumCodeFoldBlockLevel;
property NestFoldStackSize: integer read FCodeFoldStackSize; // all, incl disabled (not IncreaseLevel)
property NestFoldStackSize: integer read FNestFoldStackSize; // all, incl disabled (not IncreaseLevel)
property MinimumNestFoldBlockLevel: integer
read FMinimumNestFoldBlockLevel; // write FMinimumNestFoldBlockLevel;
property Top: TSynCustomCodeFoldBlock read FTop;
@ -939,6 +940,7 @@ procedure TSynCustomFoldHighlighter.SetLine(const NewValue: String;
begin
inherited;
FCodeFoldRange.MinimumCodeFoldBlockLevel := FCodeFoldRange.FCodeFoldStackSize;
FCodeFoldRange.FMinimumNestFoldBlockLevel := FCodeFoldRange.NestFoldStackSize;
end;
procedure TSynCustomFoldHighlighter.DoCurrentLinesChanged;
@ -1486,6 +1488,13 @@ begin
else if Pointer(FTop) > Pointer(Range.FTop) then
Result:= 1
else
Result := FMinimumNestFoldBlockLevel - Range.FMinimumNestFoldBlockLevel;
if Result <> 0 then
exit;
Result := FNestFoldStackSize - Range.FNestFoldStackSize;
if Result <> 0 then
exit;
Result := FMinimumCodeFoldBlockLevel - Range.FMinimumCodeFoldBlockLevel;
if Result <> 0 then
exit;
@ -1536,7 +1545,9 @@ procedure TSynCustomHighlighterRange.Clear;
begin
FRangeType:=nil;
FCodeFoldStackSize := 0;
FNestFoldStackSize := 0;
FMinimumCodeFoldBlockLevel := 0;
FMinimumNestFoldBlockLevel:= 0;
FTop:=nil;
end;
@ -1546,12 +1557,16 @@ begin
FTop := Src.FTop;
FCodeFoldStackSize := Src.FCodeFoldStackSize;
FMinimumCodeFoldBlockLevel := Src.FMinimumCodeFoldBlockLevel;
FNestFoldStackSize := Src.FNestFoldStackSize;
FMinimumNestFoldBlockLevel := Src.FMinimumNestFoldBlockLevel;
FRangeType := Src.FRangeType;
end
else begin
FTop := nil;
FCodeFoldStackSize := 0;
FNestFoldStackSize := 0;
FMinimumCodeFoldBlockLevel := 0;
FMinimumNestFoldBlockLevel := 0;
FRangeType := nil;
end;
end;

View File

@ -259,16 +259,11 @@ type
FMode: TPascalCompilerMode;
FBracketNestLevel : Integer;
FLastLineCodeFoldLevelFix: integer;
FPasFoldEndLevel: Smallint;
FPasFoldFixLevel: Smallint;
FPasFoldMinLevel: Smallint;
public
procedure Clear; override;
function Compare(Range: TSynCustomHighlighterRange): integer; override;
procedure Assign(Src: TSynCustomHighlighterRange); override;
function Add(ABlockType: Pointer = nil; IncreaseLevel: Boolean = True):
TSynCustomCodeFoldBlock; override;
procedure Pop(DecreaseLevel: Boolean = True); override;
function MaxFoldLevel: Integer; override;
procedure IncBracketNestLevel;
procedure DecBracketNestLevel;
@ -278,14 +273,7 @@ type
property BracketNestLevel: integer read FBracketNestLevel write FBracketNestLevel;
property LastLineCodeFoldLevelFix: integer
read FLastLineCodeFoldLevelFix write FLastLineCodeFoldLevelFix;
property PasFoldEndLevel: Smallint read FPasFoldEndLevel write FPasFoldEndLevel;
property PasFoldFixLevel: Smallint read FPasFoldFixLevel write FPasFoldFixLevel;
property PasFoldMinLevel: Smallint read FPasFoldMinLevel write FPasFoldMinLevel;
// * foldable nodes <> All nodes (pascas , not ifdef/region) *
// PasFoldEndLevel <> CodeFoldStackSize
// PasFoldMinLevel <> MinimumCodeFoldBlockLevel
// LastLineCodeFoldLevelFix <> PasFoldFixLevel
// DecLastLineCodeFoldLevelFix <> DecLastLinePasFoldFix
end;
TProcTableProc = procedure of object;
@ -300,7 +288,7 @@ type
fAsmStart: Boolean;
FExtendedKeywordsMode: Boolean;
FNestedComments: boolean;
FStartCodeFoldBlockLevel: integer;
FStartCodeFoldBlockLevel: integer; // TODO: rename FStartNestedFoldBlockLevel
FPasStartLevel: Smallint;
fRange: TRangeStates;
FOldRange: TRangeStates;
@ -1094,7 +1082,7 @@ begin
if TopPascalCodeFoldBlockType in [cfbtProcedure]
then StartPascalCodeFoldBlock(cfbtTopBeginEnd)
else StartPascalCodeFoldBlock(cfbtBeginEnd);
//debugln('TSynPasSyn.Func37 BEGIN ',dbgs(ord(TopPascalCodeFoldBlockType)),' LineNumber=',dbgs(fLineNumber),' ',dbgs(MinimumCodeFoldBlockLevel),' ',dbgs(CurrentCodeFoldBlockLevel));
//debugln('TSynPasSyn.Func37 BEGIN ',dbgs(ord(TopPascalCodeFoldBlockType)),' LineNumber=',dbgs(fLineNumber),' ',dbgs(MinimumNestFoldBlockLevel),' ',dbgs(CurrentCodeFoldBlockLevel));
end else
if FExtendedKeywordsMode and KeyComp('Break') then
Result := tkKey
@ -2378,11 +2366,10 @@ begin
fLine:=PChar(Pointer(fLineStr));
Run := 0;
Inherited SetLine(NewValue,LineNumber);
FStartCodeFoldBlockLevel := PasCodeFoldRange.MinimumCodeFoldBlockLevel;
PasCodeFoldRange.LastLineCodeFoldLevelFix := 0;
PasCodeFoldRange.PasFoldFixLevel := 0;
PasCodeFoldRange.PasFoldMinLevel := PasCodeFoldRange.PasFoldEndLevel;
FPasStartLevel := PasCodeFoldRange.PasFoldMinLevel;
FStartCodeFoldBlockLevel := PasCodeFoldRange.MinimumNestFoldBlockLevel;
FPasStartLevel := PasCodeFoldRange.MinimumCodeFoldBlockLevel;
FSynPasRangeInfo.MinLevelIfDef := FSynPasRangeInfo.EndLevelIfDef;
FSynPasRangeInfo.MinLevelRegion := FSynPasRangeInfo.EndLevelRegion;
fLineNumber := LineNumber;
@ -3295,12 +3282,12 @@ begin
if (r <> nil) and (r <> NullRange) then begin
r2 := TSynPasSynRange(CurrentRanges[ALineIndex + 1]);
if sfbIncludeDisabled in AFilter.Flags then begin
Result := TSynPasSynRange(r).CodeFoldStackSize;
Result := TSynPasSynRange(r).NestFoldStackSize;
if (r2 <> nil) and (r2 <> NullRange) then
Result := Result + TSynPasSynRange(r2).LastLineCodeFoldLevelFix;
end
else begin
Result := TSynPasSynRange(r).PasFoldEndLevel;
Result := TSynPasSynRange(r).CodeFoldStackSize;
if (r2 <> nil) and (r2 <> NullRange) then
Result := Result + TSynPasSynRange(r2).PasFoldFixLevel;
end;
@ -3347,18 +3334,18 @@ begin
if (r <> nil) and (r <> NullRange) then begin
r2 := TSynPasSynRange(CurrentRanges[ALineIndex + 1]);
if sfbIncludeDisabled in AFilter.Flags then begin
Result := TSynPasSynRange(r).CodeFoldStackSize;
Result := TSynPasSynRange(r).NestFoldStackSize;
if (r2 <> nil) and (r2 <> NullRange) then
Result := Result + TSynPasSynRange(r2).LastLineCodeFoldLevelFix;
// now Result = FoldBlockEndLevel
Result := Min(Result, TSynPasSynRange(r).MinimumCodeFoldBlockLevel);
Result := Min(Result, TSynPasSynRange(r).MinimumNestFoldBlockLevel);
end
else begin
Result := TSynPasSynRange(r).PasFoldEndLevel;
Result := TSynPasSynRange(r).CodeFoldStackSize;
if (r2 <> nil) and (r2 <> NullRange) then
Result := Result + TSynPasSynRange(r2).PasFoldFixLevel;
// now Result = FoldBlockEndLevel
Result := Min(Result, TSynPasSynRange(r).PasFoldMinLevel);
Result := Min(Result, TSynPasSynRange(r).MinimumCodeFoldBlockLevel);
end;
end;
end;
@ -3392,12 +3379,12 @@ begin
r := CurrentRanges[ALineIndex];
if (r <> nil) and (r <> NullRange) then begin
r2 := TSynPasSynRange(CurrentRanges[ALineIndex + 1]);
c := TSynPasSynRange(r).PasFoldEndLevel;
c := TSynPasSynRange(r).CodeFoldStackSize;
if (r2 <> nil) and (r2 <> NullRange) then
c := c + TSynPasSynRange(r2).PasFoldFixLevel;
if ANestIndex < c then begin
c := TSynPasSynRange(r).CodeFoldStackSize - 1 - ANestIndex;
c := TSynPasSynRange(r).NestFoldStackSize - 1 - ANestIndex;
Fold := TSynPasSynRange(r).Top;
while (Fold <> nil) and
( (c > 0) or (Fold.BlockType >= CountPascalCodeFoldBlockOffset) )
@ -3422,12 +3409,12 @@ begin
r := CurrentRanges[ALineIndex];
if (r <> nil) and (r <> NullRange) then begin
r2 := TSynPasSynRange(CurrentRanges[ALineIndex + 1]);
c := TSynPasSynRange(r).CodeFoldStackSize;
c := TSynPasSynRange(r).NestFoldStackSize;
if (r2 <> nil) and (r2 <> NullRange) then
c := c + TSynPasSynRange(r2).LastLineCodeFoldLevelFix;
if ANestIndex < c then begin
c := TSynPasSynRange(r).CodeFoldStackSize - 1 - ANestIndex;
c := TSynPasSynRange(r).NestFoldStackSize - 1 - ANestIndex;
Fold := TSynPasSynRange(r).Top;
while (Fold <> nil) and (c > 0) do begin
Fold := Fold.Parent;
@ -3597,13 +3584,13 @@ begin
begin
node.FoldGroup := FOLDGROUP_PASCAL;
if AIsFold then begin
Node.FoldLvlStart := PasCodeFoldRange.PasFoldEndLevel;
Node.NestLvlStart := PasCodeFoldRange.CodeFoldStackSize;
OneLine := (EndOffs < 0) and (Node.FoldLvlStart > PasCodeFoldRange.PasFoldMinLevel); // MinimumCodeFoldBlockLevel);
Node.FoldLvlStart := PasCodeFoldRange.CodeFoldStackSize;
Node.NestLvlStart := PasCodeFoldRange.NestFoldStackSize;
OneLine := (EndOffs < 0) and (Node.FoldLvlStart > PasCodeFoldRange.MinimumCodeFoldBlockLevel); // MinimumNestFoldBlockLevel);
end else begin
Node.FoldLvlStart := PasCodeFoldRange.CodeFoldStackSize; // Todo: zero?
Node.NestLvlStart := PasCodeFoldRange.CodeFoldStackSize;
OneLine := (EndOffs < 0) and (Node.FoldLvlStart > PasCodeFoldRange.MinimumCodeFoldBlockLevel);
Node.FoldLvlStart := PasCodeFoldRange.NestFoldStackSize; // Todo: zero?
Node.NestLvlStart := PasCodeFoldRange.NestFoldStackSize;
OneLine := (EndOffs < 0) and (Node.FoldLvlStart > PasCodeFoldRange.MinimumNestFoldBlockLevel);
end;
end;
end;
@ -3852,7 +3839,7 @@ begin
EndPascalCodeFoldBlock;
if FAtLineStart then begin
// If we are not at linestart, new folds could have been opened => handle as normal close
if (PasCodeFoldRange.CodeFoldStackSize < FStartCodeFoldBlockLevel) and
if (PasCodeFoldRange.NestFoldStackSize < FStartCodeFoldBlockLevel) and
(FStartCodeFoldBlockLevel > 0)
then begin
PasCodeFoldRange.DecLastLineCodeFoldLevelFix;
@ -3860,7 +3847,7 @@ begin
if FCatchNodeInfo then FCatchNodeInfoList.Delete;
end;
// TODO this only happens if the above was true
if (PasCodeFoldRange.PasFoldEndLevel < FPasStartLevel) and
if (PasCodeFoldRange.CodeFoldStackSize < FPasStartLevel) and
(FPasStartLevel > 0)
then begin
PasCodeFoldRange.DecLastLinePasFoldFix;
@ -3884,7 +3871,7 @@ function TSynPasSyn.GetDrawDivider(Index: integer): TSynDividerDrawConfigSetting
begin
i := 0;
j := StartLvl;
m := PasCodeFoldRange.CodeFoldStackSize;;
m := PasCodeFoldRange.NestFoldStackSize;;
t := TopPascalCodeFoldBlockType(j);
while (i <= MaxDepth) and (j < m) and
((t in CountTypes) or (t in SkipTypes)) do begin
@ -4307,9 +4294,7 @@ begin
inherited Clear;
FBracketNestLevel := 0;
FLastLineCodeFoldLevelFix := 0;
FPasFoldEndLevel := 0;
FPasFoldFixLevel := 0;
FPasFoldMinLevel := 0;
end;
function TSynPasSynRange.Compare(Range: TSynCustomHighlighterRange): integer;
@ -4323,10 +4308,6 @@ begin
if Result<>0 then exit;
Result := FLastLineCodeFoldLevelFix - TSynPasSynRange(Range).FLastLineCodeFoldLevelFix;
if Result<>0 then exit;
Result := FPasFoldEndLevel - TSynPasSynRange(Range).FPasFoldEndLevel;
if Result<>0 then exit;
Result := FPasFoldMinLevel - TSynPasSynRange(Range).FPasFoldMinLevel;
if Result<>0 then exit;
Result := FPasFoldFixLevel - TSynPasSynRange(Range).FPasFoldFixLevel;
end;
@ -4337,30 +4318,10 @@ begin
FMode:=TSynPasSynRange(Src).FMode;
FBracketNestLevel:=TSynPasSynRange(Src).FBracketNestLevel;
FLastLineCodeFoldLevelFix := TSynPasSynRange(Src).FLastLineCodeFoldLevelFix;
FPasFoldEndLevel := TSynPasSynRange(Src).FPasFoldEndLevel;
FPasFoldMinLevel := TSynPasSynRange(Src).FPasFoldMinLevel;
FPasFoldFixLevel := TSynPasSynRange(Src).FPasFoldFixLevel;
end;
end;
function TSynPasSynRange.Add(ABlockType: Pointer; IncreaseLevel: Boolean): TSynCustomCodeFoldBlock;
begin
Result := inherited Add(ABlockType, True);
if IncreaseLevel and assigned(result) then
inc(FPasFoldEndLevel);
end;
procedure TSynPasSynRange.Pop(DecreaseLevel: Boolean);
begin
if assigned(Top.Parent) then begin
if DecreaseLevel then
dec(FPasFoldEndLevel);
if FPasFoldMinLevel > FPasFoldEndLevel then
FPasFoldMinLevel := FPasFoldEndLevel;
end;
inherited Pop(True);
end;
function TSynPasSynRange.MaxFoldLevel: Integer;
begin
// Protect from overly mem consumption, by too many nested folds