IDE: define template use default flag

git-svn-id: trunk@26286 -
This commit is contained in:
mattias 2010-06-24 19:19:34 +00:00
parent bef96de901
commit d0d753564d
7 changed files with 105 additions and 67 deletions

View File

@ -317,6 +317,8 @@ type
procedure Unbind;
procedure UnmarkNodes(WithSiblings, WithChilds: boolean);
procedure WriteDebugReport(OnlyMarked: boolean);
function GetNext: TDefineTemplate;
function GetNextSkipChildren: TDefineTemplate;
public
property ChildCount: integer read FChildCount;
property FirstChild: TDefineTemplate read FFirstChild;
@ -2755,6 +2757,25 @@ begin
WriteNode(Self,' ');
end;
function TDefineTemplate.GetNext: TDefineTemplate;
begin
if FirstChild<>nil then
exit(FirstChild);
Result:=GetNextSkipChildren;
end;
function TDefineTemplate.GetNextSkipChildren: TDefineTemplate;
begin
Result:=Self;
while (Result<>nil) do begin
if Result.Next<>nil then begin
Result:=Result.Next;
exit;
end;
Result:=Result.Parent;
end;
end;
function TDefineTemplate.HasDefines(OnlyMarked, WithSiblings: boolean): boolean;
var
CurTempl: TDefineTemplate;

View File

@ -43,9 +43,9 @@ uses
LazIDEIntf,
// IDE
LazarusIDEStrConsts, DialogProcs, IDEProcs, CodeToolsOptions, InputHistory,
ProjectResources, MiscOptions, LazConf, EnvironmentOpts, TransferMacros,
CompilerOptions, OutputFilter, Compiler, Project, BaseBuildManager,
ApplicationBundle;
EditDefineTree, ProjectResources, MiscOptions, LazConf, EnvironmentOpts,
TransferMacros, CompilerOptions, OutputFilter, Compiler, Project,
BaseBuildManager, ApplicationBundle;
type
@ -580,7 +580,7 @@ begin
UnitLinksValid:=false;
end;
FPCSrcTemplate:=CodeToolBoss.DefinePool.CreateFPCSrcTemplate(
FPCSrcTemplate:=CreateFPCSourceTemplate(
CodeToolBoss.GlobalValues.Variables[ExternalMacroStart+'FPCSrcDir'],
CompilerUnitSearchPath,
CodeToolBoss.GetCompiledSrcExtForDirectory(''),

View File

@ -50,7 +50,8 @@ uses
CodeToolManager, DefineTemplates,
IDEWindowIntf, IDEImagesIntf,
LazarusIDEStrConsts, CodeToolsOptions, CodeToolsDefPreview, TransferMacros,
EditorOptions, InputFileDialog, IDEOptionDefs, LazConf, IDEProcs;
EditorOptions, InputFileDialog, IDEOptionDefs, LazConf, IDEProcs,
EditDefineTree;
type
@ -626,7 +627,7 @@ begin
DebugLn(' FPCSrcDir="',FPCSrcDir,'"');
if (FPCSrcDir<>'') and (FPCSrcDir<>DefaultFPCSrcDir)
and (UnitSearchPath<>'') then
FPCSrcTemplate:=Boss.DefinePool.CreateFPCSrcTemplate(FPCSrcDir,
FPCSrcTemplate:=CreateFPCSourceTemplate(FPCSrcDir,
UnitSearchPath, 'ppu', TargetOS, TargetProcessor, false,
UnitLinkList, CodeToolsOpts)
else
@ -754,7 +755,7 @@ begin
FPCSrcDir:=FileNames[0];
if Macros<>nil then Macros.SubstituteStr(FPCSrcDir);
DebugLn(' FPCSrcDir="',FPCSrcDir,'"');
FPCSrcTemplate:=Boss.DefinePool.CreateFPCSrcTemplate(FPCSrcDir,
FPCSrcTemplate:=CreateFPCSourceTemplate(FPCSrcDir,
UnitSearchPath, 'ppu', TargetOS, TargetProcessor, false,
UnitLinks, CodeToolsOpts);
if FPCSrcTemplate=nil then begin
@ -798,7 +799,7 @@ begin
EndUpdate;
if ShowModal=mrCancel then exit;
LazTemplate:=Boss.DefinePool.CreateLazarusSrcTemplate(FileNames[0],
LazTemplate:=CreateLazarusSourceTemplate(FileNames[0],
'$('+ExternalMacroStart+'LCLWidgetType)','',
CodeToolsOpts);
if LazTemplate=nil then exit;

View File

@ -45,16 +45,18 @@ function FindRootTemplate(AName: string): TDefineTemplate;
procedure SetAdditionalGlobalSrcPathToCodeToolBoss(const SrcPath: string);
// global defaults
function FindNotUsedDirectoryTemplate: TDefineTemplate;
function CreateNotUsedDirectoryTemplate: TDefineTemplate;
function FindFallBackTemplate: TDefineTemplate;
function CreateFallBackTemplate: TDefineTemplate;
function FindUseDefaultsFlagTemplate: TDefineTemplate;
function CreateUseDefaultsFlagTemplate: TDefineTemplate;
procedure DisableDefaultsInDirectories(DefTempl: TDefineTemplate);
// FPC sources
function CreateFPCSourceTemplate(const FPCSrcDir, UnitSearchPath, PPUExt,
DefaultTargetOS, DefaultProcessorName: string;
UnitLinkListValid: boolean; var UnitLinkList: string;
Owner: TObject): TDefineTemplate;
function CreateLazarusSourceTemplate(
const LazarusSrcDir, WidgetType, ExtraOptions: string;
Owner: TObject): TDefineTemplate;
// projects
function FindProjectsTemplate: TDefineTemplate;
@ -79,8 +81,9 @@ function RemoveAutoGeneratedDefine(ParentTemplate: TDefineTemplate;
const
NotUsedDirectoryFlagTemplName = 'DirectoryNotUsed';
FallBackTemplName = 'FallBack';
UseDefaultsFlagTemplName = 'Use defaults';
UseDefaultsFlagName = ExternalMacroStart+'UseDefaults';
NotUseDefaultsFlagTemplName = 'Do not use defaults';
ProjectDefTemplName = 'Current Project';
ProjectDirDefTemplName = 'Current Project Directory';
@ -128,7 +131,15 @@ begin
UnitSearchPath, PPUExt,
DefaultTargetOS, DefaultProcessorName,
UnitLinkListValid, UnitLinkList, Owner);
DisableDefaultsInDirectories(Result);
end;
function CreateLazarusSourceTemplate(const LazarusSrcDir, WidgetType,
ExtraOptions: string; Owner: TObject): TDefineTemplate;
begin
Result:=CodeToolBoss.DefinePool.CreateLazarusSrcTemplate(LazarusSrcDir,
WidgetType, ExtraOptions, Owner);
DisableDefaultsInDirectories(Result);
end;
function FindProjectsTemplate: TDefineTemplate;
@ -150,14 +161,15 @@ end;
function CreateProjectsTemplate: TDefineTemplate;
begin
Result:=FindProjectsTemplate;
if Result<>nil then exit;
if Result<>nil then begin
CodeToolBoss.DefineTree.MoveToLast(Result);
exit;
end;
Result:=TDefineTemplate.Create(ProjectsDefTemplName, lisEdtDefsAllProjects,
'', '', da_Block);
Result.Flags:=[dtfAutoGenerated];
// insert behind all
CodeToolBoss.DefineTree.ReplaceRootSameName(Result);
// make sure the fallback comes last
CreateFallBackTemplate;
end;
function CreateProjectTemplateWithID(const ProjectID: string): TDefineTemplate;
@ -181,8 +193,8 @@ begin
Result.Flags:=[dtfAutoGenerated];
// insert behind all
CodeToolBoss.DefineTree.ReplaceRootSameName(Result);
// make sure the fallback comes last
CreateFallBackTemplate;
// move projects behind
CreateProjectsTemplate;
end;
function CreatePackageTemplateWithID(const PkgID: string): TDefineTemplate;
@ -430,43 +442,35 @@ begin
end;
end;
function FindNotUsedDirectoryTemplate: TDefineTemplate;
function FindUseDefaultsFlagTemplate: TDefineTemplate;
begin
Result:=FindRootTemplate(NotUsedDirectoryFlagTemplName);
Result:=FindRootTemplate(UseDefaultsFlagTemplName);
end;
function CreateNotUsedDirectoryTemplate: TDefineTemplate;
function CreateUseDefaultsFlagTemplate: TDefineTemplate;
begin
Result:=FindNotUsedDirectoryTemplate;
Result:=FindUseDefaultsFlagTemplate;
if Result<>nil then exit;
Result:=TDefineTemplate.Create(NotUsedDirectoryFlagTemplName, 'Not used directory flag',
'', '', da_DefineRecurse);
Result:=TDefineTemplate.Create(UseDefaultsFlagTemplName, 'Not used directory flag',
UseDefaultsFlagName, '1', da_DefineRecurse);
Result.Flags:=[dtfAutoGenerated];
// insert in front of all
CodeToolBoss.DefineTree.ReplaceRootSameNameAddFirst(Result);
end;
function FindFallBackTemplate: TDefineTemplate;
procedure DisableDefaultsInDirectories(DefTempl: TDefineTemplate);
// add to each directory a template to undefine the UseDefaults flag
begin
Result:=FindRootTemplate(FallBackTemplName);
end;
function CreateFallBackTemplate: TDefineTemplate;
begin
Result:=FindFallBackTemplate;
if Result<>nil then begin
// make sure it is at the end
if Result.Next<>nil then
CodeToolBoss.DefineTree.MoveToLast(Result);
exit;
while DefTempl<>nil do begin
if DefTempl.Action=da_Directory then begin
DefTempl.AddChild(TDefineTemplate.Create(NotUseDefaultsFlagTemplName,
NotUseDefaultsFlagTemplName,UseDefaultsFlagName,'',da_UndefineRecurse));
DefTempl:=DefTempl.GetNextSkipChildren;
end else begin
DefTempl:=DefTempl.GetNext;
end;
end;
Result:=TDefineTemplate.Create(FallBackTemplName, 'Definitions for all other directories',
'', '', da_Block);
Result.Flags:=[dtfAutoGenerated];
// insert behind all
CodeToolBoss.DefineTree.ReplaceRootSameName(Result);
end;
end.

View File

@ -13365,8 +13365,7 @@ begin
MainBuildBoss.GetFPCCompilerParamsForEnvironmentTest(
MainBuildBoss.CurDefinesCompilerOptions);
//DebugLn('TMainIDE.InitCodeToolBoss CurDefinesCompilerOptions="',CurDefinesCompilerOptions,'"');
CreateNotUsedDirectoryTemplate;
CreateFallBackTemplate;
CreateUseDefaultsFlagTemplate;
ADefTempl:=CreateFPCTemplate(MainBuildBoss.CurDefinesCompilerFilename,
MainBuildBoss.CurDefinesCompilerOptions,
@ -13410,7 +13409,7 @@ begin
// create compiler macros for the lazarus sources
SetupLazarusDirectory(InteractiveSetup);
ADefTempl:=CreateLazarusSrcTemplate(
ADefTempl:=CreateLazarusSourceTemplate(
'$('+ExternalMacroStart+'LazarusDir)',
'$('+ExternalMacroStart+'LCLWidgetType)',
MiscellaneousOptions.BuildLazOpts.ExtraOptions,CodeToolsOpts);

View File

@ -546,7 +546,7 @@ type
private
FActive: boolean;
FSrcDirectories: TDefineTemplate;
FSrcDirIfDef: TDefineTemplate;
FSrcDirIf: TDefineTemplate;
FFlags: TProjectDefineTemplatesFlags;
FMain: TDefineTemplate;
FOutputDir: TDefineTemplate;
@ -584,7 +584,7 @@ type
property SrcDirectories: TDefineTemplate read FSrcDirectories;
property OutputDir: TDefineTemplate read FOutputDir;
property OutPutSrcPath: TDefineTemplate read FOutPutSrcPath;
property CustomDefines: TDefineTemplate read FSrcDirIfDef;
property CustomDefines: TDefineTemplate read FSrcDirIf;
property Active: boolean read FActive write SetActive;
end;
@ -5628,7 +5628,7 @@ end;
procedure TProjectDefineTemplates.UpdateSrcDirIfDef;
var
NewValue: String;
NewVariable: String;
Changed: Boolean;
UnitPathDefTempl: TDefineTemplate;
IncPathDefTempl: TDefineTemplate;
@ -5645,36 +5645,45 @@ begin
da_Block);
FMain.AddChild(FSrcDirectories);
end;
if FSrcDirIfDef=nil then begin
FSrcDirIfDef:=TDefineTemplate.Create('Source Directory Additions',
'Additional defines for project source directories',
'#ProjectSrcMark'+Project.IDAsWord,'',
da_IfDef);
FMain.AddChild(FSrcDirIfDef);
if FSrcDirIf=nil then begin
if Project=nil then begin
// ToDo: main project
FSrcDirIf:=TDefineTemplate.Create('Source Directory Additions',
'Additional defines for project source directories and all directories using defaults',
'','$(#ProjectSrcMark'+Project.IDAsWord+')',
da_If);
end else begin
// secondary projects
FSrcDirIf:=TDefineTemplate.Create('Source Directory Additions',
'Additional defines for project source directories',
'#ProjectSrcMark'+Project.IDAsWord,'',
da_IfDef);
end;
FMain.AddChild(FSrcDirIf);
// create unit path template for this directory
UnitPathDefTempl:=TDefineTemplate.Create('UnitPath', lisPkgDefsUnitPath,
'#UnitPath','$(#UnitPath);$ProjectUnitPath('+Project.IDAsString+')',
da_Define);
FSrcDirIfDef.AddChild(UnitPathDefTempl);
FSrcDirIf.AddChild(UnitPathDefTempl);
// create include path template for this directory
IncPathDefTempl:=TDefineTemplate.Create('IncPath','Include Path',
'#IncPath','$(#IncPath);$ProjectIncPath('+Project.IDAsString+')',
da_Define);
FSrcDirIfDef.AddChild(IncPathDefTempl);
FSrcDirIf.AddChild(IncPathDefTempl);
// create src path template for this directory
SrcPathDefTempl:=TDefineTemplate.Create('SrcPath','Src Path',
'#SrcPath','$(#SrcPath);$ProjectSrcPath('+Project.IDAsString+')',
da_Define);
FSrcDirIfDef.AddChild(SrcPathDefTempl);
FSrcDirIf.AddChild(SrcPathDefTempl);
Changed:=true;
end else begin
NewValue:='#ProjectSrcMark'+Project.IDAsWord;
if FSrcDirIfDef.Value<>NewValue then begin
FSrcDirIfDef.Value:='#ProjectSrcMark'+Project.IDAsWord;
NewVariable:='#ProjectSrcMark'+Project.IDAsWord;
if FSrcDirIf.Variable<>NewVariable then begin
FSrcDirIf.Variable:=NewVariable;
Changed:=true;
end;
end;
@ -5695,6 +5704,7 @@ begin
);
FOutputDir.SetDefineOwner(Project,false);
FOutputDir.SetFlags([dtfAutoGenerated],[],false);
DisableDefaultsInDirectories(FOutputDir);
FMain.AddChild(FOutputDir);
end else begin
FOutputDir.Value:=Project.GetOutputDirectory;
@ -5772,17 +5782,18 @@ begin
// build source directory define templates
fLastSourceDirectories.Assign(NewSourceDirs);
if (FSrcDirIfDef=nil) and (fLastSourceDirectories.Count>0) then
if (FSrcDirIf=nil) and (fLastSourceDirectories.Count>0) then
UpdateSrcDirIfDef;
for i:=0 to fLastSourceDirectories.Count-1 do begin
// create directory template
SrcDirDefTempl:=TDefineTemplate.Create('Source Directory '+IntToStr(i+1),
fLastSourceDirectories[i],'',fLastSourceDirectories[i],da_Directory);
DisableDefaultsInDirectories(SrcDirDefTempl);
fLastSourceDirectories.Objects[i]:=SrcDirDefTempl;
// add project source directory marker
SrcDirMarkDefTempl:=TDefineTemplate.Create('ProjectSrcDirMark',
lisProjProjectSourceDirectoryMark, '#ProjectSrcMark'+Project.IDAsWord,
'',
'1',
da_Define);
SrcDirDefTempl.AddChild(SrcDirMarkDefTempl);
@ -5816,13 +5827,13 @@ begin
'Custom Options',FLastCustomOptions,false,Project);
if OptionsDefTempl=nil then begin
// no custom options -> delete old template
if FSrcDirIfDef<>nil then begin
if FSrcDirIfDef.DeleteChild('Custom Options') then
if FSrcDirIf<>nil then begin
if FSrcDirIf.DeleteChild('Custom Options') then
Changed:=true;
end;
end else begin
UpdateSrcDirIfDef;
FSrcDirIfDef.ReplaceChild(OptionsDefTempl);
FSrcDirIf.ReplaceChild(OptionsDefTempl);
Changed:=true;
end;
if Changed then
@ -5848,7 +5859,7 @@ begin
if (CodeToolBoss<>nil) then
CodeToolBoss.DefineTree.RemoveDefineTemplate(FMain);
FMain:=nil;
FSrcDirIfDef:=nil;
FSrcDirIf:=nil;
FSrcDirectories:=nil;
FOutPutSrcPath:=nil;
FOutputDir:=nil;

View File

@ -3983,6 +3983,7 @@ begin
);
FOutputDir.SetDefineOwner(LazPackage,false);
FOutputDir.SetFlags([dtfAutoGenerated],[],false);
DisableDefaultsInDirectories(FOutputDir);
FMain.AddChild(FOutputDir);
end else begin
FOutputDir.Value:=LazPackage.GetOutputDirectory;
@ -4065,6 +4066,7 @@ begin
// create directory template
SrcDirDefTempl:=TDefineTemplate.Create('Source Directory '+IntToStr(i+1),
fLastSourceDirectories[i],'',fLastSourceDirectories[i],da_Directory);
DisableDefaultsInDirectories(SrcDirDefTempl);
fLastSourceDirectories.Objects[i]:=SrcDirDefTempl;
// add package source directory marker
SrcDirMarkDefTempl:=TDefineTemplate.Create('PkgSrcDirMark',