implemented removing, re-adding, updating project dependencies

git-svn-id: trunk@4086 -
This commit is contained in:
mattias 2003-04-20 20:32:40 +00:00
parent a9c753a035
commit 59957529dc
10 changed files with 334 additions and 52 deletions

View File

@ -97,6 +97,8 @@ type
function ShowAddToProjectDlg(AProject: TProject; function ShowAddToProjectDlg(AProject: TProject;
var AddResult: TAddToProjectResult): TModalResult; var AddResult: TAddToProjectResult): TModalResult;
function CheckAddingDependency(LazProject: TProject;
NewDependency: TPkgDependency): boolean;
implementation implementation

View File

@ -384,6 +384,7 @@ type
procedure DeleteRequiredDependency(Dependency: TPkgDependency); procedure DeleteRequiredDependency(Dependency: TPkgDependency);
procedure DeleteRemovedDependency(Dependency: TPkgDependency); procedure DeleteRemovedDependency(Dependency: TPkgDependency);
procedure RemoveRemovedDependency(Dependency: TPkgDependency); procedure RemoveRemovedDependency(Dependency: TPkgDependency);
procedure ReaddRemovedDependency(Dependency: TPkgDependency);
procedure MoveRequiredDependencyUp(Dependency: TPkgDependency); procedure MoveRequiredDependencyUp(Dependency: TPkgDependency);
procedure MoveRequiredDependencyDown(Dependency: TPkgDependency); procedure MoveRequiredDependencyDown(Dependency: TPkgDependency);
function Requires(APackage: TLazPackage): boolean; function Requires(APackage: TLazPackage): boolean;
@ -432,6 +433,7 @@ type
property UnitOutputDirectory: String property UnitOutputDirectory: String
read fUnitOutputDirectory write fUnitOutputDirectory; read fUnitOutputDirectory write fUnitOutputDirectory;
property Units[Index: integer]:TUnitInfo read GetUnits write SetUnits; property Units[Index: integer]:TUnitInfo read GetUnits write SetUnits;
property UpdateLock: integer read FUpdateLock;
end; end;
const const
@ -1428,7 +1430,7 @@ begin
// load the dependencies // load the dependencies
LoadPkgDependencyList(XMLConfig,'ProjectOptions/RequiredPackages/', LoadPkgDependencyList(XMLConfig,'ProjectOptions/RequiredPackages/',
FFirstRequiredDependency,pdlRequires,Self); FFirstRequiredDependency,pdlRequires,Self,true);
finally finally
{$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TProject.ReadProject freeing xml');{$ENDIF} {$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TProject.ReadProject freeing xml');{$ENDIF}
xmlconfig.Free; xmlconfig.Free;
@ -2156,47 +2158,73 @@ end;
procedure TProject.AddRequiredDependency(Dependency: TPkgDependency); procedure TProject.AddRequiredDependency(Dependency: TPkgDependency);
begin begin
BeginUpdate(true);
Dependency.AddToList(FFirstRequiredDependency,pdlRequires); Dependency.AddToList(FFirstRequiredDependency,pdlRequires);
Dependency.Owner:=Self; Dependency.Owner:=Self;
Dependency.HoldPackage:=true;
Modified:=true; Modified:=true;
EndUpdate;
end; end;
procedure TProject.RemoveRequiredDependency(Dependency: TPkgDependency); procedure TProject.RemoveRequiredDependency(Dependency: TPkgDependency);
begin begin
BeginUpdate(true);
Dependency.RemoveFromList(FFirstRequiredDependency,pdlRequires); Dependency.RemoveFromList(FFirstRequiredDependency,pdlRequires);
Dependency.RequiredPackage:=nil;
Dependency.AddToList(FFirstRemovedDependency,pdlRequires); Dependency.AddToList(FFirstRemovedDependency,pdlRequires);
Dependency.Removed:=true; Dependency.Removed:=true;
Modified:=true; Modified:=true;
EndUpdate;
end; end;
procedure TProject.DeleteRequiredDependency(Dependency: TPkgDependency); procedure TProject.DeleteRequiredDependency(Dependency: TPkgDependency);
begin begin
BeginUpdate(true);
Dependency.RequiredPackage:=nil; Dependency.RequiredPackage:=nil;
Dependency.RemoveFromList(FFirstRequiredDependency,pdlRequires); Dependency.RemoveFromList(FFirstRequiredDependency,pdlRequires);
Dependency.Free; Dependency.Free;
EndUpdate;
end; end;
procedure TProject.DeleteRemovedDependency(Dependency: TPkgDependency); procedure TProject.DeleteRemovedDependency(Dependency: TPkgDependency);
begin begin
BeginUpdate(true);
Dependency.RequiredPackage:=nil; Dependency.RequiredPackage:=nil;
Dependency.RemoveFromList(FFirstRemovedDependency,pdlRequires); Dependency.RemoveFromList(FFirstRemovedDependency,pdlRequires);
Dependency.Free; Dependency.Free;
EndUpdate;
end; end;
procedure TProject.RemoveRemovedDependency(Dependency: TPkgDependency); procedure TProject.RemoveRemovedDependency(Dependency: TPkgDependency);
begin begin
BeginUpdate(true);
Dependency.RemoveFromList(FFirstRemovedDependency,pdlRequires); Dependency.RemoveFromList(FFirstRemovedDependency,pdlRequires);
Dependency.Removed:=false; Dependency.Removed:=false;
EndUpdate;
end;
procedure TProject.ReaddRemovedDependency(Dependency: TPkgDependency);
begin
BeginUpdate(true);
RemoveRemovedDependency(Dependency);
AddRequiredDependency(Dependency);
EndUpdate;
end; end;
procedure TProject.MoveRequiredDependencyUp(Dependency: TPkgDependency); procedure TProject.MoveRequiredDependencyUp(Dependency: TPkgDependency);
begin begin
if Dependency.PrevRequiresDependency=nil then exit;
BeginUpdate(true);
Dependency.MoveUpInList(FFirstRequiredDependency,pdlRequires); Dependency.MoveUpInList(FFirstRequiredDependency,pdlRequires);
EndUpdate;
end; end;
procedure TProject.MoveRequiredDependencyDown(Dependency: TPkgDependency); procedure TProject.MoveRequiredDependencyDown(Dependency: TPkgDependency);
begin begin
if Dependency.NextRequiresDependency=nil then exit;
BeginUpdate(true);
Dependency.MoveDownInList(FFirstRequiredDependency,pdlRequires); Dependency.MoveDownInList(FFirstRequiredDependency,pdlRequires);
EndUpdate;
end; end;
function TProject.Requires(APackage: TLazPackage): boolean; function TProject.Requires(APackage: TLazPackage): boolean;
@ -2527,6 +2555,9 @@ end.
{ {
$Log$ $Log$
Revision 1.111 2003/04/20 20:32:40 mattias
implemented removing, re-adding, updating project dependencies
Revision 1.110 2003/04/20 09:52:07 mattias Revision 1.110 2003/04/20 09:52:07 mattias
implemented saving loading project dependencies implemented saving loading project dependencies

View File

@ -66,10 +66,13 @@ type
procedure ItemsPopupMenuPopup(Sender: TObject); procedure ItemsPopupMenuPopup(Sender: TObject);
procedure ItemsTreeViewDblClick(Sender: TObject); procedure ItemsTreeViewDblClick(Sender: TObject);
procedure ItemsTreeViewSelectionChanged(Sender: TObject); procedure ItemsTreeViewSelectionChanged(Sender: TObject);
procedure MoveDependencyUpClick(Sender: TObject);
procedure MoveDependencyDownClick(Sender: TObject);
procedure OpenBitBtnClick(Sender: TObject); procedure OpenBitBtnClick(Sender: TObject);
procedure OptionsBitBtnClick(Sender: TObject); procedure OptionsBitBtnClick(Sender: TObject);
procedure ProjectInspectorFormResize(Sender: TObject); procedure ProjectInspectorFormResize(Sender: TObject);
procedure ProjectInspectorFormShow(Sender: TObject); procedure ProjectInspectorFormShow(Sender: TObject);
procedure ReAddMenuItemClick(Sender: TObject);
procedure RemoveBitBtnClick(Sender: TObject); procedure RemoveBitBtnClick(Sender: TObject);
private private
FOnAddUnitToProject: TOnAddUnitToProject; FOnAddUnitToProject: TOnAddUnitToProject;
@ -170,6 +173,26 @@ begin
UpdateButtons; UpdateButtons;
end; end;
procedure TProjectInspectorForm.MoveDependencyUpClick(Sender: TObject);
var
Dependency: TPkgDependency;
begin
Dependency:=GetSelectedDependency;
if (Dependency=nil) or (Dependency.Removed)
or (Dependency.PrevRequiresDependency=nil) then exit;
LazProject.MoveRequiredDependencyUp(Dependency);
end;
procedure TProjectInspectorForm.MoveDependencyDownClick(Sender: TObject);
var
Dependency: TPkgDependency;
begin
Dependency:=GetSelectedDependency;
if (Dependency=nil) or (Dependency.Removed)
or (Dependency.NextRequiresDependency=nil) then exit;
LazProject.MoveRequiredDependencyDown(Dependency);
end;
procedure TProjectInspectorForm.AddBitBtnClick(Sender: TObject); procedure TProjectInspectorForm.AddBitBtnClick(Sender: TObject);
var var
AddResult: TAddToProjectResult; AddResult: TAddToProjectResult;
@ -209,8 +232,54 @@ begin
end; end;
procedure TProjectInspectorForm.ItemsPopupMenuPopup(Sender: TObject); procedure TProjectInspectorForm.ItemsPopupMenuPopup(Sender: TObject);
begin var
ItemCnt: integer;
procedure AddPopupMenuItem(const ACaption: string; AnEvent: TNotifyEvent;
EnabledFlag: boolean);
var
CurMenuItem: TMenuItem;
begin
if ItemsPopupMenu.Items.Count<=ItemCnt then begin
CurMenuItem:=TMenuItem.Create(Self);
ItemsPopupMenu.Items.Add(CurMenuItem);
end else
CurMenuItem:=ItemsPopupMenu.Items[ItemCnt];
CurMenuItem.Caption:=ACaption;
CurMenuItem.OnClick:=AnEvent;
CurMenuItem.Enabled:=EnabledFlag;
inc(ItemCnt);
end;
var
CurFile: TUnitInfo;
CurDependency: TPkgDependency;
begin
ItemCnt:=0;
CurFile:=GetSelectedFile;
if CurFile<>nil then begin
AddPopupMenuItem('Open file',@OpenBitBtnClick,true);
AddPopupMenuItem('Remove file',@RemoveBitBtnClick,RemoveBitBtn.Enabled);
end;
CurDependency:=GetSelectedDependency;
if CurDependency<>nil then begin
if CurDependency.Removed then begin
AddPopupMenuItem('Open package',@OpenBitBtnClick,true);
AddPopupMenuItem('Re-Add dependency',@ReAddMenuItemClick,
AddBitBtn.Enabled);
end else begin
AddPopupMenuItem('Open package',@OpenBitBtnClick,true);
AddPopupMenuItem('Remove dependency',@RemoveBitBtnClick,
RemoveBitBtn.Enabled);
AddPopupMenuItem('Move dependency up',@MoveDependencyUpClick,
(CurDependency.PrevRequiresDependency<>nil));
AddPopupMenuItem('Move dependency down',@MoveDependencyDownClick,
(CurDependency.NextRequiresDependency<>nil));
end;
end;
while ItemsPopupMenu.Items.Count>ItemCnt do
ItemsPopupMenu.Items.Delete(ItemsPopupMenu.Items.Count-1);
end; end;
procedure TProjectInspectorForm.OpenBitBtnClick(Sender: TObject); procedure TProjectInspectorForm.OpenBitBtnClick(Sender: TObject);
@ -228,20 +297,45 @@ begin
UpdateAll; UpdateAll;
end; end;
procedure TProjectInspectorForm.RemoveBitBtnClick(Sender: TObject); procedure TProjectInspectorForm.ReAddMenuItemClick(Sender: TObject);
var
Dependency: TPkgDependency;
RequiredPackage: TLazPackage;
begin begin
Dependency:=GetSelectedDependency;
if (Dependency=nil) or (not Dependency.Removed)
or (not CheckAddingDependency(LazProject,Dependency)) then exit;
BeginUpdate;
LazProject.ReaddRemovedDependency(Dependency);
PackageGraph.OpenDependency(Dependency,RequiredPackage);
EndUpdate;
end;
procedure TProjectInspectorForm.RemoveBitBtnClick(Sender: TObject);
var
CurDependency: TPkgDependency;
begin
CurDependency:=GetSelectedDependency;
if (CurDependency<>nil) and (not CurDependency.Removed) then begin
if MessageDlg('Confirm deleting dependency',
'Delete dependency for '+CurDependency.AsString+'?',
mtConfirmation,[mbYes,mbNo],0)<>mrYes
then exit;
LazProject.RemoveRequiredDependency(CurDependency);
end;
end; end;
procedure TProjectInspectorForm.SetLazProject(const AValue: TProject); procedure TProjectInspectorForm.SetLazProject(const AValue: TProject);
begin begin
if FLazProject=AValue then exit; if FLazProject=AValue then exit;
if FLazProject<>nil then begin if FLazProject<>nil then begin
dec(FUpdateLock,LazProject.UpdateLock);
FLazProject.OnBeginUpdate:=nil; FLazProject.OnBeginUpdate:=nil;
FLazProject.OnEndUpdate:=nil; FLazProject.OnEndUpdate:=nil;
end; end;
FLazProject:=AValue; FLazProject:=AValue;
if FLazProject<>nil then begin if FLazProject<>nil then begin
inc(FUpdateLock,LazProject.UpdateLock);
FLazProject.OnBeginUpdate:=@OnProjectBeginUpdate; FLazProject.OnBeginUpdate:=@OnProjectBeginUpdate;
FLazProject.OnEndUpdate:=@OnProjectEndUpdate; FLazProject.OnEndUpdate:=@OnProjectEndUpdate;
end; end;
@ -447,7 +541,7 @@ begin
CurNode.Free; CurNode.Free;
CurNode:=NextNode; CurNode:=NextNode;
end; end;
DependenciesNode.Expanded:=true; RemovedDependenciesNode.Expanded:=true;
end else begin end else begin
// delete removed dependency nodes // delete removed dependency nodes
if RemovedDependenciesNode<>nil then if RemovedDependenciesNode<>nil then

View File

@ -58,26 +58,30 @@ Type
FDayChanged: TNotifyEvent; FDayChanged: TNotifyEvent;
FMonthChanged: TNotifyEvent; FMonthChanged: TNotifyEvent;
FYearChanged: TNotifyEvent; FYearChanged: TNotifyEvent;
FPropsChanged: boolean;
function ReadOnlyIsStored: boolean;
procedure SetReadOnly(const AValue: Boolean); procedure SetReadOnly(const AValue: Boolean);
Procedure GetProps; Procedure GetProps;
Procedure SetProps; Procedure SetProps;
function GetDisplaySettings: TDisplaySettings; function GetDisplaySettings: TDisplaySettings;
procedure SetDisplaySettings(const AValue: TDisplaySettings); procedure SetDisplaySettings(const AValue: TDisplaySettings);
function GetDate: String; function GetDate: String;
procedure SetDate(const AValue: String); procedure SetDate(const AValue: String);
protected protected
procedure LMMonthChanged(var Message: TLMessage); message LM_MONTHCHANGED; procedure LMMonthChanged(var Message: TLMessage); message LM_MONTHCHANGED;
procedure LMYEARChanged(var Message: TLMessage); message LM_YEARCHANGED; procedure LMYearChanged(var Message: TLMessage); message LM_YEARCHANGED;
procedure LMDAYChanged(var Message: TLMessage); message LM_DAYCHANGED; procedure LMDayChanged(var Message: TLMessage); message LM_DAYCHANGED;
public public
constructor Create(AOwner: TComponent); override; constructor Create(TheOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
procedure Loaded; override;
procedure InitializeWnd; override;
procedure AddControl; override;
published published
Property Date : String read GetDate write SetDate; Property Date : String read GetDate write SetDate;
property DisplaySettings : TDisplaySettings read GetDisplaySettings write SetDisplaySettings; property DisplaySettings : TDisplaySettings read GetDisplaySettings write SetDisplaySettings;
// Property Date : TDate read GetDate write SetDate; // Property Date : TDate read GetDate write SetDate;
property ReadOnly : Boolean read FReadOnly write SetReadOnly; property ReadOnly : Boolean read FReadOnly write SetReadOnly stored ReadOnlyIsStored;
property Visible; property Visible;
// property OnChange; // property OnChange;
property OnClick; property OnClick;
@ -99,37 +103,54 @@ end;
{ TCalendar } { TCalendar }
constructor TCalendar.Create(AOwner: TComponent); constructor TCalendar.Create(TheOwner: TComponent);
begin begin
inherited Create(AOwner); inherited Create(TheOwner);
fCompStyle := csCalendar; fCompStyle := csCalendar;
SetBounds(0,0,250,150); SetBounds(0,0,250,150);
fDisplaySettings := [dsShowHeadings, dsShowDayNames]; fDisplaySettings := [dsShowHeadings, dsShowDayNames];
Date := FormatDateTime('dd-mm-yyyy',Now);
ControlStyle:=ControlStyle-csMultiClicks-[csAcceptsControls]; ControlStyle:=ControlStyle-csMultiClicks-[csAcceptsControls];
Date := FormatDateTime('dd-mm-yyyy',Now);
end; end;
destructor TCalendar.Destroy; destructor TCalendar.Destroy;
begin begin
Inherited; Inherited Destroy;
end;
procedure TCalendar.Loaded;
begin
inherited Loaded;
if FPropsChanged then SetProps;
end;
procedure TCalendar.InitializeWnd;
begin
inherited InitializeWnd;
if FPropsChanged then SetProps;
end;
procedure TCalendar.AddControl;
begin
inherited AddControl;
end; end;
function TCalendar.GetDate: String; function TCalendar.GetDate: String;
begin begin
Result := ''; Result := '';
GetPRops; GetProps;
Result := FDate; Result := FDate;
end; end;
procedure TCalendar.SetDate(const AValue: String); procedure TCalendar.SetDate(const AValue: String);
begin begin
try try
StrtoDate(AValue); //test to see if valid date.... StrtoDate(AValue); //test to see if valid date....
FDate := AValue; FDate := AValue;
SetProps; except
except raise EInvalidDate.CreateFmt(rsInvalidDate, [AValue]);
raise EInvalidDate.CreateFmt(rsInvalidDate, [AValue]); end;
end; SetProps;
end; end;
function TCalendar.GetDisplaySettings: TDisplaySettings; function TCalendar.GetDisplaySettings: TDisplaySettings;
@ -147,35 +168,42 @@ end;
procedure TCalendar.SetReadOnly(const AValue: Boolean); procedure TCalendar.SetReadOnly(const AValue: Boolean);
begin begin
if (FReadOnly <> aValue) then if (FReadOnly <> aValue) then
Begin Begin
FReadOnly := aValue; FReadOnly := aValue;
SetProps; SetProps;
end; end;
end;
function TCalendar.ReadOnlyIsStored: boolean;
begin
Result:=FReadOnly;
end; end;
Procedure TCalendar.GetProps; Procedure TCalendar.GetProps;
var var
Temp : TLMCalendar; Temp : TLMCalendar;
begin begin
if HandleAllocated then if HandleAllocated then
begin begin
CNSendMessage(LM_GETVALUE, Self, @temp); // Get the info CNSendMessage(LM_GETVALUE, Self, @temp); // Get the info
FDate := FormatDateTime('dd-mm-yyyy',Temp.Date); FDate := FormatDateTime('dd-mm-yyyy',Temp.Date);
end; end;
end; end;
Procedure TCalendar.SetProps; Procedure TCalendar.SetProps;
var var
Temp : TLMCalendar; Temp : TLMCalendar;
begin begin
if HandleAllocated then if HandleAllocated and (not (csLoading in ComponentState)) then
begin begin
Temp.Date := StrToDate(FDate); FPropsChanged:=false;
Temp.DisplaySettings := FDisplaySettings; Temp.Date := StrToDate(FDate);
Temp.ReadOnly := fReadOnly; Temp.DisplaySettings := FDisplaySettings;
CNSendMessage(LM_SETVALUE, Self, @temp); // Get the info Temp.ReadOnly := fReadOnly;
End; CNSendMessage(LM_SETVALUE, Self, @temp); // Get the info
End else begin
FPropsChanged:=true;
end;
end; end;
procedure TCalendar.LMDAYChanged(var Message: TLMessage); procedure TCalendar.LMDAYChanged(var Message: TLMessage);

View File

@ -44,7 +44,7 @@ uses
{$IFDEF IDE_MEM_CHECK} {$IFDEF IDE_MEM_CHECK}
MemCheck, MemCheck,
{$ENDIF} {$ENDIF}
Classes, SysUtils, Forms, PackageDefs; Classes, SysUtils, Forms, PackageDefs, Project;
type type
TPkgSaveFlag = ( TPkgSaveFlag = (
@ -76,7 +76,11 @@ type
function GetDefaultSaveDirectoryForFile(const Filename: string): string; virtual; abstract; function GetDefaultSaveDirectoryForFile(const Filename: string): string; virtual; abstract;
procedure LoadInstalledPackages; virtual; abstract; procedure LoadInstalledPackages; virtual; abstract;
function OpenProjectDependencies(AProject: TProject): TModalResult; virtual; abstract;
procedure AddDefaultDependencies(AProject: TProject); virtual; abstract;
procedure AddProjectDependency(AProject: TProject; APackage: TLazPackage); virtual; abstract;
procedure AddProjectLCLDependency(AProject: TProject); virtual; abstract;
function ShowConfigureCustomComponents: TModalResult; virtual; abstract; function ShowConfigureCustomComponents: TModalResult; virtual; abstract;
function DoNewPackage: TModalResult; virtual; abstract; function DoNewPackage: TModalResult; virtual; abstract;
function DoShowOpenInstalledPckDlg: TModalResult; virtual; abstract; function DoShowOpenInstalledPckDlg: TModalResult; virtual; abstract;
@ -95,6 +99,8 @@ type
Flags: TPkgCompileFlags): TModalResult; virtual; abstract; Flags: TPkgCompileFlags): TModalResult; virtual; abstract;
function OnRenameFile(const OldFilename, function OnRenameFile(const OldFilename,
NewFilename: string): TModalResult; virtual; abstract; NewFilename: string): TModalResult; virtual; abstract;
function OnProjectInspectorOpen(Sender: TObject): boolean; virtual; abstract;
end; end;
var var

View File

@ -195,6 +195,7 @@ type
TPkgDependency = class TPkgDependency = class
private private
FFlags: TPkgDependencyFlags; FFlags: TPkgDependencyFlags;
FHoldPackage: boolean;
FLoadPackageResult: TLoadPackageResult; FLoadPackageResult: TLoadPackageResult;
FOwner: TObject; FOwner: TObject;
FMaxVersion: TPkgVersion; FMaxVersion: TPkgVersion;
@ -203,6 +204,7 @@ type
FRemoved: boolean; FRemoved: boolean;
FRequiredPackage: TLazPackage; FRequiredPackage: TLazPackage;
procedure SetFlags(const AValue: TPkgDependencyFlags); procedure SetFlags(const AValue: TPkgDependencyFlags);
procedure SetHoldPackage(const AValue: boolean);
procedure SetLoadPackageResult(const AValue: TLoadPackageResult); procedure SetLoadPackageResult(const AValue: TLoadPackageResult);
procedure SetMaxVersion(const AValue: TPkgVersion); procedure SetMaxVersion(const AValue: TPkgVersion);
procedure SetMinVersion(const AValue: TPkgVersion); procedure SetMinVersion(const AValue: TPkgVersion);
@ -248,6 +250,7 @@ type
property Owner: TObject read FOwner write FOwner; property Owner: TObject read FOwner write FOwner;
property RequiredPackage: TLazPackage read FRequiredPackage write SetRequiredPackage; property RequiredPackage: TLazPackage read FRequiredPackage write SetRequiredPackage;
property LoadPackageResult: TLoadPackageResult read FLoadPackageResult write SetLoadPackageResult; property LoadPackageResult: TLoadPackageResult read FLoadPackageResult write SetLoadPackageResult;
property HoldPackage: boolean read FHoldPackage write SetHoldPackage;
end; end;
PPkgDependency = ^TPkgDependency; PPkgDependency = ^TPkgDependency;
@ -422,6 +425,7 @@ type
FFirstRequiredDependency: TPkgDependency; FFirstRequiredDependency: TPkgDependency;
FFirstUsedByDependency: TPkgDependency; FFirstUsedByDependency: TPkgDependency;
FFlags: TLazPackageFlags; FFlags: TLazPackageFlags;
FHoldPackageCount: integer;
FIconFile: string; FIconFile: string;
FInstalled: TPackageInstallType; FInstalled: TPackageInstallType;
FLastCompilerFilename: string; FLastCompilerFilename: string;
@ -561,6 +565,7 @@ type
read FFirstRequiredDependency; read FFirstRequiredDependency;
property FirstUsedByDependency: TPkgDependency read FFirstUsedByDependency; property FirstUsedByDependency: TPkgDependency read FFirstUsedByDependency;
property Flags: TLazPackageFlags read FFlags write SetFlags; property Flags: TLazPackageFlags read FFlags write SetFlags;
property HoldPackageCount: integer read FHoldPackageCount;
property IconFile: string read FIconFile write SetIconFile; property IconFile: string read FIconFile write SetIconFile;
property Installed: TPackageInstallType read FInstalled write SetInstalled; property Installed: TPackageInstallType read FInstalled write SetInstalled;
property LastCompilerFilename: string read FLastCompilerFilename property LastCompilerFilename: string read FLastCompilerFilename
@ -624,7 +629,8 @@ function LazPackageTypeIdentToType(const s: string): TLazPackageType;
procedure SortDependencyList(Dependencies: TList); procedure SortDependencyList(Dependencies: TList);
procedure LoadPkgDependencyList(XMLConfig: TXMLConfig; const ThePath: string; procedure LoadPkgDependencyList(XMLConfig: TXMLConfig; const ThePath: string;
var First: TPkgDependency; ListType: TPkgDependencyList; Owner: TObject); var First: TPkgDependency; ListType: TPkgDependencyList; Owner: TObject;
HoldPackages: boolean);
procedure SavePkgDependencyList(XMLConfig: TXMLConfig; const ThePath: string; procedure SavePkgDependencyList(XMLConfig: TXMLConfig; const ThePath: string;
First: TPkgDependency; ListType: TPkgDependencyList); First: TPkgDependency; ListType: TPkgDependencyList);
@ -666,7 +672,8 @@ begin
end; end;
procedure LoadPkgDependencyList(XMLConfig: TXMLConfig; const ThePath: string; procedure LoadPkgDependencyList(XMLConfig: TXMLConfig; const ThePath: string;
var First: TPkgDependency; ListType: TPkgDependencyList; Owner: TObject); var First: TPkgDependency; ListType: TPkgDependencyList; Owner: TObject;
HoldPackages: boolean);
var var
i: Integer; i: Integer;
PkgDependency: TPkgDependency; PkgDependency: TPkgDependency;
@ -681,6 +688,7 @@ begin
PkgDependency:=TPkgDependency.Create; PkgDependency:=TPkgDependency.Create;
PkgDependency.LoadFromXMLConfig(XMLConfig,ThePath+'Item'+IntToStr(i+1)+'/', PkgDependency.LoadFromXMLConfig(XMLConfig,ThePath+'Item'+IntToStr(i+1)+'/',
FileVersion); FileVersion);
PkgDependency.HoldPackage:=HoldPackages;
if PkgDependency.MakeSense then if PkgDependency.MakeSense then
List.Add(PkgDependency) List.Add(PkgDependency)
else else
@ -1075,6 +1083,18 @@ begin
FFlags:=AValue; FFlags:=AValue;
end; end;
procedure TPkgDependency.SetHoldPackage(const AValue: boolean);
begin
if FHoldPackage=AValue then exit;
FHoldPackage:=AValue;
if RequiredPackage<>nil then begin
if FHoldPackage then
inc(RequiredPackage.FHoldPackageCount)
else
dec(RequiredPackage.FHoldPackageCount);
end;
end;
procedure TPkgDependency.SetLoadPackageResult(const AValue: TLoadPackageResult procedure TPkgDependency.SetLoadPackageResult(const AValue: TLoadPackageResult
); );
begin begin
@ -1819,7 +1839,7 @@ begin
FPackageType:=LazPackageTypeIdentToType(XMLConfig.GetValue(Path+'Type/Value', FPackageType:=LazPackageTypeIdentToType(XMLConfig.GetValue(Path+'Type/Value',
LazPackageTypeIdents[lptRunTime])); LazPackageTypeIdents[lptRunTime]));
LoadPkgDependencyList(XMLConfig,Path+'RequiredPkgs/', LoadPkgDependencyList(XMLConfig,Path+'RequiredPkgs/',
FFirstRequiredDependency,pdlRequires,Self); FFirstRequiredDependency,pdlRequires,Self,false);
FUsageOptions.LoadFromXMLConfig(XMLConfig,Path+'UsageOptions/'); FUsageOptions.LoadFromXMLConfig(XMLConfig,Path+'UsageOptions/');
LoadRect(XMLConfig,Path+'EditorRect/',fEditorRect); LoadRect(XMLConfig,Path+'EditorRect/',fEditorRect);
EndUpdate; EndUpdate;
@ -2105,6 +2125,7 @@ end;
procedure TLazPackage.RemoveRequiredDependency(Dependency: TPkgDependency); procedure TLazPackage.RemoveRequiredDependency(Dependency: TPkgDependency);
begin begin
Dependency.RemoveFromList(FFirstRequiredDependency,pdlRequires); Dependency.RemoveFromList(FFirstRequiredDependency,pdlRequires);
Dependency.RequiredPackage:=nil;
Dependency.AddToList(FFirstRemovedDependency,pdlRequires); Dependency.AddToList(FFirstRemovedDependency,pdlRequires);
Dependency.Removed:=true; Dependency.Removed:=true;
Modified:=true; Modified:=true;
@ -2169,11 +2190,15 @@ end;
procedure TLazPackage.AddUsedByDependency(Dependency: TPkgDependency); procedure TLazPackage.AddUsedByDependency(Dependency: TPkgDependency);
begin begin
Dependency.AddToList(FFirstUsedByDependency,pdlUsedBy); Dependency.AddToList(FFirstUsedByDependency,pdlUsedBy);
if Dependency.HoldPackage then
inc(FHoldPackageCount);
end; end;
procedure TLazPackage.RemoveUsedByDependency(Dependency: TPkgDependency); procedure TLazPackage.RemoveUsedByDependency(Dependency: TPkgDependency);
begin begin
Dependency.RemoveFromList(FFirstUsedByDependency,pdlUsedBy); Dependency.RemoveFromList(FFirstUsedByDependency,pdlUsedBy);
if Dependency.HoldPackage then
dec(FHoldPackageCount);
end; end;
procedure TLazPackage.ChangeID(const NewName: string; NewVersion: TPkgVersion); procedure TLazPackage.ChangeID(const NewName: string; NewVersion: TPkgVersion);

View File

@ -339,7 +339,7 @@ begin
AddBitBtn.Enabled); AddBitBtn.Enabled);
end else if (CurNode.Parent=RemovedRequiredNode) then begin end else if (CurNode.Parent=RemovedRequiredNode) then begin
AddPopupMenuItem('Open package',@OpenFileMenuItemClick,true); AddPopupMenuItem('Open package',@OpenFileMenuItemClick,true);
AddPopupMenuItem('Add dependency',@ReAddMenuItemClick, AddPopupMenuItem('Re-Add dependency',@ReAddMenuItemClick,
AddBitBtn.Enabled); AddBitBtn.Enabled);
end; end;
end; end;

View File

@ -114,8 +114,12 @@ type
function CreateUniquePkgName(const Prefix: string; function CreateUniquePkgName(const Prefix: string;
IgnorePackage: TLazPackage): string; IgnorePackage: TLazPackage): string;
function CreateUniqueUnitName(const Prefix: string): string; function CreateUniqueUnitName(const Prefix: string): string;
function DependencyExists(Dependency: TPkgDependency;
Flags: TFindPackageFlags): boolean;
function FindAPackageWithName(const PkgName: string; function FindAPackageWithName(const PkgName: string;
IgnorePackage: TLazPackage): TLazPackage; IgnorePackage: TLazPackage): TLazPackage;
function FindBrokenDependencyPath(APackage: TLazPackage): TList;
function FindCircleDependencyPath(APackage: TLazPackage): TList;
function FindFileInAllPackages(const TheFilename: string; function FindFileInAllPackages(const TheFilename: string;
ResolveLinks, IgnoreDeleted: boolean): TPkgFile; ResolveLinks, IgnoreDeleted: boolean): TPkgFile;
function FindLowestPkgNodeByName(const PkgName: string): TAVLTreeNode; function FindLowestPkgNodeByName(const PkgName: string): TAVLTreeNode;
@ -131,14 +135,13 @@ type
WithRequiredPackages, IgnoreDeleted: boolean): TPkgFile; WithRequiredPackages, IgnoreDeleted: boolean): TPkgFile;
function FindUnitInAllPackages(const TheUnitName: string; function FindUnitInAllPackages(const TheUnitName: string;
IgnoreDeleted: boolean): TPkgFile; IgnoreDeleted: boolean): TPkgFile;
function GetAutoCompilationOrder(APackage: TLazPackage): TList;
function GetBrokenDependenciesWhenChangingPkgID(APackage: TLazPackage; function GetBrokenDependenciesWhenChangingPkgID(APackage: TLazPackage;
const NewName: string; NewVersion: TPkgVersion): TList; const NewName: string; NewVersion: TPkgVersion): TList;
function PackageCanBeReplaced(OldPackage, NewPackage: TLazPackage): boolean; function PackageCanBeReplaced(OldPackage, NewPackage: TLazPackage): boolean;
function PackageIsNeeded(APackage: TLazPackage): boolean; function PackageIsNeeded(APackage: TLazPackage): boolean;
function PackageNameExists(const PkgName: string; function PackageNameExists(const PkgName: string;
IgnorePackage: TLazPackage): boolean; IgnorePackage: TLazPackage): boolean;
function DependencyExists(Dependency: TPkgDependency;
Flags: TFindPackageFlags): boolean;
procedure ConsistencyCheck; procedure ConsistencyCheck;
procedure GetAllRequiredPackages(FirstDependency: TPkgDependency; procedure GetAllRequiredPackages(FirstDependency: TPkgDependency;
var List: TList); var List: TList);
@ -152,9 +155,6 @@ type
Event: TIteratePackagesEvent); Event: TIteratePackagesEvent);
procedure MarkAllPackagesAsNotVisited; procedure MarkAllPackagesAsNotVisited;
procedure MarkNeededPackages; procedure MarkNeededPackages;
function FindBrokenDependencyPath(APackage: TLazPackage): TList;
function FindCircleDependencyPath(APackage: TLazPackage): TList;
function GetAutoCompilationOrder(APackage: TLazPackage): TList;
public public
// packages handling // packages handling
function CreateNewPackage(const Prefix: string): TLazPackage; function CreateNewPackage(const Prefix: string): TLazPackage;
@ -183,6 +183,7 @@ type
procedure ChangeDependency(Dependency, NewDependency: TPkgDependency); procedure ChangeDependency(Dependency, NewDependency: TPkgDependency);
function OpenDependency(Dependency: TPkgDependency; function OpenDependency(Dependency: TPkgDependency;
var APackage: TLazPackage): TLoadPackageResult; var APackage: TLazPackage): TLoadPackageResult;
procedure OpenRequiredDependencyList(FirstDependency: TPkgDependency);
procedure MoveRequiredDependencyUp(ADependency: TPkgDependency); procedure MoveRequiredDependencyUp(ADependency: TPkgDependency);
procedure MoveRequiredDependencyDown(ADependency: TPkgDependency); procedure MoveRequiredDependencyDown(ADependency: TPkgDependency);
public public
@ -206,6 +207,7 @@ type
property RegistrationPackage: TLazPackage read FRegistrationPackage property RegistrationPackage: TLazPackage read FRegistrationPackage
write SetRegistrationPackage; write SetRegistrationPackage;
property RegistrationUnitName: string read FRegistrationUnitName; property RegistrationUnitName: string read FRegistrationUnitName;
property UpdateLock: integer read FUpdateLock;
end; end;
var var
@ -1168,13 +1170,15 @@ begin
end; end;
function TLazPackageGraph.PackageIsNeeded(APackage: TLazPackage): boolean; function TLazPackageGraph.PackageIsNeeded(APackage: TLazPackage): boolean;
// check if package is currently in use (installed, autoinstall, editor open) // check if package is currently in use (installed, autoinstall, editor open,
// or used by a needed dependency)
// !!! it does not check if any needed package needs this package // !!! it does not check if any needed package needs this package
begin begin
Result:=true; Result:=true;
// check if package is open, installed or will be installed // check if package is open, installed or will be installed
if (APackage.Installed<>pitNope) or (APackage.AutoInstall<>pitNope) if (APackage.Installed<>pitNope) or (APackage.AutoInstall<>pitNope)
or ((APackage.Editor<>nil) and (APackage.Editor.Visible)) then or ((APackage.Editor<>nil) and (APackage.Editor.Visible))
or (APackage.HoldPackageCount>0) then
begin begin
exit; exit;
end; end;
@ -1308,6 +1312,19 @@ begin
Result:=Dependency.LoadPackageResult; Result:=Dependency.LoadPackageResult;
end; end;
procedure TLazPackageGraph.OpenRequiredDependencyList(
FirstDependency: TPkgDependency);
var
Dependency: TPkgDependency;
RequiredPackage: TLazPackage;
begin
Dependency:=FirstDependency;
while Dependency<>nil do begin
OpenDependency(Dependency,RequiredPackage);
Dependency:=Dependency.NextRequiresDependency;
end;
end;
procedure TLazPackageGraph.MoveRequiredDependencyUp( procedure TLazPackageGraph.MoveRequiredDependencyUp(
ADependency: TPkgDependency); ADependency: TPkgDependency);
begin begin

View File

@ -468,6 +468,7 @@ var
ALayout: TIDEWindowLayout; ALayout: TIDEWindowLayout;
begin begin
inherited Create(TheOwner); inherited Create(TheOwner);
FUpdateLock:=PackageGraph.UpdateLock;
fSortedPackages:=TAVLTree.Create(@CompareLazPackageID); fSortedPackages:=TAVLTree.Create(@CompareLazPackageID);
Name:=NonModalIDEWindowNames[nmiwPkgGraphExplorer]; Name:=NonModalIDEWindowNames[nmiwPkgGraphExplorer];
Caption:='Package Graph'; Caption:='Package Graph';

View File

@ -51,10 +51,12 @@ uses
PackageEditor, AddToPackageDlg, PackageDefs, PackageLinks, PackageSystem, PackageEditor, AddToPackageDlg, PackageDefs, PackageLinks, PackageSystem,
OpenInstalledPkgDlg, PkgGraphExplorer, BrokenDependenciesDlg, CompilerOptions, OpenInstalledPkgDlg, PkgGraphExplorer, BrokenDependenciesDlg, CompilerOptions,
ExtToolDialog, ExtToolEditDlg, EditDefineTree, DefineTemplates, ExtToolDialog, ExtToolEditDlg, EditDefineTree, DefineTemplates,
ProjectInspector,
BasePkgManager, MainBar; BasePkgManager, MainBar;
type type
TPkgManager = class(TBasePkgManager) TPkgManager = class(TBasePkgManager)
// events
function OnPackageEditorCompilePackage(Sender: TObject; function OnPackageEditorCompilePackage(Sender: TObject;
APackage: TLazPackage; CompileAll: boolean): TModalResult; APackage: TLazPackage; CompileAll: boolean): TModalResult;
function OnPackageEditorCreateFile(Sender: TObject; function OnPackageEditorCreateFile(Sender: TObject;
@ -83,6 +85,7 @@ type
procedure PackageGraphDependencyModified(ADependency: TPkgDependency); procedure PackageGraphDependencyModified(ADependency: TPkgDependency);
procedure PackageGraphEndUpdate(Sender: TObject; GraphChanged: boolean); procedure PackageGraphEndUpdate(Sender: TObject; GraphChanged: boolean);
private private
// helper functions
function DoShowSavePackageAsDialog(APackage: TLazPackage): TModalResult; function DoShowSavePackageAsDialog(APackage: TLazPackage): TModalResult;
function CompileRequiredPackages(APackage: TLazPackage): TModalResult; function CompileRequiredPackages(APackage: TLazPackage): TModalResult;
function CheckPackageGraphForCompilation(APackage: TLazPackage): TModalResult; function CheckPackageGraphForCompilation(APackage: TLazPackage): TModalResult;
@ -109,7 +112,11 @@ type
procedure LoadInstalledPackages; override; procedure LoadInstalledPackages; override;
function AddPackageToGraph(APackage: TLazPackage): TModalResult; function AddPackageToGraph(APackage: TLazPackage): TModalResult;
function OpenProjectDependencies(AProject: TProject): TModalResult; override;
procedure AddDefaultDependencies(AProject: TProject); override;
procedure AddProjectDependency(AProject: TProject; APackage: TLazPackage); override;
procedure AddProjectLCLDependency(AProject: TProject); override;
function ShowConfigureCustomComponents: TModalResult; override; function ShowConfigureCustomComponents: TModalResult; override;
function DoNewPackage: TModalResult; override; function DoNewPackage: TModalResult; override;
function DoShowOpenInstalledPckDlg: TModalResult; override; function DoShowOpenInstalledPckDlg: TModalResult; override;
@ -129,6 +136,8 @@ type
Flags: TPkgCompileFlags): TModalResult; override; Flags: TPkgCompileFlags): TModalResult; override;
function OnRenameFile(const OldFilename, function OnRenameFile(const OldFilename,
NewFilename: string): TModalResult; override; NewFilename: string): TModalResult; override;
function OnProjectInspectorOpen(Sender: TObject): boolean; override;
end; end;
implementation implementation
@ -326,6 +335,8 @@ begin
if GraphChanged then begin if GraphChanged then begin
if PackageEditors<>nil then if PackageEditors<>nil then
PackageEditors.UpdateAllEditors; PackageEditors.UpdateAllEditors;
if ProjInspector<>nil then
ProjInspector.UpdateItems;
end; end;
end; end;
@ -985,6 +996,57 @@ begin
Result:=mrOk; Result:=mrOk;
end; end;
function TPkgManager.OpenProjectDependencies(AProject: TProject): TModalResult;
begin
PackageGraph.OpenRequiredDependencyList(AProject.FirstRequiredDependency);
Result:=mrOk;
end;
procedure TPkgManager.AddDefaultDependencies(AProject: TProject);
var
ds: char;
begin
case AProject.ProjectType of
ptApplication:
begin
// add lcl pp/pas dirs to source search path
ds:=PathDelim;
AProject.SrcPath:=
'$(LazarusDir)'+ds+'lcl'
+';'+
'$(LazarusDir)'+ds+'lcl'+ds+'interfaces'+ds+'$(LCLWidgetType)';
{$IFDEF EnablePkgs}
AddProjectLCLDependency(AProject);
{$ELSE}
// add lcl ppu dirs to unit search path
Project1.CompilerOptions.OtherUnitFiles:=
'$(LazarusDir)'+ds+'lcl'+ds+'units'
+';'+
'$(LazarusDir)'+ds+'lcl'+ds+'units'+ds+'$(LCLWidgetType)';
{$ENDIF}
end;
end;
OpenProjectDependencies(AProject);
end;
procedure TPkgManager.AddProjectDependency(AProject: TProject;
APackage: TLazPackage);
begin
// check if the dependency is already there
if FindDependencyByNameInList(AProject.FirstRequiredDependency,pdlRequires,
APackage.Name)<>nil
then exit;
// add a dependency for the package to the project
AProject.AddRequiredDependency(APackage.CreateDependencyForThisPkg);
end;
procedure TPkgManager.AddProjectLCLDependency(AProject: TProject);
begin
AddProjectDependency(AProject,PackageGraph.LCLPackage);
end;
function TPkgManager.ShowConfigureCustomComponents: TModalResult; function TPkgManager.ShowConfigureCustomComponents: TModalResult;
begin begin
Result:=ShowConfigureCustomComponentDlg(EnvironmentOptions.LazarusDirectory); Result:=ShowConfigureCustomComponentDlg(EnvironmentOptions.LazarusDirectory);
@ -1488,6 +1550,22 @@ begin
Result:=mrOk; Result:=mrOk;
end; end;
function TPkgManager.OnProjectInspectorOpen(Sender: TObject): boolean;
var
Dependency: TPkgDependency;
RequiredPackage: TLazPackage;
begin
Result:=false;
if (Sender=nil) or (not (Sender is TProjectInspectorForm)) then exit;
Dependency:=TProjectInspectorForm(Sender).GetSelectedDependency;
if Dependency=nil then exit;
// user has selected a dependency -> open package
Result:=true;
if PackageGraph.OpenDependency(Dependency,RequiredPackage)<>lprSuccess then
exit;
DoOpenPackage(RequiredPackage);
end;
function TPkgManager.DoClosePackageEditor(APackage: TLazPackage): TModalResult; function TPkgManager.DoClosePackageEditor(APackage: TLazPackage): TModalResult;
begin begin
if APackage.Editor<>nil then begin if APackage.Editor<>nil then begin