SynEdit, pas-HL: clean up (remove workaround foldgroup=4)

git-svn-id: trunk@37892 -
This commit is contained in:
martin 2012-07-07 12:25:47 +00:00
parent 37ea4a51d6
commit 3414a1253c
5 changed files with 38 additions and 62 deletions

View File

@ -245,7 +245,7 @@ type
FNode: TSynTextFoldAVLNode; // AvlFoldNode
Text, Keyword: String;
LineNum, ColIndex: Integer;
OpenCount: Integer;
OpenCount: Integer; // Highlighter-Nodes opening on this line (limited to the FoldGroup requested)
end;
TSynEditFoldLineCapability = (

View File

@ -155,12 +155,14 @@ type
procedure DoFilter(MinIndex: Integer = -1);
procedure SetLine(ALine: TLineIdx);
procedure SetLineClean(ALine: TLineIdx);
property HighLighter: TSynCustomFoldHighlighter read FHighLighter write FHighLighter;
public
// used by HighLighters to add data
procedure Add(const AnInfo: TSynFoldNodeInfo);
procedure Delete(AnIndex: Integer = -1);
function CountAll: Integer;
property ItemPointer[AnIndex: Integer]: PSynFoldNodeInfo read GetItemPointer;
property LastItemPointer: PSynFoldNodeInfo read GetLastItemPointer;
property HighLighter: TSynCustomFoldHighlighter read FHighLighter write FHighLighter;
protected
function DefaultGroup: Integer; virtual;
function MinCapacity: Integer; virtual;
@ -651,7 +653,8 @@ end;
function TLazSynFoldNodeInfoList.Match(const AnInfo: TSynFoldNodeInfo;
AnActionFilter: TSynFoldActions; AGroupFilter: Integer): Boolean;
begin
Result := (AnActionFilter = []) and (AGroupFilter = DefaultGroup);
Result := (AnInfo.FoldAction * AnActionFilter = AnActionFilter) and
( (AGroupFilter = 0) or (AnInfo.FoldGroup = AGroupFilter) );
end;
function TLazSynFoldNodeInfoList.DefaultGroup: Integer;

View File

@ -279,14 +279,6 @@ type
// DecLastLineCodeFoldLevelFix <> DecLastLinePasFoldFix
end;
{ TLazSynPasFoldNodeInfoList }
TLazSynPasFoldNodeInfoList = class(TLazSynFoldNodeInfoList)
protected
function Match(const AnInfo: TSynFoldNodeInfo;
AnActionFilter: TSynFoldActions; AGroupFilter: Integer = 0): Boolean; override;
end;
TProcTableProc = procedure of object;
PIdentFuncTableFunc = ^TIdentFuncTableFunc;
@ -333,7 +325,7 @@ type
FCompilerMode: TPascalCompilerMode;
fD4syntax: boolean;
FCatchNodeInfo: Boolean;
FCatchNodeInfoList: TLazSynPasFoldNodeInfoList;
FCatchNodeInfoList: TLazSynFoldNodeInfoList;
// Divider
FDividerDrawConfig: Array [TSynPasDividerDrawLocation] of TSynDividerDrawConfig;
@ -502,7 +494,8 @@ type
procedure InitFoldNodeInfo(AList: TLazSynFoldNodeInfoList; Line: TLineIdx); override;
protected
function LastLinePasFoldLevelFix(Index: Integer; AType: Integer = 1): integer; // TODO deprecated; // foldable nodes
function LastLinePasFoldLevelFix(Index: Integer; AType: Integer = 1;
AIncludeDisabled: Boolean = False): integer; // TODO deprecated; // foldable nodes
// Divider
function GetDrawDivider(Index: integer): TSynDividerDrawConfigSetting; override;
@ -673,18 +666,6 @@ begin
end;
end;
{ TLazSynPasFoldNodeInfoList }
function TLazSynPasFoldNodeInfoList.Match(const AnInfo: TSynFoldNodeInfo;
AnActionFilter: TSynFoldActions; AGroupFilter: Integer): Boolean;
begin
Result := (AnInfo.FoldAction * AnActionFilter = AnActionFilter) and
( (AGroupFilter = 0) or
( (AGroupFilter in [1..3]) and (AnInfo.FoldGroup = AGroupFilter) ) or
( (AGroupFilter = 4) and (AnInfo.FoldGroup in [1,4]) )
);
end;
procedure TSynPasSyn.InitIdent;
var
I: Integer;
@ -3384,30 +3365,26 @@ begin
dec(Result);
end;
function TSynPasSyn.LastLinePasFoldLevelFix(Index: Integer; AType: Integer = 1): integer;
function TSynPasSyn.LastLinePasFoldLevelFix(Index: Integer; AType: Integer;
AIncludeDisabled: Boolean): integer;
var
r: TSynPasSynRange;
begin
// AIncludeDisabled only works for Pascal Nodes
case AType of
2: Result := 0;
3: Result := 0;
4: // all pascal nodes (incl. not folded)
begin
if (Index < 0) or (Index >= CurrentLines.Count) then
exit(0);
r := TSynPasSynRange(CurrentRanges[Index]);
if (r <> nil) and (Pointer(r) <> NullRange) then
Result := r.LastLineCodeFoldLevelFix
else
Result := 0;
end;
else
begin
if (Index < 0) or (Index >= CurrentLines.Count) then
exit(0);
r := TSynPasSynRange(CurrentRanges[Index]);
if (r <> nil) and (Pointer(r) <> NullRange) then
Result := r.PasFoldFixLevel
if (r <> nil) and (Pointer(r) <> NullRange) then begin
if AIncludeDisabled then
Result := r.LastLineCodeFoldLevelFix // all pascal nodes (incl. not folded)
else
Result := r.PasFoldFixLevel
end
else
Result := 0;
end;
@ -3542,7 +3519,7 @@ end;
function TSynPasSyn.CreateFoldNodeInfoList: TLazSynFoldNodeInfoList;
begin
Result := TLazSynPasFoldNodeInfoList.Create;
Result := TLazSynFoldNodeInfoList.Create;
end;
procedure TSynPasSyn.InitFoldNodeInfo(AList: TLazSynFoldNodeInfoList; Line: TLineIdx);
@ -3551,14 +3528,14 @@ var
i: Integer;
begin
FCatchNodeInfo := True;
FCatchNodeInfoList := TLazSynPasFoldNodeInfoList(AList);
FCatchNodeInfoList := TLazSynFoldNodeInfoList(AList);
StartAtLineIndex(Line);
fStringLen := 0;
NextToEol;
fStringLen := 0;
i := LastLinePasFoldLevelFix(Line+1, 4);
i := LastLinePasFoldLevelFix(Line+1, FOLDGROUP_PASCAL, True); // all pascal nodes (incl. not folded)
while i < 0 do begin
EndPascalCodeFoldBlock;
inc(i);
@ -3737,10 +3714,10 @@ begin
// SetRange[Index] has the folds at the start of this line
// ClosedByNextLine: Folds closed by the next lines LastLineFix
// must be taken from SetRange[Index+1] (end of this line)
ClosedByNextLine := -LastLinePasFoldLevelFix(Index + 1, 4);
ClosedByNextLine := -LastLinePasFoldLevelFix(Index + 1, FOLDGROUP_PASCAL, True);
// ClosedInLastLine: Folds Closed by this lines LastLineFix
// must be ignored. (They are part of SetRange[Index] / this line)
ClosedInLastLine := -LastLinePasFoldLevelFix(Index, 4);
ClosedInLastLine := -LastLinePasFoldLevelFix(Index, FOLDGROUP_PASCAL, True);
// Get the highest close-offset
i := ClosedByNextLine - 1;

View File

@ -1843,7 +1843,6 @@ begin
TheList.Line := 2;
TheList.FoldGroup := 0;
TheList.FoldFlags := [];
TheList.Count; TheList.HLNode[0]; TheList.Debug;
AssertEquals(BaseTestName + 'Cnt', 3, TheList.Count);
CheckNode(TheList.HLNode[2], 2, 0, 0, 5, 2, 3, 2, 3, 1, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
CheckNode(TheList.HLNode[1], 1, 0, 0, 9, 1, 2, 1, 2, 3, 3, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
@ -2143,7 +2142,6 @@ TheList.Count; TheList.HLNode[0]; TheList.Debug;
TheList.IncludeOpeningOnLine := True;
TheList.FoldGroup := 0;
TheList.FoldFlags := [];
TheList.Count; TheList.HLNode[0]; TheList.Debug;
AssertEquals(BaseTestName + 'Cnt', 3, TheList.Count);
CheckNode(TheList.HLNode[2], 4, 0, 14, 20, 0, 1, 0, 1, 18, 18, FOLDGROUP_IFDEF, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
CheckNode(TheList.HLNode[1], 3, 0, 1, 7, 0, 1, 0, 1, 18, 18, FOLDGROUP_IFDEF, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
@ -2155,7 +2153,6 @@ TheList.Count; TheList.HLNode[0]; TheList.Debug;
TheList.IncludeOpeningOnLine := False;
TheList.FoldGroup := 0;
TheList.FoldFlags := [];
TheList.Count; TheList.HLNode[0]; TheList.Debug;
AssertEquals(BaseTestName + 'Cnt', 2, TheList.Count);
CheckNode(TheList.HLNode[1], 3, 0, 1, 7, 0, 1, 0, 1, 18, 18, FOLDGROUP_IFDEF, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
CheckNode(TheList.HLNode[0], 0, 0, 0, 7, 0, 1, 0, 1, 10, 10, FOLDGROUP_PASCAL, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
@ -2167,7 +2164,6 @@ TheList.Count; TheList.HLNode[0]; TheList.Debug;
TheList.IncludeOpeningOnLine := True;
TheList.FoldGroup := FOLDGROUP_IFDEF;
TheList.FoldFlags := [];
TheList.Count; TheList.HLNode[0]; TheList.Debug;
AssertEquals(BaseTestName + 'Cnt', 2, TheList.Count);
CheckNode(TheList.HLNode[1], 4, 0, 14, 20, 0, 1, 0, 1, 18, 18, FOLDGROUP_IFDEF, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
CheckNode(TheList.HLNode[0], 3, 0, 1, 7, 0, 1, 0, 1, 18, 18, FOLDGROUP_IFDEF, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);
@ -2178,7 +2174,7 @@ TheList.Count; TheList.HLNode[0]; TheList.Debug;
TheList.IncludeOpeningOnLine := False;
TheList.FoldGroup := FOLDGROUP_IFDEF;
TheList.FoldFlags := [];
TheList.Count; TheList.HLNode[0]; TheList.Debug;
//TheList.Count; TheList.HLNode[0]; TheList.Debug;
AssertEquals(BaseTestName + 'Cnt', 1, TheList.Count);
CheckNode(TheList.HLNode[0], 3, 0, 1, 7, 0, 1, 0, 1, 18, 18, FOLDGROUP_IFDEF, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]);

View File

@ -1148,38 +1148,38 @@ begin
CheckNode(11, [], 1, 1, 2, 2, 1, 0, 1, 0, 22, 22, 1, [sfaOneLineClose,sfaLastLineClose]);
{%endregion TEXT 1 -- [cfbtBeginEnd..cfbtNone], [] grp=1}
{%region TEXT 1 -- [cfbtBeginEnd,cfbtIfDef], [] grp=4}
{%region TEXT 1 -- [cfbtBeginEnd,cfbtIfDef], [] grp=1}
PopPushBaseName('Text 1 -- [cfbtBeginEnd,cfbtIfDef], [], grp=4');
SetLines(TestTextFoldInfo1);
EnableFolds([cfbtBeginEnd,cfbtIfDef], []);
//DebugFoldInfo([],4);
CheckFoldInfoCounts('', [], 4, [1, 1, 0, 1, 0, 1, 0, 1, 2, 1, 2, 2]);
CheckFoldInfoCounts('', [], 1, [1, 1, 0, 1, 0, 1, 0, 1, 2, 1, 2, 2]);
//### Foldinfo Line: 0 PasMinLvl=0 EndLvl=0 : program Foo;
CheckNode( 0, [], 4, 0, 0, 7, 0, 0, 0, 1, 10, 10, 1, [sfaOpen,sfaMarkup]); // program
CheckNode( 0, [], 1, 0, 0, 7, 0, 0, 0, 1, 10, 10, 1, [sfaOpen,sfaMarkup]); // program
//### Foldinfo Line: 1 PasMinLvl=0 EndLvl=0 : procedure a;
CheckNode( 1, [], 4, 0, 0, 9, 1, 1, 1, 2, 3, 3, 1, [sfaOpen,sfaMarkup]); // procedure
CheckNode( 1, [], 1, 0, 0, 9, 1, 1, 1, 2, 3, 3, 1, [sfaOpen,sfaMarkup]); // procedure
//### Foldinfo Line: 2 PasMinLvl=0 EndLvl=0 : {$IFDEF A}
//### Foldinfo Line: 3 PasMinLvl=0 EndLvl=0 : begin
CheckNode( 3, [], 4, 0, 0, 5, 2, 2, 2, 3, 1, 0, 1, [sfaOpen,sfaMarkup]); // begin
CheckNode( 3, [], 1, 0, 0, 5, 2, 2, 2, 3, 1, 0, 1, [sfaOpen,sfaMarkup]); // begin
//### Foldinfo Line: 4 PasMinLvl=0 EndLvl=0 : {$ENDIF}
//### Foldinfo Line: 5 PasMinLvl=0 EndLvl=1 : {$IFDEF B} if a then begin {$ENDIF}
CheckNode( 5, [], 4, 0, 23, 28, 0, 1, 3, 4, 0, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]); // begin
CheckNode( 5, [], 1, 0, 23, 28, 0, 1, 3, 4, 0, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]); // begin
//### Foldinfo Line: 6 PasMinLvl=1 EndLvl=1 : writeln()
//### Foldinfo Line: 7 PasMinLvl=0 EndLvl=0 : end;
CheckNode( 7, [], 4, 0, 2, 5, 1, 0, 4, 3, 0, 0, 1, [sfaClose,sfaMarkup,sfaFold]); // end
CheckNode( 7, [], 1, 0, 2, 5, 1, 0, 4, 3, 0, 0, 1, [sfaClose,sfaMarkup,sfaFold]); // end
//### Foldinfo Line: 8 PasMinLvl=0 EndLvl=0 : end;
CheckNode( 8, [], 4, 0, 0, 3, 3, 3, 3, 2, 1, 0, 1, [sfaClose,sfaMarkup]); // end;
CheckNode( 8, [], 4, 1, 0, 3, 2, 2, 2, 1, 3, 3, 1, [sfaClose,sfaMarkup]); // end;
CheckNode( 8, [], 1, 0, 0, 3, 3, 3, 3, 2, 1, 0, 1, [sfaClose,sfaMarkup]); // end;
CheckNode( 8, [], 1, 1, 0, 3, 2, 2, 2, 1, 3, 3, 1, [sfaClose,sfaMarkup]); // end;
//### Foldinfo Line: 9 PasMinLvl=0 EndLvl=1 : begin
CheckNode( 9, [], 4, 0, 0, 5, 0, 1, 1, 2, 0, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]); // begin
CheckNode( 9, [], 1, 0, 0, 5, 0, 1, 1, 2, 0, 0, 1, [sfaOpen,sfaMarkup,sfaFold,sfaFoldFold]); // begin
//### Foldinfo Line: 10 PasMinLvl=0 EndLvl=0 : end.
CheckNode(10, [], 4, 0, 0, 3, 1, 0, 2, 1, 0, 0, 1, [sfaClose,sfaMarkup,sfaFold]); // end.
CheckNode(10, [], 4, 1, 0, 3, 1, 1, 1, 0, 10, 10, 1, [sfaClose,sfaMarkup]); // end.
CheckNode(10, [], 1, 0, 0, 3, 1, 0, 2, 1, 0, 0, 1, [sfaClose,sfaMarkup,sfaFold]); // end.
CheckNode(10, [], 1, 1, 0, 3, 1, 1, 1, 0, 10, 10, 1, [sfaClose,sfaMarkup]); // end.
//### Foldinfo Line: 11 PasMinLvl=0 EndLvl=0 : //
CheckNode(11, [], 4, 0, 0, 2, 0, 0, 0, 1, 22, 22, 1, [sfaOpen]); // //
CheckNode(11, [], 4, 1, 2, 2, 1, 1, 1, 0, 22, 22, 1, [sfaClose,sfaLastLineClose]); // /
CheckNode(11, [], 1, 0, 0, 2, 0, 0, 0, 1, 22, 22, 1, [sfaOpen]); // //
CheckNode(11, [], 1, 1, 2, 2, 1, 1, 1, 0, 22, 22, 1, [sfaClose,sfaLastLineClose]); // /
{%endregion TEXT 1 -- [cfbtBeginEnd..cfbtNone], [] grp=4}
{%region TEXT 1 -- [cfbtBeginEnd..cfbtNone], [sfaFold]}