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

View File

@ -39,8 +39,8 @@ interface
uses
Classes, SysUtils, LResources, Forms, Controls, Buttons, StdCtrls, ExtCtrls,
Dialogs, LazarusIDEStrConsts, IDEOptionDefs, InputHistory, FileCtrl, IDEProcs,
EnvironmentOpts, PackageDefs;
Dialogs, LazarusIDEStrConsts, IDEOptionDefs, InputHistory, FileCtrl, AVL_Tree,
IDEProcs, EnvironmentOpts, PackageSystem, PackageDefs, ComponentReg;
type
TAddToPackageDlg = class(TForm)
@ -48,6 +48,7 @@ type
NoteBook: TNoteBook;
AddUnitPage: TPage;
NewComponentPage: TPage;
NewDependPage: TPage;
// add unit page
AddUnitFilenameLabel: TLabel;
AddUnitFilenameEdit: TEdit;
@ -66,6 +67,16 @@ type
ComponentUnitButton: TButton;
NewComponentButton: 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 AddUnitButtonClick(Sender: TObject);
procedure AddUnitFileBrowseButtonClick(Sender: TObject);
@ -75,15 +86,21 @@ type
procedure ComponentUnitButtonClick(Sender: TObject);
procedure NewComponentButtonClick(Sender: TObject);
procedure NewComponentPageResize(Sender: TObject);
procedure NewDependPageResize(Sender: TObject);
private
FLazPackage: TLazPackage;
fCurAncestorIndex: integer;
fPkgComponents: TAVLTree;// tree of TPkgComponent
fPackages: TAVLTree;// tree of TLazPackage or TPackageLink
procedure SetLazPackage(const AValue: TLazPackage);
procedure SetupComponents;
procedure OnIterateComponentClasses(PkgComponent: TPkgComponent);
procedure OnIteratePackages(APackageID: TLazPackageID);
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure UpdateAvailableAncestorTypes;
procedure UpdateAvailablePageNames;
procedure UpdateAvailableDependencyNames;
public
property LazPackage: TLazPackage read FLazPackage write SetLazPackage;
end;
@ -101,6 +118,7 @@ begin
AddDlg:=TAddToPackageDlg.Create(Application);
AddDlg.LazPackage:=Pkg;
Result:=AddDlg.ShowModal;
IDEDialogLayoutList.SaveLayout(AddDlg);
AddDlg.Free;
end;
@ -187,6 +205,7 @@ begin
try
InputHistories.ApplyFileDialogSettings(OpenDialog);
OpenDialog.Title:=lisOpenFile;
OpenDialog.Options:=OpenDialog.Options+[ofPathMustExist];
if OpenDialog.Execute then begin
AFilename:=CleanAndExpandFilename(OpenDialog.Filename);
if FilenameIsPascalUnit(AFilename) then begin
@ -266,11 +285,54 @@ begin
SetBounds(x,y,80,Height);
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);
begin
if FLazPackage=AValue then exit;
FLazPackage:=AValue;
UpdateAvailableAncestorTypes;
UpdateAvailablePageNames;
UpdateAvailableDependencyNames;
end;
procedure TAddToPackageDlg.SetupComponents;
@ -283,13 +345,18 @@ begin
AddUnitPage:=Page[0];
Pages.Add('New Component');
NewComponentPage:=Page[1];
Pages.Add('New Require, Conflict');
NewDependPage:=Page[2];
PageIndex:=0;
Align:=alClient;
end;
// add unit
AddUnitPage.OnResize:=@AddUnitPageResize;
NewComponentPage.OnResize:=@NewComponentPageResize;
NewDependPage.OnResize:=@NewDependPageResize;
AddUnitFilenameLabel:=TLabel.Create(Self);
with AddUnitFilenameLabel do begin
Name:='AddUnitFilenameLabel';
@ -327,6 +394,9 @@ begin
Caption:='Cancel';
OnClick:=@CancelAddUnitButtonClick;
end;
// add new component unit
AncestorTypeLabel:=TLabel.Create(Self);
with AncestorTypeLabel do begin
@ -407,27 +477,163 @@ begin
Caption:='Cancel';
OnClick:=@CancelNewComponentButtonClick;
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;
constructor TAddToPackageDlg.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
fPkgComponents:=TAVLTree.Create(@CompareIDEComponentByClassName);
fPackages:=TAVLTree.Create(@CompareLazPackageID);
Position:=poScreenCenter;
Width:=450;
Height:=300;
IDEDialogLayoutList.ApplyLayout(Self,500,300);
SetupComponents;
OnResize:=@AddToPackageDlgResize;
end;
destructor TAddToPackageDlg.Destroy;
begin
FreeAndNil(fPkgComponents);
FreeAndNil(fPackages);
inherited Destroy;
end;
procedure TAddToPackageDlg.UpdateAvailableAncestorTypes;
var
ANode: TAVLTreeNode;
sl: TStringList;
begin
fCurAncestorIndex:=0;
//LazPackage.IterateComponentClasses(@OnIterateComponentClasses);
// get all available registered components
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.

View File

@ -139,6 +139,7 @@ var
IDEComponentPalette: TIDEComponentPalette;
function ComparePriority(const p1,p2: TComponentPriority): integer;
function CompareIDEComponentByClassName(Data1, Data2: pointer): integer;
implementation
@ -151,6 +152,17 @@ begin
Result:=p1.Level-p2.Level;
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 }
constructor TIDEComponent.Create(TheComponentClass: TComponentClass;

View File

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

View File

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

View File

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

View File

@ -107,6 +107,11 @@ type
procedure RegisterStaticPackages;
function OpenDependency(Dependency: TPkgDependency;
Flags: TFindPackageFlags; var APackage: TLazPackage): TLoadPackageResult;
procedure IterateComponentClasses(APackage: TLazPackage;
Event: TIterateComponentClassesEvent;
WithUsedPackages, WithRequiredPackages: boolean);
procedure IteratePackages(Flags: TFindPackageFlags;
Event: TIteratePackagesEvent);
public
property Packages[Index: integer]: TLazPackage read GetPackages; default;
property RegistrationPackage: TLazPackage read FRegistrationPackage
@ -168,7 +173,7 @@ end;
constructor TLazPackageGraph.Create;
begin
FTree:=TAVLTree.Create(@CompareLazPackage);
FTree:=TAVLTree.Create(@CompareLazPackageID);
FItems:=TList.Create;
end;
@ -187,9 +192,16 @@ begin
end;
procedure TLazPackageGraph.Clear;
var
i: Integer;
CurPkg: TLazPackage;
begin
FTree.FreeAndClear;
FItems.Clear;
for i:=FItems.Count-1 downto 0 do begin
CurPkg:=Packages[i];
FItems.Delete(i);
FTree.Remove(CurPkg);
CurPkg.Free;
end;
end;
function TLazPackageGraph.Count: integer;
@ -554,6 +566,55 @@ begin
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
PackageGraph:=nil;

View File

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