Packager: Use new AddPkgDependencyDlg for dependencies of projects and packages. Support multiselection.

git-svn-id: trunk@53129 -
This commit is contained in:
juha 2016-10-16 20:06:37 +00:00
parent 09b6ef75ac
commit 60e607f3e0
10 changed files with 450 additions and 542 deletions

2
.gitattributes vendored
View File

@ -7817,6 +7817,8 @@ packager/adddirtopkgdlg.lfm svneol=native#text/plain
packager/adddirtopkgdlg.pas svneol=native#text/plain
packager/addfiletoapackagedlg.lfm svneol=native#text/plain
packager/addfiletoapackagedlg.pas svneol=native#text/pascal
packager/addpkgdependencydlg.lfm svneol=native#text/plain
packager/addpkgdependencydlg.pas svneol=native#text/pascal
packager/addtopackagedlg.lfm svneol=native#text/plain
packager/addtopackagedlg.pas svneol=native#text/pascal
packager/basepkgmanager.pas svneol=native#text/pascal

View File

@ -17,20 +17,20 @@ object AddToProjectDialog: TAddToProjectDialog
Height = 317
Top = 0
Width = 658
ActivePage = NewDependPage
ActivePage = AddEditorFilePage
Align = alClient
TabIndex = 1
TabIndex = 0
TabOrder = 0
OnChange = NotebookChange
object AddEditorFilePage: TTabSheet
Caption = 'AddEditorFilePage'
ClientHeight = 273
ClientWidth = 590
ClientHeight = 282
ClientWidth = 650
object AddFileLabel: TLabel
Left = 6
Height = 15
Height = 18
Top = 6
Width = 578
Width = 638
Align = alTop
BorderSpacing.Around = 6
Caption = 'AddFileLabel'
@ -38,9 +38,9 @@ object AddToProjectDialog: TAddToProjectDialog
end
object AddFileListView: TListView
Left = 6
Height = 238
Top = 27
Width = 578
Height = 244
Top = 30
Width = 638
Align = alTop
Anchors = [akTop, akLeft, akRight, akBottom]
AutoWidthLastColumn = True
@ -55,118 +55,16 @@ object AddToProjectDialog: TAddToProjectDialog
OnSelectItem = AddFileListViewSelectItem
end
end
object NewDependPage: TTabSheet
Caption = 'NewDependPage'
ClientHeight = 282
ClientWidth = 650
object DependPkgNameLabel: TLabel
AnchorSideTop.Control = DependPkgNameFilter
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = DependPkgNameFilter
Left = 141
Height = 18
Top = 15
Width = 141
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
Caption = 'DependPkgNameLabel'
ParentColor = False
end
object DependMinVersionLabel: TLabel
AnchorSideTop.Control = DependMinVersionEdit
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = DependMinVersionEdit
Left = 132
Height = 18
Top = 209
Width = 150
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
Caption = 'DependMinVersionLabel'
ParentColor = False
end
object DependMaxVersionLabel: TLabel
AnchorSideTop.Control = DependMaxVersionEdit
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = DependMaxVersionEdit
Left = 129
Height = 18
Top = 247
Width = 153
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
Caption = 'DependMaxVersionLabel'
ParentColor = False
end
object DependMinVersionEdit: TEdit
AnchorSideLeft.Control = DependPkgNameListBox
AnchorSideRight.Control = DependPkgNameListBox
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = DependMaxVersionEdit
Left = 288
Height = 32
Top = 202
Width = 250
Anchors = [akLeft, akRight, akBottom]
BorderSpacing.Top = 6
BorderSpacing.Bottom = 6
TabOrder = 2
Text = 'DependMinVersionEdit'
end
object DependMaxVersionEdit: TEdit
AnchorSideLeft.Control = DependMinVersionEdit
AnchorSideRight.Control = DependPkgNameListBox
AnchorSideRight.Side = asrBottom
Left = 288
Height = 32
Top = 240
Width = 250
Anchors = [akLeft, akRight, akBottom]
BorderSpacing.Top = 6
TabOrder = 3
Text = 'DependMaxVersionEdit'
end
object DependPkgNameListBox: TListBox
AnchorSideLeft.Control = DependPkgNameFilter
AnchorSideTop.Control = DependPkgNameFilter
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = DependPkgNameFilter
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = DependMinVersionEdit
Left = 288
Height = 150
Top = 46
Width = 250
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 6
BorderSpacing.Bottom = 6
ItemHeight = 0
OnSelectionChange = DependPkgNameListBoxSelectionChange
TabOrder = 1
end
object DependPkgNameFilter: TListFilterEdit
Left = 288
Height = 32
Top = 8
Width = 250
ButtonWidth = 23
NumGlyphs = 1
Anchors = [akTop]
MaxLength = 0
TabOrder = 0
FilteredListbox = DependPkgNameListBox
end
end
object AddFilesPage: TTabSheet
Caption = 'AddFilesPage'
ClientHeight = 263
ClientWidth = 590
ClientHeight = 282
ClientWidth = 650
object FilesListView: TListView
AnchorSideBottom.Control = FilesDirButton
Left = 6
Height = 216
Height = 235
Top = 6
Width = 578
Width = 638
Anchors = [akTop, akLeft, akRight, akBottom]
AutoWidthLastColumn = True
BorderSpacing.Around = 6
@ -185,7 +83,7 @@ object AddToProjectDialog: TAddToProjectDialog
AnchorSideBottom.Side = asrBottom
Left = 6
Height = 29
Top = 228
Top = 247
Width = 101
Anchors = [akLeft, akBottom]
AutoSize = True
@ -201,7 +99,7 @@ object AddToProjectDialog: TAddToProjectDialog
AnchorSideTop.Side = asrCenter
Left = 113
Height = 29
Top = 228
Top = 247
Width = 132
AutoSize = True
BorderSpacing.Around = 6
@ -216,7 +114,7 @@ object AddToProjectDialog: TAddToProjectDialog
AnchorSideTop.Side = asrCenter
Left = 251
Height = 29
Top = 228
Top = 247
Width = 123
AutoSize = True
BorderSpacing.Around = 6

View File

@ -37,26 +37,22 @@ uses
Classes, SysUtils, AVL_Tree,
// LCL
Forms, Controls, Buttons, ComCtrls, StdCtrls, Dialogs, ButtonPanel,
ListFilterEdit,
// LazUtils
FileUtil, LazFileUtils,
// IDEIntf
IDEWindowIntf, PackageIntf, IDEDialogs,
IDEWindowIntf, PackageIntf,
// IDE
LazarusIDEStrConsts, Project, InputHistory, PackageDefs, PackageSystem,
ProjPackChecks;
LazarusIDEStrConsts, Project, InputHistory, PackageDefs, ProjPackChecks;
type
TAddToProjectType = (
a2pFiles,
a2pRequiredPkg,
a2pEditorFiles
);
TAddToProjectResult = class
public
AddType: TAddToProjectType;
Dependency: TPkgDependency;
FileNames: TStrings;
destructor Destroy; override;
end;
@ -69,21 +65,12 @@ type
FilesDeleteButton: TBitBtn;
FilesDirButton: TBitBtn;
FilesShortenButton: TBitBtn;
DependPkgNameListBox: TListBox;
DependPkgNameFilter: TListFilterEdit;
// notebook
NoteBook: TPageControl;
AddEditorFilePage: TTabSheet;
NewDependPage: TTabSheet;
AddFilesPage: TTabSheet;
// add file page
AddFileLabel: TLabel;
// new required package
DependPkgNameLabel: TLabel;
DependMinVersionLabel: TLabel;
DependMinVersionEdit: TEdit;
DependMaxVersionLabel: TLabel;
DependMaxVersionEdit: TEdit;
// add files page
FilesListView: TListView;
procedure AddFileButtonClick(Sender: TObject);
@ -92,11 +79,9 @@ type
procedure AddToProjectDialogClose(Sender: TObject;
var {%H-}CloseAction: TCloseAction);
procedure AddToProjectDialogShow(Sender: TObject);
procedure DependPkgNameListBoxSelectionChange(Sender: TObject; {%H-}User: boolean);
procedure FilesDirButtonClick(Sender: TObject);
procedure FilesListViewSelectItem(Sender: TObject; {%H-}Item: TListItem;
{%H-}Selected: Boolean);
procedure NewDependButtonClick(Sender: TObject);
procedure FilesAddButtonClick(Sender: TObject);
procedure FilesDeleteButtonClick(Sender: TObject);
procedure FilesShortenButtonClick(Sender: TObject);
@ -106,17 +91,13 @@ type
fProject: TProject;
procedure SetupComponents;
procedure SetupAddEditorFilePage;
procedure SetupAddRequirementPage;
procedure SetupAddFilesPage;
function CheckNewReqOk: Boolean;
procedure OnIteratePackages(APackageID: TLazPackageID);
procedure UpdateAvailableFiles;
procedure UpdateFilesButtons;
public
AddResult: TAddToProjectResult;
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure UpdateAvailableDependencyNames;
procedure UpdateAvailableFiles;
procedure UpdateFilesButtons;
end;
function ShowAddToProjectDlg(AProject: TProject;
@ -136,12 +117,10 @@ begin
AddToProjectDialog:=TAddToProjectDialog.Create(nil);
AddToProjectDialog.fProject:=AProject;
AddToProjectDialog.UpdateAvailableFiles;
AddToProjectDialog.UpdateAvailableDependencyNames;
case AInitTab of
a2pFiles: AddToProjectDialog.NoteBook.ActivePageIndex:=2;
a2pFiles: AddToProjectDialog.NoteBook.ActivePageIndex:=1;
a2pEditorFiles: AddToProjectDialog.NoteBook.ActivePageIndex:=0;
a2pRequiredPkg: AddToProjectDialog.NoteBook.ActivePageIndex:=1;
end;
// hide tabs for simple look
AddToProjectDialog.NoteBook.ShowTabs:=false;
@ -173,12 +152,6 @@ begin
SelectNext(NoteBook.ActivePage, True, True);
end;
procedure TAddToProjectDialog.DependPkgNameListBoxSelectionChange(Sender: TObject;
User: boolean);
begin
CheckNewReqOk;
end;
procedure TAddToProjectDialog.FilesDirButtonClick(Sender: TObject);
var
DirDlg: TSelectDirectoryDialog;
@ -221,52 +194,6 @@ begin
UpdateFilesButtons;
end;
procedure TAddToProjectDialog.NewDependButtonClick(Sender: TObject);
var
NewDependency: TPkgDependency;
begin
NewDependency:=TPkgDependency.Create;
try
// check minimum version
if DependMinVersionEdit.Text<>'' then begin
if not NewDependency.MinVersion.ReadString(DependMinVersionEdit.Text) then
begin
IDEMessageDialog(lisProjAddInvalidVersion,
Format(lisProjAddTheMinimumVersionIsInvalid,
[DependMinVersionEdit.Text, LineEnding, LineEnding]),
mtError,[mbCancel]);
exit;
end;
NewDependency.Flags:=NewDependency.Flags+[pdfMinVersion];
end;
// check maximum version
if DependMaxVersionEdit.Text<>'' then begin
if not NewDependency.MaxVersion.ReadString(DependMaxVersionEdit.Text) then
begin
IDEMessageDialog(lisProjAddInvalidVersion,
Format(lisProjAddTheMaximumVersionIsInvalid,
[DependMaxVersionEdit.Text, LineEnding, LineEnding]),
mtError,[mbCancel]);
exit;
end;
NewDependency.Flags:=NewDependency.Flags+[pdfMaxVersion];
end;
NewDependency.PackageName:=DependPkgNameListBox.Items[DependPkgNameListBox.ItemIndex];
if not CheckAddingProjectDependency(fProject,NewDependency) then exit;
// ok
AddResult:=TAddToProjectResult.Create;
AddResult.Dependency:=NewDependency;
NewDependency:=nil;
AddResult.AddType:=a2pRequiredPkg;
ModalResult:=mrOk;
finally
NewDependency.Free;
end;
end;
procedure TAddToProjectDialog.AddFileButtonClick(Sender: TObject);
var
i: Integer;
@ -372,12 +299,7 @@ begin
ButtonPanel.OkButton.OnClick:=@AddFileButtonClick;
ButtonPanel.OkButton.Enabled:=AddFileListView.SelCount>0;
end;
1: begin // New Requirement
ButtonPanel.OkButton.Caption:=lisA2PCreateNewReq;
ButtonPanel.OkButton.OnClick:=@NewDependButtonClick;
CheckNewReqOk;
end;
2: begin // Add Files
1: begin // Add Files
ButtonPanel.OkButton.Caption:=lisProjAddAddFilesToProject;
ButtonPanel.OkButton.OnClick:=@FilesAddButtonClick;
UpdateFilesButtons;
@ -393,7 +315,6 @@ begin
NotebookChange(NoteBook);
SetupAddEditorFilePage;
SetupAddRequirementPage;
SetupAddFilesPage;
end;
@ -407,16 +328,6 @@ begin
CurColumn.Caption:=lisA2PFilename2;
end;
procedure TAddToProjectDialog.SetupAddRequirementPage;
begin
NewDependPage.Caption := lisProjAddNewRequirement;
DependPkgNameLabel.Caption:=lisProjAddPackageName;
DependMinVersionLabel.Caption:=lisProjAddMinimumVersionOptional;
DependMinVersionEdit.Text:='';
DependMaxVersionLabel.Caption:=lisProjAddMaximumVersionOptional;
DependMaxVersionEdit.Text:='';
end;
procedure TAddToProjectDialog.SetupAddFilesPage;
var
CurColumn: TListColumn;
@ -450,18 +361,6 @@ begin
UpdateFilesButtons;
end;
function TAddToProjectDialog.CheckNewReqOk: Boolean;
begin
Result:=DependPkgNameListBox.ItemIndex>-1;
ButtonPanel.OkButton.Enabled:=Result;
end;
procedure TAddToProjectDialog.OnIteratePackages(APackageID: TLazPackageID);
begin
if (fPackages.Find(APackageID)=nil) then
fPackages.Add(APackageID);
end;
constructor TAddToProjectDialog.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
@ -477,24 +376,6 @@ begin
inherited Destroy;
end;
procedure TAddToProjectDialog.UpdateAvailableDependencyNames;
var
ANode: TAVLTreeNode;
sl: TStringList;
begin
fPackages.Clear;
PackageGraph.IteratePackages(fpfSearchAllExisting,@OnIteratePackages);
sl:=TStringList.Create;
ANode:=fPackages.FindLowest;
while ANode<>nil do begin
sl.Add(TLazPackageID(ANode.Data).Name);
ANode:=fPackages.FindSuccessor(ANode);
end;
DependPkgNameFilter.Items.Assign(sl);
DependPkgNameFilter.InvalidateFilter;
sl.Free;
end;
procedure TAddToProjectDialog.UpdateAvailableFiles;
var
CurFile: TUnitInfo;

View File

@ -63,7 +63,8 @@ uses
PackageIntf,
// IDE
LazarusIDEStrConsts, IDEProcs, DialogProcs, IDEOptionDefs, EnvironmentOpts,
PackageDefs, Project, PackageEditor, AddToProjectDlg, InputHistory, ProjPackChecks;
PackageDefs, Project, PackageEditor, AddToProjectDlg, AddPkgDependencyDlg,
InputHistory, ProjPackChecks;
type
TOnAddUnitToProject =
@ -173,6 +174,7 @@ type
procedure AddMenuItemClick(Sender: TObject);
function AddOneFile(aFilename: string): TModalResult;
procedure DoAddMoreDialog(AInitTab: TAddToProjectType);
procedure DoAddDepDialog;
procedure FreeNodeData(Typ: TPENodeType);
function CreateNodeData(Typ: TPENodeType; aName: string; aRemoved: boolean): TPENodeData;
procedure SetDependencyDefaultFilename(AsPreferred: boolean);
@ -373,7 +375,7 @@ end;
procedure TProjectInspectorForm.mnuAddReqClick(Sender: TObject);
begin
DoAddMoreDialog(a2pRequiredPkg);
DoAddDepDialog;
end;
procedure TProjectInspectorForm.MoveDependencyUpClick(Sender: TObject);
@ -490,17 +492,6 @@ begin
UpdateAll;
EndUpdate;
end;
a2pRequiredPkg:
begin
BeginUpdate;
if Assigned(OnAddDependency) then
OnAddDependency(Self,AddResult.Dependency);
FNextSelectedPart:=AddResult.Dependency;
UpdateRequiredPackages;
EndUpdate;
end;
else
Showmessage('Not implemented');
end;
@ -508,6 +499,29 @@ begin
AddResult.Free;
end;
procedure TProjectInspectorForm.DoAddDepDialog;
var
Deps: TPkgDependencyList;
i: Integer;
Resu: TModalResult;
begin
Resu:=ShowAddPkgDependencyDlg(LazProject, Deps);
try
if (Resu<>mrOK) or (Deps.Count=0) then exit;
BeginUpdate;
for i := 0 to Deps.Count-1 do
begin
if Assigned(OnAddDependency) then
OnAddDependency(Self, Deps[i]);
end;
FNextSelectedPart:=Deps[Deps.Count];
UpdateRequiredPackages;
EndUpdate;
finally
Deps.Free;
end;
end;
procedure TProjectInspectorForm.CopyMoveToDirMenuItemClick(Sender: TObject);
begin
OnCopyMoveFiles(Self);

View File

@ -0,0 +1,135 @@
object AddPkgDependencyDialog: TAddPkgDependencyDialog
Left = 466
Height = 374
Top = 122
Width = 570
Caption = 'AddPkgDependencyDialog'
ClientHeight = 374
ClientWidth = 570
LCLVersion = '1.7'
object DependPkgNameLabel: TLabel
AnchorSideTop.Control = DependPkgNameFilter
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = DependPkgNameFilter
Left = 141
Height = 18
Top = 23
Width = 141
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
BorderSpacing.CellAlignHorizontal = ccaLeftTop
BorderSpacing.CellAlignVertical = ccaCenter
Caption = 'DependPkgNameLabel'
ParentColor = False
end
object DependPkgNameFilter: TListFilterEdit
AnchorSideRight.Side = asrBottom
Left = 288
Height = 32
Top = 16
Width = 256
ButtonWidth = 23
NumGlyphs = 1
Anchors = [akTop]
AutoSize = False
MaxLength = 0
TabOrder = 0
FilteredListbox = DependPkgNameListBox
end
object DependPkgNameListBox: TListBox
AnchorSideLeft.Control = DependPkgNameFilter
AnchorSideTop.Control = DependPkgNameFilter
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = DependPkgNameFilter
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = DependMinVersionEdit
Left = 288
Height = 174
Top = 54
Width = 256
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 6
BorderSpacing.Bottom = 6
ItemHeight = 0
MultiSelect = True
TabOrder = 1
end
object DependMinVersionEdit: TEdit
AnchorSideLeft.Control = DependPkgNameListBox
AnchorSideRight.Control = DependPkgNameListBox
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = DependMaxVersionEdit
Left = 288
Height = 32
Top = 234
Width = 256
Anchors = [akLeft, akRight, akBottom]
AutoSize = False
BorderSpacing.Top = 6
TabOrder = 2
Text = 'DependMinVersionEdit'
end
object DependMaxVersionEdit: TEdit
AnchorSideLeft.Control = DependMinVersionEdit
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = DependPkgNameListBox
AnchorSideRight.Side = asrBottom
Left = 288
Height = 32
Top = 272
Width = 256
Anchors = [akLeft, akRight, akBottom]
AutoSize = False
BorderSpacing.Top = 6
TabOrder = 3
Text = 'DependMaxVersionEdit'
end
object DependMinVersionLabel: TLabel
AnchorSideTop.Control = DependMinVersionEdit
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = DependMinVersionEdit
Left = 132
Height = 18
Top = 241
Width = 150
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
BorderSpacing.CellAlignHorizontal = ccaLeftTop
BorderSpacing.CellAlignVertical = ccaCenter
Caption = 'DependMinVersionLabel'
ParentColor = False
end
object DependMaxVersionLabel: TLabel
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = DependMaxVersionEdit
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = DependMaxVersionEdit
Left = 129
Height = 18
Top = 279
Width = 153
Anchors = [akTop, akRight]
BorderSpacing.Right = 6
BorderSpacing.CellAlignHorizontal = ccaLeftTop
BorderSpacing.CellAlignVertical = ccaCenter
Caption = 'DependMaxVersionLabel'
ParentColor = False
end
object ButtonPanel1: TButtonPanel
Left = 6
Height = 37
Top = 331
Width = 558
OKButton.Name = 'OKButton'
OKButton.DefaultCaption = True
OKButton.OnClick = OKButtonClick
HelpButton.Name = 'HelpButton'
HelpButton.DefaultCaption = True
CloseButton.Name = 'CloseButton'
CloseButton.DefaultCaption = True
CancelButton.Name = 'CancelButton'
CancelButton.DefaultCaption = True
TabOrder = 4
ShowButtons = [pbOK, pbCancel, pbHelp]
end
end

View File

@ -0,0 +1,200 @@
unit AddPkgDependencyDlg;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, AVL_Tree, fgl,
// LCL
Forms, Controls, Graphics, Dialogs, StdCtrls, ButtonPanel, LCLProc,
// LazControls
ListFilterEdit,
// LazUtils
FileUtil,
// IDEIntf
IDEWindowIntf, PackageIntf, ProjPackIntf, IDEDialogs,
// IDE
LazarusIDEStrConsts, InputHistory, PackageDefs, PackageSystem,
ProjPackBase, ProjPackChecks;
type
TPkgDependencyList = specialize TFPGList<TPkgDependency>;
{ TAddPkgDependencyDialog }
TAddPkgDependencyDialog = class(TForm)
ButtonPanel1: TButtonPanel;
DependMaxVersionEdit: TEdit;
DependMaxVersionLabel: TLabel;
DependMinVersionEdit: TEdit;
DependMinVersionLabel: TLabel;
DependPkgNameFilter: TListFilterEdit;
DependPkgNameLabel: TLabel;
DependPkgNameListBox: TListBox;
procedure OKButtonClick(Sender: TObject);
private
fPackages: TAVLTree; // tree of TLazPackage or TPackageLink
fProjPack: IProjPack;
fResultDependencies: TPkgDependencyList;
procedure AddUniquePackagesToList(APackageID: TLazPackageID);
procedure UpdateAvailableDependencyNames;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
end;
var
AddPkgDependencyDialog: TAddPkgDependencyDialog;
function ShowAddPkgDependencyDlg(AProjPack: IProjPack;
out AResultDependencies: TPkgDependencyList): TModalResult;
implementation
{$R *.lfm}
function ShowAddPkgDependencyDlg(AProjPack: IProjPack;
out AResultDependencies: TPkgDependencyList): TModalResult;
var
AddDepDialog: TAddPkgDependencyDialog;
begin
AddDepDialog:=TAddPkgDependencyDialog.Create(nil);
AddDepDialog.fProjPack:=AProjPack;
AddDepDialog.UpdateAvailableDependencyNames;
Result:=AddDepDialog.ShowModal;
if Result=mrOk then begin
AResultDependencies:=AddDepDialog.fResultDependencies;
AddDepDialog.fResultDependencies:=nil;
end else begin
AResultDependencies:=nil;
end;
AddDepDialog.Free;
end;
{ TAddPkgDependencyDialog }
constructor TAddPkgDependencyDialog.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
Caption:=lisProjAddNewRequirement;
fPackages:=TAVLTree.Create(@CompareLazPackageIDNames);
IDEDialogLayoutList.ApplyLayout(Self,500,300);
DependPkgNameLabel.Caption:=lisProjAddPackageName;
DependMinVersionLabel.Caption:=lisProjAddMinimumVersionOptional;
DependMinVersionEdit.Text:='';
DependMaxVersionLabel.Caption:=lisProjAddMaximumVersionOptional;
DependMaxVersionEdit.Text:='';
end;
destructor TAddPkgDependencyDialog.Destroy;
begin
FreeAndNil(fPackages);
inherited Destroy;
end;
procedure TAddPkgDependencyDialog.AddUniquePackagesToList(APackageID: TLazPackageID);
begin
if (APackageID.IDAsString<>fProjPack.IDAsString) and (fPackages.Find(APackageID)=Nil) then
fPackages.Add(APackageID);
end;
procedure TAddPkgDependencyDialog.UpdateAvailableDependencyNames;
var
ANode: TAVLTreeNode;
sl: TStringList;
begin
fPackages.Clear;
PackageGraph.IteratePackages(fpfSearchAllExisting,@AddUniquePackagesToList);
sl:=TStringList.Create;
try
ANode:=fPackages.FindLowest;
while ANode<>nil do begin
sl.Add(TLazPackageID(ANode.Data).Name);
ANode:=fPackages.FindSuccessor(ANode);
end;
DependPkgNameFilter.Items.Assign(sl);
DependPkgNameFilter.InvalidateFilter;
finally
sl.Free;
end;
end;
procedure TAddPkgDependencyDialog.OKButtonClick(Sender: TObject);
var
NewDependency: TPkgDependency;
MinVerTest, MaxVerTest: TPkgVersion;
MinMaxVerFlags: TPkgDependencyFlags;
i: Integer;
begin
MinVerTest := Nil;
MaxVerTest := Nil;
MinMaxVerFlags := [];
try
// check minimum version
if DependMinVersionEdit.Text <> '' then
begin
MinVerTest := TPkgVersion.Create;
if not MinVerTest.ReadString(DependMinVersionEdit.Text) then
begin
IDEMessageDialog(lisProjAddInvalidVersion,
Format(lisProjAddTheMinimumVersionIsInvalid,
[DependMinVersionEdit.Text, LineEnding, LineEnding]),
mtError,[mbCancel]);
exit;
end;
MinMaxVerFlags := [pdfMinVersion];
end;
// check maximum version
if DependMaxVersionEdit.Text <> '' then
begin
MaxVerTest := TPkgVersion.Create;
if not MaxVerTest.ReadString(DependMaxVersionEdit.Text) then
begin
IDEMessageDialog(lisProjAddInvalidVersion,
Format(lisProjAddTheMaximumVersionIsInvalid,
[DependMaxVersionEdit.Text, LineEnding, LineEnding]),
mtError,[mbCancel]);
exit;
end;
MinMaxVerFlags := MinMaxVerFlags + [pdfMaxVersion];
end;
// Add all selected packages.
fResultDependencies := TPkgDependencyList.Create; // Will be freed by the caller.
DebugLn(['TAddPkgDependencyDialog.OKButtonClick: ListBox.SelCount=', DependPkgNameListBox.SelCount]);
if DependPkgNameListBox.SelCount > 0 then
begin
for i := 0 to DependPkgNameListBox.Count-1 do
begin
DebugLn(['TAddPkgDependencyDialog.OKButtonClick: Iterating ', DependPkgNameListBox.Items[i]]);
if DependPkgNameListBox.Selected[i] then
begin
DebugLn(['TAddPkgDependencyDialog.OKButtonClick: ', DependPkgNameListBox.Items[i], ' is selected.']);
NewDependency := TPkgDependency.Create; // Will be added to package graph.
NewDependency.PackageName := DependPkgNameListBox.Items[i];
if Assigned(MinVerTest) then
NewDependency.MinVersion.Assign(MinVerTest);
if Assigned(MaxVerTest) then
NewDependency.MaxVersion.Assign(MaxVerTest);
NewDependency.Flags := NewDependency.Flags + MinMaxVerFlags;
DebugLn(['TAddPkgDependencyDialog.OKButtonClick: Checking ', DependPkgNameListBox.Items[i], ' ...']);
if not CheckAddingDependency(fProjPack, NewDependency) then exit;
DebugLn(['TAddPkgDependencyDialog.OKButtonClick: Adding ', DependPkgNameListBox.Items[i], ' to result.']);
fResultDependencies.Add(NewDependency);
NewDependency := nil;
end;
end;
end;
ModalResult := mrOk;
finally
MinVerTest.Free;
MaxVerTest.Free;
end;
end;
end.

View File

@ -20,9 +20,9 @@ object AddToPackageDlg: TAddToPackageDlg
Height = 316
Top = 0
Width = 658
ActivePage = NewRequirementPage
ActivePage = NewComponentPage
Align = alClient
TabIndex = 1
TabIndex = 0
TabOrder = 0
OnChange = PageControl1Change
object NewComponentPage: TTabSheet
@ -250,134 +250,6 @@ object AddToPackageDlg: TAddToPackageDlg
ParentColor = False
end
end
object NewRequirementPage: TTabSheet
Caption = 'New Requirement'
ClientHeight = 281
ClientWidth = 650
object NewDepPanel: TPanel
Left = 0
Height = 281
Top = 0
Width = 650
Align = alClient
BevelOuter = bvNone
ChildSizing.LeftRightSpacing = 6
ChildSizing.TopBottomSpacing = 6
ChildSizing.HorizontalSpacing = 6
ChildSizing.VerticalSpacing = 6
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 2
ClientHeight = 281
ClientWidth = 650
TabOrder = 0
object DependPkgNameLabel: TLabel
AnchorSideTop.Control = DependPkgNameFilter
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = DependPkgNameFilter
Left = 141
Height = 18
Top = 15
Width = 141
Anchors = [akTop, akRight]
BorderSpacing.CellAlignHorizontal = ccaLeftTop
BorderSpacing.CellAlignVertical = ccaCenter
Caption = 'DependPkgNameLabel'
ParentColor = False
end
object DependMinVersionLabel: TLabel
AnchorSideTop.Control = DependMinVersionEdit
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = DependMinVersionEdit
Left = 132
Height = 18
Top = 207
Width = 150
Anchors = [akTop, akRight]
BorderSpacing.CellAlignHorizontal = ccaLeftTop
BorderSpacing.CellAlignVertical = ccaCenter
Caption = 'DependMinVersionLabel'
ParentColor = False
end
object DependMinVersionEdit: TEdit
AnchorSideLeft.Control = DependPkgNameListBox
AnchorSideRight.Control = DependPkgNameListBox
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = DependMaxVersionEdit
Left = 288
Height = 32
Top = 200
Width = 256
Anchors = [akLeft, akRight, akBottom]
AutoSize = False
BorderSpacing.Top = 6
TabOrder = 2
Text = 'DependMinVersionEdit'
end
object DependMaxVersionLabel: TLabel
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = DependMaxVersionEdit
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = DependMaxVersionEdit
Left = 129
Height = 18
Top = 245
Width = 153
Anchors = [akTop, akRight]
BorderSpacing.CellAlignHorizontal = ccaLeftTop
BorderSpacing.CellAlignVertical = ccaCenter
Caption = 'DependMaxVersionLabel'
ParentColor = False
end
object DependMaxVersionEdit: TEdit
AnchorSideLeft.Control = DependMinVersionEdit
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = DependPkgNameListBox
AnchorSideRight.Side = asrBottom
Left = 288
Height = 32
Top = 238
Width = 256
Anchors = [akLeft, akRight, akBottom]
AutoSize = False
BorderSpacing.Top = 6
TabOrder = 3
Text = 'DependMaxVersionEdit'
end
object DependPkgNameFilter: TListFilterEdit
AnchorSideRight.Control = DependPkgNameListBox
AnchorSideRight.Side = asrBottom
Left = 288
Height = 32
Top = 8
Width = 256
ButtonWidth = 23
NumGlyphs = 1
Anchors = [akTop]
AutoSize = False
MaxLength = 0
TabOrder = 0
FilteredListbox = DependPkgNameListBox
end
object DependPkgNameListBox: TListBox
AnchorSideLeft.Control = DependPkgNameFilter
AnchorSideTop.Control = DependPkgNameFilter
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = DependPkgNameFilter
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = DependMinVersionEdit
Left = 288
Height = 148
Top = 46
Width = 256
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 6
BorderSpacing.Bottom = 6
ItemHeight = 0
OnSelectionChange = DependPkgNameListBoxSelectionChange
TabOrder = 1
end
end
end
object AddFilesPage: TTabSheet
Caption = 'Add Files'
ClientHeight = 281

View File

@ -34,7 +34,6 @@ uses
// LCL
LCLProc, LCLType, Forms, Controls, Buttons, ExtDlgs, StdCtrls, ExtCtrls,
Dialogs, ComCtrls, ButtonPanel,
ListFilterEdit,
// LazUtils
FileUtil, LazFileUtils,
// IDEIntf
@ -91,21 +90,12 @@ type
ComponentUnitFileShortenButton: TButton;
ComponentUnitNameEdit: TEdit;
ComponentUnitNameLabel: TLabel;
DependMaxVersionEdit: TEdit;
DependMaxVersionLabel: TLabel;
DependMinVersionEdit: TEdit;
DependMinVersionLabel: TLabel;
DependPkgNameLabel: TLabel;
FilesDeleteButton: TBitBtn;
FilesDirButton: TBitBtn;
FilesListView: TListView;
FilesShortenButton: TBitBtn;
LabelIconInfo: TLabel;
DependPkgNameListBox: TListBox;
DependPkgNameFilter: TListFilterEdit;
NewComponentPage: TTabSheet;
NewDepPanel: TPanel;
NewRequirementPage: TTabSheet;
PageControl1: TPageControl;
PalettePageCombobox: TComboBox;
PalettePageLabel: TLabel;
@ -121,7 +111,6 @@ type
procedure ComponentUnitFileBrowseButtonClick(Sender: TObject);
procedure ComponentUnitFileShortenButtonClick(Sender: TObject);
procedure ComponentUnitNameEditChange(Sender: TObject);
procedure DependPkgNameListBoxSelectionChange(Sender: TObject; {%H-}User: boolean);
procedure FilesAddButtonClick(Sender: TObject);
procedure FilesDeleteButtonClick(Sender: TObject);
procedure FilesDirButtonClick(Sender: TObject);
@ -132,7 +121,6 @@ type
procedure FormShow(Sender: TObject);
procedure NewComponentButtonClick(Sender: TObject);
procedure NewComponentPageResize(Sender: TObject);
procedure NewDependButtonClick(Sender: TObject);
procedure PageControl1Change(Sender: TObject);
private
fLastNewComponentAncestorType: string;
@ -148,12 +136,9 @@ type
procedure SetLazPackage(const AValue: TLazPackage);
procedure SetupComponents;
procedure SetupNewComponentPage;
procedure SetupAddDependencyPage;
procedure SetupAddFilesPage;
procedure OnIterateComponentClasses(PkgComponent: TPkgComponent);
procedure OnIteratePackages(APackageID: TLazPackageID);
function CheckNewCompOk: Boolean;
function CheckNewReqOk: Boolean;
function CheckFilesButtonsOk: Boolean;
procedure AutoCompleteNewComponent;
procedure AutoCompleteNewComponentUnitName;
@ -164,7 +149,6 @@ type
Params: TAddToPkgResult;
procedure UpdateAvailableAncestorTypes;
procedure UpdateAvailablePageNames;
procedure UpdateAvailableDependencyNames;
public
property LazPackage: TLazPackage read FLazPackage write SetLazPackage;
property OnGetIDEFileInfo: TGetIDEFileStateEvent read FOnGetIDEFileInfo
@ -326,11 +310,6 @@ begin
CheckNewCompOk;
end;
procedure TAddToPackageDlg.DependPkgNameListBoxSelectionChange(Sender: TObject; User: boolean);
begin
CheckNewReqOk;
end;
procedure TAddToPackageDlg.FilesAddButtonClick(Sender: TObject);
var
i: Integer;
@ -634,52 +613,6 @@ begin
AncestorComboBox.Left:=x+6;
end;
procedure TAddToPackageDlg.NewDependButtonClick(Sender: TObject);
var
NewDependency: TPkgDependency;
begin
Params.Clear;
Params.AddType:=d2ptRequiredPkg;
NewDependency:=TPkgDependency.Create;
try
// check minimum version
if DependMinVersionEdit.Text<>'' then begin
if not NewDependency.MinVersion.ReadString(DependMinVersionEdit.Text) then
begin
IDEMessageDialog(lisProjAddInvalidVersion,
Format(lisA2PTheMinimumVersionIsInvalidPleaseUseTheFormatMajor,
[DependMinVersionEdit.Text, LineEnding, LineEnding]),
mtError,[mbCancel]);
exit;
end;
NewDependency.Flags:=NewDependency.Flags+[pdfMinVersion];
end;
// check maximum version
if DependMaxVersionEdit.Text<>'' then begin
if not NewDependency.MaxVersion.ReadString(DependMaxVersionEdit.Text) then
begin
IDEMessageDialog(lisProjAddInvalidVersion,
Format(lisA2PTheMaximumVersionIsInvalidPleaseUseTheFormatMajor,
[DependMaxVersionEdit.Text, LineEnding, LineEnding]),
mtError,[mbCancel]);
exit;
end;
NewDependency.Flags:=NewDependency.Flags+[pdfMaxVersion];
end;
NewDependency.PackageName:=DependPkgNameListBox.Items[DependPkgNameListBox.ItemIndex];
ModalResult:=CheckAddingPackageDependency(LazPackage,NewDependency,false,true);
if ModalResult<>mrOk then exit;
// ok
Params.Dependency:=NewDependency;
NewDependency:=nil;
finally
NewDependency.Free;
end;
end;
procedure TAddToPackageDlg.SetLazPackage(const AValue: TLazPackage);
begin
if FLazPackage=AValue then exit;
@ -687,29 +620,23 @@ begin
Params.Pkg:=FLazPackage;
UpdateAvailableAncestorTypes;
UpdateAvailablePageNames;
UpdateAvailableDependencyNames;
end;
function TAddToPackageDlg.GetActivatePage: TAddToPkgType;
begin
if PageControl1.ActivePage=NewComponentPage then
Result:=d2ptNewComponent
else if PageControl1.ActivePage=NewRequirementPage then
Result:=d2ptRequiredPkg
else {if PageControl1.ActivePage=AddFilesPage then } begin
Assert(PageControl1.ActivePage=AddFilesPage,
'TAddToPackageDlg.GetActivatePage: PageControl1.ActivePage <> AddFilesPage');
Result:=d2ptFiles;
end;
//else
// Result:=d2ptNewFile;
end;
procedure TAddToPackageDlg.SetActivatePage(AValue: TAddToPkgType);
begin
case AValue of
d2ptNewComponent: PageControl1.ActivePage:=NewComponentPage;
d2ptRequiredPkg: PageControl1.ActivePage:=NewRequirementPage;
d2ptFiles: PageControl1.ActivePage:=AddFilesPage;
else raise Exception.Create('TAddToPackageDlg.SetActivatePage: invalid value.');
end;
@ -721,12 +648,6 @@ begin
ButtonPanel1.OKButton.Enabled:=Result;
end;
function TAddToPackageDlg.CheckNewReqOk: Boolean;
begin
Result:=DependPkgNameListBox.ItemIndex>-1;
ButtonPanel1.OKButton.Enabled:=Result;
end;
procedure TAddToPackageDlg.PageControl1Change(Sender: TObject);
begin
case PageControl1.PageIndex of
@ -735,12 +656,7 @@ begin
ButtonPanel1.OkButton.OnClick:=@NewComponentButtonClick;
CheckNewCompOk;
end;
1: begin // New Requirement
ButtonPanel1.OkButton.Caption:=lisA2PCreateNewReq;
ButtonPanel1.OkButton.OnClick:=@NewDependButtonClick;
CheckNewReqOk;
end;
2: begin // Add Files
1: begin // Add Files
ButtonPanel1.OkButton.Caption:=lisA2PAddFilesToPackage;
ButtonPanel1.OkButton.OnClick:=@FilesAddButtonClick;
CheckFilesButtonsOk;
@ -750,17 +666,12 @@ end;
procedure TAddToPackageDlg.SetupComponents;
begin
//NewFilePage.Caption:=lisA2PNewFile;
NewComponentPage.Caption:=lisA2PNewComponent;
NewRequirementPage.Caption:=lisProjAddNewRequirement;
AddFilesPage.Caption:=lisA2PAddFiles;
ButtonPanel1.CancelButton.Caption:=lisCancel;
PageControl1.PageIndex:=0;
PageControl1Change(PageControl1);
//SetupNewFilePage;
SetupNewComponentPage;
SetupAddDependencyPage;
SetupAddFilesPage;
end;
@ -792,15 +703,6 @@ begin
ComponentIconBitBtn.Height:=ComponentPaletteBtnHeight;
end;
procedure TAddToPackageDlg.SetupAddDependencyPage;
begin
DependPkgNameLabel.Caption:=lisProjAddPackageName;
DependMinVersionLabel.Caption:=lisProjAddMinimumVersionOptional;
DependMinVersionEdit.Text:='';
DependMaxVersionLabel.Caption:=lisProjAddMaximumVersionOptional;
DependMaxVersionEdit.Text:='';
end;
procedure TAddToPackageDlg.SetupAddFilesPage;
var
CurColumn: TListColumn;
@ -840,14 +742,6 @@ begin
fPkgComponents.Add(PkgComponent);
end;
procedure TAddToPackageDlg.OnIteratePackages(APackageID: TLazPackageID);
begin
if (APackageID<>LazPackage) and (fPackages.Find(APackageID)=nil) then begin
//DebugLn(['TAddToPackageDlg.OnIteratePackages ',APackageID.IDAsString,' ',DbgSName(APackageID)]);
fPackages.Add(APackageID);
end;
end;
procedure TAddToPackageDlg.AutoCompleteNewComponent;
var
PkgComponent: TPkgComponent;
@ -906,8 +800,7 @@ begin
ComponentUnitFileEdit.Text:=NewFileName;
end;
function TAddToPackageDlg.SwitchRelativeAbsoluteFilename(const Filename: string
): string;
function TAddToPackageDlg.SwitchRelativeAbsoluteFilename(const Filename: string): string;
begin
Result:=Filename;
if (not LazPackage.HasDirectory)
@ -1019,29 +912,6 @@ begin
sl.Free;
end;
procedure TAddToPackageDlg.UpdateAvailableDependencyNames;
var
ANode: TAVLTreeNode;
sl: TStringList;
PkgName: String;
Pkg: TLazPackage;
begin
fPackages.Clear;
PackageGraph.IteratePackages(fpfSearchAllExisting,@OnIteratePackages);
sl:=TStringList.Create;
ANode:=fPackages.FindLowest;
while ANode<>nil do begin
Pkg:=TLazPackage(ANode.Data);
PkgName:=Pkg.Name;
if (sl.IndexOf(PkgName)<0) then
sl.Add(PkgName);
ANode:=fPackages.FindSuccessor(ANode);
end;
DependPkgNameFilter.Items.Assign(sl);
DependPkgNameFilter.InvalidateFilter;
sl.Free;
end;
{ TAddToPkgResult }
procedure TAddToPkgResult.Clear;

View File

@ -47,8 +47,8 @@ uses
// IDE
MainBase, IDEProcs, LazarusIDEStrConsts, IDEDefs, CompilerOptions,
EnvironmentOpts, DialogProcs, InputHistory,
PackageDefs, AddToPackageDlg, PkgVirtualUnitEditor, MissingPkgFilesDlg,
PackageSystem, ProjPackChecks, CleanPkgDeps;
PackageDefs, AddToPackageDlg, AddPkgDependencyDlg, ProjPackChecks,
PkgVirtualUnitEditor, MissingPkgFilesDlg, PackageSystem, CleanPkgDeps;
const
PackageEditorMenuRootName = 'PackageEditor';
@ -373,6 +373,7 @@ type
procedure DoSortFiles;
function DoOpenPkgFile(PkgFile: TPkgFile): TModalResult;
function ShowAddDialog(var DlgPage: TAddToPkgType): TModalResult;
function ShowAddDepDialog: TModalResult;
public
// IFilesEditorInterface
function FilesEditTreeView: TTreeView;
@ -1065,7 +1066,7 @@ end;
procedure TPackageEditorForm.mnuAddNewReqrClick(Sender: TObject);
begin
ShowAddDialogEx(d2ptRequiredPkg);
ShowAddDepDialog;
end;
procedure TPackageEditorForm.mnuAddNewFileClick(Sender: TObject);
@ -2108,7 +2109,6 @@ begin
end;
end;
function TPackageEditorForm.ShowAddDialog(var DlgPage: TAddToPkgType): TModalResult;
var
IgnoreUnitPaths, IgnoreIncPaths: TFilenameToStringTree;
@ -2183,16 +2183,6 @@ var
PackageEditors.CreateNewFile(Self,AddParams);
end;
procedure AddRequiredPkg(AddParams: TAddToPkgResult);
begin
// add dependency
fForcedFlags:=[pefNeedUpdateRequiredPkgs];
PackageGraph.AddDependencyToPackage(LazPackage,AddParams.Dependency);
FreeAndNil(FNextSelectedPart);
FNextSelectedPart:=TPENodeData.Create(penDependency,
AddParams.Dependency.PackageName,false);
end;
procedure AddFile(AddParams: TAddToPkgResult);
begin
// add file
@ -2229,7 +2219,6 @@ begin
d2ptUnit: AddUnit(AddParams);
d2ptVirtualUnit: AddVirtualUnit(AddParams);
d2ptNewComponent: AddNewComponent(AddParams);
d2ptRequiredPkg: AddRequiredPkg(AddParams);
d2ptFile: AddFile(AddParams);
end;
OldParams:=AddParams;
@ -2238,7 +2227,7 @@ begin
OldParams.Free;
end;
AddParams.Free;
Assert(LazPackage.Modified, 'ShowAddDialog: LazPackage.Modified = False');
Assert(LazPackage.Modified, 'TPackageEditorForm.ShowAddDialog: LazPackage.Modified = False');
finally
IgnoreUnitPaths.Free;
IgnoreIncPaths.Free;
@ -2246,6 +2235,37 @@ begin
end;
end;
function TPackageEditorForm.ShowAddDepDialog: TModalResult;
var
Deps: TPkgDependencyList;
i: Integer;
begin
if LazPackage.ReadOnly then begin
UpdateButtons;
exit(mrCancel);
end;
Result:=ShowAddPkgDependencyDlg(LazPackage, Deps);
DebugLn(['TPackageEditorForm.ShowAddDepDialog: Deps.Count=', Deps.Count]);
try
if (Result<>mrOk) or (Deps.Count=0) then exit;
PackageGraph.BeginUpdate(false);
try
// add all dependencies
fForcedFlags := [pefNeedUpdateRequiredPkgs];
FreeAndNil(FNextSelectedPart);
for i := 0 to Deps.Count-1 do
PackageGraph.AddDependencyToPackage(LazPackage, Deps[i]);
FNextSelectedPart := TPENodeData.Create(penDependency,
Deps[Deps.Count-1].PackageName, false);
Assert(LazPackage.Modified, 'TPackageEditorForm.ShowAddDepDialog: LazPackage.Modified = False');
finally
PackageGraph.EndUpdate;
end;
finally
Deps.Free;
end;
end;
procedure TPackageEditorForm.BeginUpdate;
begin
inc(fUpdateLock);

View File

@ -13,7 +13,7 @@ uses
// IDEIntf
ComponentReg, IDEDialogs,
// IDE
LazarusIDEStrConsts, IDEDefs, Project, PackageSystem, PackageDefs;
LazarusIDEStrConsts, IDEDefs, Project, PackageSystem, PackageDefs, ProjPackBase;
// Packages:
type
@ -21,7 +21,6 @@ type
d2ptUnit,
d2ptVirtualUnit,
d2ptNewComponent,
d2ptRequiredPkg,
d2ptFile,
d2ptFiles
);
@ -42,6 +41,10 @@ function CheckAddingProjectFile(AProject: TProject; NewFiles: TStringList;
function CheckAddingProjectDependency(AProject: TProject;
NewDependency: TPkgDependency): boolean;
// Project or Package using the common interface
function CheckAddingDependency(AProjPack: IProjPack; ADependency: TPkgDependency): boolean;
implementation
@ -183,7 +186,7 @@ var
s: String;
begin
Result:=mrCancel;
DebugLn(['CheckAddingPackageDependency: ', LazPackage.Name]);
NewPkgName:=NewDependency.PackageName;
// check Max-Min version
@ -199,7 +202,7 @@ begin
end;
// package name is checked earlier
Assert(IsValidPkgName(NewPkgName), 'CheckAddingDependency: '+NewPkgName+' is not valid.');
Assert(IsValidPkgName(NewPkgName), 'CheckAddingPackageDependency: '+NewPkgName+' is not valid.');
// check if package is already required
if (CompareText(NewPkgName,LazPackage.Name)=0)
@ -230,7 +233,7 @@ begin
ConflictDependency:=PackageGraph.FindConflictRecursively(
LazPackage.FirstRequiredDependency,RequiredPackage);
if ConflictDependency<>nil then begin
DebugLn(['CheckAddingDependency ',LazPackage.Name,' requiring ',RequiredPackage.IDAsString,' conflicts with ',ConflictDependency.AsString]);
DebugLn(['CheckAddingPackageDependency ',LazPackage.Name,' requiring ',RequiredPackage.IDAsString,' conflicts with ',ConflictDependency.AsString]);
if not Quiet then
IDEMessageDialog(lisVersionMismatch,
Format(lisUnableToAddTheDependencyBecauseThePackageHasAlread, [
@ -245,7 +248,7 @@ begin
if PathList<>nil then begin
try
s:=PackagePathToStr(PathList);
DebugLn(['CheckAddingDependency ',LazPackage.Name,' requiring ',RequiredPackage.IDAsString,' creates cycles with ',s]);
DebugLn(['CheckAddingPackageDependency ',LazPackage.Name,' requiring ',RequiredPackage.IDAsString,' creates cycles with ',s]);
if not Quiet then
IDEMessageDialog(lisCircularDependencyDetected,
Format(lisUnableToAddTheDependencyBecauseThisWouldCreateA, [
@ -263,7 +266,7 @@ begin
if ProvidingAPackage<>nil then
begin
// package is already provided by another package
DebugLn(['CheckAddingDependency ',LazPackage.Name,' requiring ',NewPkgName,', but is already provided by ',ProvidingAPackage.IDAsString]);
DebugLn(['CheckAddingPackageDependency ',LazPackage.Name,' requiring ',NewPkgName,', but is already provided by ',ProvidingAPackage.IDAsString]);
if WarnIfAlreadyThere then
IDEMessageDialog(lisProjAddDependencyAlreadyExists,
Format(lisUnableToAddTheDependencyBecauseThePackageHasAlread, [
@ -355,7 +358,7 @@ begin
end;
// package name is checked earlier
Assert(IsValidPkgName(NewPkgName), 'CheckAddingDependency: ' + NewPkgName + ' is not valid.');
Assert(IsValidPkgName(NewPkgName), 'CheckAddingProjectDependency: ' + NewPkgName + ' is not valid.');
// check if package is already required
if AProject.FindDependencyByName(NewPkgName)<>nil then begin
@ -377,6 +380,19 @@ begin
Result:=true;
end;
// Package or Project:
function CheckAddingDependency(AProjPack: IProjPack; ADependency: TPkgDependency): boolean;
// ToDo: Try to combine CheckAddingPackageDependency and CheckAddingProjectDependency
// somehow to use IProjPack param.
begin
Assert((AProjPack is TLazPackage) or (AProjPack is TProject),
'CheckAddingDependency: AProjPack is neither a project nor a package.');
if AProjPack is TLazPackage then
Result := CheckAddingPackageDependency(AProjPack as TLazPackage, ADependency, False, True) = mrOK
else
Result := CheckAddingProjectDependency(AProjPack as TProject, ADependency)
end;
end.