mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-03 15:21:18 +02:00
implemented closing unneeded package
git-svn-id: trunk@4047 -
This commit is contained in:
parent
e55f738b83
commit
1007c59db7
@ -367,6 +367,7 @@ type
|
||||
procedure Close;
|
||||
procedure Release;
|
||||
procedure Hide;
|
||||
procedure ShowOnTop;
|
||||
function WantChildKey(Child : TControl;
|
||||
var Message : TLMessage): Boolean; virtual;
|
||||
procedure SetFocus; override;
|
||||
|
@ -437,9 +437,9 @@ procedure TCustomForm.WMSize(var Message: TLMSize);
|
||||
var
|
||||
OldState: TWindowState;
|
||||
begin
|
||||
{$IFDEF CHECK_POSITION}
|
||||
Writeln('[TCustomForm.WMSize] Name=',Name,' Class=',ClassName,' Message.Width=',Message.Width,' Message.Height=',Message.Height);
|
||||
{$ENDIF}
|
||||
{$IFDEF CHECK_POSITION}
|
||||
Writeln('[TCustomForm.WMSize] Name=',Name,' Class=',ClassName,' Message.Width=',Message.Width,' Message.Height=',Message.Height);
|
||||
{$ENDIF}
|
||||
Assert(False, 'Trace:WMSIZE in TCustomForm');
|
||||
if not (csDesigning in ComponentState) then begin
|
||||
OldState:=FWindowState;
|
||||
@ -1087,9 +1087,19 @@ begin
|
||||
Visible := False;
|
||||
end;
|
||||
|
||||
{------------------------------------------------------------------------------}
|
||||
{ TCustomForm Method IsForm }
|
||||
{------------------------------------------------------------------------------}
|
||||
{------------------------------------------------------------------------------
|
||||
procedure TCustomForm.ShowOnTop;
|
||||
------------------------------------------------------------------------------}
|
||||
procedure TCustomForm.ShowOnTop;
|
||||
begin
|
||||
Show;
|
||||
BringToFront;
|
||||
LCLLinux.ShowWindow(Handle,SW_SHOWNORMAL);
|
||||
end;
|
||||
|
||||
{------------------------------------------------------------------------------
|
||||
TCustomForm Method IsForm
|
||||
------------------------------------------------------------------------------}
|
||||
function TCustomForm.IsForm: Boolean;
|
||||
begin
|
||||
//TODO:
|
||||
@ -1399,6 +1409,9 @@ end;
|
||||
{ =============================================================================
|
||||
|
||||
$Log$
|
||||
Revision 1.94 2003/04/11 21:21:34 mattias
|
||||
implemented closing unneeded package
|
||||
|
||||
Revision 1.93 2003/04/11 09:32:20 mattias
|
||||
added some help stuff
|
||||
|
||||
|
@ -273,9 +273,14 @@ type
|
||||
|
||||
TLazPackageFlag = (
|
||||
lpfAutoIncrementVersionOnBuild, // increment version before
|
||||
lpfModified, // package needs saving
|
||||
lpfAutoUpdate // auto compile, if this package
|
||||
// or any required package has been modified
|
||||
lpfModified, // package needs saving
|
||||
lpfAutoUpdate, // auto compile, if this package
|
||||
// or any required package has been modified
|
||||
lpfNeeded, // Set by PackageGraph, if package is in use
|
||||
// (for example because it is Installed or an Installed
|
||||
// package requires this package)
|
||||
lpfVisited, // Used by the PackageGraph to avoid double checking
|
||||
lpfDestroying // set during destruction
|
||||
);
|
||||
TLazPackageFlags = set of TLazPackageFlag;
|
||||
|
||||
@ -425,6 +430,8 @@ type
|
||||
read FUsageOptions;
|
||||
end;
|
||||
|
||||
PLazPackage = ^TLazPackage;
|
||||
|
||||
|
||||
{ TBasePackageEditor }
|
||||
|
||||
@ -449,25 +456,32 @@ const
|
||||
LazPackageTypeIdents: array[TLazPackageType] of string = (
|
||||
'RunTime', 'DesignTime', 'RunAndDesignTime');
|
||||
LazPackageFlagNames: array[TLazPackageFlag] of string = (
|
||||
'lpfAutoIncrementVersionOnBuild', 'lpfModified', 'lpfAutoUpdate');
|
||||
'lpfAutoIncrementVersionOnBuild', 'lpfModified', 'lpfAutoUpdate',
|
||||
'lpfNeeded', 'lpfVisited', 'lpfDestroying');
|
||||
|
||||
var
|
||||
// All TPkgDependency are added to this AVL tree
|
||||
// All TPkgDependency are added to this AVL tree (sorted for names, not version!)
|
||||
PackageDependencies: TAVLTree; // tree of TPkgDependency
|
||||
|
||||
|
||||
function PkgFileTypeIdentToType(const s: string): TPkgFileType;
|
||||
function LazPackageTypeIdentToType(const s: string): TLazPackageType;
|
||||
|
||||
procedure SortDependencyList(Dependencies: TList);
|
||||
|
||||
function CompareLazPackageID(Data1, Data2: Pointer): integer;
|
||||
function CompareNameWithPackageID(Key, Data: Pointer): integer;
|
||||
function CompareLazPackageIDNames(Data1, Data2: Pointer): integer;
|
||||
function CompareNameWithPkgDependency(Key, Data: Pointer): integer;
|
||||
function ComparePkgDependencyNames(Data1, Data2: Pointer): integer;
|
||||
|
||||
function FindDependencyByNameInList(First: TPkgDependency;
|
||||
ListType: TPkgDependencyList; const Name: string): TPkgDependency;
|
||||
function FindCompatibleDependencyInList(First: TPkgDependency;
|
||||
ListType: TPkgDependencyList; ComparePackage: TLazPackageID): TPkgDependency;
|
||||
function GetDependencyWithIndex(First: TPkgDependency;
|
||||
ListType: TPkgDependencyList; Index: integer): TPkgDependency;
|
||||
|
||||
function FindLowestPkgDependencyWithName(const PkgName: string): TPkgDependency;
|
||||
function FindLowestPkgDependencyNodeWithName(const PkgName: string): TAVLTreeNode;
|
||||
function FindNextPkgDependecyNodeWithSameName(Node: TAVLTreeNode): TAVLTreeNode;
|
||||
@ -557,6 +571,26 @@ begin
|
||||
Result:=AnsiCompareText(Pkg1.Name,Pkg2.Name);
|
||||
end;
|
||||
|
||||
function CompareNameWithPkgDependency(Key, Data: Pointer): integer;
|
||||
var
|
||||
PkgName: String;
|
||||
Dependency: TPkgDependency;
|
||||
begin
|
||||
PkgName:=String(Key);
|
||||
Dependency:=TPkgDependency(Data);
|
||||
Result:=AnsiCompareText(PkgName,Dependency.PackageName);
|
||||
end;
|
||||
|
||||
function ComparePkgDependencyNames(Data1, Data2: Pointer): integer;
|
||||
var
|
||||
Dependency1: TPkgDependency;
|
||||
Dependency2: TPkgDependency;
|
||||
begin
|
||||
Dependency1:=TPkgDependency(Data1);
|
||||
Dependency2:=TPkgDependency(Data2);
|
||||
Result:=AnsiCompareText(Dependency1.PackageName,Dependency2.PackageName);
|
||||
end;
|
||||
|
||||
function FindDependencyByNameInList(First: TPkgDependency;
|
||||
ListType: TPkgDependencyList; const Name: string): TPkgDependency;
|
||||
begin
|
||||
@ -595,7 +629,8 @@ var
|
||||
begin
|
||||
Result:=nil;
|
||||
if PackageDependencies=nil then exit;
|
||||
Result:=PackageDependencies.FindKey(PChar(PkgName),@CompareNameWithPackageID);
|
||||
Result:=
|
||||
PackageDependencies.FindKey(PChar(PkgName),@CompareNameWithPkgDependency);
|
||||
if Result=nil then exit;
|
||||
while true do begin
|
||||
PrecNode:=PackageDependencies.FindPrecessor(Result);
|
||||
@ -832,7 +867,11 @@ end;
|
||||
procedure TPkgDependency.SetPackageName(const AValue: string);
|
||||
begin
|
||||
if FPackageName=AValue then exit;
|
||||
if (PackageDependencies<>nil) and (FPackageName<>'') then
|
||||
PackageDependencies.Remove(Self);
|
||||
FPackageName:=AValue;
|
||||
if (PackageDependencies<>nil) and (FPackageName<>'') then
|
||||
PackageDependencies.Add(Self);
|
||||
end;
|
||||
|
||||
procedure TPkgDependency.SetRemoved(const AValue: boolean);
|
||||
@ -856,14 +895,13 @@ constructor TPkgDependency.Create;
|
||||
begin
|
||||
MinVersion:=TPkgVersion.Create;
|
||||
MaxVersion:=TPkgVersion.Create;
|
||||
if PackageDependencies<>nil then PackageDependencies.Add(Self);
|
||||
Clear;
|
||||
end;
|
||||
|
||||
destructor TPkgDependency.Destroy;
|
||||
begin
|
||||
RequiredPackage:=nil;
|
||||
if PackageDependencies<>nil then PackageDependencies.Remove(Self);
|
||||
PackageName:='';
|
||||
FreeAndNil(fMinVersion);
|
||||
FreeAndNil(fMaxVersion);
|
||||
inherited Destroy;
|
||||
@ -872,11 +910,11 @@ end;
|
||||
procedure TPkgDependency.Clear;
|
||||
begin
|
||||
RequiredPackage:=nil;
|
||||
PackageName:='';
|
||||
FRemoved:=false;
|
||||
FFlags:=[];
|
||||
FMaxVersion.Clear;
|
||||
FMinVersion.Clear;
|
||||
FPackageName:='';
|
||||
end;
|
||||
|
||||
procedure TPkgDependency.LoadFromXMLConfig(XMLConfig: TXMLConfig;
|
||||
@ -1215,10 +1253,14 @@ begin
|
||||
end;
|
||||
|
||||
procedure TLazPackage.SetFlags(const AValue: TLazPackageFlags);
|
||||
var
|
||||
ChangedFlags: TLazPackageFlags;
|
||||
begin
|
||||
if FFlags=AValue then exit;
|
||||
ChangedFlags:=FFlags+AValue-(FFlags*AValue);
|
||||
FFlags:=AValue;
|
||||
Modified:=true;
|
||||
if ChangedFlags*[lpfAutoIncrementVersionOnBuild,lpfAutoUpdate]<>[] then
|
||||
Modified:=true;
|
||||
end;
|
||||
|
||||
procedure TLazPackage.SetIconFile(const AValue: string);
|
||||
@ -1906,7 +1948,10 @@ begin
|
||||
end;
|
||||
|
||||
initialization
|
||||
PackageDependencies:=nil;
|
||||
PackageDependencies:=TAVLTree.Create(@ComparePkgDependencyNames);
|
||||
|
||||
finalization
|
||||
FreeThenNil(PackageDependencies);
|
||||
|
||||
end.
|
||||
|
||||
|
@ -45,12 +45,15 @@ uses
|
||||
|
||||
type
|
||||
TOnOpenFile =
|
||||
function(Sender: TObject; const Filename: string): TModalResult of Object;
|
||||
function(Sender: TObject; const Filename: string): TModalResult of object;
|
||||
TOnOpenPackage =
|
||||
function(Sender: TObject; APackage: TLazPackage): TModalResult of Object;
|
||||
function(Sender: TObject; APackage: TLazPackage): TModalResult of object;
|
||||
TOnSavePackage =
|
||||
function(Sender: TObject; APackage: TLazPackage): TModalResult of object;
|
||||
TOnCreateNewPkgFile =
|
||||
function(Sender: TObject;
|
||||
const Params: TAddToPkgResult): TModalResult of object;
|
||||
TOnFreePkgEditor = procedure(APackage: TLazPackage) of object;
|
||||
|
||||
|
||||
{ TPackageEditorForm }
|
||||
@ -92,6 +95,9 @@ type
|
||||
procedure MaxVersionEditChange(Sender: TObject);
|
||||
procedure MinVersionEditChange(Sender: TObject);
|
||||
procedure OpenFileMenuItemClick(Sender: TObject);
|
||||
procedure PackageEditorFormClose(Sender: TObject; var Action: TCloseAction);
|
||||
procedure PackageEditorFormCloseQuery(Sender: TObject; var CanClose: boolean
|
||||
);
|
||||
procedure PackageEditorFormResize(Sender: TObject);
|
||||
procedure ReAddMenuItemClick(Sender: TObject);
|
||||
procedure RegisteredListBoxDrawItem(Control: TWinControl; Index: Integer;
|
||||
@ -134,11 +140,12 @@ type
|
||||
private
|
||||
FItems: TList; // list of TPackageEditorForm
|
||||
FOnCreateNewFile: TOnCreateNewPkgFile;
|
||||
FOnFreeEditor: TOnFreePkgEditor;
|
||||
FOnGetIDEFileInfo: TGetIDEFileStateEvent;
|
||||
FOnGetUnitRegisterInfo: TOnGetUnitRegisterInfo;
|
||||
FOnOpenFile: TOnOpenFile;
|
||||
FOnOpenPackage: TOnOpenPackage;
|
||||
FOnSavePackage: TNotifyEvent;
|
||||
FOnSavePackage: TOnSavePackage;
|
||||
function GetEditors(Index: integer): TPackageEditorForm;
|
||||
public
|
||||
constructor Create;
|
||||
@ -152,9 +159,10 @@ type
|
||||
function OpenFile(Sender: TObject; const Filename: string): TModalResult;
|
||||
function OpenDependency(Sender: TObject;
|
||||
Dependency: TPkgDependency): TModalResult;
|
||||
procedure DoFreeEditor(Pkg: TLazPackage);
|
||||
function CreateNewFile(Sender: TObject;
|
||||
const Params: TAddToPkgResult): TModalResult;
|
||||
procedure SavePackage(APackage: TLazPackage);
|
||||
function SavePackage(APackage: TLazPackage): TModalResult;
|
||||
public
|
||||
property Editors[Index: integer]: TPackageEditorForm read GetEditors;
|
||||
property OnCreateNewFile: TOnCreateNewPkgFile read FOnCreateNewFile
|
||||
@ -165,7 +173,8 @@ type
|
||||
write FOnGetIDEFileInfo;
|
||||
property OnGetUnitRegisterInfo: TOnGetUnitRegisterInfo
|
||||
read FOnGetUnitRegisterInfo write FOnGetUnitRegisterInfo;
|
||||
property OnSavePackage: TNotifyEvent read FOnSavePackage write FOnSavePackage;
|
||||
property OnFreeEditor: TOnFreePkgEditor read FOnFreeEditor write FOnFreeEditor;
|
||||
property OnSavePackage: TOnSavePackage read FOnSavePackage write FOnSavePackage;
|
||||
end;
|
||||
|
||||
var
|
||||
@ -350,6 +359,31 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TPackageEditorForm.PackageEditorFormClose(Sender: TObject;
|
||||
var Action: TCloseAction);
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
|
||||
end;
|
||||
|
||||
procedure TPackageEditorForm.PackageEditorFormCloseQuery(Sender: TObject;
|
||||
var CanClose: boolean);
|
||||
var
|
||||
MsgResult: Integer;
|
||||
begin
|
||||
if (LazPackage=nil) or (lpfDestroying in LazPackage.Flags)
|
||||
or (LazPackage.ReadOnly) or (not LazPackage.Modified) then exit;
|
||||
|
||||
MsgResult:=MessageDlg('Save Changes?',
|
||||
'Package "'+LazPackage.IDAsString+'" has changed.'#13
|
||||
+'Save package?',
|
||||
mtConfirmation,[mbYes,mbNo,mbAbort],0);
|
||||
if MsgResult=mrYes then begin
|
||||
MsgResult:=PackageEditors.SavePackage(LazPackage);
|
||||
end;
|
||||
if MsgResult=mrAbort then CanClose:=false;
|
||||
end;
|
||||
|
||||
procedure TPackageEditorForm.RegisteredListBoxDrawItem(Control: TWinControl;
|
||||
Index: Integer; ARect: TRect; State: TOwnerDrawState);
|
||||
var
|
||||
@ -362,6 +396,7 @@ var
|
||||
IconHeight: Integer;
|
||||
CurRect: TRect;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
if (Index<0) or (Index>=FPlugins.Count) then exit;
|
||||
CurObject:=FPlugins.Objects[Index];
|
||||
if CurObject is TPkgComponent then begin
|
||||
@ -594,6 +629,7 @@ var
|
||||
NodeIndex: Integer;
|
||||
CurFile: TPkgFile;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
CurNode:=FilesTreeView.Selected;
|
||||
if (CurNode=nil) then exit;
|
||||
if (CurNode.Parent=FilesNode) then begin
|
||||
@ -618,7 +654,9 @@ var
|
||||
ARect: TRect;
|
||||
begin
|
||||
if FLazPackage=AValue then exit;
|
||||
if FLazPackage<>nil then FLazPackage.Editor:=nil;
|
||||
FLazPackage:=AValue;
|
||||
if FLazPackage=nil then exit;
|
||||
FLazPackage.Editor:=Self;
|
||||
// find a nice position for the editor
|
||||
ARect:=FLazPackage.EditorRect;
|
||||
@ -830,6 +868,7 @@ end;
|
||||
|
||||
procedure TPackageEditorForm.UpdateAll;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
FilesTreeView.BeginUpdate;
|
||||
UpdateTitle;
|
||||
UpdateButtons;
|
||||
@ -844,6 +883,7 @@ procedure TPackageEditorForm.UpdateTitle;
|
||||
var
|
||||
NewCaption: String;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
NewCaption:='Package '+FLazPackage.Name;
|
||||
if LazPackage.Modified then
|
||||
NewCaption:=NewCaption+'*';
|
||||
@ -852,6 +892,7 @@ end;
|
||||
|
||||
procedure TPackageEditorForm.UpdateButtons;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
SaveBitBtn.Enabled:=(not LazPackage.ReadOnly)
|
||||
and (LazPackage.IsVirtual or LazPackage.Modified);
|
||||
CompileBitBtn.Enabled:=(not LazPackage.IsVirtual);
|
||||
@ -889,6 +930,7 @@ var
|
||||
CurNode: TTreeNode;
|
||||
NextNode: TTreeNode;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
FilesTreeView.BeginUpdate;
|
||||
|
||||
// files
|
||||
@ -947,6 +989,7 @@ var
|
||||
CurDependency: TPkgDependency;
|
||||
NextNode: TTreeNode;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
FilesTreeView.BeginUpdate;
|
||||
|
||||
// required packages
|
||||
@ -1011,6 +1054,7 @@ var
|
||||
Dependency: TPkgDependency;
|
||||
Removed: boolean;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
FPlugins.Clear;
|
||||
CurFile:=GetCurrentFile(Removed);
|
||||
if CurFile=nil then
|
||||
@ -1067,6 +1111,7 @@ var
|
||||
AVersion: TPkgVersion;
|
||||
Removed: boolean;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
DepencyChanged:=false;
|
||||
CurDependency:=GetCurrentDependency(Removed);
|
||||
if (CurDependency<>nil) then begin
|
||||
@ -1106,6 +1151,7 @@ procedure TPackageEditorForm.UpdateStatusBar;
|
||||
var
|
||||
StatusText: String;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
if LazPackage.IsVirtual and (not LazPackage.ReadOnly) then begin
|
||||
StatusText:='package '+LazPackage.Name+' not saved';
|
||||
end else begin
|
||||
@ -1171,10 +1217,13 @@ begin
|
||||
FPlugins:=TStringList.Create;
|
||||
SetupComponents;
|
||||
OnResize:=@PackageEditorFormResize;
|
||||
OnCloseQuery:=@PackageEditorFormCloseQuery;
|
||||
OnClose:=@PackageEditorFormClose;
|
||||
end;
|
||||
|
||||
destructor TPackageEditorForm.Destroy;
|
||||
begin
|
||||
PackageEditors.DoFreeEditor(LazPackage);
|
||||
FreeAndNil(FPlugins);
|
||||
inherited Destroy;
|
||||
end;
|
||||
@ -1261,6 +1310,12 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TPackageEditors.DoFreeEditor(Pkg: TLazPackage);
|
||||
begin
|
||||
FItems.Remove(Pkg.Editor);
|
||||
if Assigned(OnFreeEditor) then OnFreeEditor(Pkg);
|
||||
end;
|
||||
|
||||
function TPackageEditors.CreateNewFile(Sender: TObject;
|
||||
const Params: TAddToPkgResult): TModalResult;
|
||||
begin
|
||||
@ -1269,9 +1324,9 @@ begin
|
||||
Result:=OnCreateNewFile(Sender,Params);
|
||||
end;
|
||||
|
||||
procedure TPackageEditors.SavePackage(APackage: TLazPackage);
|
||||
function TPackageEditors.SavePackage(APackage: TLazPackage): TModalResult;
|
||||
begin
|
||||
if Assigned(OnSavePackage) then OnSavePackage(APackage);
|
||||
if Assigned(OnSavePackage) then Result:=OnSavePackage(Self,APackage);
|
||||
end;
|
||||
|
||||
initialization
|
||||
|
@ -65,7 +65,8 @@ const
|
||||
fpfSearchInPckgsWithEditor,fpfSearchInPkgLinks];
|
||||
|
||||
type
|
||||
TPkgAddedEvent = procedure(Pkg: TLazPackage) of object;
|
||||
TPkgAddedEvent = procedure(APackage: TLazPackage) of object;
|
||||
TPkgDeleteEvent = procedure(APackage: TLazPackage) of object;
|
||||
|
||||
TLazPackageGraph = class
|
||||
private
|
||||
@ -75,6 +76,7 @@ type
|
||||
FLCLPackage: TLazPackage;
|
||||
FOnAddPackage: TPkgAddedEvent;
|
||||
FOnChangePackageName: TPkgChangeNameEvent;
|
||||
FOnDeletePackage: TPkgDeleteEvent;
|
||||
FRegistrationFile: TPkgFile;
|
||||
FRegistrationPackage: TLazPackage;
|
||||
FRegistrationUnitName: string;
|
||||
@ -90,6 +92,7 @@ type
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
procedure Clear;
|
||||
procedure Delete(Index: integer);
|
||||
function Count: integer;
|
||||
function FindLowestPkgNodeByName(const PkgName: string): TAVLTreeNode;
|
||||
function FindNextSameName(ANode: TAVLTreeNode): TAVLTreeNode;
|
||||
@ -122,6 +125,11 @@ type
|
||||
procedure RegistrationError(const Msg: string);
|
||||
procedure AddPackage(APackage: TLazPackage);
|
||||
procedure AddStaticBasePackages;
|
||||
procedure ClosePackage(APackage: TLazPackage);
|
||||
procedure MarkNeededPackages;
|
||||
procedure CloseUnneededPackages;
|
||||
function CheckIfPackageCanBeClosed(APackage: TLazPackage): boolean;
|
||||
function PackageIsNeeded(APackage: TLazPackage): boolean;
|
||||
procedure RegisterStaticPackages;
|
||||
function OpenDependency(Dependency: TPkgDependency;
|
||||
var APackage: TLazPackage): TLoadPackageResult;
|
||||
@ -147,6 +155,7 @@ type
|
||||
property OnChangePackageName: TPkgChangeNameEvent read FOnChangePackageName
|
||||
write FOnChangePackageName;
|
||||
property OnAddPackage: TPkgAddedEvent read FOnAddPackage write FOnAddPackage;
|
||||
property OnDeletePackage: TPkgDeleteEvent read FOnDeletePackage write FOnDeletePackage;
|
||||
end;
|
||||
|
||||
var
|
||||
@ -218,14 +227,20 @@ end;
|
||||
procedure TLazPackageGraph.Clear;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i:=FItems.Count-1 downto 0 do Delete(i);
|
||||
end;
|
||||
|
||||
procedure TLazPackageGraph.Delete(Index: integer);
|
||||
var
|
||||
CurPkg: TLazPackage;
|
||||
begin
|
||||
for i:=FItems.Count-1 downto 0 do begin
|
||||
CurPkg:=Packages[i];
|
||||
FItems.Delete(i);
|
||||
FTree.Remove(CurPkg);
|
||||
CurPkg.Free;
|
||||
end;
|
||||
CurPkg:=Packages[Index];
|
||||
CurPkg.Flags:=CurPkg.Flags+[lpfDestroying];
|
||||
if Assigned(OnDeletePackage) then OnDeletePackage(CurPkg);
|
||||
FItems.Delete(Index);
|
||||
FTree.Remove(CurPkg);
|
||||
CurPkg.Free;
|
||||
end;
|
||||
|
||||
function TLazPackageGraph.Count: integer;
|
||||
@ -676,6 +691,7 @@ procedure TLazPackageGraph.AddPackage(APackage: TLazPackage);
|
||||
var
|
||||
RequiredPackage: TLazPackage;
|
||||
Dependency: TPkgDependency;
|
||||
DepNode: TAVLTreeNode;
|
||||
begin
|
||||
FTree.Add(APackage);
|
||||
FItems.Add(APackage);
|
||||
@ -688,8 +704,17 @@ begin
|
||||
Dependency:=Dependency.NextRequiresDependency;
|
||||
end;
|
||||
|
||||
// update all dependencies
|
||||
|
||||
// update all missing dependencies
|
||||
DepNode:=FindLowestPkgDependencyNodeWithName(APackage.Name);
|
||||
while DepNode<>nil do begin
|
||||
Dependency:=TPkgDependency(DepNode.Data);
|
||||
if (Dependency.LoadPackageResult<>lprSuccess)
|
||||
and Dependency.IsCompatible(APackage) then begin
|
||||
Dependency.RequiredPackage:=APackage;
|
||||
Dependency.LoadPackageResult:=lprSuccess;
|
||||
end;
|
||||
DepNode:=FindNextPkgDependecyNodeWithSameName(DepNode);
|
||||
end;
|
||||
|
||||
if Assigned(OnAddPackage) then OnAddPackage(APackage);
|
||||
end;
|
||||
@ -704,6 +729,99 @@ begin
|
||||
AddPackage(FLCLPackage);
|
||||
end;
|
||||
|
||||
procedure TLazPackageGraph.ClosePackage(APackage: TLazPackage);
|
||||
begin
|
||||
if (lpfDestroying in APackage.Flags) or PackageIsNeeded(APackage) then exit;
|
||||
CloseUnneededPackages;
|
||||
end;
|
||||
|
||||
procedure TLazPackageGraph.MarkNeededPackages;
|
||||
var
|
||||
i: Integer;
|
||||
Pkg: TLazPackage;
|
||||
PkgStack: PLazPackage;
|
||||
StackPtr: Integer;
|
||||
RequiredPackage: TLazPackage;
|
||||
Dependency: TPkgDependency;
|
||||
begin
|
||||
if Count=0 then exit;
|
||||
// mark all packages as unneeded and not visited
|
||||
for i:=0 to FItems.Count-1 do begin
|
||||
Pkg:=TLazPackage(FItems[i]);
|
||||
Pkg.Flags:=Pkg.Flags-[lpfNeeded];
|
||||
end;
|
||||
// create stack
|
||||
GetMem(PkgStack,SizeOf(Pointer)*Count);
|
||||
StackPtr:=0;
|
||||
// put all needed packages on stack
|
||||
for i:=0 to FItems.Count-1 do begin
|
||||
Pkg:=TLazPackage(FItems[i]);
|
||||
if PackageIsNeeded(Pkg)
|
||||
and (not (lpfNeeded in Pkg.Flags)) then begin
|
||||
Pkg.Flags:=Pkg.Flags+[lpfNeeded];
|
||||
PkgStack[StackPtr]:=Pkg;
|
||||
inc(StackPtr);
|
||||
end;
|
||||
end;
|
||||
// mark all needed packages
|
||||
while StackPtr>0 do begin
|
||||
// get needed package from stack
|
||||
dec(StackPtr);
|
||||
Pkg:=PkgStack[StackPtr];
|
||||
// mark package as needed
|
||||
Pkg.Flags:=Pkg.Flags+[lpfNeeded,lpfVisited];
|
||||
// put all required packages on stack
|
||||
Dependency:=Pkg.FirstRequiredDependency;
|
||||
while Dependency<>nil do begin
|
||||
if Dependency.LoadPackageResult=lprSuccess then begin
|
||||
RequiredPackage:=Dependency.RequiredPackage;
|
||||
if (not (lpfNeeded in RequiredPackage.Flags)) then begin
|
||||
RequiredPackage.Flags:=RequiredPackage.Flags+[lpfNeeded];
|
||||
PkgStack[StackPtr]:=RequiredPackage;
|
||||
inc(StackPtr);
|
||||
end;
|
||||
end;
|
||||
Dependency:=Dependency.NextRequiresDependency;
|
||||
end;
|
||||
end;
|
||||
// clean up
|
||||
FreeMem(PkgStack);
|
||||
end;
|
||||
|
||||
procedure TLazPackageGraph.CloseUnneededPackages;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
MarkNeededPackages;
|
||||
for i:=FItems.Count-1 downto 0 do
|
||||
if not (lpfNeeded in Packages[i].Flags) then Delete(i);
|
||||
end;
|
||||
|
||||
function TLazPackageGraph.CheckIfPackageCanBeClosed(APackage: TLazPackage
|
||||
): boolean;
|
||||
begin
|
||||
MarkNeededPackages;
|
||||
Result:=lpfNeeded in APackage.FLags;
|
||||
end;
|
||||
|
||||
function TLazPackageGraph.PackageIsNeeded(APackage: TLazPackage): boolean;
|
||||
begin
|
||||
Result:=true;
|
||||
// check if package is open, installed or will be installed
|
||||
if (APackage.Installed<>pitNope) or (APackage.AutoInstall<>pitNope)
|
||||
or ((APackage.Editor<>nil) and (APackage.Editor.Visible)) then
|
||||
begin
|
||||
Result:=true;
|
||||
exit;
|
||||
end;
|
||||
// check if package is used
|
||||
if (APackage.FirstUsedByDependency=nil) then begin
|
||||
Result:=false;
|
||||
exit;
|
||||
end;
|
||||
Result:=false;
|
||||
end;
|
||||
|
||||
procedure TLazPackageGraph.RegisterStaticPackages;
|
||||
begin
|
||||
// FCL
|
||||
|
@ -44,11 +44,11 @@ uses
|
||||
{$IFDEF IDE_MEM_CHECK}
|
||||
MemCheck,
|
||||
{$ENDIF}
|
||||
Classes, SysUtils, LCLProc, Forms, Controls, FileCtrl, Dialogs, Menus,
|
||||
CodeToolManager, CodeCache, Laz_XMLCfg, AVL_Tree, LazarusIDEStrConsts,
|
||||
KeyMapping, EnvironmentOpts, IDEProcs, ProjectDefs, InputHistory,
|
||||
IDEDefs, UComponentManMain, PackageEditor, AddToPackageDlg, PackageDefs,
|
||||
PackageLinks, PackageSystem, ComponentReg, OpenInstalledPkgDlg,
|
||||
Classes, SysUtils, LCLProc, Forms, Controls, FileCtrl,
|
||||
Dialogs, Menus, CodeToolManager, CodeCache, Laz_XMLCfg, AVL_Tree,
|
||||
LazarusIDEStrConsts, KeyMapping, EnvironmentOpts, IDEProcs, ProjectDefs,
|
||||
InputHistory, IDEDefs, UComponentManMain, PackageEditor, AddToPackageDlg,
|
||||
PackageDefs, PackageLinks, PackageSystem, ComponentReg, OpenInstalledPkgDlg,
|
||||
PkgGraphExporer,
|
||||
BasePkgManager, MainBar;
|
||||
|
||||
@ -57,21 +57,25 @@ type
|
||||
procedure MainIDEitmPkgOpenPackageFileClick(Sender: TObject);
|
||||
procedure MainIDEitmPkgPkgGraphClick(Sender: TObject);
|
||||
function OnPackageEditorCreateFile(Sender: TObject;
|
||||
const Params: TAddToPkgResult): TModalResult;
|
||||
const Params: TAddToPkgResult): TModalResult;
|
||||
procedure OnPackageEditorFreeEditor(APackage: TLazPackage);
|
||||
procedure OnPackageEditorGetUnitRegisterInfo(Sender: TObject;
|
||||
const AFilename: string; var TheUnitName: string;
|
||||
var HasRegisterProc: boolean);
|
||||
const AFilename: string; var TheUnitName: string;
|
||||
var HasRegisterProc: boolean);
|
||||
function OnPackageEditorOpenPackage(Sender: TObject; APackage: TLazPackage
|
||||
): TModalResult;
|
||||
procedure OnPackageEditorSavePackage(Sender: TObject);
|
||||
procedure PackageGraphChangePackageName(Pkg: TLazPackage;
|
||||
const OldName: string);
|
||||
): TModalResult;
|
||||
function OnPackageEditorSavePackage(Sender: TObject;
|
||||
APackage: TLazPackage): TModalResult;
|
||||
procedure PackageGraphChangePackageName(APackage: TLazPackage;
|
||||
const OldName: string);
|
||||
procedure PackageGraphDeletePackage(APackage: TLazPackage);
|
||||
function PackageGraphExplorerOpenPackage(Sender: TObject;
|
||||
APackage: TLazPackage): TModalResult;
|
||||
APackage: TLazPackage): TModalResult;
|
||||
procedure PkgManagerAddPackage(Pkg: TLazPackage);
|
||||
procedure mnuConfigCustomCompsClicked(Sender: TObject);
|
||||
procedure mnuPkgOpenPackageClicked(Sender: TObject);
|
||||
procedure mnuOpenRecentPackageClicked(Sender: TObject);
|
||||
procedure OnApplicationIdle(Sender: TObject);
|
||||
private
|
||||
function DoShowSavePackageAsDialog(APackage: TLazPackage): TModalResult;
|
||||
public
|
||||
@ -185,6 +189,12 @@ begin
|
||||
[nfOpenInEditor,nfIsNotPartOfProject,nfSave,nfAddToRecent]);
|
||||
end;
|
||||
|
||||
procedure TPkgManager.OnPackageEditorFreeEditor(APackage: TLazPackage);
|
||||
begin
|
||||
APackage.Editor:=nil;
|
||||
PackageGraph.ClosePackage(APackage);
|
||||
end;
|
||||
|
||||
procedure TPkgManager.OnPackageEditorGetUnitRegisterInfo(Sender: TObject;
|
||||
const AFilename: string; var TheUnitName: string; var HasRegisterProc: boolean
|
||||
);
|
||||
@ -212,17 +222,25 @@ begin
|
||||
Result:=DoOpenPackage(APackage);
|
||||
end;
|
||||
|
||||
procedure TPkgManager.OnPackageEditorSavePackage(Sender: TObject);
|
||||
function TPkgManager.OnPackageEditorSavePackage(Sender: TObject;
|
||||
APackage: TLazPackage): TModalResult;
|
||||
begin
|
||||
if Sender is TLazPackage then
|
||||
DoSavePackage(TLazPackage(Sender),[]);
|
||||
Result:=DoSavePackage(APackage,[]);
|
||||
end;
|
||||
|
||||
procedure TPkgManager.PackageGraphChangePackageName(Pkg: TLazPackage;
|
||||
procedure TPkgManager.PackageGraphChangePackageName(APackage: TLazPackage;
|
||||
const OldName: string);
|
||||
begin
|
||||
if PackageGraphExplorer<>nil then
|
||||
PackageGraphExplorer.UpdatePackageName(Pkg,OldName);
|
||||
PackageGraphExplorer.UpdatePackageName(APackage,OldName);
|
||||
end;
|
||||
|
||||
procedure TPkgManager.PackageGraphDeletePackage(APackage: TLazPackage);
|
||||
begin
|
||||
if APackage.Editor<>nil then begin
|
||||
APackage.Editor.Hide;
|
||||
APackage.Editor.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TPkgManager.PackageGraphExplorerOpenPackage(Sender: TObject;
|
||||
@ -271,6 +289,11 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TPkgManager.OnApplicationIdle(Sender: TObject);
|
||||
begin
|
||||
PackageGraph.CloseUnneededPackages;
|
||||
end;
|
||||
|
||||
function TPkgManager.DoShowSavePackageAsDialog(
|
||||
APackage: TLazPackage): TModalResult;
|
||||
var
|
||||
@ -438,11 +461,10 @@ begin
|
||||
|
||||
PkgLinks:=TPackageLinks.Create;
|
||||
|
||||
PackageDependencies:=TAVLTree.Create(@CompareLazPackageID);
|
||||
|
||||
PackageGraph:=TLazPackageGraph.Create;
|
||||
PackageGraph.OnChangePackageName:=@PackageGraphChangePackageName;
|
||||
PackageGraph.OnAddPackage:=@PkgManagerAddPackage;
|
||||
PackageGraph.OnDeletePackage:=@PackageGraphDeletePackage;
|
||||
|
||||
PackageEditors:=TPackageEditors.Create;
|
||||
PackageEditors.OnOpenFile:=@MainIDE.DoOpenMacroFile;
|
||||
@ -450,7 +472,10 @@ begin
|
||||
PackageEditors.OnCreateNewFile:=@OnPackageEditorCreateFile;
|
||||
PackageEditors.OnGetIDEFileInfo:=@MainIDE.GetIDEFileState;
|
||||
PackageEditors.OnGetUnitRegisterInfo:=@OnPackageEditorGetUnitRegisterInfo;
|
||||
PackageEditors.OnFreeEditor:=@OnPackageEditorFreeEditor;
|
||||
PackageEditors.OnSavePackage:=@OnPackageEditorSavePackage;
|
||||
|
||||
Application.AddOnIdleHandler(@OnApplicationIdle);
|
||||
end;
|
||||
|
||||
destructor TPkgManager.Destroy;
|
||||
@ -576,8 +601,7 @@ var
|
||||
begin
|
||||
// open a package editor
|
||||
CurEditor:=PackageEditors.OpenEditor(APackage);
|
||||
CurEditor.Show;
|
||||
CurEditor.BringToFront;
|
||||
CurEditor.ShowOnTop;
|
||||
Result:=mrOk;
|
||||
end;
|
||||
|
||||
@ -707,8 +731,7 @@ begin
|
||||
PackageGraphExplorer:=TPkgGraphExplorer.Create(Application);
|
||||
PackageGraphExplorer.OnOpenPackage:=@PackageGraphExplorerOpenPackage;
|
||||
end;
|
||||
PackageGraphExplorer.Show;
|
||||
PackageGraphExplorer.BringToFront;
|
||||
PackageGraphExplorer.ShowOnTop;
|
||||
Result:=mrOk;
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user