mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-22 11:19:26 +02:00
implemented package iterations
git-svn-id: trunk@4019 -
This commit is contained in:
parent
3fe22d290e
commit
54169af978
@ -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);
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user