implemented broken dependencies dialog

git-svn-id: trunk@4052 -
This commit is contained in:
mattias 2003-04-13 13:45:04 +00:00
parent 1f7808ff3a
commit 51365b3a35
13 changed files with 486 additions and 86 deletions

View File

@ -35,6 +35,10 @@ unit IDEComp;
{ $DEFINE INTERBASE} { $DEFINE INTERBASE}
{$IFDEF INTERBASE}
{$linklib crypt}
{$ENDIF}
interface interface
uses uses

View File

@ -354,6 +354,8 @@ type
function DoInitProjectRun: TModalResult; virtual; abstract; function DoInitProjectRun: TModalResult; virtual; abstract;
function DoOpenMacroFile(Sender: TObject; function DoOpenMacroFile(Sender: TObject;
const AFilename: string): TModalResult; virtual; const AFilename: string): TModalResult; virtual;
function DoCheckCreatingFile(const AFilename: string;
CheckReadable: boolean): TModalResult; virtual;
function DoCheckFilesOnDisk: TModalResult; virtual; abstract; function DoCheckFilesOnDisk: TModalResult; virtual; abstract;
function DoCheckAmbigiousSources(const AFilename: string; function DoCheckAmbigiousSources(const AFilename: string;
@ -1351,6 +1353,61 @@ begin
[ofOnlyIfExists,ofAddToRecent,ofRegularFile,ofConvertMacros]); [ofOnlyIfExists,ofAddToRecent,ofRegularFile,ofConvertMacros]);
end; end;
{-------------------------------------------------------------------------------
function TMainIDEBar.DoCheckCreatingFile(const AFilename: string;
CheckReadable: boolean): TModalResult;
-------------------------------------------------------------------------------}
function TMainIDEBar.DoCheckCreatingFile(const AFilename: string;
CheckReadable: boolean): TModalResult;
var
fs: TFileStream;
c: char;
begin
// create if not yet done
if not FileExists(AFilename) then begin
try
fs:=TFileStream.Create(AFilename,fmCreate);
fs.Free;
except
Result:=MessageDlg('Unable to create file',
'Unable to create file "'+AFilename+'".',mtError,[mbCancel,mbAbort],0);
exit;
end;
end;
// check writable
try
if CheckReadable then
fs:=TFileStream.Create(AFilename,fmOpenWrite)
else
fs:=TFileStream.Create(AFilename,fmOpenReadWrite);
try
fs.Seek(0,soEnd);
fs.Write(' ',1);
finally
fs.Free;
end;
except
Result:=MessageDlg('Unable to write file',
'Unable to write file "'+AFilename+'".',mtError,[mbCancel,mbAbort],0);
exit;
end;
// check readable
try
fs:=TFileStream.Create(AFilename,fmOpenReadWrite);
try
fs.Seek(-1,soEnd);
fs.Read(c,1);
finally
fs.Free;
end;
except
Result:=MessageDlg('Unable to read file',
'Unable to read file "'+AFilename+'".',mtError,[mbCancel,mbAbort],0);
exit;
end;
Result:=mrOk;
end;
{------------------------------------------------------------------------------- {-------------------------------------------------------------------------------
function TMainIDEBar.DoCheckAmbigiousSources(const AFilename: string function TMainIDEBar.DoCheckAmbigiousSources(const AFilename: string
): TModalResult; ): TModalResult;

View File

@ -1207,7 +1207,21 @@ begin
if Result=mrAbort then exit; if Result=mrAbort then exit;
end; end;
confPath:=SetDirSeparators(confPath); confPath:=SetDirSeparators(confPath);
xmlconfig := TXMLConfig.Create(confPath); try
ClearFile(confPath,true);
xmlconfig := TXMLConfig.Create(confPath);
except
on E: Exception do begin
writeln('ERROR: ',E.Message);
MessageDlg('Write error',
'Unable to write the project info file'#13
+'"'+ProjectInfoFile+'".'#13
+'Error: '+E.Message
,mtError,[mbOk],0);
Result:=mrCancel;
exit;
end;
end;
UpdateUsageCounts; UpdateUsageCounts;
repeat repeat
@ -2282,6 +2296,9 @@ end.
{ {
$Log$ $Log$
Revision 1.103 2003/04/13 13:45:04 mattias
implemented broken dependencies dialog
Revision 1.102 2003/04/07 23:49:03 mattias Revision 1.102 2003/04/07 23:49:03 mattias
implemented adding units to packages implemented adding units to packages

View File

@ -215,6 +215,9 @@ type
property Item[const AIndex: Integer]: TListItem read GetItem write SetItem; default; property Item[const AIndex: Integer]: TListItem read GetItem write SetItem; default;
property Owner : TCustomListView read FOwner; property Owner : TCustomListView read FOwner;
end; end;
{ TListColumn }
TWidth = 0..MaxInt; TWidth = 0..MaxInt;
@ -254,6 +257,9 @@ type
property Visible : Boolean read FVisible write SetVisible; property Visible : Boolean read FVisible write SetVisible;
property Width: TWidth read GetWidth write SetWidth; property Width: TWidth read GetWidth write SetWidth;
end; end;
{ TListColumns }
TListColumns = class(TCollection) TListColumns = class(TCollection)
private private
@ -270,6 +276,9 @@ type
read GetItem write SetItem; default; read GetItem write SetItem; default;
procedure Assign(Source: TPersistent); override; procedure Assign(Source: TPersistent); override;
end; end;
{ TCustomListView }
TItemChange = (ctText, ctImage, ctState); TItemChange = (ctText, ctImage, ctState);
TViewStyle = (vsList,vsReport); TViewStyle = (vsList,vsReport);
@ -374,8 +383,11 @@ type
procedure EndUpdate; procedure EndUpdate;
property Selected: TListItem read GetSelection write SetSelection; property Selected: TListItem read GetSelection write SetSelection;
end; end;
{ TListView }
TListView = class(TCustomListView) TListView = class(TCustomListView)
published published
property Align; property Align;
property Anchors; property Anchors;
@ -1742,6 +1754,9 @@ end.
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.71 2003/04/13 13:45:04 mattias
implemented broken dependencies dialog
Revision 1.70 2003/04/08 16:56:55 mattias Revision 1.70 2003/04/08 16:56:55 mattias
implemented saving package implemented saving package

View File

@ -41,22 +41,28 @@ uses
LMessages, Forms, Controls, GraphType, Graphics, Buttons, StdCtrls; LMessages, Forms, Controls, GraphType, Graphics, Buttons, StdCtrls;
//type
// TDialogButtons = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry,
// mbIgnore, mbAll, mbNoToAll, mbYesToAll, mbHelp);
// TDialogButtonsSet = set of TDialogButtons;
type type
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation, TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,
mtCustom); mtCustom);
TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,
mbAll, mbNoToAll, mbYesToAll, mbHelp); mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);
TMsgDlgButtons = set of TMsgDlgBtn; TMsgDlgButtons = set of TMsgDlgBtn;
const const
mbYesNoCancel = [mbYes, mbNo, mbCancel]; mbYesNoCancel = [mbYes, mbNo, mbCancel];
mbOKCancel = [mbOK, mbCancel]; mbOKCancel = [mbOK, mbCancel];
mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore]; mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];
MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (
bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,
bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose
);
BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (
mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,
mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll
);
type type
@ -340,6 +346,9 @@ end.
{ ============================================================================= { =============================================================================
$Log$ $Log$
Revision 1.30 2003/04/13 13:45:04 mattias
implemented broken dependencies dialog
Revision 1.29 2003/04/08 09:04:07 mattias Revision 1.29 2003/04/08 09:04:07 mattias
fixed registration for fpc 1.0.x fixed registration for fpc 1.0.x

View File

@ -102,7 +102,8 @@ const
ButtonIds : Array[TMsgDlgbtn] of Longint = (idButtonYes, idButtonNo, ButtonIds : Array[TMsgDlgbtn] of Longint = (idButtonYes, idButtonNo,
idButtonOK, idButtonCancel, idButtonAbort, idButtonRetry, idButtonIgnore, idButtonOK, idButtonCancel, idButtonAbort, idButtonRetry, idButtonIgnore,
idButtonAll, idButtonNoToAll, idButtonYesToAll, idButtonHelp); idButtonAll, idButtonNoToAll, idButtonYesToAll, idButtonHelp,
idButtonClose);
DialogResults : Array[idButtonOK..idButtonNoToAll] of TModalResult = ( DialogResults : Array[idButtonOK..idButtonNoToAll] of TModalResult = (
mrOk, mrCancel, mrOk{CLOSE!!}, mrYes, mrNo, -1{HELP!!}, mrAbort, mrRetry, mrOk, mrCancel, mrOk{CLOSE!!}, mrYes, mrNo, -1{HELP!!}, mrAbort, mrRetry,
@ -232,6 +233,9 @@ end;
{ {
$Log$ $Log$
Revision 1.22 2003/04/13 13:45:04 mattias
implemented broken dependencies dialog
Revision 1.21 2002/10/25 14:59:11 lazarus Revision 1.21 2002/10/25 14:59:11 lazarus
AJ: MessageDlgs -> PromptUser, better Cancel/Default order AJ: MessageDlgs -> PromptUser, better Cancel/Default order

View File

@ -48,7 +48,8 @@ uses
type type
TPkgSaveFlag = ( TPkgSaveFlag = (
psfSaveAs psfSaveAs,
pfAskBeforeSaving
); );
TPkgSaveFlags = set of TPkgSaveFlag; TPkgSaveFlags = set of TPkgSaveFlag;
@ -74,6 +75,9 @@ type
Flags: TPkgOpenFlags): TModalResult; virtual; abstract; Flags: TPkgOpenFlags): TModalResult; virtual; abstract;
function DoSavePackage(APackage: TLazPackage; function DoSavePackage(APackage: TLazPackage;
Flags: TPkgSaveFlags): TModalResult; virtual; abstract; Flags: TPkgSaveFlags): TModalResult; virtual; abstract;
function DoSaveAllPackages(Flags: TPkgSaveFlags): TModalResult; virtual; abstract;
function DoClosePackageEditor(APackage: TLazPackage): TModalResult; virtual; abstract;
function DoCloseAllPackageEditors: TModalResult; virtual; abstract;
end; end;
var var

View File

@ -216,6 +216,7 @@ type
procedure Assign(Source: TPkgDependency); procedure Assign(Source: TPkgDependency);
procedure ConsistencyCheck; procedure ConsistencyCheck;
function IsCompatible(Pkg: TLazPackageID): boolean; function IsCompatible(Pkg: TLazPackageID): boolean;
procedure MakeCompatible(const PkgName: string; const Version: TPkgVersion);
function AsString: string; function AsString: string;
function NextUsedByDependency: TPkgDependency; function NextUsedByDependency: TPkgDependency;
function PrevUsedByDependency: TPkgDependency; function PrevUsedByDependency: TPkgDependency;
@ -290,7 +291,8 @@ type
// (for example because it is Installed or an Installed // (for example because it is Installed or an Installed
// package requires this package) // package requires this package)
lpfVisited, // Used by the PackageGraph to avoid double checking lpfVisited, // Used by the PackageGraph to avoid double checking
lpfDestroying // set during destruction lpfDestroying, // set during destruction
lpfSkipSaving
); );
TLazPackageFlags = set of TLazPackageFlag; TLazPackageFlags = set of TLazPackageFlag;
@ -326,7 +328,6 @@ type
FIconFile: string; FIconFile: string;
FInstalled: TPackageInstallType; FInstalled: TPackageInstallType;
FModifiedLock: integer; FModifiedLock: integer;
FOnChangeName: TPkgChangeNameEvent;
FPackageEditor: TBasePackageEditor; FPackageEditor: TBasePackageEditor;
FPackageType: TLazPackageType; FPackageType: TLazPackageType;
FReadOnly: boolean; FReadOnly: boolean;
@ -402,6 +403,7 @@ type
function Requires(APackage: TLazPackage): boolean; function Requires(APackage: TLazPackage): boolean;
procedure AddUsedByDependency(Dependency: TPkgDependency); procedure AddUsedByDependency(Dependency: TPkgDependency);
procedure RemoveUsedByDependency(Dependency: TPkgDependency); procedure RemoveUsedByDependency(Dependency: TPkgDependency);
procedure ChangeID(const NewName: string; NewVersion: TPkgVersion);
public public
property AddDependCompilerOptions: TAdditionalCompilerOptions property AddDependCompilerOptions: TAdditionalCompilerOptions
read FAddDependCompilerOptions; read FAddDependCompilerOptions;
@ -430,7 +432,6 @@ type
property Installed: TPackageInstallType read FInstalled write SetInstalled; property Installed: TPackageInstallType read FInstalled write SetInstalled;
property Registered: boolean read FRegistered write SetRegistered; property Registered: boolean read FRegistered write SetRegistered;
property Modified: boolean read GetModified write SetModified; property Modified: boolean read GetModified write SetModified;
property OnChangeName: TPkgChangeNameEvent read FOnChangeName write FOnChangeName;
property PackageType: TLazPackageType property PackageType: TLazPackageType
read FPackageType write SetPackageType; read FPackageType write SetPackageType;
property ReadOnly: boolean read FReadOnly write SetReadOnly; property ReadOnly: boolean read FReadOnly write SetReadOnly;
@ -467,7 +468,7 @@ const
'RunTime', 'DesignTime', 'RunAndDesignTime'); 'RunTime', 'DesignTime', 'RunAndDesignTime');
LazPackageFlagNames: array[TLazPackageFlag] of string = ( LazPackageFlagNames: array[TLazPackageFlag] of string = (
'lpfAutoIncrementVersionOnBuild', 'lpfModified', 'lpfAutoUpdate', 'lpfAutoIncrementVersionOnBuild', 'lpfModified', 'lpfAutoUpdate',
'lpfNeeded', 'lpfVisited', 'lpfDestroying'); 'lpfNeeded', 'lpfVisited', 'lpfDestroying', 'lpfSkipSaving');
var var
// All TPkgDependency are added to this AVL tree (sorted for names, not version!) // All TPkgDependency are added to this AVL tree (sorted for names, not version!)
@ -1002,6 +1003,14 @@ begin
Result:=IsCompatible(Pkg.Name,Pkg.Version); Result:=IsCompatible(Pkg.Name,Pkg.Version);
end; end;
procedure TPkgDependency.MakeCompatible(const PkgName: string;
const Version: TPkgVersion);
begin
PackageName:=PkgName;
if MinVersion.Compare(Version)>0 then MinVersion.Assign(Version);
if MaxVersion.Compare(Version)<0 then MaxVersion.Assign(Version);
end;
function TPkgDependency.AsString: string; function TPkgDependency.AsString: string;
begin begin
Result:=FPackageName; Result:=FPackageName;
@ -1309,16 +1318,13 @@ begin
Include(FFlags,lpfModified) Include(FFlags,lpfModified)
else else
Exclude(FFlags,lpfModified); Exclude(FFlags,lpfModified);
Exclude(FFlags,lpfSkipSaving);
end; end;
procedure TLazPackage.SetName(const AValue: string); procedure TLazPackage.SetName(const AValue: string);
var
OldName: String;
begin begin
if FName=AValue then exit; if FName=AValue then exit;
OldName:=FName;
FName:=AValue; FName:=AValue;
if Assigned(OnChangeName) then OnChangeName(Self,OldName);
Modified:=true; Modified:=true;
end; end;
@ -1836,6 +1842,12 @@ begin
Dependency.RemoveFromList(FFirstUsedByDependency,pdlUsedBy); Dependency.RemoveFromList(FFirstUsedByDependency,pdlUsedBy);
end; end;
procedure TLazPackage.ChangeID(const NewName: string; NewVersion: TPkgVersion);
begin
Version.Assign(NewVersion);
Name:=NewName;
end;
{ TPkgComponent } { TPkgComponent }
procedure TPkgComponent.SetPkgFile(const AValue: TPkgFile); procedure TPkgComponent.SetPkgFile(const AValue: TPkgFile);

View File

@ -49,7 +49,8 @@ type
TOnOpenPackage = TOnOpenPackage =
function(Sender: TObject; APackage: TLazPackage): TModalResult of object; function(Sender: TObject; APackage: TLazPackage): TModalResult of object;
TOnSavePackage = TOnSavePackage =
function(Sender: TObject; APackage: TLazPackage): TModalResult of object; function(Sender: TObject; APackage: TLazPackage;
SaveAs: boolean): TModalResult of object;
TOnCreateNewPkgFile = TOnCreateNewPkgFile =
function(Sender: TObject; function(Sender: TObject;
const Params: TAddToPkgResult): TModalResult of object; const Params: TAddToPkgResult): TModalResult of object;
@ -109,6 +110,7 @@ type
ARect: TRect; State: TOwnerDrawState); ARect: TRect; State: TOwnerDrawState);
procedure RemoveBitBtnClick(Sender: TObject); procedure RemoveBitBtnClick(Sender: TObject);
procedure SaveBitBtnClick(Sender: TObject); procedure SaveBitBtnClick(Sender: TObject);
procedure SaveAsClick(Sender: TObject);
procedure UseMaxVersionCheckBoxClick(Sender: TObject); procedure UseMaxVersionCheckBoxClick(Sender: TObject);
procedure UseMinVersionCheckBoxClick(Sender: TObject); procedure UseMinVersionCheckBoxClick(Sender: TObject);
private private
@ -133,7 +135,7 @@ type
public public
constructor Create(TheOwner: TComponent); override; constructor Create(TheOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
procedure DoSave; procedure DoSave(SaveAs: boolean);
public public
property LazPackage: TLazPackage read FLazPackage write SetLazPackage; property LazPackage: TLazPackage read FLazPackage write SetLazPackage;
end; end;
@ -167,7 +169,7 @@ type
procedure DoFreeEditor(Pkg: TLazPackage); procedure DoFreeEditor(Pkg: TLazPackage);
function CreateNewFile(Sender: TObject; function CreateNewFile(Sender: TObject;
const Params: TAddToPkgResult): TModalResult; const Params: TAddToPkgResult): TModalResult;
function SavePackage(APackage: TLazPackage): TModalResult; function SavePackage(APackage: TLazPackage; SaveAs: boolean): TModalResult;
public public
property Editors[Index: integer]: TPackageEditorForm read GetEditors; property Editors[Index: integer]: TPackageEditorForm read GetEditors;
property OnCreateNewFile: TOnCreateNewPkgFile read FOnCreateNewFile property OnCreateNewFile: TOnCreateNewPkgFile read FOnCreateNewFile
@ -321,6 +323,7 @@ begin
AddPopupMenuItem('-',nil,true); AddPopupMenuItem('-',nil,true);
AddPopupMenuItem('Save',@SaveBitBtnClick,SaveBitBtn.Enabled); AddPopupMenuItem('Save',@SaveBitBtnClick,SaveBitBtn.Enabled);
AddPopupMenuItem('Save As',@SaveAsClick,not LazPackage.AutoCreated);
AddPopupMenuItem('Compile',@CompileBitBtnClick,CompileBitBtn.Enabled); AddPopupMenuItem('Compile',@CompileBitBtnClick,CompileBitBtn.Enabled);
AddPopupMenuItem('Add',@AddBitBtnClick,AddBitBtn.Enabled); AddPopupMenuItem('Add',@AddBitBtnClick,AddBitBtn.Enabled);
AddPopupMenuItem('Remove',@RemoveBitBtnClick,RemoveBitBtn.Enabled); AddPopupMenuItem('Remove',@RemoveBitBtnClick,RemoveBitBtn.Enabled);
@ -410,7 +413,7 @@ begin
+'Save package?', +'Save package?',
mtConfirmation,[mbYes,mbNo,mbAbort],0); mtConfirmation,[mbYes,mbNo,mbAbort],0);
if MsgResult=mrYes then begin if MsgResult=mrYes then begin
MsgResult:=PackageEditors.SavePackage(LazPackage); MsgResult:=PackageEditors.SavePackage(LazPackage,false);
end; end;
if MsgResult=mrAbort then CanClose:=false; if MsgResult=mrAbort then CanClose:=false;
end; end;
@ -505,7 +508,12 @@ end;
procedure TPackageEditorForm.SaveBitBtnClick(Sender: TObject); procedure TPackageEditorForm.SaveBitBtnClick(Sender: TObject);
begin begin
DoSave; DoSave(false);
end;
procedure TPackageEditorForm.SaveAsClick(Sender: TObject);
begin
DoSave(true);
end; end;
procedure TPackageEditorForm.UseMaxVersionCheckBoxClick(Sender: TObject); procedure TPackageEditorForm.UseMaxVersionCheckBoxClick(Sender: TObject);
@ -830,7 +838,7 @@ begin
with CompilerOptionsBitBtn do begin with CompilerOptionsBitBtn do begin
Name:='CompilerOptionsBitBtn'; Name:='CompilerOptionsBitBtn';
Parent:=Self; Parent:=Self;
Caption:='Compiler Options'; Caption:='Comp. Opts.';
OnClick:=@CompilerOptionsBitBtnClick; OnClick:=@CompilerOptionsBitBtnClick;
Hint:='Edit Options to compile package'; Hint:='Edit Options to compile package';
ShowHint:=true; ShowHint:=true;
@ -1283,9 +1291,9 @@ begin
end; end;
end; end;
procedure TPackageEditorForm.DoSave; procedure TPackageEditorForm.DoSave(SaveAs: boolean);
begin begin
PackageEditors.SavePackage(LazPackage); PackageEditors.SavePackage(LazPackage,SaveAs);
UpdateButtons; UpdateButtons;
UpdateTitle; UpdateTitle;
UpdateStatusBar; UpdateStatusBar;
@ -1404,9 +1412,10 @@ begin
Result:=OnCreateNewFile(Sender,Params); Result:=OnCreateNewFile(Sender,Params);
end; end;
function TPackageEditors.SavePackage(APackage: TLazPackage): TModalResult; function TPackageEditors.SavePackage(APackage: TLazPackage;
SaveAs: boolean): TModalResult;
begin begin
if Assigned(OnSavePackage) then Result:=OnSavePackage(Self,APackage); if Assigned(OnSavePackage) then Result:=OnSavePackage(Self,APackage,SaveAs);
end; end;
initialization initialization

View File

@ -67,6 +67,7 @@ const
type type
TPkgAddedEvent = procedure(APackage: TLazPackage) of object; TPkgAddedEvent = procedure(APackage: TLazPackage) of object;
TPkgDeleteEvent = procedure(APackage: TLazPackage) of object; TPkgDeleteEvent = procedure(APackage: TLazPackage) of object;
TDependencyModifiedEvent = procedure(ADependency: TPkgDependency) of object;
TLazPackageGraph = class TLazPackageGraph = class
private private
@ -79,6 +80,7 @@ type
FOnBeginUpdate: TNotifyEvent; FOnBeginUpdate: TNotifyEvent;
FOnChangePackageName: TPkgChangeNameEvent; FOnChangePackageName: TPkgChangeNameEvent;
FOnDeletePackage: TPkgDeleteEvent; FOnDeletePackage: TPkgDeleteEvent;
FOnDependencyModified: TDependencyModifiedEvent;
FOnEndUpdate: TNotifyEvent; FOnEndUpdate: TNotifyEvent;
FRegistrationFile: TPkgFile; FRegistrationFile: TPkgFile;
FRegistrationPackage: TLazPackage; FRegistrationPackage: TLazPackage;
@ -134,6 +136,11 @@ type
procedure ClosePackage(APackage: TLazPackage); procedure ClosePackage(APackage: TLazPackage);
procedure MarkNeededPackages; procedure MarkNeededPackages;
procedure CloseUnneededPackages; procedure CloseUnneededPackages;
procedure ChangePackageID(APackage: TLazPackage;
const NewName: string; NewVersion: TPkgVersion;
RenameDependencies: boolean);
function GetBrokenDependenciesWhenChangingPkgID(APackage: TLazPackage;
const NewName: string; NewVersion: TPkgVersion): TList;
function CheckIfPackageCanBeClosed(APackage: TLazPackage): boolean; function CheckIfPackageCanBeClosed(APackage: TLazPackage): boolean;
function PackageIsNeeded(APackage: TLazPackage): boolean; function PackageIsNeeded(APackage: TLazPackage): boolean;
procedure RegisterStaticPackages; procedure RegisterStaticPackages;
@ -157,7 +164,10 @@ type
property OnBeginUpdate: TNotifyEvent read FOnBeginUpdate write FOnBeginUpdate; property OnBeginUpdate: TNotifyEvent read FOnBeginUpdate write FOnBeginUpdate;
property OnChangePackageName: TPkgChangeNameEvent read FOnChangePackageName property OnChangePackageName: TPkgChangeNameEvent read FOnChangePackageName
write FOnChangePackageName; write FOnChangePackageName;
property OnDeletePackage: TPkgDeleteEvent read FOnDeletePackage write FOnDeletePackage; property OnDependencyModified: TDependencyModifiedEvent
read FOnDependencyModified write FOnDependencyModified;
property OnDeletePackage: TPkgDeleteEvent read FOnDeletePackage
write FOnDeletePackage;
property OnEndUpdate: TNotifyEvent read FOnEndUpdate write FOnEndUpdate; property OnEndUpdate: TNotifyEvent read FOnEndUpdate write FOnEndUpdate;
property Packages[Index: integer]: TLazPackage read GetPackages; default; property Packages[Index: integer]: TLazPackage read GetPackages; default;
property RegistrationFile: TPkgFile read FRegistrationFile; property RegistrationFile: TPkgFile read FRegistrationFile;
@ -724,8 +734,7 @@ begin
BeginUpdate; BeginUpdate;
FTree.Add(APackage); FTree.Add(APackage);
FItems.Add(APackage); FItems.Add(APackage);
APackage.OnChangeName:=@PackageChangedName;
// open all dependencies // open all dependencies
Dependency:=APackage.FirstRequiredDependency; Dependency:=APackage.FirstRequiredDependency;
while Dependency<>nil do begin while Dependency<>nil do begin
@ -829,6 +838,83 @@ begin
EndUpdate; EndUpdate;
end; end;
procedure TLazPackageGraph.ChangePackageID(APackage: TLazPackage;
const NewName: string; NewVersion: TPkgVersion; RenameDependencies: boolean);
var
Dependency, FirstUpdateDependency: TPkgDependency;
RequiredPackage: TLazPackage;
ANode: TAVLTreeNode;
NextDependency: TPkgDependency;
OldPkgName: String;
begin
OldPkgName:=APackage.Name;
if (AnsiCompareText(OldPkgName,NewName)=0)
and (APackage.Version.Compare(NewVersion)=0) then begin
// ID does not change
// -> just rename
APackage.Name:=NewName;
exit;
end;
// ID changed
// break or change all dependencies, that became incompatible
Dependency:=APackage.FirstUsedByDependency;
FirstUpdateDependency:=nil;
while Dependency<>nil do begin
NextDependency:=Dependency.NextUsedByDependency;
if not Dependency.IsCompatible(NewName,NewVersion) then begin
if RenameDependencies then begin
Dependency.MakeCompatible(NewName,NewVersion);
if Assigned(OnDependencyModified) then OnDependencyModified(Dependency);
end else begin
Dependency.RequiredPackage:=nil;
Dependency.AddToList(FirstUpdateDependency,pdlUsedBy);
end;
end;
Dependency:=NextDependency;
end;
// change ID
FTree.Remove(APackage);
APackage.ChangeID(NewName,NewVersion);
FTree.Add(APackage);
// update new broken dependencies
while FirstUpdateDependency<>nil do begin
Dependency.RemoveFromList(FirstUpdateDependency,pdlUsedBy);
OpenDependency(Dependency,RequiredPackage);
end;
// update old broken dependencies
ANode:=FindLowestPkgDependencyNodeWithName(NewName);
while ANode<>nil do begin
Dependency:=TPkgDependency(ANode.Data);
if (Dependency.LoadPackageResult<>lprSuccess)
and Dependency.IsCompatible(APackage) then
OpenDependency(Dependency,RequiredPackage);
ANode:=FindNextPkgDependecyNodeWithSameName(ANode);
end;
if Assigned(OnChangePackageName) then
OnChangePackageName(APackage,OldPkgName);
end;
function TLazPackageGraph.GetBrokenDependenciesWhenChangingPkgID(
APackage: TLazPackage; const NewName: string; NewVersion: TPkgVersion
): TList;
var
Dependency: TPkgDependency;
begin
Result:=TList.Create;
// find all dependencies, that will become incompatible
Dependency:=APackage.FirstUsedByDependency;
while Dependency<>nil do begin
if not Dependency.IsCompatible(NewName,NewVersion) then
Result.Add(Dependency);
Dependency:=Dependency.NextUsedByDependency;
end;
end;
function TLazPackageGraph.CheckIfPackageCanBeClosed(APackage: TLazPackage function TLazPackageGraph.CheckIfPackageCanBeClosed(APackage: TLazPackage
): boolean; ): boolean;
begin begin

View File

@ -41,7 +41,7 @@ uses
Classes, SysUtils, LCLProc, LResources, Forms, Controls, Buttons, ComCtrls, Classes, SysUtils, LCLProc, LResources, Forms, Controls, Buttons, ComCtrls,
StdCtrls, ExtCtrls, Menus, Dialogs, Graphics, FileCtrl, AVL_Tree, StdCtrls, ExtCtrls, Menus, Dialogs, Graphics, FileCtrl, AVL_Tree,
LazarusIDEStrConsts, IDEProcs, IDEOptionDefs, EnvironmentOpts, LazarusIDEStrConsts, IDEProcs, IDEOptionDefs, EnvironmentOpts,
Project, PackageDefs, PackageSystem, PackageEditor; Project, BrokenDependenciesDlg, PackageDefs, PackageSystem, PackageEditor;
type type
TPkgGraphExplorer = class(TForm) TPkgGraphExplorer = class(TForm)
@ -488,7 +488,6 @@ var
Dependency: TPkgDependency; Dependency: TPkgDependency;
UsedByDep: TPkgDependency; UsedByDep: TPkgDependency;
sl: TStringList; sl: TStringList;
DepOwner: TObject;
NewItem: String; NewItem: String;
begin begin
GetDependency(PkgTreeView.Selected,Pkg,Dependency); GetDependency(PkgTreeView.Selected,Pkg,Dependency);
@ -498,19 +497,7 @@ begin
UsedByDep:=Pkg.FirstUsedByDependency; UsedByDep:=Pkg.FirstUsedByDependency;
sl:=TStringList.Create; sl:=TStringList.Create;
while UsedByDep<>nil do begin while UsedByDep<>nil do begin
DepOwner:=UsedByDep.Owner; NewItem:=GetDependencyOwnerAsString(UsedByDep);
if (DepOwner<>nil) then begin
if DepOwner is TLazPackage then begin
NewItem:='Package: '+TLazPackage(DepOwner).IDAsString;
end else if DepOwner is TProject then begin
NewItem:='Project: '
+ExtractFileNameOnly(TProject(DepOwner).ProjectInfoFile);
end else begin
NewItem:=DepOwner.ClassName
end;
end else begin
NewItem:='Dependency without Owner: '+UsedByDep.AsString;
end;
sl.Add(NewItem); sl.Add(NewItem);
UsedByDep:=UsedByDep.NextUsedByDependency; UsedByDep:=UsedByDep.NextUsedByDependency;
end; end;

View File

@ -47,9 +47,9 @@ uses
Classes, SysUtils, LCLProc, Forms, Controls, FileCtrl, Classes, SysUtils, LCLProc, Forms, Controls, FileCtrl,
Dialogs, Menus, CodeToolManager, CodeCache, Laz_XMLCfg, AVL_Tree, Dialogs, Menus, CodeToolManager, CodeCache, Laz_XMLCfg, AVL_Tree,
LazarusIDEStrConsts, KeyMapping, EnvironmentOpts, IDEProcs, ProjectDefs, LazarusIDEStrConsts, KeyMapping, EnvironmentOpts, IDEProcs, ProjectDefs,
InputHistory, IDEDefs, UComponentManMain, PackageEditor, AddToPackageDlg, InputHistory, IDEDefs, UComponentManMain, Project, ComponentReg,
PackageDefs, PackageLinks, PackageSystem, ComponentReg, OpenInstalledPkgDlg, PackageEditor, AddToPackageDlg, PackageDefs, PackageLinks, PackageSystem,
PkgGraphExporer, OpenInstalledPkgDlg, PkgGraphExporer, BrokenDependenciesDlg,
BasePkgManager, MainBar; BasePkgManager, MainBar;
type type
@ -64,11 +64,12 @@ type
var HasRegisterProc: boolean); var HasRegisterProc: boolean);
function OnPackageEditorOpenPackage(Sender: TObject; APackage: TLazPackage function OnPackageEditorOpenPackage(Sender: TObject; APackage: TLazPackage
): TModalResult; ): TModalResult;
function OnPackageEditorSavePackage(Sender: TObject; function OnPackageEditorSavePackage(Sender: TObject; APackage: TLazPackage;
APackage: TLazPackage): TModalResult; SaveAs: boolean): TModalResult;
procedure PackageGraphChangePackageName(APackage: TLazPackage; procedure PackageGraphChangePackageName(APackage: TLazPackage;
const OldName: string); const OldName: string);
procedure PackageGraphDeletePackage(APackage: TLazPackage); procedure PackageGraphDeletePackage(APackage: TLazPackage);
procedure PackageGraphDependencyModified(ADependency: TPkgDependency);
function PackageGraphExplorerOpenPackage(Sender: TObject; function PackageGraphExplorerOpenPackage(Sender: TObject;
APackage: TLazPackage): TModalResult; APackage: TLazPackage): TModalResult;
procedure PkgManagerAddPackage(Pkg: TLazPackage); procedure PkgManagerAddPackage(Pkg: TLazPackage);
@ -99,7 +100,10 @@ type
Flags: TPkgOpenFlags): TModalResult; override; Flags: TPkgOpenFlags): TModalResult; override;
function DoSavePackage(APackage: TLazPackage; function DoSavePackage(APackage: TLazPackage;
Flags: TPkgSaveFlags): TModalResult; override; Flags: TPkgSaveFlags): TModalResult; override;
function DoSaveAllPackages(Flags: TPkgSaveFlags): TModalResult; override;
function DoShowPackageGraph: TModalResult; function DoShowPackageGraph: TModalResult;
function DoClosePackageEditor(APackage: TLazPackage): TModalResult; override;
function DoCloseAllPackageEditors: TModalResult; override;
end; end;
implementation implementation
@ -223,9 +227,12 @@ begin
end; end;
function TPkgManager.OnPackageEditorSavePackage(Sender: TObject; function TPkgManager.OnPackageEditorSavePackage(Sender: TObject;
APackage: TLazPackage): TModalResult; APackage: TLazPackage; SaveAs: boolean): TModalResult;
begin begin
Result:=DoSavePackage(APackage,[]); if SaveAs then
Result:=DoSavePackage(APackage,[psfSaveAs])
else
Result:=DoSavePackage(APackage,[]);
end; end;
procedure TPkgManager.PackageGraphChangePackageName(APackage: TLazPackage; procedure TPkgManager.PackageGraphChangePackageName(APackage: TLazPackage;
@ -243,6 +250,18 @@ begin
end; end;
end; end;
procedure TPkgManager.PackageGraphDependencyModified(ADependency: TPkgDependency
);
var
DepOwner: TObject;
begin
DepOwner:=ADependency.Owner;
if DepOwner is TLazPackage then
TLazPackage(DepOwner).Modified:=true
else if DepOwner is TProject then
TProject(DepOwner).Modified:=true;
end;
function TPkgManager.PackageGraphExplorerOpenPackage(Sender: TObject; function TPkgManager.PackageGraphExplorerOpenPackage(Sender: TObject;
APackage: TLazPackage): TModalResult; APackage: TLazPackage): TModalResult;
begin begin
@ -304,6 +323,8 @@ var
ConflictPkg: TLazPackage; ConflictPkg: TLazPackage;
PkgFile: TPkgFile; PkgFile: TPkgFile;
LowerFilename: String; LowerFilename: String;
BrokenDependencies: TList;
RenameDependencies: Boolean;
begin begin
OldPkgFilename:=APackage.Filename; OldPkgFilename:=APackage.Filename;
@ -402,6 +423,22 @@ begin
continue; // try again continue; // try again
end; end;
// check for broken dependencies
BrokenDependencies:=PackageGraph.GetBrokenDependenciesWhenChangingPkgID(
APackage,NewPkgName,APackage.Version);
RenameDependencies:=false;
try
if BrokenDependencies.Count>0 then begin
Result:=ShowBrokenDependencies(BrokenDependencies,
DefaultBrokenDepButtons);
if Result=mrAbort then exit;
if Result=mrRetry then continue;
if Result=mrYes then RenameDependencies:=true;
end;
finally
BrokenDependencies.Free;
end;
// check existing file // check existing file
if (CompareFilenames(NewFileName,OldPkgFilename)<>0) if (CompareFilenames(NewFileName,OldPkgFilename)<>0)
and FileExists(NewFileName) then begin and FileExists(NewFileName) then begin
@ -411,6 +448,10 @@ begin
if Result<>mrOk then exit; if Result<>mrOk then exit;
end; end;
// check if new file is read/writable
Result:=MainIDE.DoCheckCreatingFile(NewFileName,true);
if Result=mrAbort then exit;
until Result<>mrRetry; until Result<>mrRetry;
finally finally
InputHistories.StoreFileDialogSettings(SaveDialog); InputHistories.StoreFileDialogSettings(SaveDialog);
@ -421,17 +462,9 @@ begin
APackage.Filename:=NewFilename; APackage.Filename:=NewFilename;
// rename package // rename package
if NewPkgName<>APackage.Name then begin PackageGraph.ChangePackageID(APackage,NewPkgName,APackage.Version,
if AnsiCompareText(NewPkgName,APackage.Name)=0 then begin RenameDependencies);
// just change the case
APackage.Name:=NewPkgName;
end else begin
// name change -> update package graph
APackage.Name:=NewPkgName;
// ToDo: update package graph
end;
end;
// clean up old package file to reduce ambigiousities // clean up old package file to reduce ambigiousities
if FileExists(OldPkgFilename) if FileExists(OldPkgFilename)
and (CompareFilenames(OldPkgFilename,NewFilename)<>0) then begin and (CompareFilenames(OldPkgFilename,NewFilename)<>0) then begin
@ -444,8 +477,7 @@ begin
EnvironmentOptions.RecentPackageFiles); EnvironmentOptions.RecentPackageFiles);
end else begin end else begin
MessageDlg('Delete failed', MessageDlg('Delete failed',
'Deleting of file "'+OldPkgFilename+'"' 'Unable to delete file "'+OldPkgFilename+'".',mtError,[mbOk],0);
+' failed.',mtError,[mbOk],0);
end; end;
end; end;
end; end;
@ -465,6 +497,7 @@ begin
PackageGraph.OnChangePackageName:=@PackageGraphChangePackageName; PackageGraph.OnChangePackageName:=@PackageGraphChangePackageName;
PackageGraph.OnAddPackage:=@PkgManagerAddPackage; PackageGraph.OnAddPackage:=@PkgManagerAddPackage;
PackageGraph.OnDeletePackage:=@PackageGraphDeletePackage; PackageGraph.OnDeletePackage:=@PackageGraphDeletePackage;
PackageGraph.OnDependencyModified:=@PackageGraphDependencyModified;
PackageEditors:=TPackageEditors.Create; PackageEditors:=TPackageEditors.Create;
PackageEditors.OnOpenFile:=@MainIDE.DoOpenMacroFile; PackageEditors.OnOpenFile:=@MainIDE.DoOpenMacroFile;
@ -579,6 +612,7 @@ begin
NewPackage:=PackageGraph.NewPackage('NewPackage'); NewPackage:=PackageGraph.NewPackage('NewPackage');
NewPackage.AddRequiredDependency( NewPackage.AddRequiredDependency(
PackageGraph.FCLPackage.CreateDependencyForThisPkg); PackageGraph.FCLPackage.CreateDependencyForThisPkg);
NewPackage.Modified:=false;
// open a package editor // open a package editor
CurEditor:=PackageEditors.OpenEditor(NewPackage); CurEditor:=PackageEditors.OpenEditor(NewPackage);
@ -670,18 +704,29 @@ begin
Result:=mrAbort; Result:=mrAbort;
exit; exit;
end; end;
MainIDE.SaveSourceEditorChangesToCodeCache(-1);
if APackage.IsVirtual then Include(Flags,psfSaveAs); if APackage.IsVirtual then Include(Flags,psfSaveAs);
// check if package needs saving // check if package needs saving
if (not (psfSaveAs in Flags)) and (not APackage.ReadOnly) if (not (psfSaveAs in Flags))
and (not APackage.Modified) and (not APackage.ReadOnly) and (not APackage.Modified)
and FileExists(APackage.Filename) then begin and FileExists(APackage.Filename) then begin
Result:=mrOk; Result:=mrOk;
exit; exit;
end; end;
// ask user if package should be saved
if pfAskBeforeSaving in Flags then begin
Result:=MessageDlg('Save package?',
'Package "'+APackage.IDAsString+'" changed. Save?',
mtConfirmation,[mbYes,mbNo,mbAbort],0);
if (Result=mrNo) then Result:=mrIgnore;
if Result<>mrOk then exit;
end;
// save editor files to codetools
MainIDE.SaveSourceEditorChangesToCodeCache(-1);
// save package // save package
if (psfSaveAs in Flags) then begin if (psfSaveAs in Flags) then begin
Result:=DoShowSavePackageAsDialog(APackage); Result:=DoShowSavePackageAsDialog(APackage);
@ -697,6 +742,7 @@ begin
// save // save
try try
ClearFile(APackage.Filename,true);
XMLConfig:=TXMLConfig.Create(APackage.Filename); XMLConfig:=TXMLConfig.Create(APackage.Filename);
try try
XMLConfig.Clear; XMLConfig.Clear;
@ -709,12 +755,13 @@ begin
on E: Exception do begin on E: Exception do begin
Result:=MessageDlg('Error Writing Package', Result:=MessageDlg('Error Writing Package',
'Unable to write package "'+APackage.IDAsString+'"'#13 'Unable to write package "'+APackage.IDAsString+'"'#13
+'to file "'+APackage.Filename+'".', +'to file "'+APackage.Filename+'".'#13
+'Error: '+E.Message,
mtError,[mbAbort,mbCancel],0); mtError,[mbAbort,mbCancel],0);
exit; exit;
end; end;
end; end;
// success // success
APackage.Modified:=false; APackage.Modified:=false;
// add to recent // add to recent
@ -735,5 +782,58 @@ begin
Result:=mrOk; Result:=mrOk;
end; end;
function TPkgManager.DoCloseAllPackageEditors: TModalResult;
var
APackage: TLazPackage;
begin
while PackageEditors.Count>0 do begin
APackage:=PackageEditors.Editors[PackageEditors.Count-1].LazPackage;
Result:=DoClosePackageEditor(APackage);
if Result<>mrOk then exit;
end;
Result:=mrOk;
end;
function TPkgManager.DoClosePackageEditor(APackage: TLazPackage): TModalResult;
begin
if APackage.Editor<>nil then begin
APackage.Editor.Free;
end;
Result:=mrOk;
end;
function TPkgManager.DoSaveAllPackages(Flags: TPkgSaveFlags): TModalResult;
var
AllSaved: Boolean;
i: Integer;
CurPackage: TLazPackage;
begin
try
repeat
AllSaved:=true;
i:=0;
while i<PackageGraph.Count do begin
CurPackage:=PackageGraph[i];
if CurPackage.Modified and (not CurPackage.ReadOnly)
and (not (lpfSkipSaving in CurPackage.Flags)) then begin
Result:=DoSavePackage(CurPackage,Flags);
if Result=mrIgnore then
CurPackage.Flags:=CurPackage.Flags+[lpfSkipSaving];
if Result<>mrOk then exit;
AllSaved:=false;
end;
inc(i);
end;
until AllSaved;
finally
// clear all lpfSkipSaving flags
for i:=0 to PackageGraph.Count-1 do begin
CurPackage:=PackageGraph[i];
CurPackage.Flags:=CurPackage.Flags-[lpfSkipSaving];
end;
end;
Result:=mrOk;
end;
end. end.

View File

@ -39,8 +39,8 @@ interface
uses uses
Classes, SysUtils, Forms, Controls, Buttons, LResources, ExtCtrls, StdCtrls, Classes, SysUtils, Forms, Controls, Buttons, LResources, ExtCtrls, StdCtrls,
Spin, Dialogs, PathEditorDlg, IDEProcs, IDEOptionDefs, Spin, Dialogs, PathEditorDlg, IDEProcs, IDEOptionDefs, LazarusIDEStrConsts,
PackageDefs, PackageSystem; BrokenDependenciesDlg, PackageDefs, PackageSystem;
type type
TPackageOptionsDialog = class(TForm) TPackageOptionsDialog = class(TForm)
@ -89,6 +89,9 @@ type
procedure AddOptionsGroupBoxResize(Sender: TObject); procedure AddOptionsGroupBoxResize(Sender: TObject);
procedure AddPathsGroupBoxResize(Sender: TObject); procedure AddPathsGroupBoxResize(Sender: TObject);
procedure DescriptionPageResize(Sender: TObject); procedure DescriptionPageResize(Sender: TObject);
procedure OkButtonClick(Sender: TObject);
procedure PackageOptionsDialogClose(Sender: TObject;
var Action: TCloseAction);
procedure PackageOptionsDialogResize(Sender: TObject); procedure PackageOptionsDialogResize(Sender: TObject);
procedure PathEditBtnClick(Sender: TObject); procedure PathEditBtnClick(Sender: TObject);
procedure PathEditBtnExecuted(Sender: TObject); procedure PathEditBtnExecuted(Sender: TObject);
@ -104,6 +107,7 @@ type
procedure ReadOptionsFromPackage; procedure ReadOptionsFromPackage;
procedure ReadPkgTypeFromPackage; procedure ReadPkgTypeFromPackage;
function GetEditForPathButton(AButton: TPathEditorButton): TEdit; function GetEditForPathButton(AButton: TPathEditorButton): TEdit;
procedure ShowMsgPackageTypeMustBeDesign;
public public
constructor Create(TheOwner: TComponent); override; constructor Create(TheOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
@ -196,12 +200,7 @@ begin
then begin then begin
// user sets to runtime only // user sets to runtime only
if (LazPackage.AutoInstall<>pitNope) then begin if (LazPackage.AutoInstall<>pitNope) then begin
MessageDlg('Invalid package type', ShowMsgPackageTypeMustBeDesign;
'The package "'+LazPackage.IDAsString+'" has the auto install flag.'#13
+'This means it will be installed in the IDE. Installation packages'#13
+'must be designtime Packages.',
mtError,[mbCancel],0);
ReadPkgTypeFromPackage;
end; end;
end; end;
end; end;
@ -296,6 +295,89 @@ begin
SetBounds(x,y,w,90); SetBounds(x,y,w,90);
end; end;
procedure TPackageOptionsDialog.OkButtonClick(Sender: TObject);
var
NewPackageType: TLazPackageType;
NewVersion: TPkgVersion;
BrokenDependencies: TList;
RenameDependencies: Boolean;
MsgResult: TModalResult;
begin
if LazPackage.ReadOnly then exit;
// check changes
// package type
case PkgTypeRadioGroup.ItemIndex of
0: NewPackageType:=lptDesignTime;
1: NewPackageType:=lptRunTime;
else NewPackageType:=lptRunAndDesignTime;
end;
if NewPackageType<>LazPackage.PackageType then begin
if (NewPackageType=lptRunTime) and (LazPackage.AutoInstall<>pitNope) then
begin
ShowMsgPackageTypeMustBeDesign;
exit;
end;
end;
// version
NewVersion:=TPkgVersion.Create;
try
NewVersion.Major:=round(VersionMajorSpinEdit.Value);
NewVersion.Minor:=round(VersionMinorSpinEdit.Value);
NewVersion.Release:=round(VersionReleaseSpinEdit.Value);
NewVersion.Build:=round(VersionBuildSpinEdit.Value);
// check for broken dependencies
BrokenDependencies:=PackageGraph.GetBrokenDependenciesWhenChangingPkgID(
LazPackage,LazPackage.Name,NewVersion);
RenameDependencies:=false;
try
if BrokenDependencies.Count>0 then begin
MsgResult:=ShowBrokenDependencies(BrokenDependencies,
DefaultBrokenDepButtons);
if MsgResult=mrYes then
RenameDependencies:=true
else if MsgResult=mrNo then
RenameDependencies:=false
else
exit;
end;
finally
BrokenDependencies.Free;
end;
PackageGraph.ChangePackageID(LazPackage,LazPackage.Name,NewVersion,
RenameDependencies);
finally
NewVersion.Free;
end;
// Description page
LazPackage.Description:=DescriptionMemo.Text;
LazPackage.Author:=AuthorEdit.Text;
LazPackage.AutoIncrementVersionOnBuild:=AutoIncrementOnBuildCheckBox.Checked;
// Usage page
LazPackage.PackageType:=NewPackageType;
LazPackage.AutoUpdate:=(UpdateRadioGroup.ItemIndex=0);
with LazPackage.AddDependCompilerOptions do begin
UnitPath:=UnitPathEdit.Text;
IncludePath:=IncludePathEdit.Text;
ObjectPath:=ObjectPathEdit.Text;
LibraryPath:=LibraryPathEdit.Text;
LinkerOptions:=LinkerOptionsMemo.Text;
CustomOptions:=CustomOptionsMemo.Text;
end;
end;
procedure TPackageOptionsDialog.PackageOptionsDialogClose(Sender: TObject;
var Action: TCloseAction);
begin
IDEDialogLayoutList.SaveLayout(Self);
end;
procedure TPackageOptionsDialog.AddPathsGroupBoxResize(Sender: TObject); procedure TPackageOptionsDialog.AddPathsGroupBoxResize(Sender: TObject);
var var
LabelLeft: Integer; LabelLeft: Integer;
@ -385,6 +467,7 @@ begin
Name:='OkButton'; Name:='OkButton';
Caption:='Ok'; Caption:='Ok';
Parent:=Self; Parent:=Self;
OnClick:=@OkButtonClick;
end; end;
CancelButton:=TButton.Create(Self); CancelButton:=TButton.Create(Self);
@ -688,6 +771,8 @@ end;
procedure TPackageOptionsDialog.ReadOptionsFromPackage; procedure TPackageOptionsDialog.ReadOptionsFromPackage;
begin begin
if LazPackage=nil then exit; if LazPackage=nil then exit;
OkButton.Enabled:=not LazPackage.ReadOnly;
// Description page // Description page
DescriptionMemo.Text:=LazPackage.Description; DescriptionMemo.Text:=LazPackage.Description;
@ -739,6 +824,16 @@ begin
Result:=nil; Result:=nil;
end; end;
procedure TPackageOptionsDialog.ShowMsgPackageTypeMustBeDesign;
begin
MessageDlg('Invalid package type',
'The package "'+LazPackage.IDAsString+'" has the auto install flag.'#13
+'This means it will be installed in the IDE. Installation packages'#13
+'must be designtime Packages.',
mtError,[mbCancel],0);
ReadPkgTypeFromPackage;
end;
constructor TPackageOptionsDialog.Create(TheOwner: TComponent); constructor TPackageOptionsDialog.Create(TheOwner: TComponent);
begin begin
inherited Create(TheOwner); inherited Create(TheOwner);
@ -749,6 +844,7 @@ begin
Position:=poScreenCenter; Position:=poScreenCenter;
IDEDialogLayoutList.ApplyLayout(Self,450,400); IDEDialogLayoutList.ApplyLayout(Self,450,400);
OnResize(Self); OnResize(Self);
OnClose:=@PackageOptionsDialogClose;
end; end;
destructor TPackageOptionsDialog.Destroy; destructor TPackageOptionsDialog.Destroy;