47
47
TypInfo, Classes, SysUtils, LCLProc, Forms, Controls, Dialogs, Menus,
48
InterfaceBase, StringHashList, Translations, LResources,
48
contnrs, StringHashList, Translations, LResources,
50
CodeToolsCfgScript, CodeToolsConfig, CodeToolManager, CodeCache,
51
BasicCodeTools, FileProcs, Laz_XMLCfg,
50
CodeToolsConfig, CodeToolManager, CodeCache, CodeToolsStructs, BasicCodeTools,
51
FileProcs, Laz2_XMLCfg, lazutf8classes,
53
SrcEditorIntf, NewItemIntf, ProjectIntf, PackageIntf,
53
SrcEditorIntf, NewItemIntf, ProjectIntf, PackageIntf, CompOptsIntf,
54
54
MenuIntf, IDEWindowIntf, PropEdits, MacroIntf, LazIDEIntf,
56
LazConf, LazarusIDEStrConsts, IDEProcs, ObjectLists, DialogProcs, IDECommands,
56
LazarusIDEStrConsts, IDEProcs, ObjectLists, DialogProcs, IDECommands,
57
57
IDEOptionDefs, EnvironmentOpts, MiscOptions, InputHistory,
58
58
Project, ComponentReg, UComponentManMain, PackageEditor, AddToPackageDlg,
59
59
PackageDefs, PackageLinks, PackageSystem, OpenInstalledPkgDlg,
61
61
IDETranslations, TransferMacros, BuildLazDialog, NewDialog,
62
62
IDEDialogs, ProjectInspector, ComponentPalette, SourceEditor,
63
63
AddFileToAPackageDlg, LazarusPackageIntf, PublishProjectDlg, PkgLinksDlg,
64
InstallPkgSetDlg, ConfirmPkgListDlg,
64
InstallPkgSetDlg, ConfirmPkgListDlg, NewPkgComponentDlg,
66
BaseBuildManager, BasePkgManager,
67
MainBar, MainIntf, MainBase;
66
BaseBuildManager, BasePkgManager, MainBar, MainIntf, MainBase;
72
71
TPkgManager = class(TBasePkgManager)
73
72
// events - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
74
function OnPackageEditorAddToProject(Sender: TObject; APackage: TLazPackage;
75
OnlyTestIfPossible: boolean): TModalResult;
75
76
function OnPackageEditorCompilePackage(Sender: TObject;
76
77
APackage: TLazPackage;
77
78
CompileClean, CompileRequired: boolean): TModalResult;
78
function OnPackageEditorCreateMakefile(Sender: TObject;
79
APackage: TLazPackage): TModalResult;
80
79
function OnPackageEditorCreateFile(Sender: TObject;
81
80
Params: TAddToPkgResult): TModalResult;
81
function OnPackageEditorCreateMakefile(Sender: TObject;
82
APackage: TLazPackage): TModalResult;
82
83
function OnPackageEditorDeleteAmbiguousFiles(Sender: TObject;
83
84
APackage: TLazPackage; const Filename: string): TModalResult;
84
function OnPackageEditorAddToProject(Sender: TObject; APackage: TLazPackage;
85
OnlyTestIfPossible: boolean): TModalResult;
86
85
function OnPackageEditorInstallPackage(Sender: TObject;
87
86
APackage: TLazPackage): TModalResult;
87
function OnPackageEditorOpenPackage(Sender: TObject; APackage: TLazPackage
89
function OnPackageEditorOpenPkgFile(Sender: TObject; PkgFile: TPkgFile
88
91
function OnPackageEditorPublishPackage(Sender: TObject;
89
92
APackage: TLazPackage): TModalResult;
90
93
function OnPackageEditorRevertPackage(Sender: TObject; APackage: TLazPackage
92
function OnPackageEditorUninstallPackage(Sender: TObject;
93
APackage: TLazPackage): TModalResult;
94
function OnPackageEditorOpenPkgFile(Sender: TObject; PkgFile: TPkgFile
96
function OnPackageEditorOpenPackage(Sender: TObject; APackage: TLazPackage
98
95
function OnPackageEditorSavePackage(Sender: TObject; APackage: TLazPackage;
99
96
SaveAs: boolean): TModalResult;
97
function OnPackageEditorUninstallPackage(Sender: TObject;
98
APackage: TLazPackage): TModalResult;
100
99
function OnPackageEditorViewPkgSource(Sender: TObject;
101
100
APackage: TLazPackage): TModalResult;
101
procedure OnAfterWritePackage(Sender: TObject; Restore: boolean);
102
procedure OnBeforeReadPackage(Sender: TObject);
102
103
procedure OnPackageEditorFreeEditor(APackage: TLazPackage);
103
104
procedure OnPackageEditorGetUnitRegisterInfo(Sender: TObject;
104
105
const AFilename: string; var TheUnitName: string;
154
156
out Description: string);
155
157
procedure GetDependencyOwnerDirectory(Dependency: TPkgDependency;
156
158
out Directory: string);
157
procedure GetWritablePkgOutputDirectory(APackage: TLazPackage;
158
var AnOutDirectory: string);
159
159
procedure PackageFileLoaded(Sender: TObject);
160
procedure OnCheckInstallPackageList(PkgIDList: TFPList; out Ok: boolean);
161
function LoadDependencyList(FirstDependency: TPkgDependency): TModalResult;
160
procedure OnCheckInstallPackageList(PkgIDList: TObjectList;
161
RemoveConflicts: boolean; out Ok: boolean);
162
function LoadDependencyList(FirstDependency: TPkgDependency;
163
Quiet: boolean): TModalResult;
162
164
procedure CreateIDEWindow(Sender: TObject; aFormName: string;
163
165
var AForm: TCustomForm; DoDisableAutoSizing: boolean);
213
215
function GetSourceFilesOfOwners(OwnerList: TFPList): TStrings; override;
214
216
function GetPossibleOwnersOfUnit(const UnitFilename: string;
215
217
Flags: TPkgIntfOwnerSearchFlags): TFPList; override;
216
function GetPackageOfCurrentSourceEditor: TPkgFile;
217
function AddDependencyToOwners(OwnerList: TFPList; APackage: TLazPackage;
218
function GetPackageOfCurrentSourceEditor(out APackage: TIDEPackage): TPkgFile;
219
function GetPackageOfSourceEditor(out APackage: TIDEPackage; ASrcEdit: TObject): TLazPackageFile; override;
220
function IsOwnerDependingOnPkg(AnOwner: TObject; const PkgName: string;
221
out DependencyOwner: TObject): boolean; override;
222
function AddDependencyToOwners(OwnerList: TFPList; APackage: TIDEPackage;
218
223
OnlyTestIfPossible: boolean = false): TModalResult; override;
219
224
function DoOpenPkgFile(PkgFile: TPkgFile): TModalResult;
220
225
function FindVirtualUnitSource(PkgFile: TPkgFile): string;
282
286
function DoClosePackageEditor(APackage: TLazPackage): TModalResult; override;
283
287
function DoCloseAllPackageEditors: TModalResult; override;
284
288
function DoAddActiveUnitToAPackage: TModalResult;
289
function DoNewPackageComponent: TModalResult;
290
function SavePackageFiles(APackage: TLazPackage): TModalResult;
285
291
function WarnAboutMissingPackageFiles(APackage: TLazPackage): TModalResult;
286
292
function AddPackageDependency(APackage: TLazPackage; const ReqPackage: string;
287
293
OnlyTestIfPossible: boolean = false): TModalResult; override;
288
294
function GetPackageOfEditorItem(Sender: TObject): TIDEPackage; override;
291
296
// package compilation
292
297
function DoCompileProjectDependencies(AProject: TProject;
293
298
Flags: TPkgCompileFlags): TModalResult; override;
294
299
function DoCompilePackage(APackage: TLazPackage; Flags: TPkgCompileFlags;
296
Globals: TGlobalCompilerOptions = nil): TModalResult; override;
300
ShowAbort: boolean): TModalResult; override;
297
301
function DoCreatePackageMakefile(APackage: TLazPackage;
298
302
ShowAbort: boolean): TModalResult;
304
308
function DoInstallPackage(APackage: TLazPackage): TModalResult;
305
309
function DoUninstallPackage(APackage: TLazPackage;
306
310
Flags: TPkgUninstallFlags; ShowAbort: boolean): TModalResult;
307
function DoInstallPackages(PkgIdList: TFPList; AddExisting, RebuildIDE, Quiet: boolean;
308
CheckList: boolean = true): TModalResult;
311
function CheckInstallPackageList(PkgIDList: TObjectList;
312
Flags: TPkgInstallInIDEFlags = []
313
): boolean; override;
314
function InstallPackages(PkgIdList: TObjectList;
315
Flags: TPkgInstallInIDEFlags = []): TModalResult; override;
309
316
procedure DoTranslatePackage(APackage: TLazPackage);
310
317
function DoOpenPackageSource(APackage: TLazPackage): TModalResult;
311
318
function DoCompileAutoInstallPackages(Flags: TPkgCompileFlags;
470
480
GetDirectoryOfDependencyOwner(Dependency,Directory);
473
procedure TPkgManager.GetWritablePkgOutputDirectory(APackage: TLazPackage;
474
var AnOutDirectory: string);
478
if DirectoryIsWritableCached(AnOutDirectory) then exit;
480
ForceDirectory(AnOutDirectory);
481
InvalidateFileStateCache;
482
if DirectoryIsWritableCached(AnOutDirectory) then exit;
483
//debugln('TPkgManager.GetWritablePkgOutputDirectory AnOutDirectory=',AnOutDirectory,' ',dbgs(DirectoryIsWritable(AnOutDirectory)));
485
// output directory is not writable
486
// -> redirect to config directory
487
NewOutDir:=SetDirSeparators('/$(TargetCPU)-$(TargetOS)');
488
IDEMacros.SubstituteMacros(NewOutDir);
489
NewOutDir:=TrimFilename(GetPrimaryConfigPath+PathDelim+'lib'+PathDelim
490
+APackage.Name+NewOutDir);
491
AnOutDirectory:=NewOutDir;
492
debugln('TPkgManager.GetWritablePkgOutputDirectory APackage=',APackage.IDAsString,' AnOutDirectory="',AnOutDirectory,'"');
495
483
procedure TPkgManager.PackageFileLoaded(Sender: TObject);
497
485
DoCallNotifyHandler(pihtPackageFileLoaded,Sender);
500
procedure TPkgManager.OnCheckInstallPackageList(PkgIDList: TFPList;
503
NewFirstAutoInstallDependency: TPkgDependency;
506
APackage: TLazPackage;
507
CurResult: TModalResult;
488
procedure TPkgManager.OnCheckInstallPackageList(PkgIDList: TObjectList;
489
RemoveConflicts: boolean; out Ok: boolean);
512
// create new auto install dependency PkgIDList
513
ListPkgIDToDependencyList(PkgIDList,NewFirstAutoInstallDependency,
514
pdlRequires,Self,true);
516
// get all required packages
517
if LoadDependencyList(NewFirstAutoInstallDependency)<>mrOk then exit;
518
PackageGraph.GetAllRequiredPackages(NewFirstAutoInstallDependency,PkgList);
520
// check if any package is a runtime package, that is not needed
521
for i:=0 to PkgList.Count-1 do begin
522
APackage:=TLazPackage(PkgList[i]);
523
if (APackage.PackageType=lptRunTime)
524
and (APackage.FirstUsedByDependency=nil) then begin
525
// this is a runtime only package, not needed by any other package
526
CurResult:=IDEQuestionDialog(lisPkgMangPackageIsNoDesigntimePackage,
527
Format(lisPkgMangThePackageIsARuntimeOnlyPackageRuntimeOnlyPackages, [
528
APackage.IDAsString, #13]),
529
mtWarning, [mrIgnore, mrYesToAll, lisIgnoreAll, mrCancel]);
538
// try save all modified packages
539
for i:=0 to PkgList.Count-1 do begin
540
APackage:=TLazPackage(PkgList[i]);
541
if (not APackage.AutoCreated)
542
and (APackage.IsVirtual or APackage.Modified) then begin
543
if DoSavePackage(APackage,[])<>mrOk then exit;
549
FreeDependencyList(NewFirstAutoInstallDependency,pdlRequires);
491
Ok:=CheckInstallPackageList(PkgIDList);
554
function TPkgManager.LoadDependencyList(FirstDependency: TPkgDependency
494
function TPkgManager.LoadDependencyList(FirstDependency: TPkgDependency;
495
Quiet: boolean): TModalResult;
557
497
CurDependency: TPkgDependency;
558
498
OpenResult: TLoadPackageResult;
563
503
while CurDependency<>nil do begin
564
504
OpenResult:=PackageGraph.OpenDependency(CurDependency,false);
565
505
if OpenResult<>lprSuccess then begin
566
IDEMessageDialog(lisCCOErrorCaption,
567
Format(lisUnableToLoadPackage, ['"', CurDependency.AsString, '"']),
507
IDEMessageDialog(lisCCOErrorCaption,
508
Format(lisUnableToLoadPackage, ['"', CurDependency.AsString, '"']),
571
512
CurDependency:=CurDependency.NextRequiresDependency;
611
552
NewDependency.Free;
613
APackage:=PackageGraph.FindAPackageWithName(APackageName,nil);
554
APackage:=PackageGraph.FindPackageWithName(APackageName,nil);
614
555
if APackage=nil then exit;
615
556
AForm:=PackageEditors.OpenEditor(APackage);
619
procedure TPkgManager.MainIDEitmPkgAddCurUnitToPkgClick(Sender: TObject);
560
procedure TPkgManager.MainIDEitmPkgAddCurFileToPkgClick(Sender: TObject);
621
562
DoAddActiveUnitToAPackage;
565
procedure TPkgManager.MainIDEitmPkgNewComponentClick(Sender: TObject);
567
DoNewPackageComponent;
624
570
procedure TPkgManager.MainIDEitmPkgOpenPackageOfCurUnitClicked(Sender: TObject);
626
572
ActiveSourceEditor: TSourceEditorInterface;
627
573
ActiveUnitInfo: TUnitInfo;
628
574
PkgFile: TPkgFile;
631
576
MainIDE.GetCurrentUnitInfo(ActiveSourceEditor,ActiveUnitInfo);
632
577
if ActiveSourceEditor=nil then exit;
634
Filename:=ActiveUnitInfo.Filename;
636
PkgFile:=PackageGraph.FindFileInAllPackages(Filename,true,
578
PkgFile:=PackageGraph.FindFileInAllPackages(ActiveUnitInfo.Filename,true,
637
579
not ActiveUnitInfo.IsPartOfProject);
638
if PkgFile=nil then begin
639
581
IDEMessageDialog(lisProjAddPackageNotFound,
640
lisPkgThisFileIsNotInAnyLoadedPackage, mtInformation,
644
DoOpenPackageFile(PkgFile.LazPackage.Filename,[pofAddToRecent],false)
582
lisPkgThisFileIsNotInAnyLoadedPackage, mtInformation, [mbCancel])
584
DoOpenPackageFile(PkgFile.LazPackage.Filename,[pofAddToRecent],false);
587
procedure TPkgManager.OnAfterWritePackage(Sender: TObject; Restore: boolean);
589
APackage: TLazPackage absolute Sender;
591
//debugln(['TPkgManager.OnAfterWritePackage ',DbgSName(APackage),' Restore=',Restore]);
593
APackage.RestoreOptions;
596
procedure TPkgManager.OnBeforeReadPackage(Sender: TObject);
598
APackage: TLazPackage absolute Sender;
600
//debugln(['TPkgManager.OnBeforeReadPackage ',DbgSName(APackage)]);
601
APackage.BackupOptions;
647
604
function TPkgManager.OnPackageEditorCompilePackage(Sender: TObject;
648
605
APackage: TLazPackage; CompileClean, CompileRequired: boolean): TModalResult;
650
607
Flags: TPkgCompileFlags;
651
Globals: TGlobalCompilerOptions;
654
610
if CompileClean then Include(Flags,pcfCleanCompile);
655
611
if CompileRequired then Include(Flags,pcfCompileDependenciesClean);
656
if Project1<>nil then
657
Globals:=Project1.CompilerOptions.Globals
660
612
//debugln('TPkgManager.OnPackageEditorCompilePackage OS=',Globals.TargetOS);
661
Result:=DoCompilePackage(APackage,Flags,false,Globals);
613
Result:=DoCompilePackage(APackage,Flags,false);
664
616
function TPkgManager.OnPackageEditorCreateMakefile(Sender: TObject;
703
655
BinMemStream.CopyFrom(BinFileStream,BinFileStream.Size);
704
656
BinMemStream.Position:=0;
705
657
BinExt:=uppercase(ExtractFileExt(Params.IconFile));
706
ResourceType:=copy(BinExt,2,length(BinExt)-1);
707
ResourceName:=ExtractFileNameOnly(Params.IconFile);
708
BinaryToLazarusResourceCode(BinMemStream,ResMemStream
709
,ResourceName,ResourceType);
658
ResType:=copy(BinExt,2,length(BinExt)-1);
659
ResName:=ExtractFileNameOnly(Params.NewClassName);
660
BinaryToLazarusResourceCode(BinMemStream,ResMemStream,ResName,ResType);
710
661
ResMemStream.Position:=0;
711
662
CodeBuf.LoadFromStream(ResMemStream);
712
663
Result:=SaveCodeBuffer(CodeBuf);
730
681
// create sourcecode
732
UsesLine:='Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs';
683
if PackageGraph.FindDependencyRecursively(Params.Pkg.FirstRequiredDependency,
686
UsesLine:='Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs'
688
UsesLine:='Classes, SysUtils';
733
689
if (System.Pos(Params.UsedUnitname,UsesLine)<1)
734
690
and (Params.UsedUnitname<>'') then
735
691
UsesLine:=UsesLine+', '+Params.UsedUnitname;
1281
1241
Result:=IDEMessageDialogAb(lisPkgMangBrokenDependency,
1282
1242
Format(lisPkgMangTheProjectRequiresThePackageButItWasNotFound, [
1283
1243
'"', Dependency.AsString, '"', #13]),
1284
mtError,[mbCancel],ShowAbort);
1244
mtError,Btns,ShowAbort);
1245
if not ShowAbort then
1246
Result := mrCancel; // User confirmed error, implicitly cancel the action
1289
1251
DoShowPackageGraphPathList(PathList);
1290
1252
Result:=IDEMessageDialogAb(lisPkgMangBrokenDependency,
1291
lisPkgMangARequiredPackagesWasNotFound,
1292
mtError,[mbCancel],ShowAbort);
1296
// check for circle dependencies
1297
PathList:=PackageGraph.FindCircleDependencyPath(APackage,FirstDependency);
1298
if PathList<>nil then begin
1299
DoShowPackageGraphPathList(PathList);
1300
Result:=IDEMessageDialogAb(lisPkgMangCircleInPackageDependencies,
1301
lisPkgMangThereIsACircleInTheRequiredPackages,
1302
mtError,[mbCancel],ShowAbort);
1253
lisPkgMangRequiredPackagesWereNotFound,
1254
mtError,Btns,ShowAbort);
1255
if not ShowAbort then
1256
Result := mrCancel; // User confirmed error, implicitly cancel the action
1260
// check for cycle dependencies
1261
PathList:=PackageGraph.FindCycleDependencyPath(APackage,FirstDependency);
1262
if PathList<>nil then begin
1263
DoShowPackageGraphPathList(PathList);
1264
Result:=IDEMessageDialogAb(lisPkgMangCircularDependencies,
1265
lisPkgMangThereIsACircularDependency,
1266
mtError,Btns,ShowAbort);
1267
if not ShowAbort then
1268
Result := mrCancel; // User confirmed error, implicitly cancel the action
1272
// check for a package that compiles to the default FPC search path
1273
PathList:=PackageGraph.FindPkgOutputInFPCSearchPath(APackage,FirstDependency);
1274
if PathList<>nil then begin
1275
ConflictPkg:=TObject(PathList[PathList.Count-1]) as TLazPackage;
1276
DoShowPackageGraphPathList(PathList);
1277
Result:=IDEMessageDialogAb(lisPkgMangCircularDependencies,
1278
Format(lisPkgMangThePackageIsCompiledAutomaticallyAndItsOutputDirec, [
1279
ConflictPkg.Name, ConflictPkg.GetOutputDirectory, #13#13, #13, #13,
1281
mtError,Btns,ShowAbort);
1282
if not ShowAbort then
1283
Result := mrCancel; // User confirmed error, implicitly cancel the action
1389
procedure TPkgManager.SaveAutoInstallDependencies(
1390
SetWithStaticPcksFlagForIDE: boolean);
1374
procedure TPkgManager.SaveAutoInstallDependencies;
1392
1376
Dependency: TPkgDependency;
1393
1377
sl: TStringList;
1395
if SetWithStaticPcksFlagForIDE then begin
1396
MiscellaneousOptions.BuildLazProfiles.Current.WithStaticPackages:=True;
1399
1379
sl:=TStringList.Create;
1400
1380
Dependency:=PackageGraph.FirstAutoInstallDependency;
1401
1381
while Dependency<>nil do begin
1402
1382
if (Dependency.LoadPackageResult=lprSuccess)
1403
1383
and (not Dependency.RequiredPackage.AutoCreated)
1404
1384
and (not PackageGraph.IsStaticBasePackage(Dependency.PackageName))
1405
and (not Dependency.RequiredPackage.Missing) then begin
1385
and (not Dependency.RequiredPackage.Missing)
1386
and (not (Dependency.RequiredPackage.PackageType in [lptRunTime,lptRunTimeOnly]))
1406
1388
if sl.IndexOf(Dependency.PackageName)<0 then begin
1407
1389
sl.Add(Dependency.PackageName);
1408
DebugLn('TPkgManager.SaveAutoInstallDependencies A ',Dependency.PackageName);
1390
//DebugLn('TPkgManager.SaveAutoInstallDependencies A ',Dependency.PackageName);
1411
1393
Dependency:=Dependency.NextRequiresDependency;
1783
1773
if LangEnd<>length(Filename)-2 then exit;
1784
1774
AUnitName:=copy(Filename,1,UnitNameEnd-1);
1785
1775
Language:=copy(Filename,UnitNameEnd+1,LangEnd-UnitNameEnd-1);
1786
Result:=IsValidIdent(AUnitName) and (Language<>'');
1776
Result:=IsValidUnitName(AUnitName) and (Language<>'');
1787
1777
//DebugLn(['GetPOFilenameParts AUnitName=',AUnitName,' Language=',Language,' Result=',Result]);
1790
1780
procedure TranslateWithFileMask(APackage: TLazPackage;
1791
1781
const Directory, Language: string);
1793
FileInfo: TSearchRec;
1794
1783
CurUnitName: string;
1795
1784
CurLang: string;
1798
1788
if Language='' then exit;
1799
FileMask:=Directory+'*.'+Language+'.po';
1800
//DebugLn(['TranslateWithFileMask APackage=',APackage.IDAsString,' FileMask="',FileMask,'"']);
1801
if FindFirstUTF8(FileMask,faAnyFile,FileInfo)=0
1804
// check if special file
1805
if (FileInfo.Name='.') or (FileInfo.Name='..') or (FileInfo.Name='') then
1807
if GetPOFilenameParts(FileInfo.Name,CurUnitName,CurLang)
1791
CodeToolBoss.DirectoryCachePool.GetListing(Directory,Files,false);
1792
for Filename in Files do begin
1793
if CompareFileExt(Filename,'.po',false)<>0 then continue;
1794
if GetPOFilenameParts(Filename,CurUnitName,CurLang)
1808
1795
and (CurLang=Language)
1809
1796
and (APackage.FindUnit(CurUnitName)<>nil)
1810
1797
and not UnitTranslated(CurUnitName) then begin
1811
TranslateUnit(Directory+FileInfo.Name,CurUnitName);
1798
TranslateUnit(AppendPathDelim(Directory)+Filename,CurUnitName);
1813
until FindNextUTF8(FileInfo)<>0;
1815
FindCloseUTF8(FileInfo);
2194
2187
// check filename
2195
2188
AlternativePkgName:=ExtractFileNameOnly(AFilename);
2196
2189
if (not (pofRevert in Flags))
2197
and ((AlternativePkgName='') or (not IsValidIdent(AlternativePkgName)))
2190
and ((AlternativePkgName='') or (not IsValidUnitName(AlternativePkgName)))
2199
2192
DoQuestionDlg(lisPkgMangInvalidPackageFilename,
2200
2193
Format(lisPkgMangThePackageFileNameInIsNotAValidLazarusPackageName, ['"',
2201
2194
AlternativePkgName, '"', #13, '"', AFilename, '"']));
2202
RemoveFromRecentList(AFilename,EnvironmentOptions.RecentPackageFiles);
2195
RemoveFromRecentList(AFilename,EnvironmentOptions.RecentPackageFiles,rltFile);
2203
2196
SetRecentPackagesMenu;
2323
2316
if APackage.IsVirtual then Include(Flags,psfSaveAs);
2325
// check if package needs saving
2326
if (not (psfSaveAs in Flags))
2327
and (not APackage.ReadOnly) and (not APackage.Modified)
2328
and FileExistsCached(APackage.Filename) then begin
2318
if not ( (psfSaveAs in Flags) or APackage.ReadOnly or APackage.Modified
2319
or FileExistsCached(APackage.Filename)
2320
or (APackage.UserIgnoreChangeStamp<>APackage.ChangeStamp )) then
2333
// ask user if package should be saved
2334
if psfAskBeforeSaving in Flags then begin
2335
Result:=IDEMessageDialog(lisPkgMangSavePackage2,
2336
Format(lisPkgMangPackageChangedSave, ['"', APackage.IDAsString,
2338
mtConfirmation,[mbYes,mbNo,mbAbort]);
2339
if (Result=mrNo) then Result:=mrIgnore;
2340
if Result<>mrYes then exit;
2326
// save new or changed files
2327
Result:=SavePackageFiles(APackage);
2328
if Result<>mrOk then exit;
2343
2330
// warn about missing files
2344
2331
Result:=WarnAboutMissingPackageFiles(APackage);
2345
2332
if Result<>mrOk then exit;
2477
2464
NewLazarusSrcDir: String;
2478
2465
OldLazarusSrcDir: String;
2479
APackage: TLazPackage;
2466
VisitedPkgs: TStringToStringTree;
2467
ReloadPkgs: TStringList;
2469
function PkgInOldLazarusDir(APackage: TLazPackage): boolean;
2471
Result:=FileIsInPath(APackage.Filename,OldLazarusSrcDir)
2472
or PackageGraph.IsStaticBasePackage(APackage.Name)
2473
or (SysUtils.CompareText(copy(APackage.Filename,1,length(LazDirMacro)),LazDirMacro)=0)
2476
procedure GatherLazarusSrcPackages(APackage: TLazPackage);
2478
ADependency: TPkgDependency;
2480
if APackage=nil then exit;
2481
if VisitedPkgs.Contains(APackage.Name) then exit;
2482
VisitedPkgs[APackage.Name]:='1';
2483
// search the dependencies first
2484
ADependency:=APackage.FirstRequiredDependency;
2485
while ADependency<>nil do begin
2486
GatherLazarusSrcPackages(ADependency.RequiredPackage);
2487
ADependency:=ADependency.NextRequiresDependency;
2489
if PkgInOldLazarusDir(APackage) then begin
2490
// this package was from the old lazarus source directory
2491
ReloadPkgs.Add(APackage.Name);
2495
function ReloadPkg(APackage: TLazPackage): boolean;
2498
MsgResult: TModalResult;
2502
if APackage=nil then exit;
2503
if not PkgInOldLazarusDir(APackage) then exit;
2504
// this package was from the old lazarus source directory
2505
// check if there is a package in the new version
2506
Link:=PkgLinks.FindLinkWithPkgName(APackage.Name);
2507
if Link<>nil then begin
2508
Filename:=TrimFilename(Link.Filename);
2509
if not FilenameIsAbsolute(Filename) then
2510
Filename:=AppendPathDelim(NewLazarusSrcDir)+Filename;
2511
if FileIsInPath(Filename,NewLazarusSrcDir)
2512
and FileExistsUTF8(Filename) then
2514
DebugLn(['TPkgManager.LazarusSrcDirChanged load: ',Filename]);
2515
// open package in new lazarus source directory
2516
MsgResult:=DoOpenPackageFile(Filename,[pofDoNotOpenEditor,pofRevert],true);
2517
if MsgResult=mrAbort then exit(false);
2482
MsgResult: TModalResult;
2485
2525
if PackageGraph=nil then exit;
2486
2526
OldLazarusSrcDir:=FLastLazarusSrcDir;
2487
NewLazarusSrcDir:=EnvironmentOptions.LazarusDirectory;
2527
NewLazarusSrcDir:=EnvironmentOptions.GetParsedLazarusDirectory;
2488
2528
FLastLazarusSrcDir:=NewLazarusSrcDir;
2489
2529
if CompareFilenames(OldLazarusSrcDir,NewLazarusSrcDir)=0 then exit;
2530
debugln(['TPkgManager.LazarusSrcDirChanged loading new lpl files from ',PkgLinks.GetGlobalLinkDirectory]);
2531
if PkgLinks.IsUpdating then
2532
debugln(['TPkgManager.LazarusSrcDirChanged inconsistency: pkglinks are locked']);
2490
2533
PkgLinks.UpdateGlobalLinks;
2493
while i<PackageGraph.Count do begin
2494
APackage:=PackageGraph.Packages[i];
2495
if (SysUtils.CompareText(copy(APackage.Filename,1,length(LazDirMacro)),LazDirMacro)=0)
2496
or FileIsInPath(APackage.Filename,OldLazarusSrcDir)
2497
or (PackageGraph.IsStaticBasePackage(APackage.Name) and (not APackage.AutoCreated))
2499
// this package was from the old lazarus source directory
2500
// check if there is a package in the new version
2501
Link:=PkgLinks.FindLinkWithPkgName(APackage.Name);
2502
if Link<>nil then begin
2503
Filename:=TrimFilename(Link.Filename);
2504
if not FilenameIsAbsolute(Filename) then
2505
Filename:=AppendPathDelim(NewLazarusSrcDir)+Filename;
2506
if FileIsInPath(Filename,NewLazarusSrcDir)
2507
and FileExistsUTF8(Filename) then
2509
DebugLn(['TPkgManager.LazarusSrcDirChanged load: ',Filename]);
2510
// open package in new lazarus source directory
2511
MsgResult:=DoOpenPackageFile(Filename,[pofDoNotOpenEditor,pofRevert],true);
2512
if MsgResult=mrAbort then break;
2535
VisitedPkgs:=TStringToStringTree.Create(false);
2536
ReloadPkgs:=TStringList.Create;
2538
// collect candidates
2539
for i:=0 to PackageGraph.Count-1 do
2540
GatherLazarusSrcPackages(PackageGraph.Packages[i]);
2542
for i:=0 to ReloadPkgs.Count-1 do
2543
ReloadPkg(PackageGraph.FindPackageWithName(ReloadPkgs[i],nil));
2527
2557
Result:=PackageGraph.Packages[Index];
2530
function TPkgManager.FindPackageWithName(const PkgName: string): TIDEPackage;
2560
function TPkgManager.FindPackageWithName(const PkgName: string;
2561
IgnorePackage: TIDEPackage): TIDEPackage;
2534
ID:=TLazPackageID.Create;
2537
Result:=PackageGraph.FindPackageWithID(ID);
2566
if (IgnorePackage<>nil) then
2567
Pkg:=IgnorePackage as TLazPackage;
2568
Result:=PackageGraph.FindPackageWithName(PkgName,Pkg);
2571
function TPkgManager.RedirectPackageDependency(APackage: TIDEPackage): TIDEPackage;
2574
if Result=PackageGraph.LCLBasePackage then begin
2575
// Older Lazarus does not have a LCLBase and a component does not work
2576
// without an LCLBase implementation, so we have to use LCL instead.
2577
Result:=PackageGraph.LCLPackage;
2543
2581
function TPkgManager.DoCompileProjectDependencies(AProject: TProject;
2544
2582
Flags: TPkgCompileFlags): TModalResult;
2584
CompilePolicy: TPackageUpdatePolicy;
2546
2586
// check graph for circles and broken dependencies
2547
2587
if not (pcfDoNotCompileDependencies in Flags) then begin
2562
2602
// automatically compile required packages
2563
2603
if not (pcfDoNotCompileDependencies in Flags) then begin
2604
CompilePolicy:=pupAsNeeded;
2605
if pcfCompileDependenciesClean in Flags then
2606
CompilePolicy:=pupOnRebuildingAll;
2564
2607
Result:=PackageGraph.CompileRequiredPackages(nil,
2565
AProject.FirstRequiredDependency,
2566
AProject.CompilerOptions.Globals,
2608
AProject.FirstRequiredDependency,
2609
not (pfUseDesignTimePackages in AProject.Flags),
2568
2611
if Result<>mrOk then exit;
2602
2644
if Result<>mrOk then exit;
2605
Result:=WarnAboutMissingPackageFiles(APackage);
2606
if Result<>mrOk then exit;
2608
Result:=PackageGraph.CompilePackage(APackage,Flags,false,Globals);
2647
Result:=PackageGraph.CompilePackage(APackage,Flags,false);
2611
2650
function TPkgManager.DoCreatePackageMakefile(APackage: TLazPackage;
2612
2651
ShowAbort: boolean): TModalResult;
2614
2653
Result:=DoCompilePackage(APackage,[pcfDoNotCompileDependencies,
2615
pcfDoNotCompilePackage,pcfCreateMakefile],ShowAbort,nil);
2654
pcfDoNotCompilePackage,pcfCreateMakefile],ShowAbort);
2618
2657
function TPkgManager.OnRenameFile(const OldFilename, NewFilename: string;
2635
2673
NewPkgFile:=PackageGraph.FindFileInAllPackages(NewFilename,true,false);
2636
2674
if (NewPkgFile<>nil) and (OldPackage<>NewPkgFile.LazPackage) then exit;
2638
Result:=IDEMessageDialog(lisPkgMangRenameFileInPackage,
2639
Format(lisPkgMangThePackageOwnsTheFileShouldTheFileBeRenamed, [
2640
OldPackage.IDAsString, #13, '"', OldFilename, '"', #13]),
2641
mtConfirmation,[mbYes,mbNo,mbAbort]);
2642
if Result=mrNo then begin
2646
if Result<>mrYes then exit;
2648
2676
OldPkgFile.Filename:=NewFilename;
2649
if OldPackage.Editor<>nil then OldPackage.Editor.UpdateAll(true);
2677
if OldPackage.Editor<>nil then
2678
OldPackage.Editor.UpdateAll(true);
2650
2679
OldPackage.Modified:=true;
2655
2682
{------------------------------------------------------------------------------
2741
2769
UnitNames.Add(NewUnitName);
2742
2770
// find package
2743
2771
PkgFile:=PackageGraph.FindUnitInAllPackages(NewUnitName,true);
2744
//DebugLn(['CollectNeededUnitnamesAndPackages AAA2 PkgFile=',PkgFile<>nil]);
2745
if (PkgFile=nil) and (RegComp is TPkgComponent) then begin
2772
//DebugLn(['CollectNeededUnitnamesAndPackages PkgFile=',PkgFile<>nil]);
2773
if (PkgFile=nil) and (RegComp is TPkgComponent) then
2746
2774
PkgFile:=TPkgComponent(RegComp).PkgFile;
2747
if (PkgFile<>nil) and (PkgFile.LazPackage<>nil)
2748
and (Packages.IndexOf(PkgFile.LazPackage)<0) then
2749
Packages.Add(PkgFile.LazPackage);
2775
if (PkgFile<>nil) then begin
2776
APackage:=PkgFile.LazPackage;
2777
APackage:=TLazPackage(RedirectPackageDependency(APackage));
2778
if (APackage<>nil) and (Packages.IndexOf(APackage)<0) then
2779
Packages.Add(APackage);
2763
2793
Result:=LoadAndParseUnitBuf;
2764
2794
if Result<>mrOk then exit;
2765
if not CodeToolBoss.FindUsedUnitNames(UnitBuf,MainUsesSection,
2766
ImplementationUsesSection)
2768
MainIDE.DoJumpToCodeToolBossError;
2771
for i:=0 to MainUsesSection.Count-1 do begin
2772
j:=UnitNames.IndexOf(MainUsesSection[i]);
2773
if j>=0 then UnitNames.Delete(j);
2775
MainUsesSection.Free;
2776
ImplementationUsesSection.Free;
2795
MainUsesSection:=nil;
2796
ImplementationUsesSection:=nil;
2798
if not CodeToolBoss.FindUsedUnitNames(UnitBuf,MainUsesSection,
2799
ImplementationUsesSection)
2801
MainIDE.DoJumpToCodeToolBossError;
2804
for i:=0 to MainUsesSection.Count-1 do begin
2805
j:=UnitNames.IndexOf(MainUsesSection[i]);
2806
if j>=0 then UnitNames.Delete(j);
2809
MainUsesSection.Free;
2810
ImplementationUsesSection.Free;
2797
2832
for i:=0 to MissingDependencies.Count-1 do begin
2798
2833
UnitOwner:=TObject(MissingDependencies[i]);
2799
2834
RequiredPackage:=TLazPackage(MissingDependencies.Objects[i]);
2835
RequiredPackage:=TLazPackage(RedirectPackageDependency(RequiredPackage));
2800
2836
if UnitOwner is TProject then begin
2801
2837
PackageAdditions:=Format(
2802
2838
lisPkgMangAddingNewDependencyForProjectPackage, [PackageAdditions,
2803
TProject(UnitOwner).Title, RequiredPackage.Name, #13#13]);
2839
TProject(UnitOwner).GetTitle, RequiredPackage.Name, #13#13]);
2804
2840
end else if UnitOwner is TLazPackage then begin
2805
2841
PackageAdditions:=Format(
2806
2842
lisPkgMangAddingNewDependencyForPackagePackage, [PackageAdditions,
2835
2871
for i:=0 to MissingDependencies.Count-1 do begin
2836
2872
UnitOwner:=TObject(MissingDependencies[i]);
2837
2873
RequiredPackage:=TLazPackage(MissingDependencies.Objects[i]);
2874
RequiredPackage:=TLazPackage(RedirectPackageDependency(RequiredPackage));
2838
2875
if UnitOwner is TProject then begin
2839
DebugLn('TPkgManager.AddUnitDependenciesForComponentClasses Adding Project Dependency ',TProject(UnitOwner).Title,' -> ',RequiredPackage.Name);
2876
DebugLn('TPkgManager.AddUnitDependenciesForComponentClasses Adding Project Dependency ',TProject(UnitOwner).GetTitle,' -> ',RequiredPackage.Name);
2840
2877
AddProjectDependency(TProject(UnitOwner),RequiredPackage);
2841
2878
end else if UnitOwner is TLazPackage then begin
2842
2879
DebugLn('TPkgManager.AddUnitDependenciesForComponentClasses Adding Package Dependency ',TLazPackage(UnitOwner).Name,' -> ',RequiredPackage.Name);
2843
PackageGraph.AddDependencyToPackage(TLazPackage(UnitOwner),
2880
AddPackageDependency(TLazPackage(UnitOwner),RequiredPackage.Name);
2939
2975
CurUnitName:='';
2940
2976
if CurRegisteredComponent.ComponentClass<>nil then
2941
2977
CurUnitName:=GetClassUnitName(CurRegisteredComponent.ComponentClass);
2942
//DebugLn(['TPkgManager.GetMissingDependenciesForUnit AAA1 CurUnitName=',CurUnitName]);
2978
//DebugLn(['TPkgManager.GetMissingDependenciesForUnit CurUnitName=',CurUnitName]);
2943
2979
if CurUnitName='' then
2944
2980
CurUnitName:=CurRegisteredComponent.GetUnitName;
2945
2981
PkgFile:=PackageGraph.FindUnitInAllPackages(CurUnitName,true);
2946
//DebugLn(['TPkgManager.GetMissingDependenciesForUnit AAA2 PkgFile=',PkgFile<>nil]);
2982
//DebugLn(['TPkgManager.GetMissingDependenciesForUnit PkgFile=',PkgFile<>nil]);
2947
2983
if PkgFile=nil then
2948
2984
PkgFile:=TPkgComponent(CurRegisteredComponent).PkgFile;
2949
2985
if PkgFile<>nil then begin
2950
2986
RequiredPackage:=PkgFile.LazPackage;
2987
RequiredPackage:=TLazPackage(RedirectPackageDependency(RequiredPackage));
2951
2988
if (RequiredPackage<>nil)
2952
2989
and (RequiredPackage<>UnitOwner)
2953
2990
and (FindCompatibleDependencyInList(FirstDependency,pdlRequires,
3101
3138
and (BaseDir<>'') then begin
3102
3139
// search in project source directories
3103
3140
ProjectDirs:=AProject.LazCompilerOptions.OtherUnitFiles+';.';
3104
if not IDEMacros.CreateAbsoluteSearchPath(ProjectDirs,BaseDir) then exit;
3105
if FindPathInSearchPath(PChar(SrcDir),length(SrcDir),
3106
PChar(ProjectDirs),length(ProjectDirs))<>nil
3141
if IDEMacros.CreateAbsoluteSearchPath(ProjectDirs,BaseDir) then begin
3142
if FindPathInSearchPath(PChar(SrcDir),length(SrcDir),
3143
PChar(ProjectDirs),length(ProjectDirs))<>nil
3146
3185
FreeThenNil(Result);
3149
function TPkgManager.GetPackageOfCurrentSourceEditor: TPkgFile;
3188
function TPkgManager.GetPackageOfCurrentSourceEditor(out APackage: TIDEPackage
3151
3191
SrcEdit: TSourceEditor;
3153
3195
SrcEdit:=SourceEditorManager.GetActiveSE;
3154
if SrcEdit<>nil then begin
3155
Result:=SearchFile(SrcEdit.Filename,[],nil);
3196
if SrcEdit=nil then exit;
3197
Result := TPkgFile(GetPackageOfSourceEditor(APackage, SrcEdit));
3200
function TPkgManager.GetPackageOfSourceEditor(out APackage: TIDEPackage;
3201
ASrcEdit: TObject): TLazPackageFile;
3208
if ASrcEdit=nil then exit;
3209
Filename:=TSourceEditor(ASrcEdit).FileName;
3210
Result:=SearchFile(Filename,[],nil);
3211
if Result<>nil then begin
3212
APackage:=Result.LazPackage;
3215
for i:=0 to PackageGraph.Count-1 do begin
3216
APackage:=PackageGraph[i];
3217
if CompareFilenames(TLazPackage(APackage).GetSrcFilename,FileName)=0 then
3223
function TPkgManager.IsOwnerDependingOnPkg(AnOwner: TObject;
3224
const PkgName: string; out DependencyOwner: TObject): boolean;
3226
FirstDep: TPkgDependency;
3227
Dep: TPkgDependency;
3230
DependencyOwner:=nil;
3231
if (AnOwner=nil) or (PkgName='') then exit;
3232
if AnOwner is TProject then
3233
FirstDep:=TProject(AnOwner).FirstRequiredDependency
3234
else if AnOwner is TLazPackage then begin
3235
if CompareDottedIdentifiers(PChar(TLazPackage(AnOwner).Name),
3238
DependencyOwner:=AnOwner;
3241
FirstDep:=TLazPackage(AnOwner).FirstRequiredDependency;
3244
if PackageGraph=nil then exit;
3245
Dep:=PackageGraph.FindDependencyRecursively(FirstDep,PkgName);
3246
if Dep=nil then exit;
3247
DependencyOwner:=Dep.Owner;
3160
3251
function TPkgManager.AddDependencyToOwners(OwnerList: TFPList;
3161
APackage: TLazPackage; OnlyTestIfPossible: boolean): TModalResult;
3252
APackage: TIDEPackage; OnlyTestIfPossible: boolean): TModalResult;
3165
3256
NewDependency: TPkgDependency;
3166
3257
ADependency: TPkgDependency;
3261
Pkg:=APackage as TLazPackage;
3168
3262
if not OnlyTestIfPossible then begin
3169
3263
Result:=AddDependencyToOwners(OwnerList,APackage,true);
3170
3264
if Result<>mrOk then exit;
3175
3269
Item:=TObject(OwnerList[i]);
3176
3270
if Item=APackage then continue;
3177
3271
if Item is TProject then begin
3178
Result:=AddProjectDependency(TProject(Item),APackage,OnlyTestIfPossible);
3272
Result:=AddProjectDependency(TProject(Item),Pkg,OnlyTestIfPossible);
3179
3273
if Result<>mrOk then exit;
3180
3274
end else if Item is TLazPackage then begin
3181
3275
NewDependency:=TPkgDependency.Create;
3183
3277
NewDependency.PackageName:=APackage.Name;
3184
if not CheckAddingDependency(TLazPackage(Item),NewDependency) then
3186
if not OnlyTestIfPossible then begin
3278
r:=CheckAddingDependency(TLazPackage(Item),NewDependency,false,false);
3279
if r=mrCancel then exit;
3280
if (not OnlyTestIfPossible) and (r<>mrIgnore) then begin
3187
3281
ADependency:=NewDependency;
3188
3282
NewDependency:=nil;
3189
3283
PackageGraph.AddDependencyToPackage(TLazPackage(Item),ADependency);
3338
3434
if ActiveSourceEditor=nil then exit;
3340
3436
Filename:=ActiveUnitInfo.Filename;
3342
3438
// check if filename is absolute
3343
3439
if ActiveUnitInfo.IsVirtual or (not FileExistsUTF8(Filename)) then begin
3344
3440
Result:=IDEMessageDialog(lisPkgMangFileNotSaved,
3345
lisPkgMangPleaseSaveTheFileBeforeAddingItToAPackage,
3346
mtWarning,[mbCancel]);
3441
lisPkgMangPleaseSaveTheFileBeforeAddingItToAPackage, mtWarning,[mbCancel]);
3350
3445
// check if file is part of project
3351
3446
if ActiveUnitInfo.IsPartOfProject then begin
3352
3447
Result:=IDEMessageDialog(lisPkgMangFileIsInProject,
3353
Format(lisPkgMangWarningTheFileBelongsToTheCurrentProject, ['"',
3354
Filename, '"', #13])
3355
,mtWarning,[mbIgnore,mbCancel,mbAbort]);
3448
Format(lisPkgMangWarningTheFileBelongsToTheCurrentProject,
3449
['"', Filename, '"', #13])
3450
,mtWarning,[mbIgnore,mbCancel]);
3356
3451
if Result<>mrIgnore then exit;
3359
3454
// check if file is already in a package
3360
3455
PkgFile:=PackageGraph.FindFileInAllPackages(Filename,true,true);
3361
3456
if PkgFile<>nil then begin
3362
3457
Result:=IDEMessageDialog(lisPkgMangFileIsAlreadyInPackage,
3363
Format(lisPkgMangTheFileIsAlreadyInThePackage, ['"', Filename, '"', #13,
3364
PkgFile.LazPackage.IDAsString]),
3365
mtWarning,[mbIgnore,mbCancel,mbAbort]);
3458
Format(lisPkgMangTheFileIsAlreadyInThePackage,
3459
['"', Filename, '"', #13, PkgFile.LazPackage.IDAsString]),
3460
mtWarning,[mbIgnore,mbCancel]);
3366
3461
if Result<>mrIgnore then exit;
3379
Result:=ShowAddFileToAPackageDlg(Filename,TheUnitName,HasRegisterProc);
3474
Result:=ShowAddFileToAPackageDlg(Filename,TheUnitName,HasRegisterProc,
3475
@MainIDE.GetIDEFileState);
3478
function TPkgManager.DoNewPackageComponent: TModalResult;
3480
APackage: TLazPackage;
3481
CurEditor: TPackageEditorForm;
3482
SaveFlags: TPkgSaveFlags;
3483
Page: TAddToPkgType;
3485
Result:=ShowNewPkgComponentDialog(APackage);
3486
if Result<>mrOk then exit;
3488
if APackage=nil then begin
3489
// create new package
3490
// create a new package with standard dependencies
3491
APackage:=PackageGraph.CreateNewPackage(NameToValidIdentifier(lisPkgMangNewPackage));
3492
PackageGraph.AddDependencyToPackage(APackage,
3493
PackageGraph.IDEIntfPackage.CreateDependencyWithOwner(APackage));
3494
APackage.Modified:=false;
3495
Include(SaveFlags,psfSaveAs);
3497
// open a package editor
3498
CurEditor:=PackageEditors.OpenEditor(APackage);
3499
IDEWindowCreators.ShowForm(CurEditor,true);
3501
Result:=DoSavePackage(APackage,SaveFlags);
3502
if Result<>mrOk then exit;
3503
// show new component dialog
3504
Page:=d2ptNewComponent;
3505
Result:=CurEditor.ShowAddDialog(Page);
3508
function TPkgManager.SavePackageFiles(APackage: TLazPackage): TModalResult;
3513
SaveFlags: TSaveFlags;
3514
SrcEdit: TSourceEditor;
3517
for i:=0 to APackage.FileCount-1 do begin
3518
AFile:=APackage.Files[i];
3519
if AFile.FileType=pftVirtualUnit then continue;
3520
AFilename:=AFile.Filename;
3521
if System.Pos('$(',AFilename)>0 then begin
3522
// filename contains macros -> skip
3523
//debugln(['TPkgManager.SavePackageFiles macros ',AFilename]);
3526
// check if open in editor
3527
SrcEdit:=SourceEditorManager.SourceEditorIntfWithFilename(AFilename);
3530
// not open in source editor => skip
3531
//debugln(['TPkgManager.SavePackageFiles no src edit ',AFilename]);
3534
SaveFlags:=[sfCanAbort];
3535
if not FilenameIsAbsolute(AFilename) then
3536
SaveFlags:=[sfSaveAs];
3537
debugln(['TPkgManager.SavePackageFiles saving ',AFilename]);
3538
Result:=LazarusIDE.DoSaveEditorFile(SrcEdit,SaveFlags);
3539
if Result=mrIgnore then Result:=mrOk;
3540
if Result<>mrOk then exit;
3382
3544
function TPkgManager.WarnAboutMissingPackageFiles(APackage: TLazPackage
3390
3552
for i:=0 to APackage.FileCount-1 do begin
3391
3553
AFile:=APackage.Files[i];
3392
3554
if AFile.FileType=pftVirtualUnit then continue;
3393
AFilename:=AFile.Filename;
3555
AFilename:=AFile.GetFullFilename;
3394
3556
if System.Pos('$(',AFilename)>0 then begin
3395
3557
// filename contains macros -> skip
3397
if (not APackage.IsVirtual) and FilenameIsAbsolute(AFilename) then
3398
APackage.LongenFilename(AFilename);
3399
if FilenameIsAbsolute(AFilename) then begin
3400
if not FileExistsCached(AFilename) then begin
3401
if not APackage.IsVirtual then
3402
AFilename:=CreateRelativePath(AFilename,APackage.Directory);
3403
Result:=IDEQuestionDialog(lisPkgMangPackageFileMissing,
3404
Format(lisPkgMangTheFileOfPackageIsMissing, ['"', AFilename, '"',
3405
#13, APackage.IDAsString]),
3406
mtWarning,[mrIgnore,mrAbort]);
3407
if Result<>mrAbort then
3409
// one warning is enough
3413
if not APackage.IsVirtual then begin
3415
Result:=IDEQuestionDialog(lisPkgMangPackageFileNotSaved,
3416
Format(lisPkgMangTheFileOfPackageNeedsToBeSavedFirst, ['"',
3417
AFilename, '"', #13, APackage.IDAsString]),
3418
mtWarning, [mrIgnore, lisPkgMangIgnoreAndSavePackageNow, mrAbort]);
3419
if Result<>mrAbort then
3560
if FilenameIsAbsolute(AFilename) and FileExistsCached(AFilename) then
3562
Result:=IDEQuestionDialog(lisPkgSysPackageFileNotFound,
3563
Format(lisPkgMangTheFileOfPackageWasNotFound, [AFilename, APackage.
3565
mtWarning,[mrIgnore,mrAbort]);
3566
if Result<>mrAbort then
3568
// one warning is enough
3539
3688
// check if package is designtime package
3540
if APackage.PackageType=lptRunTime then begin
3689
if APackage.PackageType in [lptRunTime,lptRunTimeOnly] then begin
3691
if APackage.PackageType=lptRunTime then
3692
Include(Btns,mbIgnore);
3541
3693
Result:=IDEMessageDialog(lisPkgMangPackageIsNoDesigntimePackage,
3542
Format(lisPkgMangThePackageIsARuntimeOnlyPackageRuntimeOnlyPackages, [
3543
APackage.IDAsString, #13]),
3544
mtError,[mbIgnore,mbAbort]);
3694
Format(lisPkgMangThePackageIsARuntimeOnlyPackageRuntimeOnlyPackages,
3695
[APackage.IDAsString, #13]),
3545
3697
if Result<>mrIgnore then exit;
3699
// check if package requires a runtime only package
3700
ConflictDep:=PackageGraph.FindRuntimePkgOnlyRecursively(
3701
APackage.FirstRequiredDependency);
3702
if ConflictDep<>nil then begin
3703
IDEQuestionDialog(lisNotADesigntimePackage,
3704
Format(lisThePackageCanNotBeInstalledBecauseItRequiresWhichI, [
3705
APackage.Name, ConflictDep.AsString]),
3548
3712
// save package
3549
3713
if APackage.IsVirtual or APackage.Modified then begin
3550
3714
Result:=DoSavePackage(APackage,[]);
3620
3782
if NeedSaving then begin
3621
3783
PackageGraph.SortAutoInstallDependencies;
3622
SaveAutoInstallDependencies(true);
3784
SaveAutoInstallDependencies;
3625
3787
// save IDE build configs, so user can build IDE on command line
3626
BuildIDEFlags:=[blfWithStaticPackages,blfDontClean,blfOnlyIDE];
3788
BuildIDEFlags:=[blfDontClean,blfOnlyIDE];
3627
3789
Result:=MainIDE.DoSaveBuildIDEConfigs(BuildIDEFlags);
3628
3790
if Result<>mrOk then exit;
3630
3792
// ask user to rebuild Lazarus now
3631
3793
Result:=IDEMessageDialog(lisPkgMangRebuildLazarus,
3632
Format(lisPkgMangThePackageWasMarkedForInstallationCurrentlyLazarus, [
3633
'"', APackage.IDAsString, '"', #13, #13, #13]),
3794
Format(lisPkgMangThePackageWasMarkedForInstallationCurrentlyLazarus,
3795
['"', APackage.IDAsString, '"', #13, #13, #13]),
3634
3796
mtConfirmation,[mbYes,mbNo]);
3635
3797
if Result<>mrYes then begin
3660
3822
DoShowPackageGraphPathList(DependencyPath);
3661
3823
ParentPackage:=TLazPackage(DependencyPath[0]);
3662
3824
Result:=IDEMessageDialogAb(lisPkgMangPackageIsRequired,
3663
Format(lisPkgMangThePackageIsRequiredByWhichIsMarkedForInstallation, [
3664
APackage.IDAsString, ParentPackage.IDAsString, #13]),
3825
Format(lisPkgMangThePackageIsRequiredByWhichIsMarkedForInstallation,
3826
[APackage.IDAsString, ParentPackage.IDAsString, #13]),
3665
3827
mtError,[mbCancel],ShowAbort);
3701
3862
Dependency.Free;
3702
3863
PackageGraph.SortAutoInstallDependencies;
3704
SaveAutoInstallDependencies(true);
3865
SaveAutoInstallDependencies;
3707
3868
// save IDE build configs, so user can build IDE on command line
3708
BuildIDEFlags:=[blfWithStaticPackages,blfDontClean,blfOnlyIDE];
3869
BuildIDEFlags:=[blfDontClean,blfOnlyIDE];
3709
3870
Result:=MainIDE.DoSaveBuildIDEConfigs(BuildIDEFlags);
3710
3871
if Result<>mrOk then exit;
3712
3873
if not (puifDoNotBuildIDE in Flags) then begin
3713
3874
// ask user to rebuilt Lazarus now
3714
3875
Result:=IDEMessageDialog(lisPkgMangRebuildLazarus,
3715
Format(lisPkgMangThePackageWasMarkedCurrentlyLazarus, ['"',
3716
APackage.IDAsString, '"', #13, #13, #13]),
3876
Format(lisPkgMangThePackageWasMarkedCurrentlyLazarus,
3877
['"', APackage.IDAsString, '"', #13, #13, #13]),
3717
3878
mtConfirmation,[mbYes,mbNo]);
3718
3879
if Result=mrNo then begin
3733
function TPkgManager.DoInstallPackages(PkgIdList: TFPList; AddExisting,
3734
RebuildIDE, Quiet: boolean; CheckList: boolean): TModalResult;
3894
function TPkgManager.CheckInstallPackageList(PkgIDList: TObjectList;
3895
Flags: TPkgInstallInIDEFlags): boolean;
3897
NewFirstAutoInstallDependency: TPkgDependency;
3899
procedure DeleteDependency(ADependency: TPkgDependency);
3902
PkgID: TLazPackageID;
3904
DeleteDependencyInList(ADependency,NewFirstAutoInstallDependency,pdlRequires);
3905
if piiifRemoveConflicts in Flags then
3906
for i:=PkgIDList.Count-1 downto 0 do begin
3907
PkgID:=TLazPackageID(PkgIDList[i]);
3908
if SysUtils.CompareText(PkgID.Name,ADependency.PackageName)=0 then begin
3909
PkgIDList.Delete(i);
3918
APackage: TLazPackage;
3919
ADependency: TPkgDependency;
3920
NextDependency: TPkgDependency;
3921
SaveFlags: TPkgSaveFlags;
3922
ConflictDep: TPkgDependency;
3927
// create new auto install dependency PkgIDList
3928
ListPkgIDToDependencyList(PkgIDList,NewFirstAutoInstallDependency,
3929
pdlRequires,Self,true);
3931
// load all required packages
3932
if LoadDependencyList(NewFirstAutoInstallDependency,piiifQuiet in Flags)<>mrOk then exit;
3934
// remove all top level runtime packages from the list
3935
// Note: it's ok if a designtime package uses a runtime package
3936
ADependency:=NewFirstAutoInstallDependency;
3937
while ADependency<>nil do begin
3938
NextDependency:=ADependency.NextRequiresDependency;
3939
if (ADependency.RequiredPackage<>nil) then begin
3940
if (ADependency.RequiredPackage.PackageType in [lptRunTime,lptRunTimeOnly])
3942
// top level dependency on runtime package => delete
3943
DeleteDependency(ADependency);
3945
ConflictDep:=PackageGraph.FindRuntimePkgOnlyRecursively(
3946
ADependency.RequiredPackage.FirstRequiredDependency);
3947
//debugln(['TPkgManager.CheckInstallPackageList ',ADependency.RequiredPackage.Name,' ',ConflictDep<>nil]);
3948
if ConflictDep<>nil then begin
3949
if piiifRemoveConflicts in Flags then begin
3950
// can remove conflict
3951
if not (piiifQuiet in Flags)
3952
and (IDEQuestionDialog(lisNotADesigntimePackage,
3953
Format(lisThePackageCanNotBeInstalledBecauseItRequiresWhichI, [
3954
ADependency.RequiredPackage.Name, ConflictDep.AsString]),
3956
[mrYes, Format(lisUninstall, [ADependency.RequiredPackage.Name]), mrCancel]
3961
// can not remove conflict
3962
if not (piiifQuiet in Flags) then
3963
IDEQuestionDialog(lisNotADesigntimePackage,
3964
Format(lisThePackageCanNotBeInstalledBecauseItRequiresWhichI, [
3965
ADependency.RequiredPackage.Name, ConflictDep.AsString]),
3966
mtError,[mrCancel]);
3969
// dependency needs a runtime only package => delete
3970
DeleteDependency(ADependency);
3974
ADependency:=NextDependency;
3977
PackageGraph.GetAllRequiredPackages(NewFirstAutoInstallDependency,PkgList);
3979
// try save all modified packages
3980
for i:=0 to PkgList.Count-1 do begin
3981
APackage:=TLazPackage(PkgList[i]);
3982
if (not APackage.AutoCreated)
3983
and (APackage.IsVirtual or APackage.Modified) then begin
3985
if DoSavePackage(APackage,SaveFlags)<>mrOk then exit;
3991
FreeDependencyList(NewFirstAutoInstallDependency,pdlRequires);
3996
function TPkgManager.InstallPackages(PkgIdList: TObjectList;
3997
Flags: TPkgInstallInIDEFlags): TModalResult;
3736
3999
procedure CreateChangeReport(
3737
4000
OldDependencyList, NewDependencyList: TPkgDependency; Report: TStrings);
3786
4049
NewFirstAutoInstallDependency: TPkgDependency;
3787
4050
BuildIDEFlags: TBuildLazarusFlags;
3789
4051
Report: TStringList;
3790
4052
PkgList: TFPList;
3791
4053
RequiredPackage: TLazPackage;
3793
4055
CurDependency: TPkgDependency;
4056
OldID: TLazPackageID;
3795
4058
Result:=mrCancel;
3796
4059
NewFirstAutoInstallDependency:=nil;
4062
if not (piiifClear in Flags) then
3801
4064
// add existing install packages to list
3802
4065
NewFirstAutoInstallDependency:=PackageGraph.FirstAutoInstallDependency;
3803
4066
while NewFirstAutoInstallDependency<>nil do begin
3804
if NewFirstAutoInstallDependency.RequiredPackage<>nil then
3805
PkgIdList.Add(NewFirstAutoInstallDependency.RequiredPackage);
4067
if NewFirstAutoInstallDependency.RequiredPackage<>nil then begin
4068
i:=PkgIdList.Count-1;
4070
and (TLazPackageID(PkgIdList[i]).Compare(NewFirstAutoInstallDependency.RequiredPackage)<>0)
4073
OldID:=TLazPackageID.Create;
4074
OldID.AssignID(NewFirstAutoInstallDependency.RequiredPackage);
4075
PkgIdList.Add(OldID);
3806
4078
NewFirstAutoInstallDependency:=NewFirstAutoInstallDependency.NextRequiresDependency;
4082
if not (piiifSkipChecks in Flags) then
3812
OnCheckInstallPackageList(PkgIDList,ok);
3813
if not ok then exit(mrCancel);
4084
if not CheckInstallPackageList(PkgIDList,Flags*[piiifQuiet,piiifRemoveConflicts]) then
3816
4088
// create new auto install dependency PkgIDList
3875
4147
// save package list
3876
4148
//debugln('TPkgManager.MainIDEitmPkgEditInstallPkgsClick save package list');
3877
4149
PackageGraph.SortAutoInstallDependencies;
3878
SaveAutoInstallDependencies(true);
4150
SaveAutoInstallDependencies;
3880
4152
// save IDE build configs, so user can build IDE on command line
3881
BuildIDEFlags:=[blfWithStaticPackages,blfDontClean,blfOnlyIDE,
3882
blfWithoutCompilingIDE];
4153
BuildIDEFlags:=[blfDontClean,blfOnlyIDE];
3883
4154
if MainIDE.DoSaveBuildIDEConfigs(BuildIDEFlags)<>mrOk then exit(mrCancel);
3885
if RebuildIDE then begin
4156
if piiifRebuildIDE in Flags then
3886
4158
// rebuild Lazarus
3887
4159
if MainIDE.DoBuildLazarus(BuildIDEFlags)<>mrOk then exit(mrCancel);