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