implemented package iterations

git-svn-id: trunk@4019 -
This commit is contained in:
mattias 2003-04-07 01:59:25 +00:00
parent 3fe22d290e
commit 54169af978
8 changed files with 418 additions and 92 deletions

View File

@ -37,7 +37,8 @@ interface
uses uses
Classes, SysUtils, IDEProcs, LazConf, LResources, Forms, Controls, Buttons, Classes, SysUtils, IDEProcs, LazConf, LResources, Forms, Controls, Buttons,
ExtCtrls, StdCtrls, ComCtrls, Dialogs, Laz_XMLCfg, CodeToolManager, ExtCtrls, StdCtrls, ComCtrls, Dialogs, Laz_XMLCfg, CodeToolManager,
DefineTemplates, SourceChanger, EditDefineTree, SynEdit,LazarusIDEStrConsts; DefineTemplates, SourceChanger, SynEdit,
IDEOptionDefs, EditDefineTree, LazarusIDEStrConsts;
type type
TCodeToolsOptions = class TCodeToolsOptions = class
@ -645,6 +646,7 @@ begin
Width:=485; Width:=485;
Height:=435; Height:=435;
Position:=poScreenCenter; Position:=poScreenCenter;
IDEDialogLayoutList.ApplyLayout(Self,485,435);
Caption:=dlgCodeToolsOpts; Caption:=dlgCodeToolsOpts;
OnResize:=@CodeToolsOptsDlgResize; OnResize:=@CodeToolsOptsDlgResize;
@ -1690,6 +1692,7 @@ begin
CodeToolsOptsDlg.OnGetSynEditSettings:=OnGetSynEditSettings; CodeToolsOptsDlg.OnGetSynEditSettings:=OnGetSynEditSettings;
CodeToolsOptsDlg.UpdatePreviewSettings; CodeToolsOptsDlg.UpdatePreviewSettings;
Result:=CodeToolsOptsDlg.ShowModal; Result:=CodeToolsOptsDlg.ShowModal;
IDEDialogLayoutList.SaveLayout(CodeToolsOptsDlg);
if Result=mrOk then begin if Result=mrOk then begin
CodeToolsOptsDlg.WriteSettings(Options); CodeToolsOptsDlg.WriteSettings(Options);
Options.AssignTo(CodeToolBoss); Options.AssignTo(CodeToolBoss);

View File

@ -39,8 +39,8 @@ interface
uses uses
Classes, SysUtils, LResources, Forms, Controls, Buttons, StdCtrls, ExtCtrls, Classes, SysUtils, LResources, Forms, Controls, Buttons, StdCtrls, ExtCtrls,
Dialogs, LazarusIDEStrConsts, IDEOptionDefs, InputHistory, FileCtrl, IDEProcs, Dialogs, LazarusIDEStrConsts, IDEOptionDefs, InputHistory, FileCtrl, AVL_Tree,
EnvironmentOpts, PackageDefs; IDEProcs, EnvironmentOpts, PackageSystem, PackageDefs, ComponentReg;
type type
TAddToPackageDlg = class(TForm) TAddToPackageDlg = class(TForm)
@ -48,6 +48,7 @@ type
NoteBook: TNoteBook; NoteBook: TNoteBook;
AddUnitPage: TPage; AddUnitPage: TPage;
NewComponentPage: TPage; NewComponentPage: TPage;
NewDependPage: TPage;
// add unit page // add unit page
AddUnitFilenameLabel: TLabel; AddUnitFilenameLabel: TLabel;
AddUnitFilenameEdit: TEdit; AddUnitFilenameEdit: TEdit;
@ -66,6 +67,16 @@ type
ComponentUnitButton: TButton; ComponentUnitButton: TButton;
NewComponentButton: TButton; NewComponentButton: TButton;
CancelNewComponentButton: TButton; CancelNewComponentButton: TButton;
// new require/conflict
DependPkgNameLabel: TLabel;
DependPkgNameComboBox: TComboBox;
DependTypeRadioGroup: TRadioGroup;
DependMinVersionLabel: TLabel;
DependMinVersionEdit: TEdit;
DependMaxVersionLabel: TLabel;
DependMaxVersionEdit: TEdit;
NewDependButton: TButton;
CancelDependButton: TButton;
procedure AddToPackageDlgResize(Sender: TObject); procedure AddToPackageDlgResize(Sender: TObject);
procedure AddUnitButtonClick(Sender: TObject); procedure AddUnitButtonClick(Sender: TObject);
procedure AddUnitFileBrowseButtonClick(Sender: TObject); procedure AddUnitFileBrowseButtonClick(Sender: TObject);
@ -75,15 +86,21 @@ type
procedure ComponentUnitButtonClick(Sender: TObject); procedure ComponentUnitButtonClick(Sender: TObject);
procedure NewComponentButtonClick(Sender: TObject); procedure NewComponentButtonClick(Sender: TObject);
procedure NewComponentPageResize(Sender: TObject); procedure NewComponentPageResize(Sender: TObject);
procedure NewDependPageResize(Sender: TObject);
private private
FLazPackage: TLazPackage; FLazPackage: TLazPackage;
fCurAncestorIndex: integer; fPkgComponents: TAVLTree;// tree of TPkgComponent
fPackages: TAVLTree;// tree of TLazPackage or TPackageLink
procedure SetLazPackage(const AValue: TLazPackage); procedure SetLazPackage(const AValue: TLazPackage);
procedure SetupComponents; procedure SetupComponents;
procedure OnIterateComponentClasses(PkgComponent: TPkgComponent);
procedure OnIteratePackages(APackageID: TLazPackageID);
public public
constructor Create(TheOwner: TComponent); override; constructor Create(TheOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
procedure UpdateAvailableAncestorTypes; procedure UpdateAvailableAncestorTypes;
procedure UpdateAvailablePageNames;
procedure UpdateAvailableDependencyNames;
public public
property LazPackage: TLazPackage read FLazPackage write SetLazPackage; property LazPackage: TLazPackage read FLazPackage write SetLazPackage;
end; end;
@ -101,6 +118,7 @@ begin
AddDlg:=TAddToPackageDlg.Create(Application); AddDlg:=TAddToPackageDlg.Create(Application);
AddDlg.LazPackage:=Pkg; AddDlg.LazPackage:=Pkg;
Result:=AddDlg.ShowModal; Result:=AddDlg.ShowModal;
IDEDialogLayoutList.SaveLayout(AddDlg);
AddDlg.Free; AddDlg.Free;
end; end;
@ -187,6 +205,7 @@ begin
try try
InputHistories.ApplyFileDialogSettings(OpenDialog); InputHistories.ApplyFileDialogSettings(OpenDialog);
OpenDialog.Title:=lisOpenFile; OpenDialog.Title:=lisOpenFile;
OpenDialog.Options:=OpenDialog.Options+[ofPathMustExist];
if OpenDialog.Execute then begin if OpenDialog.Execute then begin
AFilename:=CleanAndExpandFilename(OpenDialog.Filename); AFilename:=CleanAndExpandFilename(OpenDialog.Filename);
if FilenameIsPascalUnit(AFilename) then begin if FilenameIsPascalUnit(AFilename) then begin
@ -266,11 +285,54 @@ begin
SetBounds(x,y,80,Height); SetBounds(x,y,80,Height);
end; end;
procedure TAddToPackageDlg.NewDependPageResize(Sender: TObject);
var
x: Integer;
y: Integer;
begin
x:=5;
y:=5;
with DependPkgNameLabel do
SetBounds(x,y+3,110,Height);
with DependPkgNameComboBox do
SetBounds(x+DependPkgNameLabel.Width+5,y,150,Height);
inc(y,DependPkgNameComboBox.Height+5);
with DependTypeRadioGroup do
SetBounds(x,y,200,50);
inc(y,DependTypeRadioGroup.Height+10);
with DependMinVersionLabel do
SetBounds(x,y+3,170,Height);
with DependMinVersionEdit do
SetBounds(x+DependMinVersionLabel.Width+5,y,100,Height);
inc(y,DependMinVersionEdit.Height+5);
with DependMaxVersionLabel do
SetBounds(x,y+3,DependMinVersionLabel.Width,Height);
with DependMaxVersionEdit do
SetBounds(x+DependMaxVersionLabel.Width+5,y,
DependMinVersionEdit.Width,Height);
inc(y,DependMaxVersionEdit.Height+20);
with NewDependButton do
SetBounds(x,y,80,Height);
with CancelDependButton do
SetBounds(x+NewDependButton.Width+10,y,80,Height);
end;
procedure TAddToPackageDlg.SetLazPackage(const AValue: TLazPackage); procedure TAddToPackageDlg.SetLazPackage(const AValue: TLazPackage);
begin begin
if FLazPackage=AValue then exit; if FLazPackage=AValue then exit;
FLazPackage:=AValue; FLazPackage:=AValue;
UpdateAvailableAncestorTypes; UpdateAvailableAncestorTypes;
UpdateAvailablePageNames;
UpdateAvailableDependencyNames;
end; end;
procedure TAddToPackageDlg.SetupComponents; procedure TAddToPackageDlg.SetupComponents;
@ -283,13 +345,18 @@ begin
AddUnitPage:=Page[0]; AddUnitPage:=Page[0];
Pages.Add('New Component'); Pages.Add('New Component');
NewComponentPage:=Page[1]; NewComponentPage:=Page[1];
Pages.Add('New Require, Conflict');
NewDependPage:=Page[2];
PageIndex:=0; PageIndex:=0;
Align:=alClient; Align:=alClient;
end; end;
// add unit
AddUnitPage.OnResize:=@AddUnitPageResize; AddUnitPage.OnResize:=@AddUnitPageResize;
NewComponentPage.OnResize:=@NewComponentPageResize; NewComponentPage.OnResize:=@NewComponentPageResize;
NewDependPage.OnResize:=@NewDependPageResize;
AddUnitFilenameLabel:=TLabel.Create(Self); AddUnitFilenameLabel:=TLabel.Create(Self);
with AddUnitFilenameLabel do begin with AddUnitFilenameLabel do begin
Name:='AddUnitFilenameLabel'; Name:='AddUnitFilenameLabel';
@ -327,6 +394,9 @@ begin
Caption:='Cancel'; Caption:='Cancel';
OnClick:=@CancelAddUnitButtonClick; OnClick:=@CancelAddUnitButtonClick;
end; end;
// add new component unit
AncestorTypeLabel:=TLabel.Create(Self); AncestorTypeLabel:=TLabel.Create(Self);
with AncestorTypeLabel do begin with AncestorTypeLabel do begin
@ -407,27 +477,163 @@ begin
Caption:='Cancel'; Caption:='Cancel';
OnClick:=@CancelNewComponentButtonClick; OnClick:=@CancelNewComponentButtonClick;
end; end;
// add require, conflict
DependPkgNameLabel:=TLabel.Create(Self);
with DependPkgNameLabel do begin
Name:='DependPkgNameLabel';
Parent:=NewDependPage;
Caption:='Package Name:';
end;
DependPkgNameComboBox:=TComboBox.Create(Self);
with DependPkgNameComboBox do begin
Name:='DependPkgNameComboBox';
Parent:=NewDependPage;
Text:='';
end;
DependTypeRadioGroup:=TRadioGroup.Create(Self);
with DependTypeRadioGroup do begin
Name:='DependTypeRadioGroup';
Parent:=NewDependPage;
Items.Add('Require');
Items.Add('Conflict');
ItemIndex:=0;
Columns:=2;
Caption:='Type';
end;
DependMinVersionLabel:=TLabel.Create(Self);
with DependMinVersionLabel do begin
Name:='DependMinVersionLabel';
Parent:=NewDependPage;
Caption:='Minimum Version (optional):';
end;
DependMinVersionEdit:=TEdit.Create(Self);
with DependMinVersionEdit do begin
Name:='DependMinVersionEdit';
Parent:=NewDependPage;
Text:='';
end;
DependMaxVersionLabel:=TLabel.Create(Self);
with DependMaxVersionLabel do begin
Name:='DependMaxVersionLabel';
Parent:=NewDependPage;
Caption:='Maximum Version (optional):';
end;
DependMaxVersionEdit:=TEdit.Create(Self);
with DependMaxVersionEdit do begin
Name:='DependMaxVersionEdit';
Parent:=NewDependPage;
Text:='';
end;
NewDependButton:=TButton.Create(Self);
with NewDependButton do begin
Name:='NewDependButton';
Parent:=NewDependPage;
Caption:='Ok';
end;
CancelDependButton:=TButton.Create(Self);
with CancelDependButton do begin
Name:='CancelDependButton';
Parent:=NewDependPage;
Caption:='Cancel';
ModalResult:=mrCancel;
end;
end;
procedure TAddToPackageDlg.OnIterateComponentClasses(PkgComponent: TPkgComponent
);
begin
if fPkgComponents.Find(PkgComponent)=nil then
fPkgComponents.Add(PkgComponent);
end;
procedure TAddToPackageDlg.OnIteratePackages(APackageID: TLazPackageID);
begin
if (APackageID<>LazPackage) and (fPackages.Find(APackageID)=nil) then
fPackages.Add(APackageID);
end; end;
constructor TAddToPackageDlg.Create(TheOwner: TComponent); constructor TAddToPackageDlg.Create(TheOwner: TComponent);
begin begin
inherited Create(TheOwner); inherited Create(TheOwner);
fPkgComponents:=TAVLTree.Create(@CompareIDEComponentByClassName);
fPackages:=TAVLTree.Create(@CompareLazPackageID);
Position:=poScreenCenter; Position:=poScreenCenter;
Width:=450; IDEDialogLayoutList.ApplyLayout(Self,500,300);
Height:=300;
SetupComponents; SetupComponents;
OnResize:=@AddToPackageDlgResize; OnResize:=@AddToPackageDlgResize;
end; end;
destructor TAddToPackageDlg.Destroy; destructor TAddToPackageDlg.Destroy;
begin begin
FreeAndNil(fPkgComponents);
FreeAndNil(fPackages);
inherited Destroy; inherited Destroy;
end; end;
procedure TAddToPackageDlg.UpdateAvailableAncestorTypes; procedure TAddToPackageDlg.UpdateAvailableAncestorTypes;
var
ANode: TAVLTreeNode;
sl: TStringList;
begin begin
fCurAncestorIndex:=0; // get all available registered components
//LazPackage.IterateComponentClasses(@OnIterateComponentClasses); fPkgComponents.Clear;
PackageGraph.IterateComponentClasses(LazPackage,@OnIterateComponentClasses,
true,true);
// put them into the combobox
sl:=TStringList.Create;
ANode:=fPkgComponents.FindLowest;
while ANode<>nil do begin
sl.Add(TPkgComponent(ANode.Data).ComponentClass.ClassName);
ANode:=fPkgComponents.FindSuccessor(ANode);
end;
AncestorComboBox.Items.Assign(sl);
sl.Free;
end;
procedure TAddToPackageDlg.UpdateAvailablePageNames;
var
i: Integer;
APageName: String;
sl: TStringList;
begin
// get all current pagenames (excluding the hidden page)
sl:=TStringList.Create;
for i:=0 to IDEComponentPalette.Count-1 do begin
APageName:=IDEComponentPalette[i].PageName;
if APageName<>'' then
sl.Add(APageName);
end;
sl.Sort;
PalettePageCombobox.Items.Assign(sl);
sl.Free;
end;
procedure TAddToPackageDlg.UpdateAvailableDependencyNames;
var
ANode: TAVLTreeNode;
sl: TStringList;
begin
fPackages.Clear;
PackageGraph.IteratePackages(fpfSearchPackageEverywhere,@OnIteratePackages);
sl:=TStringList.Create;
ANode:=fPackages.FindLowest;
while ANode<>nil do begin
sl.Add(TLazPackageID(ANode.Data).IDAsString);
ANode:=fPackages.FindSuccessor(ANode);
end;
DependPkgNameComboBox.Items.Assign(sl);
sl.Free;
end; end;
end. end.

View File

@ -139,6 +139,7 @@ var
IDEComponentPalette: TIDEComponentPalette; IDEComponentPalette: TIDEComponentPalette;
function ComparePriority(const p1,p2: TComponentPriority): integer; function ComparePriority(const p1,p2: TComponentPriority): integer;
function CompareIDEComponentByClassName(Data1, Data2: pointer): integer;
implementation implementation
@ -151,6 +152,17 @@ begin
Result:=p1.Level-p2.Level; Result:=p1.Level-p2.Level;
end; end;
function CompareIDEComponentByClassName(Data1, Data2: pointer): integer;
var
Comp1: TIDEComponent;
Comp2: TIDEComponent;
begin
Comp1:=TIDEComponent(Data1);
Comp2:=TIDEComponent(Data2);
Result:=AnsiCompareText(Comp1.ComponentClass.Classname,
Comp2.ComponentClass.Classname);
end;
{ TIDEComponent } { TIDEComponent }
constructor TIDEComponent.Create(TheComponentClass: TComponentClass; constructor TIDEComponent.Create(TheComponentClass: TComponentClass;

View File

@ -138,6 +138,8 @@ type
function IsVirtual: boolean; function IsVirtual: boolean;
function GetShortFilename: string; function GetShortFilename: string;
function ComponentCount: integer; function ComponentCount: integer;
procedure AddPkgComponent(APkgComponent: TPkgComponent);
procedure RemovePkgComponent(APkgComponent: TPkgComponent);
public public
property Filename: string read FFilename write SetFilename; property Filename: string read FFilename write SetFilename;
property FileType: TPkgFileType read FFileType write SetFileType; property FileType: TPkgFileType read FFileType write SetFileType;
@ -200,6 +202,22 @@ type
end; end;
{ TLazPackageID }
TLazPackageID = class
protected
FName: string;
FVersion: TPkgVersion;
procedure SetName(const AValue: string); virtual;
public
function IDAsString: string;
function Compare(PackageID2: TLazPackageID): integer;
public
property Name: string read FName write SetName;
property Version: TPkgVersion read FVersion;
end;
{ TLazPackage } { TLazPackage }
TLazPackageType = ( TLazPackageType = (
@ -231,38 +249,36 @@ type
pitStatic, pitStatic,
pitDynamic pitDynamic
); );
TLazPackage = class TLazPackage = class(TLazPackageID)
private private
FAuthor: string; FAuthor: string;
FAutoCreated: boolean; FAutoCreated: boolean;
FAutoInstall: TPackageInstallType; FAutoInstall: TPackageInstallType;
FComponentCount: integer;
FConflictPkgs: TList; // TList of TPkgDependency
FCompilerOptions: TPkgCompilerOptions; FCompilerOptions: TPkgCompilerOptions;
FComponents: TList; // TList of TPkgComponent FComponents: TList; // TList of TPkgComponent
FConflictPkgs: TList; // TList of TPkgDependency
FDependingPkgs: TList; // TList of TLazPackage FDependingPkgs: TList; // TList of TLazPackage
FDescription: string; FDescription: string;
FDirectory: string; FDirectory: string;
FEditorRect: TRect; FEditorRect: TRect;
FInstalled: TPackageInstallType;
FRegistered: boolean;
FPackageEditor: TBasePackageEditor;
FReadOnly: boolean;
FVersion: TPkgVersion;
FFilename: string; FFilename: string;
FFiles: TList; // TList of TPkgFile FFiles: TList; // TList of TPkgFile
FFlags: TLazPackageFlags; FFlags: TLazPackageFlags;
FIconFile: string; FIconFile: string;
FName: string; FInstalled: TPackageInstallType;
FModifiedLock: integer; FModifiedLock: integer;
FPackageEditor: TBasePackageEditor;
FPackageType: TLazPackageType; FPackageType: TLazPackageType;
FReadOnly: boolean;
FRegistered: boolean;
FRequiredPkgs: TList; // TList of TPkgDependency FRequiredPkgs: TList; // TList of TPkgDependency
FTitle: string; FTitle: string;
FUsageOptions: TAdditionalCompilerOptions; FUsageOptions: TAdditionalCompilerOptions;
FUsedPkgs: TList; // list of TLazPackage FUsedPkgs: TList; // list of TLazPackage
function GetAutoIncrementVersionOnBuild: boolean; function GetAutoIncrementVersionOnBuild: boolean;
function GetAutoUpdate: boolean; function GetAutoUpdate: boolean;
function GetComponentCount: integer;
function GetComponents(Index: integer): TPkgComponent; function GetComponents(Index: integer): TPkgComponent;
function GetConflictPkgCount: integer; function GetConflictPkgCount: integer;
function GetConflictPkgs(Index: integer): TPkgDependency; function GetConflictPkgs(Index: integer): TPkgDependency;
@ -288,7 +304,7 @@ type
procedure SetInstalled(const AValue: TPackageInstallType); procedure SetInstalled(const AValue: TPackageInstallType);
procedure SetRegistered(const AValue: boolean); procedure SetRegistered(const AValue: boolean);
procedure SetModified(const AValue: boolean); procedure SetModified(const AValue: boolean);
procedure SetName(const AValue: string); procedure SetName(const AValue: string); override;
procedure SetPackageEditor(const AValue: TBasePackageEditor); procedure SetPackageEditor(const AValue: TBasePackageEditor);
procedure SetPackageType(const AValue: TLazPackageType); procedure SetPackageType(const AValue: TLazPackageType);
procedure SetReadOnly(const AValue: boolean); procedure SetReadOnly(const AValue: boolean);
@ -303,11 +319,10 @@ type
procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string); procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string);
function IsVirtual: boolean; function IsVirtual: boolean;
procedure CheckInnerDependencies; procedure CheckInnerDependencies;
function Compare(Package2: TLazPackage): integer;
procedure ShortenFilename(var ExpandedFilename: string); procedure ShortenFilename(var ExpandedFilename: string);
procedure LongenFilename(var AFilename: string); procedure LongenFilename(var AFilename: string);
procedure IterateComponentClasses(Event: TIterateComponentClassesEvent; procedure IterateComponentClasses(Event: TIterateComponentClassesEvent;
WithRequiredPackages: boolean); WithUsedPackages: boolean);
procedure ConsistencyCheck; procedure ConsistencyCheck;
function IndexOfPkgComponent(PkgComponent: TPkgComponent): integer; function IndexOfPkgComponent(PkgComponent: TPkgComponent): integer;
function FindUnit(const TheUnitName: string): TPkgFile; function FindUnit(const TheUnitName: string): TPkgFile;
@ -320,6 +335,8 @@ type
function CreateDependencyForThisPkg: TPkgDependency; function CreateDependencyForThisPkg: TPkgDependency;
function AddComponent(PkgFile: TPkgFile; const Page: string; function AddComponent(PkgFile: TPkgFile; const Page: string;
TheComponentClass: TComponentClass): TPkgComponent; TheComponentClass: TComponentClass): TPkgComponent;
procedure AddPkgComponent(APkgComponent: TPkgComponent);
procedure RemovePkgComponent(APkgComponent: TPkgComponent);
public public
property Author: string read FAuthor write SetAuthor; property Author: string read FAuthor write SetAuthor;
property AutoCreated: boolean read FAutoCreated write SetAutoCreated; property AutoCreated: boolean read FAutoCreated write SetAutoCreated;
@ -329,7 +346,7 @@ type
property AutoUpdate: boolean read GetAutoUpdate write SetAutoUpdate; property AutoUpdate: boolean read GetAutoUpdate write SetAutoUpdate;
property CompilerOptions: TPkgCompilerOptions property CompilerOptions: TPkgCompilerOptions
read FCompilerOptions; read FCompilerOptions;
property ComponentCount: integer read FComponentCount; property ComponentCount: integer read GetComponentCount;
property Components[Index: integer]: TPkgComponent read GetComponents; property Components[Index: integer]: TPkgComponent read GetComponents;
property ConflictPkgCount: integer read GetConflictPkgCount; property ConflictPkgCount: integer read GetConflictPkgCount;
property ConflictPkgs[Index: integer]: TPkgDependency read GetConflictPkgs; property ConflictPkgs[Index: integer]: TPkgDependency read GetConflictPkgs;
@ -347,7 +364,6 @@ type
property Installed: TPackageInstallType read FInstalled write SetInstalled; property Installed: TPackageInstallType read FInstalled write SetInstalled;
property Registered: boolean read FRegistered write SetRegistered; property Registered: boolean read FRegistered write SetRegistered;
property Modified: boolean read GetModified write SetModified; property Modified: boolean read GetModified write SetModified;
property Name: string read FName write SetName;
property PackageType: TLazPackageType property PackageType: TLazPackageType
read FPackageType write SetPackageType; read FPackageType write SetPackageType;
property ReadOnly: boolean read FReadOnly write SetReadOnly; property ReadOnly: boolean read FReadOnly write SetReadOnly;
@ -358,7 +374,6 @@ type
read FUsageOptions; read FUsageOptions;
property UsedPkgCount: integer read GetUsedPkgCount; property UsedPkgCount: integer read GetUsedPkgCount;
property UsedPkgs[Index: integer]: TLazPackage read GetUsedPkgs; property UsedPkgs[Index: integer]: TLazPackage read GetUsedPkgs;
property Version: TPkgVersion read FVersion;
end; end;
@ -391,7 +406,7 @@ const
function PkgFileTypeIdentToType(const s: string): TPkgFileType; function PkgFileTypeIdentToType(const s: string): TPkgFileType;
function LazPackageTypeIdentToType(const s: string): TLazPackageType; function LazPackageTypeIdentToType(const s: string): TLazPackageType;
procedure SortDependencyList(Dependencies: TList); procedure SortDependencyList(Dependencies: TList);
function CompareLazPackage(Data1, Data2: Pointer): integer; function CompareLazPackageID(Data1, Data2: Pointer): integer;
function CompareNameWithPackage(Key, Data: Pointer): integer; function CompareNameWithPackage(Key, Data: Pointer): integer;
@ -446,13 +461,13 @@ begin
end; end;
end; end;
function CompareLazPackage(Data1, Data2: Pointer): integer; function CompareLazPackageID(Data1, Data2: Pointer): integer;
var var
Pkg1: TLazPackage; Pkg1: TLazPackageID;
Pkg2: TLazPackage; Pkg2: TLazPackageID;
begin begin
Pkg1:=TLazPackage(Data1); Pkg1:=TLazPackageID(Data1);
Pkg2:=TLazPackage(Data2); Pkg2:=TLazPackageID(Data2);
Result:=Pkg1.Compare(Pkg2); Result:=Pkg1.Compare(Pkg2);
end; end;
@ -608,6 +623,22 @@ begin
Result:=0; Result:=0;
end; end;
procedure TPkgFile.AddPkgComponent(APkgComponent: TPkgComponent);
begin
if FComponents=nil then FComponents:=TList.Create;
FComponents.Add(APkgComponent);
if LazPackage<>nil then
LazPackage.AddPkgComponent(APkgComponent);
end;
procedure TPkgFile.RemovePkgComponent(APkgComponent: TPkgComponent);
begin
if FComponents<>nil then
FComponents.Remove(APkgComponent);
if LazPackage<>nil then
LazPackage.RemovePkgComponent(APkgComponent);
end;
{ TPkgDependency } { TPkgDependency }
procedure TPkgDependency.SetFlags(const AValue: TPkgDependencyFlags); procedure TPkgDependency.SetFlags(const AValue: TPkgDependencyFlags);
@ -805,6 +836,11 @@ begin
Result:=lpfAutoUpdate in FFlags; Result:=lpfAutoUpdate in FFlags;
end; end;
function TLazPackage.GetComponentCount: integer;
begin
Result:=FComponents.Count;
end;
function TLazPackage.GetComponents(Index: integer): TPkgComponent; function TLazPackage.GetComponents(Index: integer): TPkgComponent;
begin begin
Result:=TPkgComponent(FComponents[Index]); Result:=TPkgComponent(FComponents[Index]);
@ -1036,16 +1072,16 @@ var
begin begin
FAuthor:=''; FAuthor:='';
FAutoInstall:=pitNope; FAutoInstall:=pitNope;
for i:=0 to FConflictPkgs.Count-1 do ConflictPkgs[i].Free; for i:=FConflictPkgs.Count-1 downto 0 do ConflictPkgs[i].Free;
FConflictPkgs.Clear; FConflictPkgs.Clear;
for i:=0 to FComponents.Count-1 do Components[i].Free; for i:=FComponents.Count-1 downto 0 do Components[i].Free;
FComponents.Clear; FComponents.Clear;
FCompilerOptions.Clear; FCompilerOptions.Clear;
FDescription:=''; FDescription:='';
FDirectory:=''; FDirectory:='';
FVersion.Clear; FVersion.Clear;
FFilename:=''; FFilename:='';
for i:=0 to FFiles.Count-1 do Files[i].Free; for i:=FFiles.Count-1 downto 0 do Files[i].Free;
FFiles.Clear; FFiles.Clear;
FFlags:=[lpfAutoIncrementVersionOnBuild,lpfAutoUpdate]; FFlags:=[lpfAutoIncrementVersionOnBuild,lpfAutoUpdate];
FIconFile:=''; FIconFile:='';
@ -1053,7 +1089,7 @@ begin
FName:=''; FName:='';
FPackageType:=lptRunTime; FPackageType:=lptRunTime;
FRegistered:=false; FRegistered:=false;
for i:=0 to FRequiredPkgs.Count-1 do RequiredPkgs[i].Free; for i:=FRequiredPkgs.Count-1 downto 0 do RequiredPkgs[i].Free;
FRequiredPkgs.Clear; FRequiredPkgs.Clear;
FTitle:=''; FTitle:='';
FUsageOptions.Clear; FUsageOptions.Clear;
@ -1204,20 +1240,13 @@ begin
// ToDo: make some checks like deactivating double requirements // ToDo: make some checks like deactivating double requirements
end; end;
function TLazPackage.Compare(Package2: TLazPackage): integer;
begin
Result:=AnsiCompareText(Name,Package2.Name);
if Result<>0 then exit;
Result:=Version.Compare(Package2.Version);
end;
procedure TLazPackage.ShortenFilename(var ExpandedFilename: string); procedure TLazPackage.ShortenFilename(var ExpandedFilename: string);
var var
PkgDir: String; PkgDir: String;
CurPath: String; CurPath: String;
begin begin
PkgDir:=FDirectory; PkgDir:=FDirectory;
if (PkgDir='') and (PkgDir[length(PkgDir)]<>PathDelim) then exit; if (PkgDir='') or (PkgDir[length(PkgDir)]<>PathDelim) then exit;
CurPath:=copy(ExtractFilePath(ExpandedFilename),1,length(PkgDir)); CurPath:=copy(ExtractFilePath(ExpandedFilename),1,length(PkgDir));
if CompareFilenames(PkgDir,CurPath)=0 then begin if CompareFilenames(PkgDir,CurPath)=0 then begin
ExpandedFilename:=copy(ExpandedFilename,length(CurPath)+1, ExpandedFilename:=copy(ExpandedFilename,length(CurPath)+1,
@ -1227,13 +1256,14 @@ end;
procedure TLazPackage.LongenFilename(var AFilename: string); procedure TLazPackage.LongenFilename(var AFilename: string);
begin begin
if (FDirectory='') and (FDirectory[length(FDirectory)]<>PathDelim) then exit; if (FDirectory='') or (FDirectory[length(FDirectory)]<>PathDelim) then exit;
if not FilenameIsAbsolute(AFilename) then if not FilenameIsAbsolute(AFilename) then
AFilename:=TrimFilename(Directory+AFilename); AFilename:=TrimFilename(Directory+AFilename);
end; end;
procedure TLazPackage.IterateComponentClasses( procedure TLazPackage.IterateComponentClasses(
Event: TIterateComponentClassesEvent; WithRequiredPackages: boolean); Event: TIterateComponentClassesEvent;
WithUsedPackages: boolean);
var var
Cnt: Integer; Cnt: Integer;
i: Integer; i: Integer;
@ -1242,8 +1272,10 @@ begin
Cnt:=ComponentCount; Cnt:=ComponentCount;
for i:=0 to Cnt-1 do Event(Components[i]); for i:=0 to Cnt-1 do Event(Components[i]);
// iterate through all used packages // iterate through all used packages
if WithRequiredPackages then begin if WithUsedPackages then begin
// ToDo Cnt:=UsedPkgCount;
for i:=0 to Cnt-1 do
UsedPkgs[i].IterateComponentClasses(Event,false);
end; end;
end; end;
@ -1323,7 +1355,16 @@ function TLazPackage.AddComponent(PkgFile: TPkgFile; const Page: string;
TheComponentClass: TComponentClass): TPkgComponent; TheComponentClass: TComponentClass): TPkgComponent;
begin begin
Result:=TPkgComponent.Create(PkgFile,TheComponentClass,Page); Result:=TPkgComponent.Create(PkgFile,TheComponentClass,Page);
FComponents.Add(Result); end;
procedure TLazPackage.AddPkgComponent(APkgComponent: TPkgComponent);
begin
FComponents.Add(APkgComponent);
end;
procedure TLazPackage.RemovePkgComponent(APkgComponent: TPkgComponent);
begin
FComponents.Remove(APkgComponent);
end; end;
{ TPkgComponent } { TPkgComponent }
@ -1331,11 +1372,9 @@ end;
procedure TPkgComponent.SetPkgFile(const AValue: TPkgFile); procedure TPkgComponent.SetPkgFile(const AValue: TPkgFile);
begin begin
if FPkgFile=AValue then exit; if FPkgFile=AValue then exit;
if (FPkgFile<>nil) and (FPkgFile.FComponents<>nil) then if (FPkgFile<>nil) then PkgFile.RemovePkgComponent(Self);
FPkgFile.FComponents.Remove(Self);
FPkgFile:=AValue; FPkgFile:=AValue;
if FPkgFile<>nil then if (FPkgFile<>nil) then PkgFile.AddPkgComponent(Self);
FPkgFile.GetComponentList.Add(Self);
end; end;
constructor TPkgComponent.Create(ThePkgFile: TPkgFile; constructor TPkgComponent.Create(ThePkgFile: TPkgFile;
@ -1404,5 +1443,25 @@ begin
Result:=Page.PageName<>''; Result:=Page.PageName<>'';
end; end;
{ TLazPackageID }
procedure TLazPackageID.SetName(const AValue: string);
begin
if FName=AValue then exit;
FName:=AValue;
end;
function TLazPackageID.IDAsString: string;
begin
Result:=Name+' '+Version.AsString;
end;
function TLazPackageID.Compare(PackageID2: TLazPackageID): integer;
begin
Result:=AnsiCompareText(Name,PackageID2.Name);
if Result<>0 then exit;
Result:=Version.Compare(PackageID2.Version);
end;
end. end.

View File

@ -243,7 +243,8 @@ begin
// draw registered component // draw registered component
CurComponent:=TPkgComponent(CurObject); CurComponent:=TPkgComponent(CurObject);
with RegisteredListBox.Canvas do begin with RegisteredListBox.Canvas do begin
CurStr:=CurComponent.ComponentClass.ClassName; CurStr:=CurComponent.ComponentClass.ClassName
+', Page: '+CurComponent.Page.PageName;
TxtH:=TextHeight(CurStr); TxtH:=TextHeight(CurStr);
CurRect:=ARect; CurRect:=ARect;
inc(CurRect.Left,25); inc(CurRect.Left,25);
@ -598,7 +599,7 @@ begin
FPlugins.AddObject(CurLine,CurComponent); FPlugins.AddObject(CurLine,CurComponent);
inc(CurListIndex); inc(CurListIndex);
end; end;
// show them in the RegisteredListBox // put them in the RegisteredListBox
RegisteredListBox.Items.Assign(FPlugins); RegisteredListBox.Items.Assign(FPlugins);
end else begin end else begin
CallRegisterProcCheckBox.Checked:=false; CallRegisterProcCheckBox.Checked:=false;

View File

@ -42,6 +42,10 @@ uses
PackageDefs, LazConf; PackageDefs, LazConf;
type type
TIteratePackagesEvent =
procedure(APackage: TLazPackageID) of object;
{ TPackageLink } { TPackageLink }
TPkgLinkOrigin = ( TPkgLinkOrigin = (
@ -50,24 +54,17 @@ type
); );
TPkgLinkOrigins = set of TPkgLinkOrigin; TPkgLinkOrigins = set of TPkgLinkOrigin;
TPackageLink = class TPackageLink = class(TLazPackageID)
private private
FFilename: string; FFilename: string;
FOrigin: TPkgLinkOrigin; FOrigin: TPkgLinkOrigin;
FPkgName: string;
FVersion: TPkgVersion;
procedure SetFilename(const AValue: string); procedure SetFilename(const AValue: string);
procedure SetOrigin(const AValue: TPkgLinkOrigin); procedure SetOrigin(const AValue: TPkgLinkOrigin);
procedure SetPkgName(const AValue: string);
procedure SetVersion(const AValue: TPkgVersion);
public public
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
function Compare(Link2: TPackageLink): integer;
public public
property Origin: TPkgLinkOrigin read FOrigin write SetOrigin; property Origin: TPkgLinkOrigin read FOrigin write SetOrigin;
property PkgName: string read FPkgName write SetPkgName;
property Version: TPkgVersion read FVersion write SetVersion;
property Filename: string read FFilename write SetFilename; property Filename: string read FFilename write SetFilename;
end; end;
@ -108,6 +105,7 @@ type
var var
PkgLinks: TPackageLinks; PkgLinks: TPackageLinks;
implementation implementation
@ -134,7 +132,7 @@ begin
else begin else begin
PkgName:=AnsiString(Key); PkgName:=AnsiString(Key);
Link:=TPackageLink(Data); Link:=TPackageLink(Data);
Result:=AnsiCompareText(PkgName,Link.PkgName); Result:=AnsiCompareText(PkgName,Link.Name);
end; end;
end; end;
@ -152,18 +150,6 @@ begin
FFilename:=AValue; FFilename:=AValue;
end; end;
procedure TPackageLink.SetPkgName(const AValue: string);
begin
if FPkgName=AValue then exit;
FPkgName:=AValue;
end;
procedure TPackageLink.SetVersion(const AValue: TPkgVersion);
begin
if FVersion=AValue then exit;
FVersion:=AValue;
end;
constructor TPackageLink.Create; constructor TPackageLink.Create;
begin begin
FVersion:=TPkgVersion.Create; FVersion:=TPkgVersion.Create;
@ -175,13 +161,6 @@ begin
inherited Destroy; inherited Destroy;
end; end;
function TPackageLink.Compare(Link2: TPackageLink): integer;
begin
Result:=AnsiCompareText(PkgName,Link2.PkgName);
if Result=0 then
Result:=Version.Compare(Link2.Version);
end;
{ TPackageLinks } { TPackageLinks }
function TPackageLinks.FindLeftMostNode(LinkTree: TAVLTree; function TPackageLinks.FindLeftMostNode(LinkTree: TAVLTree;
@ -198,7 +177,7 @@ begin
while Result<>nil do begin while Result<>nil do begin
PriorNode:=LinkTree.FindPrecessor(Result); PriorNode:=LinkTree.FindPrecessor(Result);
if (PriorNode=nil) if (PriorNode=nil)
or (AnsiCompareText(TPackageLink(PriorNode.Data).PkgName,PkgName)<>0) or (AnsiCompareText(TPackageLink(PriorNode.Data).Name,PkgName)<>0)
then then
break; break;
Result:=PriorNode; Result:=PriorNode;
@ -320,10 +299,10 @@ begin
NewPkgLink:=TPackageLink.Create; NewPkgLink:=TPackageLink.Create;
NewPkgLink.Origin:=ploGlobal; NewPkgLink.Origin:=ploGlobal;
NewPkgLink.PkgName:=NewPkgName; NewPkgLink.Name:=NewPkgName;
NewPkgLink.Version.Assign(PkgVersion); NewPkgLink.Version.Assign(PkgVersion);
NewPkgLink.Filename:=NewFilename; NewPkgLink.Filename:=NewFilename;
if IsValidIdent(NewPkgLink.PkgName) and FileExists(NewPkgLink.Filename) if IsValidIdent(NewPkgLink.Name) and FileExists(NewPkgLink.Filename)
then then
FGlobalLinks.Add(NewPkgLink) FGlobalLinks.Add(NewPkgLink)
else else
@ -363,11 +342,11 @@ begin
ItemPath:=Path+'Item'+IntToStr(i)+'/'; ItemPath:=Path+'Item'+IntToStr(i)+'/';
NewPkgLink:=TPackageLink.Create; NewPkgLink:=TPackageLink.Create;
NewPkgLink.Origin:=ploUser; NewPkgLink.Origin:=ploUser;
NewPkgLink.PkgName:=XMLConfig.GetValue(ItemPath+'PkgName/Value',''); NewPkgLink.Name:=XMLConfig.GetValue(ItemPath+'Name/Value','');
NewPkgLink.Version.LoadFromXMLConfig(XMLConfig,ItemPath+'Version/', NewPkgLink.Version.LoadFromXMLConfig(XMLConfig,ItemPath+'Version/',
LazPkgXMLFileVersion); LazPkgXMLFileVersion);
NewPkgLink.Filename:=XMLConfig.GetValue(ItemPath+'Filename/Value',''); NewPkgLink.Filename:=XMLConfig.GetValue(ItemPath+'Filename/Value','');
if IsValidIdent(NewPkgLink.PkgName) and FileExists(NewPkgLink.Filename) if IsValidIdent(NewPkgLink.Name) and FileExists(NewPkgLink.Filename)
then then
FUserLinks.Add(NewPkgLink) FUserLinks.Add(NewPkgLink)
else else
@ -430,7 +409,7 @@ begin
break; break;
end; end;
CurNode:=LinkTree.FindSuccessor(CurNode); CurNode:=LinkTree.FindSuccessor(CurNode);
if AnsiCompareText(TPackageLink(CurNode.Data).PkgName,Dependency.PackageName) if AnsiCompareText(TPackageLink(CurNode.Data).Name,Dependency.PackageName)
<>0 <>0
then begin then begin
CurNode:=nil; CurNode:=nil;

View File

@ -107,6 +107,11 @@ type
procedure RegisterStaticPackages; procedure RegisterStaticPackages;
function OpenDependency(Dependency: TPkgDependency; function OpenDependency(Dependency: TPkgDependency;
Flags: TFindPackageFlags; var APackage: TLazPackage): TLoadPackageResult; Flags: TFindPackageFlags; var APackage: TLazPackage): TLoadPackageResult;
procedure IterateComponentClasses(APackage: TLazPackage;
Event: TIterateComponentClassesEvent;
WithUsedPackages, WithRequiredPackages: boolean);
procedure IteratePackages(Flags: TFindPackageFlags;
Event: TIteratePackagesEvent);
public public
property Packages[Index: integer]: TLazPackage read GetPackages; default; property Packages[Index: integer]: TLazPackage read GetPackages; default;
property RegistrationPackage: TLazPackage read FRegistrationPackage property RegistrationPackage: TLazPackage read FRegistrationPackage
@ -168,7 +173,7 @@ end;
constructor TLazPackageGraph.Create; constructor TLazPackageGraph.Create;
begin begin
FTree:=TAVLTree.Create(@CompareLazPackage); FTree:=TAVLTree.Create(@CompareLazPackageID);
FItems:=TList.Create; FItems:=TList.Create;
end; end;
@ -187,9 +192,16 @@ begin
end; end;
procedure TLazPackageGraph.Clear; procedure TLazPackageGraph.Clear;
var
i: Integer;
CurPkg: TLazPackage;
begin begin
FTree.FreeAndClear; for i:=FItems.Count-1 downto 0 do begin
FItems.Clear; CurPkg:=Packages[i];
FItems.Delete(i);
FTree.Remove(CurPkg);
CurPkg.Free;
end;
end; end;
function TLazPackageGraph.Count: integer; function TLazPackageGraph.Count: integer;
@ -554,6 +566,55 @@ begin
end; end;
end; end;
procedure TLazPackageGraph.IterateComponentClasses(APackage: TLazPackage;
Event: TIterateComponentClassesEvent; WithUsedPackages,
WithRequiredPackages: boolean);
var
Cnt: Integer;
i: Integer;
ARequiredPackage: TLazPackage;
ADependency: TPkgDependency;
begin
APackage.IterateComponentClasses(Event,WithUsedPackages);
// iterate through all required packages
if WithRequiredPackages then begin
Cnt:=APackage.RequiredPkgCount;
for i:=0 to Cnt-1 do begin
ADependency:=APackage.RequiredPkgs[i];
if OpenDependency(ADependency,[fpfSearchInInstalledPckgs],ARequiredPackage)
=lprSuccess
then begin
ARequiredPackage.IterateComponentClasses(Event,false);
end;
end;
end;
end;
procedure TLazPackageGraph.IteratePackages(Flags: TFindPackageFlags;
Event: TIteratePackagesEvent);
var
CurPkg: TLazPackage;
i: Integer;
begin
// iterate opened packages
for i:=0 to FItems.Count-1 do begin
CurPkg:=Packages[i];
// check installed packages
if ((fpfSearchInInstalledPckgs in Flags) and (CurPkg.Installed<>pitNope))
// check autoinstall packages
or ((fpfSearchInAutoInstallPckgs in Flags) and (CurPkg.AutoInstall<>pitNope))
// check packages with opened editor
or ((fpfSearchInPckgsWithEditor in Flags) and (CurPkg.Editor<>nil))
then
Event(CurPkg);
end;
// iterate in package links
if (fpfSearchInPkgLinks in Flags) then begin
// ToDo
//PkgLinks.IteratePackageNames();
end;
end;
initialization initialization
PackageGraph:=nil; PackageGraph:=nil;

View File

@ -152,8 +152,13 @@ var
CurEditor: TPackageEditorForm; CurEditor: TPackageEditorForm;
begin begin
Result:=mrCancel; Result:=mrCancel;
// create a new package // create a new package with standard dependencies
NewPackage:=PackageGraph.NewPackage('NewPackage'); NewPackage:=PackageGraph.NewPackage('NewPackage');
NewPackage.AddRequiredDependency(
PackageGraph.FCLPackage.CreateDependencyForThisPkg);
NewPackage.AddRequiredDependency(
PackageGraph.LCLPackage.CreateDependencyForThisPkg);
// open a package editor // open a package editor
CurEditor:=PackageEditors.OpenEditor(NewPackage); CurEditor:=PackageEditors.OpenEditor(NewPackage);
CurEditor.Show; CurEditor.Show;