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;
TPkgCompileFlag = (
pcfOnlyIfNeeded,
pcfCleanCompile, // append -B to the compiler options
pcfGroupCompile,
pcfDoNotCompileDependencies,
pcfDoNotCompilePackage,
pcfCompileDependenciesClean,
pcfSkipDesignTimePackages,
pcfOnlyIfNeeded,
pcfDoNotSaveEditorFiles,
pcfCreateMakefile,
pcfCreateFpmakeFile

View File

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

View File

@ -463,7 +463,8 @@ type
lpfDestroying, // set during destruction
lpfLoading, // set during loading
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;

View File

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