SynEdit: Allow configuration for folding

git-svn-id: trunk@19234 -
This commit is contained in:
martin 2009-04-05 20:46:30 +00:00
parent 7f608f7cb4
commit d683c26988
9 changed files with 699 additions and 285 deletions

View File

@ -7552,10 +7552,15 @@ begin
end;
procedure TCustomSynEdit.HighlighterAttrChanged(Sender: TObject);
var
t: integer;
begin
RecalcCharExtent;
SizeOrFontChanged(TRUE); //jr 2000-10-01
Invalidate;
t := 0;
if fHighlighter.AttributeChangeNeedScan then
ScanFrom(t, FLines.Count - 1);
end;
procedure TCustomSynEdit.StatusChanged(AChanges: TSynStatusChanges);

View File

@ -211,6 +211,7 @@ type
procedure SetDrawDividerLevel(const AValue: Integer);
procedure SetEnabled(const Value: boolean); //DDH 2001-10-23
protected
FAttributeChangeNeedScan: Boolean;
fDefaultFilter: string;
fUpdateChange: boolean; //mh 2001-09-13
procedure AddAttribute(AAttrib: TSynHighlighterAttributes);
@ -237,6 +238,7 @@ type
function GetDividerDrawConfigCount: Integer; virtual;
public
procedure DefHighlightChange(Sender: TObject);
property AttributeChangeNeedScan: Boolean read FAttributeChangeNeedScan;
{$IFNDEF SYN_CPPB_1} class {$ENDIF}
function GetCapabilities: TSynHighlighterCapabilities; virtual;
{$IFNDEF SYN_CPPB_1} class {$ENDIF}
@ -1042,8 +1044,10 @@ procedure TSynCustomHighlighter.DefHighlightChange(Sender: TObject);
begin
if fUpdateCount > 0 then
fUpdateChange := TRUE
else
else begin
fAttrChangeHooks.Fire;
FAttributeChangeNeedScan := False;
end;
end;
function TSynCustomHighlighter.GetAttribCount: integer;

View File

@ -120,6 +120,10 @@ type
fRanges: TSynCustomHighlighterRanges;
FRootCodeFoldBlock: TSynCustomCodeFoldBlock;
protected
function GetFoldConfig(Index: Integer): Boolean; virtual;
function GetFoldConfigCount: Integer; virtual;
procedure SetFoldConfig(Index: Integer; const AValue: Boolean); virtual;
function GetFoldNodeInfo(Line, Index: Integer): TSynFoldNodeInfo; virtual;
function GetFoldNodeInfoCount(Line: Integer): Integer; virtual;
property CodeFoldRange: TSynCustomHighlighterRange read FCodeFoldRange;
@ -159,6 +163,11 @@ type
procedure SetLine({$IFDEF FPC}const {$ENDIF}NewValue: String;
LineNumber:Integer // 0 based
); override;
public
property FoldConfig[Index: Integer]: Boolean
read GetFoldConfig write SetFoldConfig;
property FoldConfigCount: Integer read GetFoldConfigCount;
end;
{ TSynCustomHighlighterRanges }
@ -316,6 +325,20 @@ begin
Result := 0;
end;
function TSynCustomFoldHighlighter.GetFoldConfig(Index: Integer): Boolean;
begin
Result := False;
end;
function TSynCustomFoldHighlighter.GetFoldConfigCount: Integer;
begin
Result := 0;
end;
procedure TSynCustomFoldHighlighter.SetFoldConfig(Index: Integer; const AValue: Boolean);
begin
end;
function TSynCustomFoldHighlighter.GetFoldNodeInfo(Line, Index: Integer): TSynFoldNodeInfo;
begin
Result.FoldAction := [sfaInvalid];

View File

@ -91,11 +91,13 @@ type
{$IFDEF SYN_LAZARUS}
TPascalCodeFoldBlockType = (
cfbtNone,
cfbtBeginEnd,
cfbtBeginEnd, // Nested
cfbtTopBeginEnd, // Begin of Procedure
cfbtNestedComment,
cfbtProcedure,
cfbtUses,
cfbtVarType,
cfbtLocalVarType,
cfbtClass,
cfbtClassSection,
cfbtUnitSection,
@ -104,7 +106,9 @@ type
cfbtRecord,
cfbtTry,
cfbtExcept,
cfbtRepeat
cfbtRepeat,
cfbtAsm,
cfbtCase
);
TPascalCodeFoldBlockTypes = set of TPascalCodeFoldBlockType;
@ -115,8 +119,8 @@ const
cfbtAll: TPascalCodeFoldBlockTypes =
[low(TPascalCodeFoldBlockType)..high(TPascalCodeFoldBlockType)];
PascalWordTrippletRanges: TPascalCodeFoldBlockTypes =
[cfbtBeginEnd, cfbtProcedure, cfbtClass, cfbtProgram, cfbtRecord,
cfbtTry, cfbtExcept, cfbtRepeat
[cfbtBeginEnd, cfbtTopBeginEnd, cfbtProcedure, cfbtClass, cfbtProgram, cfbtRecord,
cfbtTry, cfbtExcept, cfbtRepeat, cfbtAsm, cfbtCase
];
type
@ -237,6 +241,7 @@ type
FNodeInfoLine, FNodeInfoCount: Integer;
FNodeInfoList: Array of TSynFoldNodeInfo;
FDividerDrawConfig: Array [TSynPasDividerDrawLocation] of TSynDividerDrawConfig;
FFoldConfig: Array [TPascalCodeFoldBlockType] of Boolean;
procedure GrowNodeInfoList;
function GetPasCodeFoldRange: TSynPasSynRange;
procedure SetCompilerMode(const AValue: TPascalCompilerMode);
@ -369,7 +374,12 @@ type
ABlockType: TPascalCodeFoldBlockType);
procedure CreateDividerDrawConfig;
procedure DestroyDividerDrawConfig;
procedure InitFoldConfig;
protected
function GetFoldConfig(Index: Integer): Boolean; override;
function GetFoldConfigCount: Integer; override;
procedure SetFoldConfig(Index: Integer; const AValue: Boolean); override;
function GetFoldNodeInfo(Line, Index: Integer): TSynFoldNodeInfo; override;
function GetFoldNodeInfoCount(Line: Integer): Integer; override;
@ -377,8 +387,8 @@ type
function IsFilterStored: boolean; override; //mh 2000-10-08
procedure CreateRootCodeFoldBlock; override;
function StartPascalCodeFoldBlock(ABlockType: TPascalCodeFoldBlockType;
SubBlock: boolean = false): TSynCustomCodeFoldBlock;
function StartPascalCodeFoldBlock(ABlockType: TPascalCodeFoldBlockType):
TSynCustomCodeFoldBlock;
procedure EndCodeFoldBlock(DecreaseLevel: Boolean = True); override;
procedure CloseBeginEndBlocks;
procedure EndCodeFoldBlockLastLine;
@ -871,14 +881,15 @@ begin
EndCodeFoldBlock;
end else if TopPascalCodeFoldBlockType = cfbtTry then begin
EndCodeFoldBlock;
end else if TopPascalCodeFoldBlockType = cfbtBeginEnd then begin
end else if TopPascalCodeFoldBlockType in [cfbtTopBeginEnd, cfbtAsm] then begin
EndCodeFoldBlock;
if TopPascalCodeFoldBlockType = cfbtProcedure then
EndCodeFoldBlock;
if TopPascalCodeFoldBlockType = cfbtProgram then
EndCodeFoldBlock;
end
else if TopPascalCodeFoldBlockType = cfbtUnitSection then begin
end else if TopPascalCodeFoldBlockType in [cfbtBeginEnd, cfbtCase] then begin
EndCodeFoldBlock;
end else if TopPascalCodeFoldBlockType = cfbtUnitSection then begin
EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType = cfbtUnit then // "Unit".."end."
EndCodeFoldBlock;
@ -915,8 +926,8 @@ begin
end else
if KeyComp('Case') then begin
if TopPascalCodeFoldBlockType in
[cfbtBeginEnd, cfbtTry, cfbtExcept, cfbtRepeat] then
StartPascalCodeFoldBlock(cfbtBeginEnd,true);
[cfbtBeginEnd, cfbtTopBeginEnd, cfbtCase, cfbtTry, cfbtExcept, cfbtRepeat] then
StartPascalCodeFoldBlock(cfbtCase);
Result := tkKey;
end else Result := tkIdentifier;
end;
@ -944,7 +955,7 @@ begin
fRange := fRange + [rsAsm];
fAsmStart := True;
{$IFDEF SYN_LAZARUS}
StartPascalCodeFoldBlock(cfbtBeginEnd);
StartPascalCodeFoldBlock(cfbtAsm);
//debugln('TSynPasSyn.Func37 BEGIN ',dbgs(ord(TopPascalCodeFoldBlockType)),' LineNumber=',dbgs(fLineNumber),' ',dbgs(MinimumCodeFoldBlockLevel),' ',dbgs(CurrentCodeFoldBlockLevel));
{$ENDIF}
end else Result := tkIdentifier;
@ -964,12 +975,13 @@ begin
if (fRange * [rsImplementation, rsInterface] = []) then
Include(fRange, rsImplementation);
PasCodeFoldRange.BracketNestLevel := 0; // Reset in case of partial code
if TopPascalCodeFoldBlockType=cfbtVarType then EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then
EndCodeFoldBlockLastLine;
Result := tkKey;
{$IFDEF SYN_LAZARUS}
StartPascalCodeFoldBlock(cfbtBeginEnd);
if TopPascalCodeFoldBlockType in [cfbtProcedure]
then StartPascalCodeFoldBlock(cfbtTopBeginEnd)
else StartPascalCodeFoldBlock(cfbtBeginEnd);
//debugln('TSynPasSyn.Func37 BEGIN ',dbgs(ord(TopPascalCodeFoldBlockType)),' LineNumber=',dbgs(fLineNumber),' ',dbgs(MinimumCodeFoldBlockLevel),' ',dbgs(CurrentCodeFoldBlockLevel));
{$ENDIF}
end else
Result := tkIdentifier;
end;
@ -997,9 +1009,13 @@ begin
else if KeyComp('Var') then begin
if (PasCodeFoldRange.BracketNestLevel = 0) and
(TopPascalCodeFoldBlockType in
[cfbtVarType, cfbtNone, cfbtProcedure, cfbtProgram, cfbtUnit, cfbtUnitSection]) then begin
if TopPascalCodeFoldBlockType=cfbtVarType then EndCodeFoldBlockLastLine;
StartPascalCodeFoldBlock(cfbtVarType);
[cfbtVarType, cfbtLocalVarType, cfbtNone, cfbtProcedure, cfbtProgram,
cfbtUnit, cfbtUnitSection]) then begin
if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then
EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType in [cfbtProcedure]
then StartPascalCodeFoldBlock(cfbtLocalVarType)
else StartPascalCodeFoldBlock(cfbtVarType);
end;
Result := tkKey;
end
@ -1115,8 +1131,8 @@ begin
else if KeyComp('Try') then
begin
if TopPascalCodeFoldBlockType in
[cfbtBeginEnd, cfbtTry, cfbtExcept, cfbtRepeat] then
StartPascalCodeFoldBlock(cfbtTry,true);
[cfbtBeginEnd, cfbtTopBeginEnd, cfbtCase, cfbtTry, cfbtExcept, cfbtRepeat] then
StartPascalCodeFoldBlock(cfbtTry);
Result := tkKey;
end
else if KeyComp('Inline') then Result := tkKey else Result := tkIdentifier;
@ -1131,7 +1147,6 @@ begin
else if KeyComp('Uses') then begin
if (TopPascalCodeFoldBlockType in
[cfbtNone, cfbtProgram, cfbtUnit, cfbtUnitSection]) then begin
if TopPascalCodeFoldBlockType=cfbtVarType then EndCodeFoldBlockLastLine;
StartPascalCodeFoldBlock(cfbtUses);
end;
Result := tkKey;
@ -1143,7 +1158,7 @@ function TSynPasSyn.Func65: TtkTokenKind;
begin
if KeyComp('Repeat') then begin
Result := tkKey;
StartPascalCodeFoldBlock(cfbtRepeat, True);
StartPascalCodeFoldBlock(cfbtRepeat);
end
else Result := tkIdentifier;
end;
@ -1153,11 +1168,14 @@ begin
if KeyComp('Type') then begin
if (PasCodeFoldRange.BracketNestLevel = 0)
and (TopPascalCodeFoldBlockType in
[cfbtVarType, cfbtNone, cfbtProcedure, cfbtProgram, cfbtUnit, cfbtUnitSection])
and not(rsAfterEqual in fRange)
[cfbtVarType, cfbtLocalVarType, cfbtNone, cfbtProcedure, cfbtProgram,
cfbtUnit, cfbtUnitSection]) and not(rsAfterEqual in fRange)
then begin
if TopPascalCodeFoldBlockType=cfbtVarType then EndCodeFoldBlockLastLine;
StartPascalCodeFoldBlock(cfbtVarType);
if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then
EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType in [cfbtProcedure]
then StartPascalCodeFoldBlock(cfbtLocalVarType)
else StartPascalCodeFoldBlock(cfbtVarType);
end;
Result := tkKey;
end
@ -1178,9 +1196,13 @@ begin
else if KeyComp('Const') then begin
if (PasCodeFoldRange.BracketNestLevel = 0) and
(TopPascalCodeFoldBlockType in
[cfbtVarType, cfbtNone, cfbtProcedure, cfbtProgram, cfbtUnit, cfbtUnitSection]) then begin
if TopPascalCodeFoldBlockType=cfbtVarType then EndCodeFoldBlockLastLine;
StartPascalCodeFoldBlock(cfbtVarType);
[cfbtVarType, cfbtLocalVarType, cfbtNone, cfbtProcedure, cfbtProgram,
cfbtUnit, cfbtUnitSection]) then begin
if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then
EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType in [cfbtProcedure]
then StartPascalCodeFoldBlock(cfbtLocalVarType)
else StartPascalCodeFoldBlock(cfbtVarType);
end;
Result := tkKey;
end
@ -1197,7 +1219,7 @@ begin
if KeyComp('Except') then begin
Result := tkKey;
if TopPascalCodeFoldBlockType = cfbtTry then
StartPascalCodeFoldBlock(cfbtExcept, True);
StartPascalCodeFoldBlock(cfbtExcept);
end
else Result := tkIdentifier;
end;
@ -1224,7 +1246,7 @@ begin
if KeyComp('Finally') then begin
Result := tkKey;
if TopPascalCodeFoldBlockType = cfbtTry then
StartPascalCodeFoldBlock(cfbtExcept, True);
StartPascalCodeFoldBlock(cfbtExcept);
end
else Result := tkIdentifier;
end;
@ -1240,7 +1262,8 @@ begin
(fRange * [rsInterface, rsImplementation] = []) then
begin
CloseBeginEndBlocks;
if TopPascalCodeFoldBlockType=cfbtVarType then EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then
EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType=cfbtUnitSection then EndCodeFoldBlockLastLine;
StartPascalCodeFoldBlock(cfbtUnitSection);
fRange := fRange + [rsInterface];
@ -1378,7 +1401,8 @@ begin
if not(rsAfterEqual in fRange) then begin
PasCodeFoldRange.BracketNestLevel := 0; // Reset in case of partial code
CloseBeginEndBlocks;
if TopPascalCodeFoldBlockType=cfbtVarType then EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then
EndCodeFoldBlockLastLine;
if ((rsImplementation in fRange) and
not(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]))
then
@ -1400,7 +1424,8 @@ begin
if not(rsAfterEqual in fRange) then begin
PasCodeFoldRange.BracketNestLevel := 0; // Reset in case of partial code
CloseBeginEndBlocks;
if TopPascalCodeFoldBlockType=cfbtVarType then EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then
EndCodeFoldBlockLastLine;
if ((rsImplementation in fRange) and
not(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]))
then
@ -1499,7 +1524,8 @@ begin
if KeyComp('Finalization') then begin
PasCodeFoldRange.BracketNestLevel := 0; // Reset in case of partial code
CloseBeginEndBlocks;
if TopPascalCodeFoldBlockType=cfbtVarType then EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then
EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType=cfbtUnitSection then EndCodeFoldBlockLastLine;
StartPascalCodeFoldBlock(cfbtUnitSection);
fRange := fRange - [rsInterface] + [rsImplementation];
@ -1524,7 +1550,8 @@ begin
begin
PasCodeFoldRange.BracketNestLevel := 0; // Reset in case of partial code
CloseBeginEndBlocks;
if TopPascalCodeFoldBlockType = cfbtVarType then EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then
EndCodeFoldBlockLastLine;
if ((rsImplementation in fRange) and
not(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]))
then
@ -1544,7 +1571,8 @@ begin
if not(rsAfterEqual in fRange) then begin
PasCodeFoldRange.BracketNestLevel := 0; // Reset in case of partial code
CloseBeginEndBlocks;
if TopPascalCodeFoldBlockType=cfbtVarType then EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then
EndCodeFoldBlockLastLine;
if ((rsImplementation in fRange) and
not(TopPascalCodeFoldBlockType in [cfbtClass, cfbtClassSection]))
then
@ -1555,7 +1583,8 @@ begin
if KeyComp('Implementation') then begin
PasCodeFoldRange.BracketNestLevel := 0; // Reset in case of partial code
CloseBeginEndBlocks;
if TopPascalCodeFoldBlockType=cfbtVarType then EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then
EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType=cfbtUnitSection then EndCodeFoldBlockLastLine;
StartPascalCodeFoldBlock(cfbtUnitSection);
fRange := fRange - [rsInterface] + [rsImplementation];
@ -1575,7 +1604,8 @@ begin
if KeyComp('Initialization') then begin
PasCodeFoldRange.BracketNestLevel := 0; // Reset in case of partial code
CloseBeginEndBlocks;
if TopPascalCodeFoldBlockType=cfbtVarType then EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType in [cfbtVarType, cfbtLocalVarType] then
EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType=cfbtUnitSection then EndCodeFoldBlockLastLine;
StartPascalCodeFoldBlock(cfbtUnitSection);
fRange := fRange - [rsInterface] + [rsImplementation];
@ -1703,6 +1733,7 @@ constructor TSynPasSyn.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
CreateDividerDrawConfig;
InitFoldConfig;
fD4syntax := true;
fAsmAttri := TSynHighlighterAttributes.Create(SYNS_AttrAssembler);
AddAttribute(fAsmAttri);
@ -2478,11 +2509,12 @@ begin
end;
function TSynPasSyn.StartPascalCodeFoldBlock(
ABlockType: TPascalCodeFoldBlockType;
SubBlock: boolean): TSynCustomCodeFoldBlock;
ABlockType: TPascalCodeFoldBlockType): TSynCustomCodeFoldBlock;
var
p: PtrInt;
FoldBlock: Boolean;
begin
FoldBlock := FFoldConfig[ABlockType];
p := 0;
if FCatchNodeInfo then begin // exclude subblocks, because they do not increase the foldlevel yet
GrowNodeInfoList;
@ -2491,10 +2523,10 @@ begin
include(FNodeInfoList[FNodeInfoCount].FoldAction, sfaOpen);
inc(FNodeInfoCount);
end;
if SubBlock then
if not FoldBlock then
p := PtrInt(CountPascalCodeFoldBlockOffset);
Result:=TSynCustomCodeFoldBlock(
inherited StartCodeFoldBlock(p+Pointer(PtrInt(ABlockType)), not SubBlock));
inherited StartCodeFoldBlock(p+Pointer(PtrInt(ABlockType)), FoldBlock));
end;
procedure TSynPasSyn.EndCodeFoldBlock(DecreaseLevel: Boolean);
@ -2513,10 +2545,12 @@ end;
procedure TSynPasSyn.CloseBeginEndBlocks;
begin
if not(TopPascalCodeFoldBlockType in
[cfbtBeginEnd, cfbtExcept, cfbtTry, cfbtRepeat]) then
[cfbtBeginEnd, cfbtTopBeginEnd, cfbtCase, cfbtAsm, cfbtExcept, cfbtTry,
cfbtRepeat]) then
exit;
while TopPascalCodeFoldBlockType in
[cfbtBeginEnd, cfbtExcept, cfbtTry, cfbtRepeat] do
[cfbtBeginEnd, cfbtTopBeginEnd, cfbtCase, cfbtAsm, cfbtExcept, cfbtTry,
cfbtRepeat] do
EndCodeFoldBlockLastLine;
if TopPascalCodeFoldBlockType = cfbtProcedure then
EndCodeFoldBlockLastLine; // This procedure did have a begin/end block, so it must end too
@ -2615,27 +2649,25 @@ begin
cfbtUses:
if FDividerDrawConfig[pddlUses].MaxDrawDepth > 0 then
exit(FDividerDrawConfig[pddlUses].TopSetting);
cfbtLocalVarType:
if CheckFoldNestLevel(FDividerDrawConfig[pddlVarLocal].MaxDrawDepth - 1,
i + 2, [cfbtProcedure], cfbtAll, c) then begin
if c = 0
then exit(FDividerDrawConfig[pddlVarLocal].TopSetting)
else exit(FDividerDrawConfig[pddlVarLocal].NestSetting);
end;
cfbtVarType:
if nxt = cfbtProcedure then begin
if CheckFoldNestLevel(FDividerDrawConfig[pddlVarLocal].MaxDrawDepth - 1,
i + 2, [cfbtProcedure], cfbtAll, c) then begin
if c = 0
then exit(FDividerDrawConfig[pddlVarLocal].TopSetting)
else exit(FDividerDrawConfig[pddlVarLocal].NestSetting);
end;
end
else // global var
if FDividerDrawConfig[pddlVarGlobal].MaxDrawDepth > 0 then
exit(FDividerDrawConfig[pddlVarGlobal].TopSetting);
if FDividerDrawConfig[pddlVarGlobal].MaxDrawDepth > 0 then
exit(FDividerDrawConfig[pddlVarGlobal].TopSetting);
cfbtClass, cfbtRecord:
begin
if CheckFoldNestLevel(0, i + 1, [cfbtProcedure],
cfbtAll - [cfbtVarType], c)
cfbtAll - [cfbtVarType, cfbtLocalVarType], c)
then t := pddlStructGlobal
else t := pddlStructLocal;
if CheckFoldNestLevel(FDividerDrawConfig[t].MaxDrawDepth - 1,
i + 1, [cfbtClass, cfbtRecord],
cfbtAll - [cfbtVarType], c) then begin
cfbtAll - [cfbtVarType, cfbtLocalVarType], c) then begin
if c = 0
then exit(FDividerDrawConfig[t].TopSetting)
else exit(FDividerDrawConfig[t].NestSetting);
@ -2648,14 +2680,14 @@ begin
then exit(FDividerDrawConfig[pddlProcedure].TopSetting)
else exit(FDividerDrawConfig[pddlProcedure].NestSetting);
end;
cfbtBeginEnd, cfbtRepeat:
if CheckFoldNestLevel(FDividerDrawConfig[pddlBeginEnd].MaxDrawDepth - 1,
i + 1, [cfbtBeginEnd, cfbtRepeat],
cfbtAll - [cfbtProcedure], c) then begin
if c = 0
then exit(FDividerDrawConfig[pddlBeginEnd].TopSetting)
else exit(FDividerDrawConfig[pddlBeginEnd].NestSetting);
end;
cfbtTopBeginEnd:
if FDividerDrawConfig[pddlBeginEnd].MaxDrawDepth > 0 then
exit(FDividerDrawConfig[pddlBeginEnd].TopSetting);
cfbtBeginEnd, cfbtRepeat, cfbtCase, cfbtAsm:
if CheckFoldNestLevel(FDividerDrawConfig[pddlBeginEnd].MaxDrawDepth - 2,
i + 1, [cfbtBeginEnd, cfbtRepeat, cfbtCase, cfbtAsm],
cfbtAll - [cfbtProcedure, cfbtTopBeginEnd], c) then
exit(FDividerDrawConfig[pddlBeginEnd].NestSetting);
cfbtTry:
if CheckFoldNestLevel(FDividerDrawConfig[pddlTry].MaxDrawDepth - 1,
i + 1, [cfbtTry], cfbtAll - [cfbtProcedure], c)
@ -2698,6 +2730,40 @@ begin
FreeAndNil(FDividerDrawConfig[i]);
end;
procedure TSynPasSyn.InitFoldConfig;
var
i: TPascalCodeFoldBlockType;
begin
for i := low(TPascalCodeFoldBlockType) to high(TPascalCodeFoldBlockType) do
FFoldConfig[i] := i in [cfbtBeginEnd, cfbtTopBeginEnd, cfbtNestedComment,
cfbtProcedure, cfbtUses, cfbtLocalVarType, cfbtClass,
cfbtClassSection, cfbtRecord, cfbtRepeat, cfbtCase,
cfbtAsm];
end;
function TSynPasSyn.GetFoldConfig(Index: Integer): Boolean;
begin
// + 1 as we skip cfbtNone;
Result := FFoldConfig[TPascalCodeFoldBlockType(Index + 1)];
end;
function TSynPasSyn.GetFoldConfigCount: Integer;
begin
// excluded cfbtNone;
Result := ord(high(TPascalCodeFoldBlockType)) -
ord(low(TPascalCodeFoldBlockType));
end;
procedure TSynPasSyn.SetFoldConfig(Index: Integer; const AValue: Boolean);
begin
if FFoldConfig[TPascalCodeFoldBlockType(Index + 1)] = AValue then
exit;
FFoldConfig[TPascalCodeFoldBlockType(Index + 1)] := AValue;
FAttributeChangeNeedScan := True;
DefHighlightChange(self);
// Todo: Since all synedits will rescan => delete all foldranges
end;
function TSynPasSyn.GetDividerDrawConfig(Index: Integer): TSynDividerDrawConfig;
begin
Result := FDividerDrawConfig[TSynPasDividerDrawLocation(Index)];

View File

@ -39,7 +39,7 @@ uses
// LCL
Controls, Graphics, LCLProc, FileUtil, LResources,
// synedit
SynEdit, SynEditAutoComplete, SynEditHighlighter, SynEditKeyCmds,
SynEdit, SynEditAutoComplete, SynEditHighlighter, SynEditHighlighterFoldBase, SynEditKeyCmds,
SynEditStrConst, SynEditMarkupBracket, SynEditMarkupHighAll, SynEditMarkupWordGroup,
SynGutter, SynGutterBase, SynGutterCodeFolding, SynGutterLineNumber, SynGutterChanges,
SynHighlighterCPP, SynHighlighterHTML, SynHighlighterJava, SynHighlighterLFM,
@ -387,6 +387,85 @@ const
(Count: 0; Info: nil) // jscript
);
type
TEditorOptionsFoldInfo = record
Name: String; // Name for display
Xml: String; // Name for XML
Index: Integer; // FHighlighter.FoldConf[index]
Enabled: Boolean;
end;
TEditorOptionsFoldInfoList = Array [0..999] of TEditorOptionsFoldInfo;
PEditorOptionsFoldInfoList = ^TEditorOptionsFoldInfoList;
TEditorOptionsFoldRecord = record
Count: Integer;
Info: PEditorOptionsFoldInfoList;
end;
const
EditorOptionsFoldInfoPas: Array [0..17] of TEditorOptionsFoldInfo
= (
(Name: dlgFoldPasProcedure; Xml: 'Procedure';
Index: ord(cfbtProcedure)-1; Enabled: True),
(Name: dlgFoldLocalPasVarType; Xml: 'LocalVarType';
Index: ord(cfbtLocalVarType)-1; Enabled: True),
(Name: dlgFoldPasProcBeginEnd; Xml: 'ProcBeginEnd';
Index: ord(cfbtTopBeginEnd)-1; Enabled: True),
(Name: dlgFoldPasBeginEnd; Xml: 'BeginEnd';
Index: ord(cfbtBeginEnd)-1; Enabled: True),
(Name: dlgFoldPasRepeat; Xml: 'Repeat';
Index: ord(cfbtRepeat)-1; Enabled: False),
(Name: dlgFoldPasCase; Xml: 'Case';
Index: ord(cfbtCase)-1; Enabled: False),
(Name: dlgFoldPasTry; Xml: 'Try';
Index: ord(cfbtTry)-1; Enabled: False),
(Name: dlgFoldPasExcept; Xml: 'Except';
Index: ord(cfbtExcept)-1; Enabled: False),
(Name: dlgFoldPasAsm; Xml: 'Asm';
Index: ord(cfbtAsm)-1; Enabled: True),
(Name: dlgFoldPasProgram; Xml: 'Program';
Index: ord(cfbtProgram)-1; Enabled: False),
(Name: dlgFoldPasUnit; Xml: 'Unit';
Index: ord(cfbtUnit)-1; Enabled: False),
(Name: dlgFoldPasUnitSection; Xml: 'UnitSection';
Index: ord(cfbtUnitSection)-1; Enabled: False),
(Name: dlgFoldPasUses; Xml: 'Uses';
Index: ord(cfbtUses)-1; Enabled: True),
(Name: dlgFoldPasVarType; Xml: 'VarType';
Index: ord(cfbtVarType)-1; Enabled: False),
(Name: dlgFoldPasClass; Xml: 'Class';
Index: ord(cfbtClass)-1; Enabled: True),
(Name: dlgFoldPasClassSection; Xml: 'ClassSection';
Index: ord(cfbtClassSection)-1; Enabled: True),
(Name: dlgFoldPasRecord; Xml: 'Record';
Index: ord(cfbtRecord)-1; Enabled: True),
(Name: dlgFoldPasNestedComment; Xml: 'NestedComment';
Index: ord(cfbtNestedComment)-1;Enabled: True)
);
EditorOptionsFoldDefaults: array[TLazSyntaxHighlighter] of
TEditorOptionsFoldRecord =
( (Count: 0; Info: nil), // none
(Count: 0; Info: nil), // text
(Count: 18; Info: {$IFDEF FPC}@{$ENDIF}EditorOptionsFoldInfoPas[0]), // Freepas
(Count: 18; Info: {$IFDEF FPC}@{$ENDIF}EditorOptionsFoldInfoPas[0]), // pas
(Count: 0; Info: nil), // lfm
(Count: 0; Info: nil), // xml
(Count: 0; Info: nil), // html
(Count: 0; Info: nil), // cpp
(Count: 0; Info: nil), // perl
(Count: 0; Info: nil), // java
(Count: 0; Info: nil), // shell
(Count: 0; Info: nil), // python
(Count: 0; Info: nil), // php
(Count: 0; Info: nil), // sql
(Count: 0; Info: nil) // jscript
);
const
EditorOptsFormatVersion = 4;
@ -2317,11 +2396,12 @@ var
Conf: TSynDividerDrawConfig;
ConfName: String;
Path: String;
i: Integer;
i, h: Integer;
TheFoldInfo: TEditorOptionsFoldRecord;
begin
i := HighlighterList.FindByHighlighter(Syn);
if i < 0 then exit;
TheInfo := EditorOptionsDividerDefaults[HighlighterList[i].TheType];
h := HighlighterList.FindByHighlighter(Syn);
if h < 0 then exit;
TheInfo := EditorOptionsDividerDefaults[HighlighterList[h].TheType];
ReadDefaultsForHighlighterFoldSettings(Syn);
@ -2338,35 +2418,56 @@ begin
Conf.NestColor := XMLConfig.GetValue(Path + 'NestColor/Value',
Conf.NestColor);
end;
if (syn is TSynCustomFoldHighlighter) then begin
TheFoldInfo := EditorOptionsFoldDefaults[HighlighterList[h].TheType];
for i := 0 to TheFoldInfo.Count - 1 do begin
ConfName := TheFoldInfo.Info^[i].Xml;
Path := 'EditorOptions/FoldConfig/Lang' +
StrToValidXMLName(Syn.LanguageName) + '/Type' + ConfName + '/' ;
TSynCustomFoldHighlighter(Syn).FoldConfig[TheFoldInfo.Info^[i].Index] :=
XMLConfig.GetValue(Path + 'Enabled/Value',
TSynCustomFoldHighlighter(Syn).FoldConfig[TheFoldInfo.Info^[i].Index]);
end;
end;
end;
procedure TEditorOptions.ReadDefaultsForHighlighterFoldSettings(Syn: TSrcIDEHighlighter);
var
TheInfo: TEditorOptionsDividerRecord;
i: Integer;
i, h: Integer;
TheFoldInfo: TEditorOptionsFoldRecord;
begin
i := HighlighterList.FindByHighlighter(Syn);
if i < 0 then exit;
TheInfo := EditorOptionsDividerDefaults[HighlighterList[i].TheType];
h := HighlighterList.FindByHighlighter(Syn);
if h < 0 then exit;
TheInfo := EditorOptionsDividerDefaults[HighlighterList[h].TheType];
for i := 0 to TheInfo.Count - 1 do begin
Syn.DividerDrawConfig[i].MaxDrawDepth := TheInfo.Info^[i].MaxLeveL;
Syn.DividerDrawConfig[i].TopColor := clDefault;
Syn.DividerDrawConfig[i].NestColor := clDefault;
end;
if (syn is TSynCustomFoldHighlighter) then begin
TheFoldInfo := EditorOptionsFoldDefaults[HighlighterList[h].TheType];
for i := 0 to TheFoldInfo.Count - 1 do begin
TSynCustomFoldHighlighter(Syn).FoldConfig[TheFoldInfo.Info^[i].Index]
:= TheFoldInfo.Info^[i].Enabled;
end;
end;
end;
procedure TEditorOptions.WriteHighlighterFoldSettings(Syn: TSrcIDEHighlighter);
var
DefSyn: TSrcIDEHighlighter;
i: Integer;
i, h: Integer;
Path: String;
Conf, DefConf: TSynDividerDrawConfig;
TheInfo: TEditorOptionsDividerRecord;
ConfName: String;
TheFoldInfo: TEditorOptionsFoldRecord;
begin
i := HighlighterList.FindByHighlighter(Syn);
if i < 0 then exit;
TheInfo := EditorOptionsDividerDefaults[HighlighterList[i].TheType];
h := HighlighterList.FindByHighlighter(Syn);
if h < 0 then exit;
TheInfo := EditorOptionsDividerDefaults[HighlighterList[h].TheType];
DefSyn := TCustomSynClass(Syn.ClassType).Create(Nil);
try
@ -2384,6 +2485,19 @@ begin
XMLConfig.SetDeleteValue(Path + 'NestColor/Value', Conf.NestColor,
DefConf.NestColor);
end;
if (syn is TSynCustomFoldHighlighter) then begin
TheFoldInfo := EditorOptionsFoldDefaults[HighlighterList[h].TheType];
for i := 0 to TheFoldInfo.Count - 1 do begin
ConfName := TheFoldInfo.Info^[i].Xml;
Path := 'EditorOptions/FoldConfig/Lang' +
StrToValidXMLName(Syn.LanguageName) + '/Type' + ConfName + '/' ;
XMLConfig.SetDeleteValue(Path + 'Enabled/Value',
TSynCustomFoldHighlighter(Syn).FoldConfig[TheFoldInfo.Info^[i].Index],
TSynCustomFoldHighlighter(DefSyn).FoldConfig[TheFoldInfo.Info^[i].Index]);
end;
end;
finally
DefSyn.Free;
end;

View File

@ -1,11 +1,12 @@
inherited EditorCodefoldingOptionsFrame: TEditorCodefoldingOptionsFrame
Height = 334
Width = 521
Anchors = [akTop]
ClientHeight = 334
ClientWidth = 521
Visible = False
DesignLeft = 230
DesignTop = 230
DesignLeft = 115
DesignTop = 115
object Bevel1: TBevel[0]
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = chkCodeFoldingEnabled
@ -19,96 +20,52 @@ inherited EditorCodefoldingOptionsFrame: TEditorCodefoldingOptionsFrame
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 6
end
object LanguageLabel: TLabel[1]
AnchorSideLeft.Control = LanguageComboBox
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = LanguageComboBox
Left = 206
Height = 16
Top = 31
Width = 81
BorderSpacing.Left = 6
BorderSpacing.Right = 6
Caption = 'LanguageLabel'
ParentColor = False
end
object chkCodeFoldingEnabled: TCheckBox[2]
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
Left = 0
Height = 19
Top = 0
Width = 136
Caption = 'chkCodeFoldingEnabled'
TabOrder = 0
end
object LanguageComboBox: TComboBox[3]
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Bevel1
Left = 0
Height = 21
Top = 31
Width = 200
AutoComplete = False
BorderSpacing.Top = 6
ItemHeight = 13
ItemWidth = 0
OnChange = LanguageComboBoxChange
OnExit = LanguageComboBoxExit
OnKeyDown = LanguageComboBoxKeyDown
TabOrder = 1
Text = 'LanguageComboBox'
end
object FoldConfigListBox: TListBox[4]
object DividerConfPanel: TPanel[1]
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = LanguageComboBox
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = LanguageComboBox
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 276
Top = 58
Width = 200
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 6
ItemHeight = 0
OnClick = FoldConfigListBoxClick
OnSelectionChange = FoldConfigListBoxSelectionChange
TabOrder = 2
end
object DividerConfPanel: TPanel[5]
AnchorSideLeft.Control = FoldConfigListBox
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = FoldConfigListBox
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 206
Left = 0
Height = 276
Top = 58
Width = 315
Width = 521
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Left = 6
BorderSpacing.Top = 6
BevelOuter = bvNone
ClientHeight = 276
ClientWidth = 315
TabOrder = 3
ClientWidth = 521
TabOrder = 2
object LanguageLabel: TLabel
AnchorSideLeft.Control = LanguageComboBox
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = LanguageComboBox
Left = 206
Height = 16
Top = 31
Width = 81
BorderSpacing.Left = 6
BorderSpacing.Right = 6
Caption = 'LanguageLabel'
ParentColor = False
end
object DividerBoolPanel: TPanel
AnchorSideLeft.Control = DividerConfPanel
AnchorSideLeft.Control = DividerConfigListBox
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = DividerConfPanel
AnchorSideRight.Control = DividerConfPanel
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = DividerSpinPanel
AnchorSideBottom.Side = asrBottom
Left = 0
Left = 206
Height = 23
Top = 0
Width = 315
Anchors = [akTop, akLeft, akRight, akBottom]
AutoSize = True
BorderSpacing.Left = 6
BevelOuter = bvNone
ClientHeight = 23
ClientWidth = 315
@ -130,16 +87,18 @@ inherited EditorCodefoldingOptionsFrame: TEditorCodefoldingOptionsFrame
end
end
object DividerSpinPanel: TPanel
AnchorSideLeft.Control = DividerConfPanel
AnchorSideLeft.Control = DividerConfigListBox
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = DividerConfPanel
AnchorSideRight.Control = DividerConfPanel
AnchorSideRight.Side = asrBottom
Left = 0
Left = 206
Height = 23
Top = 0
Width = 315
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BorderSpacing.Left = 6
BevelOuter = bvNone
ClientHeight = 23
ClientWidth = 315
@ -172,17 +131,19 @@ inherited EditorCodefoldingOptionsFrame: TEditorCodefoldingOptionsFrame
end
end
object NestLvlPanel: TPanel
AnchorSideLeft.Control = DividerConfPanel
AnchorSideLeft.Control = DividerConfigListBox
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = TopLvlPanel
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = DividerConfPanel
AnchorSideRight.Side = asrBottom
Left = 0
Left = 206
Height = 44
Top = 80
Width = 315
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BorderSpacing.Left = 6
BorderSpacing.Top = 6
BevelOuter = bvNone
ClientHeight = 44
@ -232,16 +193,18 @@ inherited EditorCodefoldingOptionsFrame: TEditorCodefoldingOptionsFrame
end
end
object TopLvlPanel: TPanel
AnchorSideLeft.Control = DividerConfPanel
AnchorSideLeft.Control = DividerConfigListBox
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = DividerConfPanel
AnchorSideRight.Control = DividerConfPanel
AnchorSideRight.Side = asrBottom
Left = 0
Left = 206
Height = 44
Top = 30
Width = 315
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BorderSpacing.Left = 6
BorderSpacing.Top = 30
BevelOuter = bvNone
ClientHeight = 44
@ -289,5 +252,125 @@ inherited EditorCodefoldingOptionsFrame: TEditorCodefoldingOptionsFrame
TabOrder = 1
end
end
object DividerConfigListBox: TListBox
AnchorSideLeft.Control = DividerConfPanel
AnchorSideTop.Control = DividerConfPanel
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = DividerConfPanel
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 276
Top = 0
Width = 200
Anchors = [akTop, akLeft, akBottom]
ItemHeight = 0
OnClick = DividerConfigListBoxClick
OnSelectionChange = DividerConfigListBoxSelectionChange
TabOrder = 4
end
end
object chkCodeFoldingEnabled: TCheckBox[2]
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
Left = 0
Height = 19
Top = 0
Width = 136
Caption = 'chkCodeFoldingEnabled'
TabOrder = 0
end
object LanguageComboBox: TComboBox[3]
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Bevel1
Left = 0
Height = 21
Top = 31
Width = 200
AutoComplete = False
BorderSpacing.Top = 6
ItemHeight = 13
ItemWidth = 0
OnChange = LanguageComboBoxChange
OnExit = LanguageComboBoxExit
OnKeyDown = LanguageComboBoxKeyDown
TabOrder = 1
Text = 'LanguageComboBox'
end
object FoldConfPanel: TPanel[4]
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = LanguageComboBox
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 276
Top = 58
Width = 521
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 6
BevelOuter = bvNone
ClientHeight = 276
ClientWidth = 521
TabOrder = 3
object FoldConfigCheckListBox: TCheckListBox
AnchorSideLeft.Control = FoldConfPanel
AnchorSideTop.Control = FoldConfPanel
AnchorSideBottom.Control = FoldConfPanel
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 276
Top = 0
Width = 200
Anchors = [akTop, akLeft, akBottom]
ExtendedSelect = False
ItemHeight = 0
OnClickCheck = FoldConfigCheckListBoxClickCheck
OnExit = FoldConfigCheckListBoxClickCheck
OnKeyUp = FoldConfigCheckListBoxKeyUp
TabOrder = 0
end
end
object ToolBar1: TToolBar[5]
AnchorSideLeft.Control = LanguageComboBox
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = LanguageComboBox
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 206
Height = 26
Top = 28
Width = 315
Align = alNone
BorderSpacing.Left = 6
Caption = 'ToolBar1'
TabOrder = 4
object DividerSpeedButton: TSpeedButton
Tag = 1
Left = 1
Height = 22
Top = 2
Width = 70
Caption = 'Divider'
Color = clBtnFace
Down = True
GroupIndex = 1
NumGlyphs = 0
OnClick = DividerSpeedButtonClick
end
object FoldSpeedButton: TSpeedButton
Tag = 1
Left = 71
Height = 22
Top = 2
Width = 70
Caption = 'Fold'
Color = clBtnFace
GroupIndex = 1
NumGlyphs = 0
OnClick = FoldSpeedButtonClick
end
end
end

View File

@ -1,111 +1,141 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TEditorCodefoldingOptionsFrame','FORMDATA',[
'TPF0'#241#30'TEditorCodefoldingOptionsFrame'#29'EditorCodefoldingOptionsFram'
+'e'#6'Height'#3'N'#1#5'Width'#3#9#2#12'ClientHeight'#3'N'#1#11'ClientWidth'#3
+#9#2#7'Visible'#8#10'DesignLeft'#3#230#0#9'DesignTop'#3#230#0#0#242#2#0#6'TB'
+'evel'#6'Bevel1'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Cont'
+'rol'#7#21'chkCodeFoldingEnabled'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'A'
+'nchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#4
+'Left'#2#0#6'Height'#2#2#3'Top'#2#25#5'Width'#3#9#2#7'Anchors'#11#5'akTop'#6
+'akLeft'#7'akRight'#0#17'BorderSpacing.Top'#2#6#0#0#242#2#1#6'TLabel'#13'Lan'
+'guageLabel'#22'AnchorSideLeft.Control'#7#16'LanguageComboBox'#19'AnchorSide'
+'Left.Side'#7#9'asrBottom'#21'AnchorSideTop.Control'#7#16'LanguageComboBox'#4
+'Left'#3#206#0#6'Height'#2#16#3'Top'#2#31#5'Width'#2'Q'#18'BorderSpacing.Lef'
+'t'#2#6#19'BorderSpacing.Right'#2#6#7'Caption'#6#13'LanguageLabel'#11'Parent'
+'Color'#8#0#0#242#2#2#9'TCheckBox'#21'chkCodeFoldingEnabled'#22'AnchorSideLe'
+'ft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#5'Owner'#4'Left'#2#0#6'H'
+'eight'#2#19#3'Top'#2#0#5'Width'#3#136#0#7'Caption'#6#21'chkCodeFoldingEnabl'
+'ed'#8'TabOrder'#2#0#0#0#242#2#3#9'TComboBox'#16'LanguageComboBox'#22'Anchor'
+'SideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#6'Bevel1'#4'Left'#2
+#0#6'Height'#2#21#3'Top'#2#31#5'Width'#3#200#0#12'AutoComplete'#8#17'BorderS'
+'pacing.Top'#2#6#10'ItemHeight'#2#13#9'ItemWidth'#2#0#8'OnChange'#7#22'Langu'
+'ageComboBoxChange'#6'OnExit'#7#20'LanguageComboBoxExit'#9'OnKeyDown'#7#23'L'
+'anguageComboBoxKeyDown'#8'TabOrder'#2#1#4'Text'#6#16'LanguageComboBox'#0#0
+#242#2#4#8'TListBox'#17'FoldConfigListBox'#22'AnchorSideLeft.Control'#7#5'Ow'
+'ner'#21'AnchorSideTop.Control'#7#16'LanguageComboBox'#18'AnchorSideTop.Side'
+#7#9'asrBottom'#23'AnchorSideRight.Control'#7#16'LanguageComboBox'#20'Anchor'
+'SideRight.Side'#7#9'asrBottom'#24'AnchorSideBottom.Control'#7#5'Owner'#21'A'
+'nchorSideBottom.Side'#7#9'asrBottom'#4'Left'#2#0#6'Height'#3#20#1#3'Top'#2
+':'#5'Width'#3#200#0#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#8'akBottom'
+#0#17'BorderSpacing.Top'#2#6#10'ItemHeight'#2#0#7'OnClick'#7#22'FoldConfigLi'
+'stBoxClick'#17'OnSelectionChange'#7' FoldConfigListBoxSelectionChange'#8'Ta'
+'bOrder'#2#2#0#0#242#2#5#6'TPanel'#16'DividerConfPanel'#22'AnchorSideLeft.Co'
+'ntrol'#7#17'FoldConfigListBox'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21'An'
+'chorSideTop.Control'#7#17'FoldConfigListBox'#23'AnchorSideRight.Control'#7#5
+'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#24'AnchorSideBottom.Control'
+#7#5'Owner'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#3#206#0#6'Heigh'
+'t'#3#20#1#3'Top'#2':'#5'Width'#3';'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'ak'
+'Right'#8'akBottom'#0#18'BorderSpacing.Left'#2#6#10'BevelOuter'#7#6'bvNone'
+#12'ClientHeight'#3#20#1#11'ClientWidth'#3';'#1#8'TabOrder'#2#3#0#6'TPanel'
+#16'DividerBoolPanel'#22'AnchorSideLeft.Control'#7#16'DividerConfPanel'#21'A'
+'nchorSideTop.Control'#7#16'DividerConfPanel'#23'AnchorSideRight.Control'#7
+#16'DividerConfPanel'#20'AnchorSideRight.Side'#7#9'asrBottom'#24'AnchorSideB'
+'ottom.Control'#7#16'DividerSpinPanel'#21'AnchorSideBottom.Side'#7#9'asrBott'
+'om'#4'Left'#2#0#6'Height'#2#23#3'Top'#2#0#5'Width'#3';'#1#7'Anchors'#11#5'a'
+'kTop'#6'akLeft'#7'akRight'#8'akBottom'#0#8'AutoSize'#9#10'BevelOuter'#7#6'b'
+'vNone'#12'ClientHeight'#2#23#11'ClientWidth'#3';'#1#8'TabOrder'#2#1#7'Visib'
+'le'#8#0#9'TCheckBox'#20'DividerOnOffCheckBox'#22'AnchorSideLeft.Control'#7
+#16'DividerBoolPanel'#21'AnchorSideTop.Control'#7#16'DividerBoolPanel'#23'An'
+'chorSideRight.Control'#7#16'DividerBoolPanel'#20'AnchorSideRight.Side'#7#9
+'asrBottom'#4'Left'#2#0#6'Height'#2#19#3'Top'#2#0#5'Width'#3';'#1#7'Anchors'
+#11#5'akTop'#6'akLeft'#7'akRight'#0#7'Caption'#6#20'DividerOnOffCheckBox'#8
+'OnChange'#7#26'DividerOnOffCheckBoxChange'#8'TabOrder'#2#0#0#0#0#6'TPanel'
+#16'DividerSpinPanel'#22'AnchorSideLeft.Control'#7#16'DividerConfPanel'#21'A'
+'nchorSideTop.Control'#7#16'DividerConfPanel'#23'AnchorSideRight.Control'#7
+#16'DividerConfPanel'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#2#0#6
+'Height'#2#23#3'Top'#2#0#5'Width'#3';'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7
+'akRight'#0#8'AutoSize'#9#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2#23#11
+'ClientWidth'#3';'#1#8'TabOrder'#2#0#0#6'TLabel'#16'DividerSpinLabel'#22'Anc'
+'horSideLeft.Control'#7#15'DividerSpinEdit'#19'AnchorSideLeft.Side'#7#9'asrB'
+'ottom'#21'AnchorSideTop.Control'#7#15'DividerSpinEdit'#18'AnchorSideTop.Sid'
+'e'#7#9'asrCenter'#23'AnchorSideRight.Control'#7#16'DividerSpinPanel'#20'Anc'
+'horSideRight.Side'#7#9'asrBottom'#4'Left'#2'5'#6'Height'#2#16#3'Top'#2#3#5
+'Width'#3#6#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#18'BorderSpacing'
+'.Left'#2#3#7'Caption'#6#16'DividerSpinLabel'#11'ParentColor'#8#0#0#9'TSpinE'
+'dit'#15'DividerSpinEdit'#22'AnchorSideLeft.Control'#7#16'DividerSpinPanel'
+#21'AnchorSideTop.Control'#7#16'DividerSpinPanel'#4'Left'#2#0#6'Height'#2#23
,#3'Top'#2#0#5'Width'#2'2'#8'OnChange'#7#21'DividerSpinEditChange'#8'TabOrder'
+#2#0#0#0#0#6'TPanel'#12'NestLvlPanel'#22'AnchorSideLeft.Control'#7#16'Divide'
+'rConfPanel'#21'AnchorSideTop.Control'#7#11'TopLvlPanel'#18'AnchorSideTop.Si'
+'de'#7#9'asrBottom'#23'AnchorSideRight.Control'#7#16'DividerConfPanel'#20'An'
+'chorSideRight.Side'#7#9'asrBottom'#4'Left'#2#0#6'Height'#2','#3'Top'#2'P'#5
+'Width'#3';'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#9#17
+'BorderSpacing.Top'#2#6#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2','#11
+'ClientWidth'#3';'#1#8'TabOrder'#2#2#7'Visible'#8#0#6'TLabel'#17'NestLvlColo'
+'rLabel'#22'AnchorSideLeft.Control'#7#12'NestLvlPanel'#21'AnchorSideTop.Cont'
+'rol'#7#12'NestLvlPanel'#4'Left'#2#0#6'Height'#2#16#3'Top'#2#0#5'Width'#2'a'
+#7'Caption'#6#17'NestLvlColorLabel'#11'ParentColor'#8#0#0#9'TColorBox'#15'Ne'
+'stLvlColorBox'#22'AnchorSideLeft.Control'#7#12'NestLvlPanel'#21'AnchorSideT'
+'op.Control'#7#17'NestLvlColorLabel'#18'AnchorSideTop.Side'#7#9'asrBottom'#4
+'Left'#2#0#6'Height'#2#22#3'Top'#2#22#5'Width'#2'd'#17'DefaultColorColor'#7#7
+'clWhite'#5'Style'#11#16'cbStandardColors'#16'cbExtendedColors'#14'cbSystemC'
+'olors'#16'cbIncludeDefault'#13'cbCustomColor'#13'cbPrettyNames'#0#12'AutoCo'
+'mplete'#8#17'BorderSpacing.Top'#2#6#10'ItemHeight'#2#16#9'ItemWidth'#2#0#8
+'OnChange'#7#21'NestLvlColorBoxChange'#8'TabOrder'#2#0#0#0#9'TCheckBox'#20'N'
+'estLvlColorCheckBox'#22'AnchorSideLeft.Control'#7#15'NestLvlColorBox'#19'An'
+'chorSideLeft.Side'#7#9'asrBottom'#21'AnchorSideTop.Control'#7#15'NestLvlCol'
+'orBox'#18'AnchorSideTop.Side'#7#9'asrCenter'#4'Left'#2'j'#6'Height'#2#19#3
+'Top'#2#24#5'Width'#3#129#0#18'BorderSpacing.Left'#2#6#7'Caption'#6#20'NestL'
+'vlColorCheckBox'#8'OnChange'#7#26'NestLvlColorCheckBoxChange'#8'TabOrder'#2
+#1#0#0#0#6'TPanel'#11'TopLvlPanel'#22'AnchorSideLeft.Control'#7#16'DividerCo'
+'nfPanel'#21'AnchorSideTop.Control'#7#16'DividerConfPanel'#23'AnchorSideRigh'
+'t.Control'#7#16'DividerConfPanel'#20'AnchorSideRight.Side'#7#9'asrBottom'#4
+'Left'#2#0#6'Height'#2','#3'Top'#2#30#5'Width'#3';'#1#7'Anchors'#11#5'akTop'
+#6'akLeft'#7'akRight'#0#8'AutoSize'#9#17'BorderSpacing.Top'#2#30#10'BevelOut'
+'er'#7#6'bvNone'#12'ClientHeight'#2','#11'ClientWidth'#3';'#1#8'TabOrder'#2#3
+#0#6'TLabel'#16'TopLvlColorLabel'#22'AnchorSideLeft.Control'#7#11'TopLvlPane'
+'l'#21'AnchorSideTop.Control'#7#11'TopLvlPanel'#4'Left'#2#0#6'Height'#2#16#3
+'Top'#2#0#5'Width'#2'^'#7'Caption'#6#16'TopLvlColorLabel'#11'ParentColor'#8#0
+#0#9'TColorBox'#14'TopLvlColorBox'#22'AnchorSideLeft.Control'#7#11'TopLvlPan'
+'el'#21'AnchorSideTop.Control'#7#16'TopLvlColorLabel'#18'AnchorSideTop.Side'
+#7#9'asrBottom'#4'Left'#2#0#6'Height'#2#22#3'Top'#2#22#5'Width'#2'd'#17'Defa'
+'ultColorColor'#7#7'clWhite'#5'Style'#11#16'cbStandardColors'#16'cbExtendedC'
+'olors'#14'cbSystemColors'#16'cbIncludeDefault'#13'cbCustomColor'#13'cbPrett'
+'yNames'#0#12'AutoComplete'#8#17'BorderSpacing.Top'#2#6#10'ItemHeight'#2#16#9
+'ItemWidth'#2#0#8'OnChange'#7#20'TopLvlColorBoxChange'#8'TabOrder'#2#0#0#0#9
+'TCheckBox'#19'TopLvlColorCheckBox'#22'AnchorSideLeft.Control'#7#14'TopLvlCo'
+'lorBox'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21'AnchorSideTop.Control'#7
+#14'TopLvlColorBox'#18'AnchorSideTop.Side'#7#9'asrCenter'#4'Left'#2'j'#6'Hei'
+'ght'#2#19#3'Top'#2#24#5'Width'#2'~'#18'BorderSpacing.Left'#2#6#7'Caption'#6
+#19'TopLvlColorCheckBox'#8'OnChange'#7#25'TopLvlColorCheckBoxChange'#8'TabOr'
+'der'#2#1#0#0#0#0#0
+'e'#6'Height'#3'N'#1#5'Width'#3#9#2#7'Anchors'#11#5'akTop'#0#12'ClientHeight'
+#3'N'#1#11'ClientWidth'#3#9#2#7'Visible'#8#10'DesignLeft'#2's'#9'DesignTop'#2
+'s'#0#242#2#0#6'TBevel'#6'Bevel1'#22'AnchorSideLeft.Control'#7#5'Owner'#21'A'
+'nchorSideTop.Control'#7#21'chkCodeFoldingEnabled'#18'AnchorSideTop.Side'#7#9
+'asrBottom'#23'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7
+#9'asrBottom'#4'Left'#2#0#6'Height'#2#2#3'Top'#2#25#5'Width'#3#9#2#7'Anchors'
+#11#5'akTop'#6'akLeft'#7'akRight'#0#17'BorderSpacing.Top'#2#6#0#0#242#2#1#6
+'TPanel'#16'DividerConfPanel'#22'AnchorSideLeft.Control'#7#5'Owner'#21'Ancho'
+'rSideTop.Control'#7#16'LanguageComboBox'#18'AnchorSideTop.Side'#7#9'asrBott'
+'om'#23'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asr'
+'Bottom'#24'AnchorSideBottom.Control'#7#5'Owner'#21'AnchorSideBottom.Side'#7
+#9'asrBottom'#4'Left'#2#0#6'Height'#3#20#1#3'Top'#2':'#5'Width'#3#9#2#7'Anch'
+'ors'#11#5'akTop'#6'akLeft'#7'akRight'#8'akBottom'#0#17'BorderSpacing.Top'#2
+#6#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#3#20#1#11'ClientWidth'#3#9#2#8
+'TabOrder'#2#2#0#6'TLabel'#13'LanguageLabel'#22'AnchorSideLeft.Control'#7#16
+'LanguageComboBox'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21'AnchorSideTop.C'
+'ontrol'#7#16'LanguageComboBox'#4'Left'#3#206#0#6'Height'#2#16#3'Top'#2#31#5
+'Width'#2'Q'#18'BorderSpacing.Left'#2#6#19'BorderSpacing.Right'#2#6#7'Captio'
+'n'#6#13'LanguageLabel'#11'ParentColor'#8#0#0#6'TPanel'#16'DividerBoolPanel'
+#22'AnchorSideLeft.Control'#7#20'DividerConfigListBox'#19'AnchorSideLeft.Sid'
+'e'#7#9'asrBottom'#21'AnchorSideTop.Control'#7#16'DividerConfPanel'#23'Ancho'
+'rSideRight.Control'#7#16'DividerConfPanel'#20'AnchorSideRight.Side'#7#9'asr'
+'Bottom'#24'AnchorSideBottom.Control'#7#16'DividerSpinPanel'#21'AnchorSideBo'
+'ttom.Side'#7#9'asrBottom'#4'Left'#3#206#0#6'Height'#2#23#3'Top'#2#0#5'Width'
+#3';'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#8'akBottom'#0#8'AutoSize'
+#9#18'BorderSpacing.Left'#2#6#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2
+#23#11'ClientWidth'#3';'#1#8'TabOrder'#2#1#7'Visible'#8#0#9'TCheckBox'#20'Di'
+'viderOnOffCheckBox'#22'AnchorSideLeft.Control'#7#16'DividerBoolPanel'#21'An'
+'chorSideTop.Control'#7#16'DividerBoolPanel'#23'AnchorSideRight.Control'#7#16
+'DividerBoolPanel'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#2#0#6'Hei'
+'ght'#2#19#3'Top'#2#0#5'Width'#3';'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akR'
+'ight'#0#7'Caption'#6#20'DividerOnOffCheckBox'#8'OnChange'#7#26'DividerOnOff'
+'CheckBoxChange'#8'TabOrder'#2#0#0#0#0#6'TPanel'#16'DividerSpinPanel'#22'Anc'
+'horSideLeft.Control'#7#20'DividerConfigListBox'#19'AnchorSideLeft.Side'#7#9
+'asrBottom'#21'AnchorSideTop.Control'#7#16'DividerConfPanel'#23'AnchorSideRi'
+'ght.Control'#7#16'DividerConfPanel'#20'AnchorSideRight.Side'#7#9'asrBottom'
+#4'Left'#3#206#0#6'Height'#2#23#3'Top'#2#0#5'Width'#3';'#1#7'Anchors'#11#5'a'
+'kTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#9#18'BorderSpacing.Left'#2#6#10'Be'
+'velOuter'#7#6'bvNone'#12'ClientHeight'#2#23#11'ClientWidth'#3';'#1#8'TabOrd'
+'er'#2#0#0#6'TLabel'#16'DividerSpinLabel'#22'AnchorSideLeft.Control'#7#15'Di'
+'viderSpinEdit'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21'AnchorSideTop.Cont'
+'rol'#7#15'DividerSpinEdit'#18'AnchorSideTop.Side'#7#9'asrCenter'#23'AnchorS'
+'ideRight.Control'#7#16'DividerSpinPanel'#20'AnchorSideRight.Side'#7#9'asrBo'
+'ttom'#4'Left'#2'5'#6'Height'#2#16#3'Top'#2#3#5'Width'#3#6#1#7'Anchors'#11#5
+'akTop'#6'akLeft'#7'akRight'#0#18'BorderSpacing.Left'#2#3#7'Caption'#6#16'Di'
+'viderSpinLabel'#11'ParentColor'#8#0#0#9'TSpinEdit'#15'DividerSpinEdit'#22'A'
+'nchorSideLeft.Control'#7#16'DividerSpinPanel'#21'AnchorSideTop.Control'#7#16
+'DividerSpinPanel'#4'Left'#2#0#6'Height'#2#23#3'Top'#2#0#5'Width'#2'2'#8'OnC'
+'hange'#7#21'DividerSpinEditChange'#8'TabOrder'#2#0#0#0#0#6'TPanel'#12'NestL'
+'vlPanel'#22'AnchorSideLeft.Control'#7#20'DividerConfigListBox'#19'AnchorSid'
+'eLeft.Side'#7#9'asrBottom'#21'AnchorSideTop.Control'#7#11'TopLvlPanel'#18'A'
+'nchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7#16'DividerC'
+'onfPanel'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#3#206#0#6'Height'
+#2','#3'Top'#2'P'#5'Width'#3';'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'
+#0#8'AutoSize'#9#18'BorderSpacing.Left'#2#6#17'BorderSpacing.Top'#2#6#10'Bev'
+'elOuter'#7#6'bvNone'#12'ClientHeight'#2','#11'ClientWidth'#3';'#1#8'TabOrde'
+'r'#2#2#7'Visible'#8#0#6'TLabel'#17'NestLvlColorLabel'#22'AnchorSideLeft.Con'
+'trol'#7#12'NestLvlPanel'#21'AnchorSideTop.Control'#7#12'NestLvlPanel'#4'Lef'
+'t'#2#0#6'Height'#2#16#3'Top'#2#0#5'Width'#2'a'#7'Caption'#6#17'NestLvlColor'
+'Label'#11'ParentColor'#8#0#0#9'TColorBox'#15'NestLvlColorBox'#22'AnchorSide'
+'Left.Control'#7#12'NestLvlPanel'#21'AnchorSideTop.Control'#7#17'NestLvlColo'
+'rLabel'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2#0#6'Height'#2#22#3
+'Top'#2#22#5'Width'#2'd'#17'DefaultColorColor'#7#7'clWhite'#5'Style'#11#16'c'
,'bStandardColors'#16'cbExtendedColors'#14'cbSystemColors'#16'cbIncludeDefaul'
+'t'#13'cbCustomColor'#13'cbPrettyNames'#0#12'AutoComplete'#8#17'BorderSpacin'
+'g.Top'#2#6#10'ItemHeight'#2#16#9'ItemWidth'#2#0#8'OnChange'#7#21'NestLvlCol'
+'orBoxChange'#8'TabOrder'#2#0#0#0#9'TCheckBox'#20'NestLvlColorCheckBox'#22'A'
+'nchorSideLeft.Control'#7#15'NestLvlColorBox'#19'AnchorSideLeft.Side'#7#9'as'
+'rBottom'#21'AnchorSideTop.Control'#7#15'NestLvlColorBox'#18'AnchorSideTop.S'
+'ide'#7#9'asrCenter'#4'Left'#2'j'#6'Height'#2#19#3'Top'#2#24#5'Width'#3#129#0
+#18'BorderSpacing.Left'#2#6#7'Caption'#6#20'NestLvlColorCheckBox'#8'OnChange'
+#7#26'NestLvlColorCheckBoxChange'#8'TabOrder'#2#1#0#0#0#6'TPanel'#11'TopLvlP'
+'anel'#22'AnchorSideLeft.Control'#7#20'DividerConfigListBox'#19'AnchorSideLe'
+'ft.Side'#7#9'asrBottom'#21'AnchorSideTop.Control'#7#16'DividerConfPanel'#23
+'AnchorSideRight.Control'#7#16'DividerConfPanel'#20'AnchorSideRight.Side'#7#9
+'asrBottom'#4'Left'#3#206#0#6'Height'#2','#3'Top'#2#30#5'Width'#3';'#1#7'Anc'
+'hors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#9#18'BorderSpacing.Lef'
+'t'#2#6#17'BorderSpacing.Top'#2#30#10'BevelOuter'#7#6'bvNone'#12'ClientHeigh'
+'t'#2','#11'ClientWidth'#3';'#1#8'TabOrder'#2#3#0#6'TLabel'#16'TopLvlColorLa'
+'bel'#22'AnchorSideLeft.Control'#7#11'TopLvlPanel'#21'AnchorSideTop.Control'
+#7#11'TopLvlPanel'#4'Left'#2#0#6'Height'#2#16#3'Top'#2#0#5'Width'#2'^'#7'Cap'
+'tion'#6#16'TopLvlColorLabel'#11'ParentColor'#8#0#0#9'TColorBox'#14'TopLvlCo'
+'lorBox'#22'AnchorSideLeft.Control'#7#11'TopLvlPanel'#21'AnchorSideTop.Contr'
+'ol'#7#16'TopLvlColorLabel'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2#0
+#6'Height'#2#22#3'Top'#2#22#5'Width'#2'd'#17'DefaultColorColor'#7#7'clWhite'
+#5'Style'#11#16'cbStandardColors'#16'cbExtendedColors'#14'cbSystemColors'#16
+'cbIncludeDefault'#13'cbCustomColor'#13'cbPrettyNames'#0#12'AutoComplete'#8
+#17'BorderSpacing.Top'#2#6#10'ItemHeight'#2#16#9'ItemWidth'#2#0#8'OnChange'#7
+#20'TopLvlColorBoxChange'#8'TabOrder'#2#0#0#0#9'TCheckBox'#19'TopLvlColorChe'
+'ckBox'#22'AnchorSideLeft.Control'#7#14'TopLvlColorBox'#19'AnchorSideLeft.Si'
+'de'#7#9'asrBottom'#21'AnchorSideTop.Control'#7#14'TopLvlColorBox'#18'Anchor'
+'SideTop.Side'#7#9'asrCenter'#4'Left'#2'j'#6'Height'#2#19#3'Top'#2#24#5'Widt'
+'h'#2'~'#18'BorderSpacing.Left'#2#6#7'Caption'#6#19'TopLvlColorCheckBox'#8'O'
+'nChange'#7#25'TopLvlColorCheckBoxChange'#8'TabOrder'#2#1#0#0#0#8'TListBox'
+#20'DividerConfigListBox'#22'AnchorSideLeft.Control'#7#16'DividerConfPanel'
+#21'AnchorSideTop.Control'#7#16'DividerConfPanel'#20'AnchorSideRight.Side'#7
+#9'asrBottom'#24'AnchorSideBottom.Control'#7#16'DividerConfPanel'#21'AnchorS'
+'ideBottom.Side'#7#9'asrBottom'#4'Left'#2#0#6'Height'#3#20#1#3'Top'#2#0#5'Wi'
+'dth'#3#200#0#7'Anchors'#11#5'akTop'#6'akLeft'#8'akBottom'#0#10'ItemHeight'#2
+#0#7'OnClick'#7#25'DividerConfigListBoxClick'#17'OnSelectionChange'#7'#Divid'
+'erConfigListBoxSelectionChange'#8'TabOrder'#2#4#0#0#0#242#2#2#9'TCheckBox'
+#21'chkCodeFoldingEnabled'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSi'
+'deTop.Control'#7#5'Owner'#4'Left'#2#0#6'Height'#2#19#3'Top'#2#0#5'Width'#3
+#136#0#7'Caption'#6#21'chkCodeFoldingEnabled'#8'TabOrder'#2#0#0#0#242#2#3#9
+'TComboBox'#16'LanguageComboBox'#22'AnchorSideLeft.Control'#7#5'Owner'#21'An'
+'chorSideTop.Control'#7#6'Bevel1'#4'Left'#2#0#6'Height'#2#21#3'Top'#2#31#5'W'
+'idth'#3#200#0#12'AutoComplete'#8#17'BorderSpacing.Top'#2#6#10'ItemHeight'#2
+#13#9'ItemWidth'#2#0#8'OnChange'#7#22'LanguageComboBoxChange'#6'OnExit'#7#20
+'LanguageComboBoxExit'#9'OnKeyDown'#7#23'LanguageComboBoxKeyDown'#8'TabOrder'
+#2#1#4'Text'#6#16'LanguageComboBox'#0#0#242#2#4#6'TPanel'#13'FoldConfPanel'
+#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#16'Langua'
+'geComboBox'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Contro'
+'l'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#24'AnchorSideBottom.C'
+'ontrol'#7#5'Owner'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#2#0#6'H'
+'eight'#3#20#1#3'Top'#2':'#5'Width'#3#9#2#7'Anchors'#11#5'akTop'#6'akLeft'#7
+'akRight'#8'akBottom'#0#17'BorderSpacing.Top'#2#6#10'BevelOuter'#7#6'bvNone'
+#12'ClientHeight'#3#20#1#11'ClientWidth'#3#9#2#8'TabOrder'#2#3#0#13'TCheckLi'
+'stBox'#22'FoldConfigCheckListBox'#22'AnchorSideLeft.Control'#7#13'FoldConfP'
+'anel'#21'AnchorSideTop.Control'#7#13'FoldConfPanel'#24'AnchorSideBottom.Con'
+'trol'#7#13'FoldConfPanel'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#2
+#0#6'Height'#3#20#1#3'Top'#2#0#5'Width'#3#200#0#7'Anchors'#11#5'akTop'#6'akL'
+'eft'#8'akBottom'#0#14'ExtendedSelect'#8#10'ItemHeight'#2#0#12'OnClickCheck'
+#7' FoldConfigCheckListBoxClickCheck'#6'OnExit'#7' FoldConfigCheckListBoxCli'
+'ckCheck'#7'OnKeyUp'#7#27'FoldConfigCheckListBoxKeyUp'#8'TabOrder'#2#0#0#0#0
+#242#2#5#8'TToolBar'#8'ToolBar1'#22'AnchorSideLeft.Control'#7#16'LanguageCom'
+'boBox'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21'AnchorSideTop.Control'#7#16
+'LanguageComboBox'#18'AnchorSideTop.Side'#7#9'asrCenter'#23'AnchorSideRight.'
,'Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#3#206#0
+#6'Height'#2#26#3'Top'#2#28#5'Width'#3';'#1#5'Align'#7#6'alNone'#18'BorderSp'
+'acing.Left'#2#6#7'Caption'#6#8'ToolBar1'#8'TabOrder'#2#4#0#12'TSpeedButton'
+#18'DividerSpeedButton'#3'Tag'#2#1#4'Left'#2#1#6'Height'#2#22#3'Top'#2#2#5'W'
+'idth'#2'F'#7'Caption'#6#7'Divider'#5'Color'#7#9'clBtnFace'#4'Down'#9#10'Gro'
+'upIndex'#2#1#9'NumGlyphs'#2#0#7'OnClick'#7#23'DividerSpeedButtonClick'#0#0
+#12'TSpeedButton'#15'FoldSpeedButton'#3'Tag'#2#1#4'Left'#2'G'#6'Height'#2#22
+#3'Top'#2#2#5'Width'#2'F'#7'Caption'#6#4'Fold'#5'Color'#7#9'clBtnFace'#10'Gr'
+'oupIndex'#2#1#9'NumGlyphs'#2#0#7'OnClick'#7#20'FoldSpeedButtonClick'#0#0#0#0
]);

View File

@ -27,7 +27,7 @@ interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, StdCtrls, ExtCtrls, Graphics,
LCLType, EditorOptions, LazarusIDEStrConsts, IDEOptionsIntf, Controls,
SynEditHighlighter, Spin, ComCtrls, ColorBox;
SynEditHighlighter, SynEditHighlighterFoldBase, Spin, ComCtrls, ColorBox, CheckLst, Buttons;
type
@ -35,6 +35,11 @@ type
TEditorCodefoldingOptionsFrame = class(TAbstractIDEOptionsEditor)
Bevel1: TBevel;
FoldConfigCheckListBox: TCheckListBox;
FoldConfPanel: TPanel;
DividerSpeedButton: TSpeedButton;
FoldSpeedButton: TSpeedButton;
ToolBar1: TToolBar;
TopLvlPanel: TPanel;
TopLvlColorCheckBox: TCheckBox;
NestLvlColorCheckBox: TCheckBox;
@ -47,16 +52,20 @@ type
NestLvlColorLabel: TLabel;
LanguageComboBox: TComboBox;
LanguageLabel: TLabel;
FoldConfigListBox: TListBox;
DividerConfigListBox: TListBox;
DividerConfPanel: TPanel;
DividerSpinPanel: TPanel;
DividerBoolPanel: TPanel;
DividerSpinEdit: TSpinEdit;
NestLvlPanel: TPanel;
procedure DividerOnOffCheckBoxChange(Sender: TObject);
procedure DividerSpeedButtonClick(Sender: TObject);
procedure DividerSpinEditChange(Sender: TObject);
procedure FoldConfigListBoxClick(Sender: TObject);
procedure FoldConfigListBoxSelectionChange(Sender: TObject; User: boolean);
procedure DividerConfigListBoxClick(Sender: TObject);
procedure DividerConfigListBoxSelectionChange(Sender: TObject; User: boolean);
procedure FoldConfigCheckListBoxClickCheck(Sender: TObject);
procedure FoldConfigCheckListBoxKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FoldSpeedButtonClick(Sender: TObject);
procedure LanguageComboBoxChange(Sender: TObject);
procedure LanguageComboBoxExit(Sender: TObject);
procedure LanguageComboBoxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
@ -69,7 +78,8 @@ type
FHighlighters: array[TLazSyntaxHighlighter] of TSrcIDEHighlighter;
FCurHighlighter: TSrcIDEHighlighter;
FCurDividerConf: TSynDividerDrawConfig;
FCurInfo: TEditorOptionsDividerRecord;
FCurDivInfo: TEditorOptionsDividerRecord;
FCurFoldInfo: TEditorOptionsFoldRecord;
protected
function GetHighlighter(SynType: TLazSyntaxHighlighter;
CreateIfNotExists: Boolean): TSrcIDEHighlighter;
@ -104,26 +114,80 @@ end;
procedure TEditorCodefoldingOptionsFrame.LanguageComboBoxExit(Sender: TObject);
var
ComboBox: TComboBox absolute Sender;
i: Integer;
tp: TLazSyntaxHighlighter;
begin
tp := EditorOpts.HighlighterList
[EditorOpts.HighlighterList.FindByName(ComboBox.Text)].TheType;
FCurHighlighter := GetHighlighter(tp, True);
FCurInfo := EditorOptionsDividerDefaults[tp];
FoldConfigListBox.Clear;
for i := 0 to FCurInfo.Count - 1 do
FoldConfigListBox.Items.add(FCurInfo.Info^[i].Name);
FoldConfigListBox.ItemIndex := 0;
FoldConfigListBoxSelectionChange(Sender, True);
FCurDivInfo := EditorOptionsDividerDefaults[tp];
FCurFoldInfo := EditorOptionsFoldDefaults[tp];
DividerSpeedButton.Enabled := FCurDivInfo.Count > 0;
FoldSpeedButton.Enabled := FCurFoldInfo.Count > 0;
if DividerSpeedButton.Enabled and
(DividerSpeedButton.Down or not FoldSpeedButton.Enabled) then begin
DividerSpeedButton.Down := true;
DividerSpeedButtonClick(DividerSpeedButton)
end else begin
FoldSpeedButton.Down := true;
FoldSpeedButtonClick(FoldSpeedButton);
end;
end;
procedure TEditorCodefoldingOptionsFrame.FoldConfigListBoxClick(Sender: TObject);
procedure TEditorCodefoldingOptionsFrame.FoldSpeedButtonClick(Sender: TObject);
var
i: Integer;
begin
FoldConfigListBoxSelectionChange(Sender, True);
FoldConfPanel.Visible := true;
DividerConfPanel.Visible := False;
FoldConfigCheckListBox.Clear;
if not (assigned(FCurHighlighter) and
(FCurHighlighter is TSynCustomFoldHighlighter)) then exit;
for i := 0 to FCurFoldInfo.Count - 1 do begin
FoldConfigCheckListBox.Items.add(FCurFoldInfo.Info^[i].Name);
FoldConfigCheckListBox.Checked[i] :=
TSynCustomFoldHighlighter(FCurHighlighter).FoldConfig[FCurFoldInfo.Info^[i].Index];
end;
end;
procedure TEditorCodefoldingOptionsFrame.FoldConfigListBoxSelectionChange(Sender: TObject; User: boolean);
procedure TEditorCodefoldingOptionsFrame.FoldConfigCheckListBoxClickCheck(Sender: TObject);
var
i: Integer;
begin
if not (assigned(FCurHighlighter) and
(FCurHighlighter is TSynCustomFoldHighlighter)) then exit;
for i := 0 to FCurFoldInfo.Count - 1 do
TSynCustomFoldHighlighter(FCurHighlighter).FoldConfig[FCurFoldInfo.Info^[i].Index]
:= FoldConfigCheckListBox.Checked[i];
end;
procedure TEditorCodefoldingOptionsFrame.FoldConfigCheckListBoxKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
FoldConfigCheckListBoxClickCheck(Sender);
end;
procedure TEditorCodefoldingOptionsFrame.DividerSpeedButtonClick(Sender: TObject);
var
i: Integer;
begin
FoldConfPanel.Visible := False;
DividerConfPanel.Visible := True;
DividerConfigListBox.Clear;
for i := 0 to FCurDivInfo.Count - 1 do
DividerConfigListBox.Items.add(FCurDivInfo.Info^[i].Name);
DividerConfigListBox.ItemIndex := 0;
DividerConfigListBoxSelectionChange(Sender, True);
end;
procedure TEditorCodefoldingOptionsFrame.DividerConfigListBoxClick(Sender: TObject);
begin
DividerConfigListBoxSelectionChange(Sender, True);
end;
procedure TEditorCodefoldingOptionsFrame.DividerConfigListBoxSelectionChange(Sender: TObject; User: boolean);
var
ListBox: TListBox absolute Sender;
i: LongInt;
@ -132,11 +196,11 @@ var
begin
if not assigned(FCurHighlighter) then exit;
i := ListBox.ItemIndex;
if (i < 0) or (i >= FCurInfo.Count) then exit;
if (i < 0) or (i >= FCurDivInfo.Count) then exit;
NewDiv := FCurHighlighter.DividerDrawConfig[i];
FCurDividerConf := nil;
b := FCurInfo.Info^[i].BoolOpt;
b := FCurDivInfo.Info^[i].BoolOpt;
DividerBoolPanel.Visible := b;
DividerSpinPanel.Visible := not b;
NestLvlPanel.Visible := not b;
@ -228,7 +292,6 @@ function TEditorCodefoldingOptionsFrame.GetHighlighter(SynType: TLazSyntaxHighli
CreateIfNotExists: Boolean): TSrcIDEHighlighter;
var
SynClass: TCustomSynClass;
i: Integer;
begin
Result := FHighlighters[SynType];
if (Result <> nil) or not(CreateIfNotExists) then exit;
@ -268,13 +331,16 @@ begin
TopLvlColorCheckBox.Caption := dlgDividerTopColorDefault;
NestLvlColorLabel.Caption := dlgDividerNestColor;
NestLvlColorCheckBox.Caption := dlgDividerNestColorDefault;
DividerSpeedButton.Caption := dlgDividerConf;
FoldSpeedButton.Caption := dlgfoldConf;
end;
procedure TEditorCodefoldingOptionsFrame.ReadSettings(
AOptions: TAbstractIDEOptions);
var
i: Integer;
r: TEditorOptionsDividerRecord;
rd: TEditorOptionsDividerRecord;
rf: TEditorOptionsFoldRecord;
begin
with AOptions as TEditorOptions do
begin
@ -283,8 +349,9 @@ begin
with LanguageComboBox.Items do begin
BeginUpdate;
for i := 0 to EditorOpts.HighlighterList.Count - 1 do begin
r := EditorOptionsDividerDefaults[HighlighterList[i].TheType];
if r.Count > 0 then
rd := EditorOptionsDividerDefaults[HighlighterList[i].TheType];
rf := EditorOptionsFoldDefaults[HighlighterList[i].TheType];
if (rd.Count > 0) or (rf.Count > 0) then
Add(HighlighterList[i].SynClass.GetLanguageName);
end;
EndUpdate;

View File

@ -1220,6 +1220,9 @@ resourcestring
dlgIndentCodeTo = 'Indent code to';
//dlgCodeToolsTab = 'Code Tools';
lisAutomaticFeatures = 'Automatic features';
dlgDividerConf = 'Divider';
dlgfoldConf = 'Folding';
dlgDividerOnOff = 'Draw divider';
dlgDividerDrawDepth = 'Draw divider level';
dlgDividerTopColor = 'Line color';
@ -1237,6 +1240,25 @@ resourcestring
dlgDivPasBeginEndName = 'Begin/End';
dlgDivPasTryName = 'Try/Except';
dlgFoldPasBeginEnd = 'Begin/End (nested)';
dlgFoldPasProcBeginEnd = 'Begin/End (procedure)';
dlgFoldPasNestedComment = 'Nested Comment';
dlgFoldPasProcedure = 'Procedure';
dlgFoldPasUses = 'Uses';
dlgFoldPasVarType = 'Var/Type (global)';
dlgFoldLocalPasVarType = 'Var/Type (local)';
dlgFoldPasClass = 'Class/Object';
dlgFoldPasClassSection = 'public/private';
dlgFoldPasUnitSection = 'Unit section';
dlgFoldPasProgram = 'Program';
dlgFoldPasUnit = 'Unit';
dlgFoldPasRecord = 'Record';
dlgFoldPasTry = 'Try';
dlgFoldPasExcept = 'Except/Finally';
dlgFoldPasRepeat = 'Repeat';
dlgFoldPasCase = 'Case';
dlgFoldPasAsm = 'Asm';
// CodeTools dialog
dlgCodeToolsOpts = 'CodeTools Options';
dlgCodeCreation = 'Code Creation';