IDE: move/copy multiple files via dnd from package editors/project inspector

git-svn-id: trunk@45977 -
This commit is contained in:
mattias 2014-07-25 18:13:56 +00:00
parent bb6f12fb49
commit b3807641a3
4 changed files with 96 additions and 23 deletions

View File

@ -183,12 +183,13 @@ type
TPkgOpenFlags = set of TPkgOpenFlag; TPkgOpenFlags = set of TPkgOpenFlag;
TPkgCompileFlag = ( TPkgCompileFlag = (
pcfOnlyIfNeeded,
pcfCleanCompile, // append -B to the compiler options pcfCleanCompile, // append -B to the compiler options
pcfGroupCompile,
pcfDoNotCompileDependencies, pcfDoNotCompileDependencies,
pcfDoNotCompilePackage, pcfDoNotCompilePackage,
pcfCompileDependenciesClean, pcfCompileDependenciesClean,
pcfSkipDesignTimePackages, pcfSkipDesignTimePackages,
pcfOnlyIfNeeded,
pcfDoNotSaveEditorFiles, pcfDoNotSaveEditorFiles,
pcfCreateMakefile, pcfCreateMakefile,
pcfCreateFpmakeFile pcfCreateFpmakeFile

View File

@ -263,6 +263,7 @@ begin
end end
else if Item.Target is TLazPackage then begin else if Item.Target is TLazPackage then begin
Pkg:=TLazPackage(Item.Target); Pkg:=TLazPackage(Item.Target);
Pkg.Flags:=Pkg.Flags-[lpfNeedGroupCompile];
Item.Caption:=Pkg.IDAsString; Item.Caption:=Pkg.IDAsString;
Item.Filename:=Pkg.Filename; Item.Filename:=Pkg.Filename;
end; end;
@ -303,8 +304,10 @@ begin
Pkg:=TLazPackage(Item.Target); Pkg:=TLazPackage(Item.Target);
Item.Note:=''; Item.Note:='';
NeedBuild:=PackageGraph.CheckIfPackageNeedsCompilation( NeedBuild:=PackageGraph.CheckIfPackageNeedsCompilation(
Pkg,SkipDesignTimePackages,NeedBuildAll,Item.Note); Pkg,SkipDesignTimePackages,true,NeedBuildAll,Item.Note);
if NeedBuild=mrYes then begin if NeedBuild=mrYes then begin
debugln(['TIDEInfoNeedBuildDlg.CheckNeedBuild ',Pkg.Name]);
PackageGraph.SetFlagDependenciesNeedBuild(Pkg);
if NeedBuildAll then if NeedBuildAll then
Item.NeedBuild:=inbClean Item.NeedBuild:=inbClean
else else

View File

@ -463,7 +463,8 @@ type
lpfDestroying, // set during destruction lpfDestroying, // set during destruction
lpfLoading, // set during loading lpfLoading, // set during loading
lpfSkipSaving, // Used by PkgBoss to skip saving lpfSkipSaving, // Used by PkgBoss to skip saving
lpfCycle // Used by the PackageGraph to mark cycles lpfCycle, // Used by the PackageGraph to mark cycles
lpfNeedGroupCompile // set during group compile, dependent packages need compile too
); );
TLazPackageFlags = set of TLazPackageFlag; TLazPackageFlags = set of TLazPackageFlag;

View File

@ -48,7 +48,7 @@ uses
Classes, SysUtils, FileProcs, FileUtil, LCLProc, Forms, Controls, Dialogs, Classes, SysUtils, FileProcs, FileUtil, LCLProc, Forms, Controls, Dialogs,
Laz2_XMLCfg, LazLogger, LazFileUtils, InterfaceBase, LazUTF8, Laz2_XMLCfg, LazLogger, LazFileUtils, InterfaceBase, LazUTF8,
// codetools // codetools
AVL_Tree, DefineTemplates, CodeCache, AVL_Tree, contnrs, DefineTemplates, CodeCache,
BasicCodeTools, CodeToolsStructs, NonPascalCodeTools, SourceChanger, BasicCodeTools, CodeToolsStructs, NonPascalCodeTools, SourceChanger,
CodeToolManager, DirectoryCacher, CodeToolManager, DirectoryCacher,
// IDEIntf, // IDEIntf,
@ -184,7 +184,7 @@ type
Verbose: boolean): boolean; Verbose: boolean): boolean;
function GetPackageCompilerParams(APackage: TLazPackage): string; function GetPackageCompilerParams(APackage: TLazPackage): string;
function CheckIfCurPkgOutDirNeedsCompile(APackage: TLazPackage; function CheckIfCurPkgOutDirNeedsCompile(APackage: TLazPackage;
CheckDependencies, SkipDesignTimePackages: boolean; CheckDependencies, SkipDesignTimePackages, GroupCompile: boolean;
out NeedBuildAllFlag, ConfigChanged, DependenciesChanged: boolean; out NeedBuildAllFlag, ConfigChanged, DependenciesChanged: boolean;
var Note: string): TModalResult; var Note: string): TModalResult;
procedure InvalidateStateFile(APackage: TLazPackage); procedure InvalidateStateFile(APackage: TLazPackage);
@ -323,6 +323,7 @@ type
Complete, MainPPUExists, ShowAbort: boolean): TModalResult; Complete, MainPPUExists, ShowAbort: boolean): TModalResult;
function LoadPackageCompiledState(APackage: TLazPackage; function LoadPackageCompiledState(APackage: TLazPackage;
IgnoreErrors, ShowAbort: boolean): TModalResult; IgnoreErrors, ShowAbort: boolean): TModalResult;
procedure SetFlagDependenciesNeedBuild(Pkg: TLazPackage);
function CheckCompileNeedDueToFPCUnits(TheOwner: TObject; function CheckCompileNeedDueToFPCUnits(TheOwner: TObject;
StateFileAge: longint; var Note: string): boolean; StateFileAge: longint; var Note: string): boolean;
function CheckCompileNeedDueToDependencies(TheOwner: TObject; function CheckCompileNeedDueToDependencies(TheOwner: TObject;
@ -330,7 +331,7 @@ type
SkipDesignTimePackages: boolean; StateFileAge: longint; SkipDesignTimePackages: boolean; StateFileAge: longint;
var Note: string): TModalResult; var Note: string): TModalResult;
function CheckIfPackageNeedsCompilation(APackage: TLazPackage; function CheckIfPackageNeedsCompilation(APackage: TLazPackage;
SkipDesignTimePackages: boolean; SkipDesignTimePackages, GroupCompile: boolean;
out NeedBuildAllFlag: boolean; var Note: string): TModalResult; out NeedBuildAllFlag: boolean; var Note: string): TModalResult;
function PreparePackageOutputDirectory(APackage: TLazPackage; function PreparePackageOutputDirectory(APackage: TLazPackage;
CleanUp: boolean): TModalResult; CleanUp: boolean): TModalResult;
@ -664,6 +665,7 @@ end;
function TLazPkgGraphBuildItem.Add(Tool: TAbstractExternalTool): integer; function TLazPkgGraphBuildItem.Add(Tool: TAbstractExternalTool): integer;
begin begin
if Tool=nil then exit;
Tool.Reference(Self,'TLazPkgGraphBuildItem.Add'); Tool.Reference(Self,'TLazPkgGraphBuildItem.Add');
if Tool.Data is TLazPkgGraphExtToolData then if Tool.Data is TLazPkgGraphExtToolData then
TLazPkgGraphExtToolData(Tool.Data).BuildItem:=Self; TLazPkgGraphExtToolData(Tool.Data).BuildItem:=Self;
@ -3124,8 +3126,8 @@ begin
end; end;
function TLazPackageGraph.CheckIfPackageNeedsCompilation(APackage: TLazPackage; function TLazPackageGraph.CheckIfPackageNeedsCompilation(APackage: TLazPackage;
SkipDesignTimePackages: boolean; out NeedBuildAllFlag: boolean; var SkipDesignTimePackages, GroupCompile: boolean; out NeedBuildAllFlag: boolean;
Note: string): TModalResult; var Note: string): TModalResult;
var var
OutputDir: String; OutputDir: String;
NewOutputDir: String; NewOutputDir: String;
@ -3146,7 +3148,7 @@ begin
// check the current output directory // check the current output directory
Result:=CheckIfCurPkgOutDirNeedsCompile(APackage, Result:=CheckIfCurPkgOutDirNeedsCompile(APackage,
true,SkipDesignTimePackages, true,SkipDesignTimePackages,GroupCompile,
NeedBuildAllFlag,ConfigChanged,DependenciesChanged,Note); NeedBuildAllFlag,ConfigChanged,DependenciesChanged,Note);
if Result=mrNo then begin if Result=mrNo then begin
// the current output is valid // the current output is valid
@ -3174,7 +3176,7 @@ begin
Note+='Normal output directory is not writable, switching to fallback.'+LineEnding; Note+='Normal output directory is not writable, switching to fallback.'+LineEnding;
APackage.CompilerOptions.ParsedOpts.OutputDirectoryOverride:=NewOutputDir; APackage.CompilerOptions.ParsedOpts.OutputDirectoryOverride:=NewOutputDir;
Result:=CheckIfCurPkgOutDirNeedsCompile(APackage, Result:=CheckIfCurPkgOutDirNeedsCompile(APackage,
true,SkipDesignTimePackages, true,SkipDesignTimePackages,GroupCompile,
NeedBuildAllFlag,ConfigChanged,DependenciesChanged,Note); NeedBuildAllFlag,ConfigChanged,DependenciesChanged,Note);
end else begin end else begin
// the last compile was put to the fallback output directory // the last compile was put to the fallback output directory
@ -3195,7 +3197,7 @@ begin
APackage.CompilerOptions.ParsedOpts.OutputDirectoryOverride:=''; APackage.CompilerOptions.ParsedOpts.OutputDirectoryOverride:='';
OldNeedBuildAllFlag:=NeedBuildAllFlag; OldNeedBuildAllFlag:=NeedBuildAllFlag;
DefResult:=CheckIfCurPkgOutDirNeedsCompile(APackage, DefResult:=CheckIfCurPkgOutDirNeedsCompile(APackage,
true,SkipDesignTimePackages, true,SkipDesignTimePackages,GroupCompile,
NeedBuildAllFlag,ConfigChanged,DependenciesChanged,Note); NeedBuildAllFlag,ConfigChanged,DependenciesChanged,Note);
if DefResult=mrNo then begin if DefResult=mrNo then begin
// switching back to the not writable output directory requires no compile // switching back to the not writable output directory requires no compile
@ -3211,9 +3213,9 @@ begin
end; end;
function TLazPackageGraph.CheckIfCurPkgOutDirNeedsCompile( function TLazPackageGraph.CheckIfCurPkgOutDirNeedsCompile(
APackage: TLazPackage; CheckDependencies, SkipDesignTimePackages: boolean; APackage: TLazPackage; CheckDependencies, SkipDesignTimePackages,
out NeedBuildAllFlag, ConfigChanged, DependenciesChanged: boolean; GroupCompile: boolean; out NeedBuildAllFlag, ConfigChanged,
var Note: string): TModalResult; DependenciesChanged: boolean; var Note: string): TModalResult;
// returns: mrYes, mrNo, mrCancel, mrAbort // returns: mrYes, mrNo, mrCancel, mrAbort
var var
StateFilename: String; StateFilename: String;
@ -3278,6 +3280,13 @@ begin
ConfigChanged:=true; ConfigChanged:=true;
end; end;
if GroupCompile and (lpfNeedGroupCompile in APackage.Flags) then begin
debugln(['TLazPackageGraph.CheckIfCurPkgOutDirNeedsCompile dependencies will be rebuilt']);
Note:='Dependencies will be rebuilt';
DependenciesChanged:=true;
exit(mrYes);
end;
StateFileAge:=FileAgeUTF8(StateFilename); StateFileAge:=FileAgeUTF8(StateFilename);
// check compiler and params // check compiler and params
@ -3439,7 +3448,7 @@ begin
Note); Note);
if Result<>mrNo then begin if Result<>mrNo then begin
DependenciesChanged:=true; DependenciesChanged:=true;
exit; exit(mrYes);
end; end;
end; end;
@ -3502,6 +3511,13 @@ var
Flags: TPkgCompileFlags; Flags: TPkgCompileFlags;
ReqFlags: TPkgIntfRequiredFlags; ReqFlags: TPkgIntfRequiredFlags;
CurPkg: TLazPackage; CurPkg: TLazPackage;
BuildItems: TObjectList;
{$IFDEF EnableGroupCompile}
BuildItem: TLazPkgGraphBuildItem;
j: Integer;
Tool: TAbstractExternalTool;
ToolData: TLazPkgGraphExtToolData;
{$ENDIF}
begin begin
{$IFDEF VerbosePkgCompile} {$IFDEF VerbosePkgCompile}
debugln('TLazPackageGraph.CompileRequiredPackages A MinPolicy=',dbgs(Policy),' SkipDesignTimePackages=',SkipDesignTimePackages); debugln('TLazPackageGraph.CompileRequiredPackages A MinPolicy=',dbgs(Policy),' SkipDesignTimePackages=',SkipDesignTimePackages);
@ -3512,32 +3528,61 @@ begin
GetAllRequiredPackages(APackage,FirstDependency,PkgList,ReqFlags,Policy); GetAllRequiredPackages(APackage,FirstDependency,PkgList,ReqFlags,Policy);
if PkgList<>nil then begin if PkgList<>nil then begin
//DebugLn('TLazPackageGraph.CompileRequiredPackages B Count=',IntToStr(PkgList.Count)); //DebugLn('TLazPackageGraph.CompileRequiredPackages B Count=',IntToStr(PkgList.Count));
BuildItems:=nil;
BeginUpdate(false); BeginUpdate(false);
try try
Flags:=[pcfDoNotCompileDependencies,pcfDoNotSaveEditorFiles];
for i:=PkgList.Count-1 downto 0 do begin for i:=PkgList.Count-1 downto 0 do begin
CurPkg:=TLazPackage(PkgList[i]); CurPkg:=TLazPackage(PkgList[i]);
if SkipDesignTimePackages and (CurPkg.PackageType=lptDesignTime) then if SkipDesignTimePackages and (CurPkg.PackageType=lptDesignTime) then
PkgList.Delete(i); PkgList.Delete(i);
CurPkg.Flags:=CurPkg.Flags+[lpfNeedGroupCompile];
end; end;
if Assigned(OnBeforeCompilePackages) then if Assigned(OnBeforeCompilePackages) then
begin begin
Result:=OnBeforeCompilePackages(PkgList); Result:=OnBeforeCompilePackages(PkgList);
if Result<>mrOk then exit; if Result<>mrOk then exit;
end; end;
// prepare output directories, basic checks
Flags:=[pcfDoNotCompileDependencies,pcfDoNotSaveEditorFiles,pcfGroupCompile];
if SkipDesignTimePackages then
Include(Flags,pcfSkipDesignTimePackages);
if Policy=pupAsNeeded then if Policy=pupAsNeeded then
Include(Flags,pcfOnlyIfNeeded) Include(Flags,pcfOnlyIfNeeded)
else else
Include(Flags,pcfCleanCompile); Include(Flags,pcfCleanCompile);
if SkipDesignTimePackages then BuildItems:=TObjectList.Create(true);
Include(Flags,pcfSkipDesignTimePackages); for i:=0 to PkgList.Count-1 do begin
i:=0; CurPkg:=TLazPackage(PkgList[i]);
while i<PkgList.Count do begin {$IFDEF EnableGroupCompile}
Result:=CompilePackage(TLazPackage(PkgList[i]),Flags,false); BuildItem:=TLazPkgGraphBuildItem.Create(nil);
BuildItems.Add(BuildItem);
{$ELSE}
BuildItem:=nil;
{$ENDIF}
Result:=CompilePackage(CurPkg,Flags,false,BuildItem);
if Result<>mrOk then exit; if Result<>mrOk then exit;
inc(i); end;
// execute
for i:=0 to BuildItems.Count-1 do begin
BuildItem:=TLazPkgGraphBuildItem(BuildItems[i]);
for j:=0 to BuildItem.Count-1 do begin
Tool:=BuildItem[j];
debugln(['TLazPackageGraph.CompileRequiredPackages ',Tool.Title]);
if Tool.Data is TLazPkgGraphExtToolData then
ToolData:=TLazPkgGraphExtToolData(Tool.Data)
else
ToolData:=nil;
Tool.Execute;
Tool.WaitForExit;
if (Tool.ErrorMessage<>'') or ((ToolData<>nil) and (ToolData.ErrorMessage<>''))
then
exit(mrCancel);
end;
end; end;
finally finally
FreeAndNil(BuildItems);
FreeAndNil(PkgList); FreeAndNil(PkgList);
EndUpdate; EndUpdate;
end; end;
@ -3548,6 +3593,24 @@ begin
Result:=mrOk; Result:=mrOk;
end; end;
procedure TLazPackageGraph.SetFlagDependenciesNeedBuild(Pkg: TLazPackage);
// set flag lpfNeedGroupCompile in all dependent packages
var
ADependency: TPkgDependency;
begin
if Pkg=nil then exit;
if lpfNeedGroupCompile in Pkg.Flags then exit;
debugln(['TLazPackageGraph.SetFlagDependenciesNeedBuild START=',Pkg.Name]);
Pkg.Flags:=Pkg.Flags+[lpfNeedGroupCompile];
ADependency:=Pkg.FirstUsedByDependency;
while ADependency<>nil do begin
debugln(['TLazPackageGraph.SetFlagDependenciesNeedBuild UsedBy=',ADependency.RequiredPackage<>nil]);
SetFlagDependenciesNeedBuild(ADependency.RequiredPackage);
ADependency:=ADependency.NextUsedByDependency;
end;
debugln(['TLazPackageGraph.SetFlagDependenciesNeedBuild END=',Pkg.Name]);
end;
function TLazPackageGraph.CompilePackage(APackage: TLazPackage; function TLazPackageGraph.CompilePackage(APackage: TLazPackage;
Flags: TPkgCompileFlags; ShowAbort: boolean; BuildItem: TLazPkgGraphBuildItem Flags: TPkgCompileFlags; ShowAbort: boolean; BuildItem: TLazPkgGraphBuildItem
): TModalResult; ): TModalResult;
@ -3606,6 +3669,7 @@ begin
Note:=''; Note:='';
Result:=CheckIfPackageNeedsCompilation(APackage, Result:=CheckIfPackageNeedsCompilation(APackage,
pcfSkipDesignTimePackages in Flags, pcfSkipDesignTimePackages in Flags,
pcfGroupCompile in Flags,
NeedBuildAllFlag,Note); NeedBuildAllFlag,Note);
if Note<>'' then if Note<>'' then
Note:='Compile reason: '+Note; Note:='Compile reason: '+Note;
@ -3622,8 +3686,12 @@ begin
end; end;
try try
if (LazarusIDE<>nil) then if (BuildItem=nil) and (LazarusIDE<>nil) then
LazarusIDE.MainBarSubTitle:=APackage.Name; LazarusIDE.MainBarSubTitle:=APackage.Name;
if pcfGroupCompile in Flags then
SetFlagDependenciesNeedBuild(APackage);
// auto increase version // auto increase version
// ToDo // ToDo