diff --git a/components/codetools/definetemplates.pas b/components/codetools/definetemplates.pas index eec33a9402..f39cecefa5 100644 --- a/components/codetools/definetemplates.pas +++ b/components/codetools/definetemplates.pas @@ -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; diff --git a/ide/buildmanager.pas b/ide/buildmanager.pas index 8213501686..824762b1bf 100644 --- a/ide/buildmanager.pas +++ b/ide/buildmanager.pas @@ -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(''), diff --git a/ide/codetoolsdefines.pas b/ide/codetoolsdefines.pas index 111bab6acf..f2c2e363a1 100644 --- a/ide/codetoolsdefines.pas +++ b/ide/codetoolsdefines.pas @@ -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; diff --git a/ide/editdefinetree.pas b/ide/editdefinetree.pas index 50a942abd4..045439b109 100644 --- a/ide/editdefinetree.pas +++ b/ide/editdefinetree.pas @@ -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. diff --git a/ide/main.pp b/ide/main.pp index 95fa94731d..88cc64a2ed 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -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); diff --git a/ide/project.pp b/ide/project.pp index dbf5ee91cf..b0635d4e4b 100644 --- a/ide/project.pp +++ b/ide/project.pp @@ -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; diff --git a/packager/packagedefs.pas b/packager/packagedefs.pas index e6230b10c0..e9e4c73f09 100644 --- a/packager/packagedefs.pas +++ b/packager/packagedefs.pas @@ -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',