1 {
2  /***************************************************************************
3                             basepkgmanager.pas
4                             ------------------
5 
6 
7  ***************************************************************************/
8 
9  ***************************************************************************
10  *                                                                         *
11  *   This source is free software; you can redistribute it and/or modify   *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  *   This code is distributed in the hope that it will be useful, but      *
17  *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
18  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
19  *   General Public License for more details.                              *
20  *                                                                         *
21  *   A copy of the GNU General Public License is available on the World    *
22  *   Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also      *
23  *   obtain it by writing to the Free Software Foundation,                 *
24  *   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA.   *
25  *                                                                         *
26  ***************************************************************************
27 
28   Author: Mattias Gaertner
29 
30   Abstract:
31     TBasePkgManager is the base class for TPkgManager, which controls the whole
32     package system in the IDE. The base class is mostly abstract.
33 }
34 unit BasePkgManager;
35 
36 {$mode objfpc}{$H+}
37 
38 interface
39 
40 {$I ide.inc}
41 
42 uses
43 {$IFDEF IDE_MEM_CHECK}
44   MemCheck,
45 {$ENDIF}
46   TypInfo, Classes, SysUtils, Forms, LazFileUtils, LCLProc, ComCtrls,
47   LazIDEIntf, PackageIntf, MenuIntf,
48   LazarusIDEStrConsts, EnvironmentOpts,
49   CompilerOptions, PackageDefs, PackageSystem, Project;
50 
51 type
52   { TBasePkgManager }
53 
54   TBasePkgManager = class(TPackageEditingInterface)
55   public
56     // initialization and menu
57     constructor Create(TheOwner: TComponent); override;
58     destructor Destroy; override;
59 
60     procedure ConnectMainBarEvents; virtual; abstract;
61     procedure ConnectSourceNotebookEvents; virtual; abstract;
62     procedure SetupMainBarShortCuts; virtual; abstract;
63     procedure SetRecentPackagesMenu; virtual; abstract;
64     procedure SaveSettings; virtual; abstract;
65     procedure ProcessCommand(Command: word; var Handled: boolean); virtual; abstract;
66     procedure OnSourceEditorPopupMenu(const AddMenuItemProc: TAddMenuItemProc); virtual; abstract;
67     procedure TranslateResourceStrings; virtual; abstract;
68 
69     // files
GetDefaultSaveDirectoryForFilenull70     function GetDefaultSaveDirectoryForFile(const Filename: string): string; virtual; abstract;
OnRenameFilenull71     function OnRenameFile(const OldFilename, NewFilename: string;
72                           IsPartOfProject: boolean): TModalResult; virtual; abstract;
FindIncludeFileInProjectDependenciesnull73     function FindIncludeFileInProjectDependencies(Project1: TProject;
74                           const Filename: string): string; virtual; abstract;
SearchFilenull75     function SearchFile(const AFilename: string;
76                         SearchFlags: TSearchIDEFileFlags;
77                         InObject: TObject): TPkgFile; virtual; abstract;
SearchUnitInDesigntimePackagesnull78     function SearchUnitInDesigntimePackages(const AnUnitName: string;
79                                 InObject: TObject): TPkgFile; virtual; abstract;
AddDependencyToUnitOwnersnull80     function AddDependencyToUnitOwners(const OwnedFilename,
81                      RequiredUnitname: string): TModalResult; virtual; abstract;
82 
83     // project
OpenProjectDependenciesnull84     function OpenProjectDependencies(AProject: TProject;
85                        ReportMissing: boolean): TModalResult; virtual; abstract;
AddProjectDependencynull86     function AddProjectDependency(AProject: TProject; APackage: TLazPackage;
87                                   OnlyTestIfPossible: boolean = false): TModalResult; virtual; abstract;
AddProjectDependencynull88     function AddProjectDependency(AProject: TProject;
89                                   ADependency: TPkgDependency): TModalResult; virtual; abstract;
AddProjectDependenciesnull90     function AddProjectDependencies(AProject: TProject; const Packages: string;
91                                   OnlyTestIfPossible: boolean = false): TModalResult; virtual; abstract;
CheckProjectHasInstalledPackagesnull92     function CheckProjectHasInstalledPackages(AProject: TProject; Interactive: boolean): TModalResult; virtual; abstract;
CanOpenDesignerFormnull93     function CanOpenDesignerForm(AnUnitInfo: TUnitInfo;
94                                  Interactive: boolean): TModalResult; virtual; abstract;
OnProjectInspectorAddDependencynull95     function OnProjectInspectorAddDependency(Sender: TObject;
96                   ADependency: TPkgDependency): TModalResult; virtual; abstract;
OnProjectInspectorRemoveDependencynull97     function OnProjectInspectorRemoveDependency(Sender: TObject;
98                   ADependency: TPkgDependency): TModalResult; virtual; abstract;
OnProjectInspectorReAddDependencynull99     function OnProjectInspectorReAddDependency(Sender: TObject;
100                   ADependency: TPkgDependency): TModalResult; virtual; abstract;
101     procedure OnProjectInspectorDragDropTreeView(Sender, Source: TObject;
102       X, Y: Integer); virtual; abstract;
OnProjectInspectorDragOverTreeViewnull103     function OnProjectInspectorDragOverTreeView(Sender, Source: TObject;
104       X, Y: Integer; out TargetTVNode: TTreeNode;
105       out TargetTVType: TTreeViewInsertMarkType): boolean; virtual; abstract;
106     procedure OnProjectInspectorCopyMoveFiles(Sender: TObject); virtual; abstract;
107 
108     // package editors
DoNewPackagenull109     function DoNewPackage: TModalResult; virtual; abstract;
DoOpenPackagenull110     function DoOpenPackage(APackage: TLazPackage; Flags: TPkgOpenFlags;
111                            ShowAbort: boolean): TModalResult; virtual; abstract;
DoSavePackagenull112     function DoSavePackage(APackage: TLazPackage;
113                           Flags: TPkgSaveFlags): TModalResult; virtual; abstract;
114 
DoClosePackageEditornull115     function DoClosePackageEditor(APackage: TLazPackage): TModalResult; virtual; abstract;
DoCloseAllPackageEditorsnull116     function DoCloseAllPackageEditors: TModalResult; virtual; abstract;
AddPackageDependencynull117     function AddPackageDependency(APackage: TLazPackage; const ReqPackage: string;
118                                   OnlyTestIfPossible: boolean = false): TModalResult; virtual; abstract;
119     procedure OpenHiddenModifiedPackages; virtual; abstract;
120 
121     // package graph
122     procedure GetPackagesChangedOnDisk(out ListOfPackages: TStringList; IgnoreModifiedFlag: boolean = False); virtual; abstract;
RevertPackagesnull123     function RevertPackages(APackageList: TStringList // list of TLazPackage and alternative lpk file name
124         ): TModalResult; virtual; abstract;
CheckUserSearchPathsnull125     function CheckUserSearchPaths(aCompilerOptions: TBaseCompilerOptions): TModalResult; virtual; abstract;
126     procedure DoShowPackageGraphPathList(PathList: TFPList); virtual; abstract;
127     procedure RebuildDefineTemplates; virtual; abstract;
128     procedure LazarusSrcDirChanged; virtual; abstract;
129 
130     // package compilation
DoCompileProjectDependenciesnull131     function DoCompileProjectDependencies(AProject: TProject;
132                       Flags: TPkgCompileFlags): TModalResult; virtual; abstract;
133 
134     // package installation
135     procedure LoadInstalledPackages; virtual; abstract;
DoShowLoadedPkgDlgnull136     function DoShowLoadedPkgDlg: TModalResult; virtual; abstract;
DoCompileAutoInstallPackagesnull137     function DoCompileAutoInstallPackages(Flags: TPkgCompileFlags;
138                                           OnlyBase: boolean): TModalResult; virtual; abstract;
DoSaveAutoInstallConfignull139     function DoSaveAutoInstallConfig: TModalResult; virtual; abstract;
140 
141     // components
GetUsableComponentUnitsnull142     function GetUsableComponentUnits(CurRoot: TPersistent): TFPList; virtual; abstract; // list of TUnitInfo
143     procedure IterateComponentNames(CurRoot: TPersistent; TypeData: PTypeData;
144                                     Proc: TGetStrProc); virtual; abstract;
FindUsableComponentnull145     function FindUsableComponent(CurRoot: TPersistent;
146                   const ComponentPath: string): TComponent; virtual; abstract;
FindReferencedRootComponentnull147     function FindReferencedRootComponent(CurRoot: TPersistent;
148          const ComponentName: string): TComponent; virtual; abstract;
149   end;
150 
151 var
152   PkgBoss: TBasePkgManager;
153 
PkgSaveFlagsToStringnull154 function PkgSaveFlagsToString(Flags: TPkgSaveFlags): string;
PkgOpenFlagsToStringnull155 function PkgOpenFlagsToString(Flags: TPkgOpenFlags): string;
156 
157 procedure GetDescriptionOfDependencyOwner(Dependency: TPkgDependency;
158                                           out Description: string);
159 procedure GetDirectoryOfDependencyOwner(Dependency: TPkgDependency;
160                                         out Directory: string);
161 
162 
163 implementation
164 
PkgSaveFlagsToStringnull165 function PkgSaveFlagsToString(Flags: TPkgSaveFlags): string;
166 var
167   f: TPkgSaveFlag;
168   s: string;
169 begin
170   Result:='';
171   for f:=Low(TPkgSaveFlag) to High(TPkgSaveFlag) do begin
172     if not (f in Flags) then continue;
173     WriteStr(s, f);
174     if Result<>'' then
175       Result:=Result+',';
176     Result:=Result+s;
177   end;
178   Result:='['+Result+']';
179 end;
180 
PkgOpenFlagsToStringnull181 function PkgOpenFlagsToString(Flags: TPkgOpenFlags): string;
182 var
183   f: TPkgOpenFlag;
184   s: string;
185 begin
186   Result:='';
187   for f:=Low(TPkgOpenFlag) to High(TPkgOpenFlag) do begin
188     if not (f in Flags) then continue;
189     WriteStr(s, f);
190     if Result<>'' then
191       Result:=Result+',';
192     Result:=Result+s;
193   end;
194   Result:='['+Result+']';
195 end;
196 
197 procedure GetDescriptionOfDependencyOwner(Dependency: TPkgDependency;
198   out Description: string);
199 var
200   DepOwner: TObject;
201 begin
202   DepOwner:=Dependency.Owner;
203   if (DepOwner<>nil) then begin
204     if DepOwner is TLazPackage then begin
205       Description:=Format(lisPkgMangPackage, [TLazPackage(DepOwner).IDAsString]);
206     end else if DepOwner is TProject then begin
207       Description:=Format(lisPkgMangProject, [ExtractFileNameOnly(TProject(
208         DepOwner).ProjectInfoFile)]);
209     end else if (DepOwner=PkgBoss) or (DepOwner=PackageGraph) then begin
210       Description:=lisLazarus;
211     end else begin
212       Description:=dbgsName(DepOwner)
213     end;
214   end else begin
215     Description:=Format(lisPkgMangDependencyWithoutOwner, [Dependency.AsString]);
216   end;
217 end;
218 
219 procedure GetDirectoryOfDependencyOwner(Dependency: TPkgDependency;
220   out Directory: string);
221 var
222   DepOwner: TObject;
223 begin
224   DepOwner:=Dependency.Owner;
225   if (DepOwner<>nil) then begin
226     if DepOwner is TLazPackage then begin
227       Directory:=TLazPackage(DepOwner).Directory;
228     end else if DepOwner is TProject then begin
229       Directory:=TProject(DepOwner).Directory;
230     end else if DepOwner=PkgBoss then begin
231       Directory:=EnvironmentOptions.GetParsedLazarusDirectory;
232     end else begin
233       Directory:=''
234     end;
235   end else begin
236     Directory:=''
237   end;
238 end;
239 
240 { TBasePkgManager }
241 
242 constructor TBasePkgManager.Create(TheOwner: TComponent);
243 begin
244   PackageEditingInterface:=Self;
245   inherited Create(TheOwner);
246 end;
247 
248 destructor TBasePkgManager.Destroy;
249 begin
250   inherited Destroy;
251   PackageEditingInterface:=nil;
252 end;
253 
254 initialization
255   PkgBoss:=nil;
256 
257 end.
258 
259