IDE: Support installing online package dependencies also from Package Editor.

git-svn-id: trunk@63962 -
This commit is contained in:
juha 2020-10-06 08:30:41 +00:00
parent 30e70e5c24
commit 41552a49c8
13 changed files with 199 additions and 190 deletions

View File

@ -80,9 +80,20 @@ type
property CustomOptions: TConfigStorage read FCustomOptions;
end;
{ PkgDependency flags }
TPkgDependencyType = (
pdtLazarus,
pdtFPMake
);
TLoadPackageResult = (
const
PkgDependencyTypeNames: array[TPkgDependencyType] of string = (
'Lazarus',
'FPMake'
);
type
TLoadPackageResult = ( // PkgDependency flags
lprUndefined,
lprSuccess,
lprNotFound,
@ -93,6 +104,7 @@ type
TPkgDependencyID = class(TPkgDependencyBase)
private
FDependencyType: TPkgDependencyType;
procedure SetRequiredPackage(const AValue: TIDEPackage);
protected
FLoadPackageResult: TLoadPackageResult;
@ -103,6 +115,7 @@ type
procedure Clear; override;
function AsString: string;
public
property DependencyType: TPkgDependencyType read FDependencyType write FDependencyType;
property LoadPackageResult: TLoadPackageResult read FLoadPackageResult write FLoadPackageResult;
property RequiredIDEPackage: TIDEPackage read FRequiredPackage write SetRequiredPackage;
end;

View File

@ -115,15 +115,15 @@ type
{ TOPMInterface }
TOPMInterface = class
private
FPackageListAvailable: TNotifyEvent;
public
{confirmation/install/extract/download dialogs will be displayed in the center of WorkArea}
// confirmation/install/extract/download dialogs will be displayed in the center of WorkArea
function DownloadPackages(APkgLinks: TList): TModalResult; virtual; abstract;
function InstallPackages(APkgLinks: TList; var ANeedToRebuild: Boolean): TModalResult; virtual; abstract;
// InstallPackages may return mrRetry which means the IDE should be rebuilt.
function InstallPackages(APkgLinks: TList): TModalResult; virtual; abstract;
function IsPackageAvailable(APkgLink: TPackageLink; AType: Integer): Boolean; virtual; abstract;
function FindOnlineLink(const AName: String): TPackageLink; virtual; abstract;
property OnPackageListAvailable: TNotifyEvent read FPackageListAvailable write FPackageListAvailable;
procedure AddPackageListNotification(ANotification: TNotifyEvent); virtual; abstract;
procedure RemovePackageListNotification(ANotification: TNotifyEvent); virtual; abstract;
end;
var

View File

@ -29,10 +29,15 @@ unit opkman_intf;
interface
uses
Classes, SysUtils, Forms, Dialogs, Controls, contnrs, fpjson, ExtCtrls,
dateutils,
Classes, SysUtils, Contnrs, fpjson, dateutils,
// LCL
Forms, Dialogs, Controls, ExtCtrls,
// LazUtils
LazMethodList,
// BuildIntf
PackageIntf, PackageLinkIntf, PackageDependencyIntf,
// IdeIntf
LazIDEIntf, PackageIntf, PackageLinkIntf, PackageDependencyIntf, IDECommands,
LazIDEIntf, IDECommands,
// OPM
opkman_downloader, opkman_serializablepackages, opkman_installer, opkman_mainfrm;
@ -46,6 +51,7 @@ type
FPackagesToInstall: TObjectList;
FPackageDependecies: TObjectList;
FPackageLinks: TObjectList;
FPackageListNotifications: TMethodList;
FTimer: TTimer;
FNeedToInit: Boolean;
procedure DoOnTimer(Sender: TObject);
@ -66,9 +72,11 @@ type
destructor Destroy; override;
public
function DownloadPackages(APkgLinks: TList): TModalResult; override;
function InstallPackages(APkgLinks: TList; var ANeedToRebuild: Boolean): TModalResult; override;
function InstallPackages(APkgLinks: TList): TModalResult; override;
function IsPackageAvailable(APkgLink: TPackageLink; AType: Integer): Boolean; override;
function FindOnlineLink(const AName: String): TPackageLink; override;
procedure AddPackageListNotification(ANotification: TNotifyEvent); override;
procedure RemovePackageListNotification(ANotification: TNotifyEvent); override;
end;
implementation
@ -86,6 +94,7 @@ begin
FPackagesToDownload := TObjectList.Create(False);
FPackagesToInstall := TObjectList.Create(False);
FPackageDependecies := TObjectList.Create(False);
FPackageListNotifications := TMethodList.Create;
FNeedToInit := True;
FTimer := TTimer.Create(nil);
FTimer.Interval := 50;
@ -96,6 +105,7 @@ end;
destructor TOPMInterfaceEx.Destroy;
begin
FTimer.Free;
FPackageListNotifications.Free;
FPackageLinks.Clear;
FPackageLinks.Free;
FPackagesToDownload.Clear;
@ -119,7 +129,6 @@ begin
PackageDownloader.Cancel;
end;
procedure TOPMInterfaceEx.DoOnTimer(Sender: TObject);
begin
if Assigned(LazarusIDE) and Assigned(PackageEditingInterface) and (not LazarusIDE.IDEIsClosing) then
@ -179,6 +188,16 @@ begin
end;
end;
procedure TOPMInterfaceEx.AddPackageListNotification(ANotification: TNotifyEvent);
begin
FPackageListNotifications.Add(TMethod(ANotification));
end;
procedure TOPMInterfaceEx.RemovePackageListNotification(ANotification: TNotifyEvent);
begin
FPackageListNotifications.Remove(TMethod(ANotification));
end;
procedure TOPMInterfaceEx.SynchronizePackages;
var
I, J: Integer;
@ -215,8 +234,7 @@ begin
end;
end;
end;
if (Assigned(OnPackageListAvailable)) then
OnPackageListAvailable(Self);
FPackageListNotifications.CallNotifyEvents(Self);
end;
procedure TOPMInterfaceEx.AddToDownloadList(const AName: String);
@ -412,11 +430,12 @@ begin
end;
function TOPMInterfaceEx.InstallPackages(APkgLinks: TList;
var ANeedToRebuild: Boolean): TModalResult;
function TOPMInterfaceEx.InstallPackages(APkgLinks: TList): TModalResult;
// Result can be mrOk, mrCancel, or mrRetry which means the IDE should be rebuilt.
var
I: Integer;
InstallStatus: TInstallStatus;
ANeedToRebuild: Boolean;
begin
FPackagesToInstall.Clear;
for I := 0 to APkgLinks.Count - 1 do
@ -432,7 +451,6 @@ begin
for I := 0 to FPackageDependecies.Count - 1 do
FPackagesToInstall.Insert(0, FPackageDependecies.Items[I]);
PackageAction := paInstall;
if SerializablePackages.DownloadCount > 0 then
begin
@ -461,8 +479,11 @@ begin
begin
SerializablePackages.MarkRuntimePackages;
SerializablePackages.GetPackageStates;
if (ANeedToRebuild) and ((InstallStatus = isSuccess) or (InstallStatus = isPartiallyFailed)) then
ANeedToRebuild := MessageDlgEx(rsOPMInterfaceRebuildConf, mtConfirmation, [mbYes, mbNo], nil) = mrYes;
if ANeedToRebuild
and ((InstallStatus = isSuccess) or (InstallStatus = isPartiallyFailed))
and (MessageDlgEx(rsOPMInterfaceRebuildConf,mtConfirmation,[mbYes,mbNo], nil) = mrYes)
then
Result := mrRetry;
end;
end;
end;

View File

@ -94,6 +94,7 @@ begin
spCollapse.Caption := '';
spCollapse.Images := MainDM.Images;
spCollapse.ImageIndex := IMG_COLLAPSE;
ButtonPanel1.OKButton.Caption := rsMainFrm_TBInstall_Caption;
FVST := TLazVirtualStringTree.Create(nil);
with FVST do
begin

View File

@ -12,6 +12,7 @@ object ProjectInspectorForm: TProjectInspectorForm
OnActivate = FormActivate
OnCreate = FormCreate
OnDeactivate = FormDeactivate
OnDestroy = FormDestroy
OnDropFiles = FormDropFiles
LCLVersion = '2.1.0.0'
object ItemsTreeView: TTreeView

View File

@ -115,6 +115,7 @@ type
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDeactivate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
procedure ItemsPopupMenuPopup(Sender: TObject);
procedure ItemsTreeViewAdvancedCustomDrawItem(Sender: TCustomTreeView;
@ -572,7 +573,13 @@ begin
UpdateAll;
end;
if OPMInterface <> nil then
OPMInterface.OnPackageListAvailable := @PackageListAvailable;
OPMInterface.AddPackageListNotification(@PackageListAvailable);
end;
procedure TProjectInspectorForm.FormDestroy(Sender: TObject);
begin
if OPMInterface <> nil then
OPMInterface.RemovePackageListNotification(@PackageListAvailable);
end;
procedure TProjectInspectorForm.FormActivate(Sender: TObject);
@ -781,63 +788,25 @@ end;
procedure TProjectInspectorForm.OpenButtonClick(Sender: TObject);
var
i: Integer;
TVNode: TTreeNode;
NodeData: TPENodeData;
Item: TObject;
CurFile: TUnitInfo;
CurDependency: TPkgDependency;
PackageLink: TPackageLink;
PkgLinks: TList;
NeedToRebuild: Boolean;
begin
PkgLinks := TList.Create;
try
NeedToRebuild := False;
BeginUpdate;
try
for i:=0 to ItemsTreeView.SelectionCount-1 do
for i:=0 to ItemsTreeView.SelectionCount-1 do
begin
if GetNodeDataItem(ItemsTreeView.Selections[i], NodeData, Item) then
begin
if Item is TUnitInfo then
begin
TVNode:=ItemsTreeView.Selections[i];
if not GetNodeDataItem(TVNode,NodeData,Item) then continue;
if Item is TUnitInfo then
begin
CurFile:=TUnitInfo(Item);
if LazarusIDE.DoOpenEditorFile(CurFile.Filename,-1,-1,[ofAddToRecent])<>mrOk then
begin
FreeAndNil(PkgLinks);
Exit;
end;
end
else if Item is TPkgDependency then
begin
CurDependency:=TPkgDependency(Item);
if CurDependency.DependencyType=pdtLazarus then
begin
if CurDependency.LoadPackageResult = lprSuccess then
begin
if PackageEditingInterface.DoOpenPackageWithName(CurDependency.PackageName,[],false)<>mrOk then
begin
FreeAndNil(PkgLinks);
Exit;
end;
end else begin
PackageLink:=FindOPLink(CurDependency);
if PackageLink<>nil then
PkgLinks.Add(PackageLink);
end;
end;
end;
end;
finally
EndUpdate;
if LazarusIDE.DoOpenEditorFile(TUnitInfo(Item).Filename,
-1,-1,[ofAddToRecent]) <> mrOk then
Exit;
end
else if Item is TPkgDependency then
if not OpmAddOrOpenDependency(TPkgDependency(Item)) then
Exit;
end;
if (OPMInterface<>nil) and (PkgLinks.Count>0) then
OPMInterface.InstallPackages(PkgLinks, NeedToRebuild);
finally
PkgLinks.Free;
end;
if (OPMInterface<>nil) and (NeedToRebuild) then
MainIDEInterface.DoBuildLazarus([])
OpmInstallPendingDependencies;
end;
procedure TProjectInspectorForm.OptionsBitBtnClick(Sender: TObject);
@ -1301,34 +1270,9 @@ begin
end;
procedure TProjectInspectorForm.PackageListAvailable(Sender: TObject);
var
CurDependency: TPkgDependency;
TVNode: TTreeNode;
NodeData: TPENodeData;
Item: TObject;
NodeText: String;
i, ImgInd: Integer;
begin
BeginUpdate;
try
DebugLn(['TProjectInspectorForm.PackageListAvailable: Start']);
for i:=0 to ItemsTreeView.Items.Count-1 do begin
TVNode:=ItemsTreeView.Items[i];
if not GetNodeDataItem(TVNode,NodeData,Item) then continue;
if not (Item is TPkgDependency) then continue;
CurDependency:=TPkgDependency(Item);
if CurDependency.DependencyType = pdtFPMake then continue;
NodeText:=CurDependency.AsString;
ImgInd:=FPropGui.GetDependencyImageIndex(CurDependency);
if ImgInd = FPropGui.ImageIndexAvailableOnline then
NodeText:=NodeText+' '+lisPckEditAvailableOnline;
TVNode.Text:=NodeText;
TVNode.ImageIndex:=ImgInd;
TVNode.SelectedIndex:=ImgInd;
end;
finally
EndUpdate;
end;
DebugLn(['TProjectInspectorForm.PackageListAvailable: ', LazProject.Title]);
UpdateRequiredPackages;
end;
procedure TProjectInspectorForm.KeyDown(var Key: Word; Shift: TShiftState);

View File

@ -10,10 +10,12 @@ uses
LResources, Forms, Controls, Graphics, Dialogs, ButtonPanel, StdCtrls,
// LazControls
ListFilterEdit,
// BuildIntf
PackageIntf,
// IdeIntf
IDEWindowIntf,
// IDE
ProjPackCommon, PackageDefs, LazarusIDEStrConsts, AddPkgDependencyDlg,
LazarusIDEStrConsts, ProjPackCommon, PackageDefs, AddPkgDependencyDlg,
// fppkg
FppkgHelper;

View File

@ -45,7 +45,7 @@ type
procedure FormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure OKButtonClick(Sender: TObject);
function InstallOnlinePackages(out ANeedToRebuild: Boolean): TModalResult;
function InstallOnlinePackages: TModalResult;
private
fUpdating: Boolean;
fPackages: TAVLTree; // tree of TLazPackage or TPackageLink.
@ -187,13 +187,12 @@ begin
UpdateAvailableDependencyNames;
end;
function TAddPkgDependencyDialog.InstallOnlinePackages(out ANeedToRebuild: Boolean): TModalResult;
function TAddPkgDependencyDialog.InstallOnlinePackages: TModalResult;
var
I: Integer;
Pkg: TLazPackageID;
PkgList: TList;
begin
ANeedToRebuild := False;
Result := mrOk;
PkgList := TList.Create;
try
@ -209,7 +208,7 @@ begin
if PkgList.Count > 0 then
begin
Assert(Assigned(OPMInterface), 'InstallOnlinePackages: OPMInterface=Nil');
Result := OPMInterface.InstallPackages(PkgList, ANeedToRebuild);
Result := OPMInterface.InstallPackages(PkgList);
end;
finally
PkgList.Free;
@ -218,17 +217,16 @@ end;
procedure TAddPkgDependencyDialog.CloseButtonClick(Sender: TObject);
var
NeedToRebuild: Boolean;
OpmRes: TModalResult;
begin
ModalResult := mrNone;
if InstallOnlinePackages(NeedToRebuild) = mrOK then
OpmRes := InstallOnlinePackages;
if OpmRes = mrCancel then Exit;
UpdateAvailableDependencyNames;
if OpmRes = mrRetry then // mrRetry means the IDE must be rebuilt.
begin
UpdateAvailableDependencyNames;
if NeedToRebuild then
begin
Self.Hide;
MainIDEInterface.DoBuildLazarus([]);
end;
Self.Hide;
MainIDEInterface.DoBuildLazarus([]);
end;
end;

View File

@ -234,25 +234,11 @@ type
pddUsedBy
);
TPkgDependencyType = (
pdtLazarus,
pdtFPMake
);
const
PkgDependencyTypeNames: array[TPkgDependencyType] of string = (
'Lazarus',
'FPMake'
);
type
{ TPkgDependency }
TPkgDependency = class(TPkgDependencyID)
private
FDefaultFilename: string;
FDependencyType: TPkgDependencyType;
FHoldPackage: boolean;
FMarkerFlags: TPKgMarkerFlags;
FOwner: TObject;
@ -309,7 +295,6 @@ type
property DefaultFilename: string read FDefaultFilename write FDefaultFilename;
property PreferDefaultFilename: boolean read FPreferDefaultFilename write FPreferDefaultFilename;
property RequiredPackage: TLazPackage read GetRequiredPackage write SetRequiredPackage;
property DependencyType: TPkgDependencyType read FDependencyType write FDependencyType;
end;
PPkgDependency = ^TPkgDependency;
@ -1792,7 +1777,7 @@ end;
procedure TPkgDependency.SetRequiredPackage(AValue: TLazPackage);
begin
Assert((FDependencyType=pdtLazarus) or not assigned(AValue), 'Not possible to set a reference to a LazPackage into an FPMake-dependency');
Assert((DependencyType=pdtLazarus) or not assigned(AValue), 'Not possible to set a reference to a LazPackage into an FPMake-dependency');
RequiredIDEPackage := AValue;
end;

View File

@ -163,7 +163,7 @@ object PackageEditorForm: TPackageEditorForm
BorderSpacing.Left = 3
Constraints.MinHeight = 25
Constraints.MinWidth = 25
OnClick = OpenFileMenuItemClick
OnClick = OpenButtonClick
ShowHint = True
ParentFont = False
ParentShowHint = False

View File

@ -42,7 +42,8 @@ uses
// LazUtils
FileUtil, LazFileUtils, LazFileCache, AvgLvlTree, LazLoggerBase, LazTracer,
// BuildIntf
ProjectIntf, PackageDependencyIntf, PackageIntf, IDEOptionsIntf, NewItemIntf,
ProjectIntf, PackageDependencyIntf, PackageIntf, PackageLinkIntf,
IDEOptionsIntf, NewItemIntf,
// IDEIntf
IDEImagesIntf, MenuIntf, LazIDEIntf, FormEditingIntf, IDEHelpIntf,
IDEWindowIntf, IDEDialogs, ComponentReg, IDEOptEditorIntf,
@ -218,7 +219,7 @@ type
procedure MoveDownBtnClick(Sender: TObject);
procedure MoveUpBtnClick(Sender: TObject);
procedure OnIdle(Sender: TObject; var {%H-}Done: Boolean);
procedure OpenFileMenuItemClick(Sender: TObject);
procedure OpenButtonClick(Sender: TObject);
procedure OpenFolderMenuItemClick(Sender: TObject);
procedure OptionsBitBtnClick(Sender: TObject);
procedure PackageEditorFormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
@ -274,7 +275,7 @@ type
procedure UpdateTitle(Immediately: boolean = false);
procedure UpdateFiles(Immediately: boolean = false);
procedure UpdateRemovedFiles(Immediately: boolean = false);
procedure UpdateRequiredPkgs(Immediately: boolean = false);
procedure UpdateRequiredPackages(Immediately: boolean = false);
procedure UpdatePEProperties(Immediately: boolean = false);
procedure UpdateButtons(Immediately: boolean = false);
procedure UpdateStatusBar(Immediately: boolean = false);
@ -286,6 +287,7 @@ type
procedure ExtendIncPathForNewIncludeFile(const AnIncludeFile: string;
var IgnoreIncPaths: TFilenameToStringTree);
function CanBeAddedToProject: boolean;
procedure PackageListAvailable(Sender: TObject);
function PassesFilter(rec: PIDEOptionsGroupRec): Boolean;
procedure TraverseSettings(AOptions: TAbstractPackageFileIDEOptions; anAction: TIDEPackageOptsDlgAction);
procedure FileOptionsToGui;
@ -318,7 +320,6 @@ type
procedure DoRevert;
procedure DoSave(SaveAs: boolean);
procedure DoSortFiles;
function DoOpenPkgFile(PkgFile: TPkgFile): TModalResult;
function ShowNewCompDialog: TModalResult;
function ShowAddDepDialog: TModalResult;
function ShowAddFPMakeDepDialog: TModalResult;
@ -761,7 +762,7 @@ begin
SetItem(PkgEditMenuAddNewFPMakeReqr, @mnuAddFPMakeReqClick, UserSelection=[pstReqPackNode],
Writable);
// selected files
SetItem(PkgEditMenuOpenFile, @OpenFileMenuItemClick,
SetItem(PkgEditMenuOpenFile, @OpenButtonClick,
UserSelection*[pstFilesNode,pstReqPackNode,pstFPMake]=[]);
SetItem(PkgEditMenuRemoveFile, @RemoveBitBtnClick,
UserSelection=[pstFile], RemoveBitBtn.Enabled);
@ -955,7 +956,7 @@ end;
procedure TPackageEditorForm.ItemsTreeViewDblClick(Sender: TObject);
begin
OpenFileMenuItemClick(Self);
OpenButtonClick(Self);
end;
procedure TPackageEditorForm.ItemsTreeViewKeyDown(Sender: TObject;
@ -974,7 +975,7 @@ begin
Handled := False;
end
else if Key = VK_RETURN then
OpenFileMenuItemClick(Nil)
OpenButtonClick(Nil)
else if Key = VK_DELETE then
RemoveBitBtnClick(Nil)
else if Key = VK_INSERT then
@ -1048,7 +1049,7 @@ begin
CurDependency.DefaultFilename:='';
CurDependency.PreferDefaultFilename:=false;
LazPackage.Modified:=true;
UpdateRequiredPkgs;
UpdateRequiredPackages;
end;
procedure TPackageEditorForm.CollapseDirectoryMenuItemClick(Sender: TObject);
@ -1081,27 +1082,27 @@ begin
DoMoveDependency(1)
end;
procedure TPackageEditorForm.OpenFileMenuItemClick(Sender: TObject);
procedure TPackageEditorForm.OpenButtonClick(Sender: TObject);
var
CurFile: TPkgFile;
CurDependency: TPkgDependency;
i: Integer;
TVNode: TTreeNode;
NodeData: TPENodeData;
Item: TObject;
begin
for i:=0 to ItemsTreeView.SelectionCount-1 do begin
TVNode:=ItemsTreeView.Selections[i];
if GetNodeDataItem(TVNode,NodeData,Item) then begin
if Item is TPkgFile then begin
CurFile:=TPkgFile(Item);
if DoOpenPkgFile(CurFile)<>mrOk then exit;
end else if Item is TPkgDependency then begin
CurDependency:=TPkgDependency(Item);
if PackageEditors.OpenDependency(Self,CurDependency)<>mrOk then exit;
end;
for i:=0 to ItemsTreeView.SelectionCount-1 do
begin
if GetNodeDataItem(ItemsTreeView.Selections[i],NodeData,Item) then
begin
if Item is TPkgFile then
begin
if PackageEditors.OpenPkgFile(Self,TPkgFile(Item))<>mrOk then
Exit;
end
else if Item is TPkgDependency then
if not OpmAddOrOpenDependency(TPkgDependency(Item)) then
Exit;
end;
end;
OpmInstallPendingDependencies;
end;
procedure TPackageEditorForm.OptionsBitBtnClick(Sender: TObject);
@ -1319,7 +1320,7 @@ procedure TPackageEditorForm.FilterEditKeyDown(Sender: TObject; var Key: Word;
begin
if Key = VK_RETURN then
begin
OpenFileMenuItemClick(Nil);
OpenButtonClick(Nil);
Key := VK_UNKNOWN;
end;
end;
@ -1336,10 +1337,14 @@ begin
SetupComponents;
SortAlphabetically := EnvironmentOptions.PackageEditorSortAlphabetically;
ShowDirectoryHierarchy := EnvironmentOptions.PackageEditorShowDirHierarchy;
if OPMInterface <> nil then
OPMInterface.AddPackageListNotification(@PackageListAvailable);
end;
procedure TPackageEditorForm.FormDestroy(Sender: TObject);
begin
if OPMInterface <> nil then
OPMInterface.RemovePackageListNotification(@PackageListAvailable);
IdleConnected:=true;
FreeAndNil(FNextSelectedPart);
EnvironmentOptions.PackageEditorSortAlphabetically := SortAlphabetically;
@ -1835,7 +1840,7 @@ begin
CurDependency.DefaultFilename:=NewFilename;
CurDependency.PreferDefaultFilename:=AsPreferred;
LazPackage.Modified:=true;
UpdateRequiredPkgs;
UpdateRequiredPackages;
debugln(['Info: TPackageEditorForm.SetDependencyDefaultFilename ',CurDependency.PackageName,' DefaultFilename:=',NewFilename,' AsPreferred=',AsPreferred]);
finally
EndUpdate;
@ -2172,7 +2177,7 @@ begin
if pefNeedUpdateRemovedFiles in fFlags then
UpdateRemovedFiles(true);
if pefNeedUpdateRequiredPkgs in fFlags then
UpdateRequiredPkgs(true);
UpdateRequiredPackages(true);
if pefNeedUpdateProperties in fFlags then
UpdatePEProperties(true);
if pefNeedUpdateButtons in fFlags then
@ -2283,7 +2288,7 @@ begin
UpdateButtons;
end;
procedure TPackageEditorForm.UpdateRequiredPkgs(Immediately: boolean);
procedure TPackageEditorForm.UpdateRequiredPackages(Immediately: boolean);
var
Dependency: TPkgDependency;
RequiredBranch, RemovedBranch: TTreeFilterBranch;
@ -2824,6 +2829,12 @@ begin
Result:=PackageEditors.AddToProject(LazPackage,true)=mrOk;
end;
procedure TPackageEditorForm.PackageListAvailable(Sender: TObject);
begin
DebugLn(['TPackageEditorForm.PackageListAvailable: ', LazPackage.Name]);
UpdateRequiredPackages;
end;
procedure TPackageEditorForm.DoSave(SaveAs: boolean);
begin
GuiToFileOptions(False);
@ -3002,11 +3013,6 @@ begin
ItemsTreeView.ApplyStoredSelection(TreeSelection);
end;
function TPackageEditorForm.DoOpenPkgFile(PkgFile: TPkgFile): TModalResult;
begin
Result:=PackageEditors.OpenPkgFile(Self,PkgFile);
end;
procedure TPackageEditorForm.DoFixFilesCase;
begin
LazPackage.FixFilesCaseSensitivity;
@ -3363,7 +3369,8 @@ begin
if Dependency.DependencyType=pdtLazarus then
begin
APackage:=Dependency.RequiredPackage;
if Assigned(OnOpenPackage) then Result:=OnOpenPackage(Sender,APackage);
if Assigned(OnOpenPackage) then
Result:=OnOpenPackage(Sender,APackage);
end
else
ShowMessage('It is not possible to open FPMake packages.');

View File

@ -208,8 +208,7 @@ type
function MoveFiles(TargetFilesEdit, SrcFilesEdit: IFilesEditorInterface;
IDEFiles: TFPList; TargetDirectory: string): boolean;
function CopyMoveFiles(Sender: TObject): boolean;
function ResolveBrokenDependenciesOnline(ABrokenDependencies: TFPList;
var ANeedToRebuild: Boolean): TModalResult;
function ResolveBrokenDependenciesOnline(ABrokenDependencies: TFPList): TModalResult;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
@ -3289,8 +3288,7 @@ begin
Result:=mrOk;
end;
function TPkgManager.ResolveBrokenDependenciesOnline(ABrokenDependencies: TFPList;
var ANeedToRebuild: Boolean): TModalResult;
function TPkgManager.ResolveBrokenDependenciesOnline(ABrokenDependencies: TFPList): TModalResult;
var
Dependency: TPkgDependency;
I: Integer;
@ -3315,7 +3313,7 @@ begin
end;
if PkgLinks.Count > 0 then begin
if IDEMessageDialog(lisNotInstalledPackages, Format(lisInstallPackagesMsg, [PkgLinksStr]), mtConfirmation, [mbYes, mbNo]) = mrYes then
Result := OPMInterface.InstallPackages(PkgLinks, ANeedToRebuild);
Result := OPMInterface.InstallPackages(PkgLinks);
end;
finally
PkgLinks.Free;
@ -3326,30 +3324,32 @@ function TPkgManager.OpenProjectDependencies(AProject: TProject;
ReportMissing: boolean): TModalResult;
var
BrokenDependencies: TFPList;
NeedToRebuild: Boolean;
OpmRes: TModalResult;
begin
NeedToRebuild := False;
Result:=mrOk;
Result := mrOk;
OpmRes := mrOk;
PackageGraph.OpenRequiredDependencyList(AProject.FirstRequiredDependency);
if ReportMissing then begin
BrokenDependencies:=PackageGraph.FindAllBrokenDependencies(nil,
AProject.FirstRequiredDependency);
if BrokenDependencies<>nil then begin
if OPMInterface <> nil then begin
ResolveBrokenDependenciesOnline(BrokenDependencies, NeedToRebuild);
BrokenDependencies := PackageGraph.FindAllBrokenDependencies(nil,
AProject.FirstRequiredDependency);
if Assigned(BrokenDependencies) then
begin
if Assigned(OPMInterface) then
begin
OpmRes := ResolveBrokenDependenciesOnline(BrokenDependencies);
FreeAndNil(BrokenDependencies);
BrokenDependencies := PackageGraph.FindAllBrokenDependencies(nil, AProject.FirstRequiredDependency);
if BrokenDependencies <> nil then
BrokenDependencies := PackageGraph.FindAllBrokenDependencies(nil,
AProject.FirstRequiredDependency);
if Assigned(BrokenDependencies) then
Result := ShowBrokenDependenciesReport(BrokenDependencies);
end
else
Result:=ShowBrokenDependenciesReport(BrokenDependencies);
Result := ShowBrokenDependenciesReport(BrokenDependencies);
BrokenDependencies.Free;
end;
end;
LazPackageLinks.SaveUserLinks;
if (OPMInterface <> nil) and (NeedToRebuild) then
if OpmRes = mrRetry then // mrRetry means the IDE must be rebuilt.
MainIDEInterface.DoBuildLazarus([])
end;
@ -3538,7 +3538,7 @@ begin
// add to recent packages
if (pofAddToRecent in Flags) then begin
AFilename:=APackage.Filename;
Assert(AFilename=APackage.Filename, 'TPkgManager.DoOpenPackage(');
if FileExistsCached(AFilename) then begin
AddToMenuRecentPackages(AFilename);
end;
@ -5149,16 +5149,13 @@ function TPkgManager.DoOpenPkgFile(PkgFile: TPkgFile): TModalResult;
var
Filename: String;
begin
if (PkgFile.FileType=pftVirtualUnit) then begin
Filename:=FindVirtualUnitSource(PkgFile);
if Filename<>'' then begin
Result:=MainIDE.DoOpenEditorFile(Filename,-1,-1,
[ofOnlyIfExists,ofAddToRecent,ofRegularFile]);
exit;
end;
end;
Result:=MainIDE.DoOpenEditorFile(PkgFile.GetFullFilename,-1,-1,
[ofOnlyIfExists,ofAddToRecent,ofRegularFile]);
if (PkgFile.FileType=pftVirtualUnit) then
Filename:=FindVirtualUnitSource(PkgFile)
else
Filename:=PkgFile.GetFullFilename;
if Filename<>'' then
Result:=MainIDE.DoOpenEditorFile(Filename,-1,-1,
[ofOnlyIfExists,ofAddToRecent,ofRegularFile]);
end;
function TPkgManager.FindVirtualUnitSource(PkgFile: TPkgFile): string;

View File

@ -44,7 +44,7 @@ uses
// IdeIntf
FormEditingIntf, IDEImagesIntf,
// IDE
LazarusIDEStrConsts, ProjPackEditing, PackageLinks;
LazarusIDEStrConsts, ProjPackEditing, PackageLinks, MainIntf;
type
@ -103,6 +103,8 @@ type
function NodeTreeIsIn(xIterNode, xParentNode: TTreeNode): Boolean;
function FindOPLink(const ADependency: TPkgDependencyID): TPackageLink;
function OPNote(ADep: TPkgDependencyID): string;
function OpmAddOrOpenDependency(ADep: TPkgDependencyID): Boolean;
procedure OpmInstallPendingDependencies;
implementation
@ -149,6 +151,44 @@ begin
Result:='';
end;
// The following 2 functions are a pair.
// The first may add online package names to a list and the second downloads them.
var
OpmPkgLinks: TList = Nil;
function OpmAddOrOpenDependency(ADep: TPkgDependencyID): Boolean;
var
PackageLink: TPackageLink;
begin
Result := True;
if aDep.DependencyType <> pdtLazarus then Exit;
if aDep.LoadPackageResult = lprSuccess then
begin
if PackageEditingInterface.DoOpenPackageWithName(aDep.PackageName,[],false)<>mrOk then
Exit(False);
end
else begin
PackageLink := FindOPLink(ADep);
if Assigned(PackageLink) then
begin
if OpmPkgLinks = Nil then
OpmPkgLinks := TList.Create;
OpmPkgLinks.Add(PackageLink);
end;
end;
end;
procedure OpmInstallPendingDependencies;
begin
if Assigned(OpmPkgLinks) then
try
if OPMInterface.InstallPackages(OpmPkgLinks) = mrRetry then
MainIDEInterface.DoBuildLazarus([]); // mrRetry means IDE must be rebuilt.
finally
FreeAndNil(OpmPkgLinks);
end;
end;
{ TProjPackFilePropGui }
constructor TProjPackFilePropGui.Create(aOwner: TWinControl; aPackageGui: Boolean);