mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-30 03:50:43 +02:00
implemented broken dependencies dialog
git-svn-id: trunk@4052 -
This commit is contained in:
parent
1f7808ff3a
commit
51365b3a35
@ -35,6 +35,10 @@ unit IDEComp;
|
|||||||
|
|
||||||
{ $DEFINE INTERBASE}
|
{ $DEFINE INTERBASE}
|
||||||
|
|
||||||
|
{$IFDEF INTERBASE}
|
||||||
|
{$linklib crypt}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user