IDE: Project Inspector: Display missing "Required Packages" with different icon if the packages are available online. The possibility to install online packages directly from Project Inspector when Opkman is installed.

git-svn-id: trunk@56712 -
This commit is contained in:
balazs 2017-12-13 07:29:59 +00:00
parent 640a82f920
commit 08558f4b92
4 changed files with 110 additions and 19 deletions

View File

@ -106,9 +106,12 @@ type
{ TOPMInterface }
TOPMInterface = class
private
FPackageListAvailable: TNotifyEvent;
public
{confirmation/install/extract/download dialogs will be displayed in the center of WorkArea}
function InstallPackages(APkgLinks: TList; var ANeedToRebuild: Boolean): TModalResult; virtual; abstract;
property OnPackageListAvailable: TNotifyEvent read FPackageListAvailable write FPackageListAvailable;
end;
var

View File

@ -4299,7 +4299,7 @@ resourcestring
lisPkgMangTheFollowingPackagesFailedToLoad = 'The following packages failed to load:';
lisMissingPackages = 'Missing Packages';
lisNotInstalledPackages = 'Not installed packages';
lisInstallPackagesMsg = 'The following packages are not installed, but available in the main repository: %s.' +
lisInstallPackagesMsg = 'The following packages are not installed, but available online: %s.' +
sLineBreak + 'Do you wish to install missing packages?';
lisOtherSourcesPathOfPackageContainsDirectoryWhichIsA = 'other sources path '
+'of package "%s" contains directory "%s", which is already in the unit '
@ -4622,6 +4622,7 @@ resourcestring
lisPckEditRemovedFiles = 'Removed Files';
lisPckEditRemovedRequiredPackages = 'Removed required packages';
lisPckEditDefault = '%s, default: %s';
lisPckEditAvailableOnline = '(available online)';
lisPckEditDependencyProperties = 'Dependency Properties';
lisFilesHasRegisterProcedureInPackageUsesSection = 'Files: %s, has Register '
+'procedure: %s, in package uses section: %s';

View File

@ -60,11 +60,11 @@ uses
TreeFilterEdit,
// IDEIntf
IDEHelpIntf, IDECommands, IDEDialogs, IDEImagesIntf, LazIDEIntf, ProjectIntf,
PackageIntf,
PackageIntf, PackageLinkIntf, MainIntf,
// IDE
LazarusIDEStrConsts, IDEProcs, DialogProcs, IDEOptionDefs, EnvironmentOpts,
PackageDefs, Project, PackageEditor, AddToProjectDlg, AddPkgDependencyDlg,
InputHistory, MainBase, ProjPackChecks;
InputHistory, MainBase, ProjPackChecks, PackageLinks;
type
TOnAddUnitToProject =
@ -163,6 +163,7 @@ type
ImageIndexFiles: integer;
ImageIndexRequired: integer;
ImageIndexConflict: integer;
ImageIndexAvailableOnline: integer;
ImageIndexRemovedRequired: integer;
ImageIndexProject: integer;
ImageIndexUnit: integer;
@ -188,6 +189,8 @@ type
procedure OnProjectBeginUpdate(Sender: TObject);
procedure OnProjectEndUpdate(Sender: TObject; ProjectChanged: boolean);
procedure EnableI18NForSelectedLFM(TheEnable: boolean);
procedure DoOnPackageListAvailable(Sender: TObject);
function FindOnlinePackageLink(const ADependency: TPkgDependency): TPackageLink;
protected
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure IdleHandler(Sender: TObject; var {%H-}Done: Boolean);
@ -546,6 +549,8 @@ end;
procedure TProjectInspectorForm.FormCreate(Sender: TObject);
begin
TIDEImages.AssignImage(FilterEdit.Glyph, 'btnfiltercancel');
if OPMInterface <> nil then
OPMInterface.OnPackageListAvailable := @DoOnPackageListAvailable;
end;
procedure TProjectInspectorForm.FormDropFiles(Sender: TObject;
@ -744,27 +749,50 @@ var
Item: TObject;
CurFile: TUnitInfo;
CurDependency: TPkgDependency;
PackageLink: TPackageLink;
PkgLinks: TList;
NeedToRebuild: Boolean;
begin
BeginUpdate;
PkgLinks := TList.Create;
try
for i:=0 to ItemsTreeView.SelectionCount-1 do 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 exit;
end else if Item is TPkgDependency then begin
CurDependency:=TPkgDependency(Item);
if PackageEditingInterface.DoOpenPackageWithName(
CurDependency.PackageName,[],false)<>mrOk
then
exit;
NeedToRebuild := False;
BeginUpdate;
try
for i:=0 to ItemsTreeView.SelectionCount-1 do 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
PkgLinks.Free;
Exit;
end;
end else if Item is TPkgDependency then begin
CurDependency:=TPkgDependency(Item);
if CurDependency.LoadPackageResult = lprSuccess then begin
if PackageEditingInterface.DoOpenPackageWithName(CurDependency.PackageName,[],false)<>mrOk then begin
PkgLinks.Free;
Exit;
end;
end else begin
if OPMInterface<>nil then begin
PackageLink:=FindOnlinePackageLink(CurDependency);
if PackageLink<>nil then
PkgLinks.Add(PackageLink);
end;
end;
end;
end;
finally
EndUpdate;
end;
if (OPMInterface<>nil) and (PkgLinks.Count>0) then
OPMInterface.InstallPackages(PkgLinks, NeedToRebuild);
finally
EndUpdate;
PkgLinks.Free;
end;
if (OPMInterface<>nil) and (NeedToRebuild) then
MainIDEInterface.DoBuildLazarus([])
end;
procedure TProjectInspectorForm.OptionsBitBtnClick(Sender: TObject);
@ -1016,6 +1044,7 @@ begin
ImageIndexFiles := IDEImages.LoadImage('pkg_files');
ImageIndexRequired := IDEImages.LoadImage('pkg_required');
ImageIndexConflict := IDEImages.LoadImage('pkg_conflict');
ImageIndexAvailableOnline := IDEImages.LoadImage('pkg_install');
ImageIndexRemovedRequired := IDEImages.LoadImage('pkg_removedrequired');
ImageIndexProject := IDEImages.LoadImage('item_project_source');
ImageIndexUnit := IDEImages.LoadImage('item_unit');
@ -1086,8 +1115,12 @@ begin
Result:=ImageIndexRemovedRequired
else if TPkgDependency(Item).LoadPackageResult=lprSuccess then
Result:=ImageIndexRequired
else
else begin
Result:=ImageIndexConflict;
if OPMInterface<>nil then
if FindOnlinePackageLink(TPkgDependency(Item))<>nil then
Result:=ImageIndexAvailableOnline;
end;
end;
end;
@ -1154,6 +1187,10 @@ begin
else
NodeText:=Format(lisPckEditDefault, [NodeText, AFilename]);
end;
if Dependency.LoadPackageResult<>lprSuccess then
if OPMInterface<>nil then
if FindOnlinePackageLink(Dependency)<>nil then
NodeText:=NodeText+lisPckEditAvailableOnline;
// Add the required package under the branch
ANodeData := CreateNodeData(penDependency, Dependency.PackageName, False);
RequiredBranch.AddNodeData(NodeText, ANodeData);
@ -1224,6 +1261,55 @@ begin
end;
end;
procedure TProjectInspectorForm.DoOnPackageListAvailable(Sender: TObject);
var
CurDependency: TPkgDependency;
i: Integer;
TVNode: TTreeNode;
NodeData: TPENodeData;
Item: TObject;
NodeText: String;
ImageIndex: Integer;
begin
BeginUpdate;
try
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);
NodeText:=CurDependency.AsString;
ImageIndex:=ImageIndexRequired;
if CurDependency.LoadPackageResult<>lprSuccess then begin
ImageIndex:=ImageIndexConflict;
if OPMInterface<>nil then begin
if FindOnlinePackageLink(CurDependency)<>nil then begin
NodeText:=NodeText+lisPckEditAvailableOnline;
ImageIndex:=ImageIndexAvailableOnline;
end;
end;
end;
TVNode.Text:=NodeText;
TVNode.ImageIndex:=ImageIndex;
TVNode.SelectedIndex:=ImageIndex;
end;
finally
EndUpdate;
end;
end;
function TProjectInspectorForm.FindOnlinePackageLink(
const ADependency: TPkgDependency): TPackageLink;
var
PackageLink: TPackageLink;
begin
Result := nil;
PackageLink := LazPackageLinks.FindLinkWithPkgName(ADependency.AsString);
if (PackageLink <> nil) and (PackageLink.Origin = ploOnline) and
(ADependency.IsCompatible(PackageLink.Version)) then
Result := PackageLink;
end;
procedure TProjectInspectorForm.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited KeyDown(Key, Shift);

View File

@ -3356,6 +3356,7 @@ begin
if BrokenDependencies<>nil then begin
if OPMInterface <> nil then begin
ResolveBrokenDependenciesOnline(BrokenDependencies, NeedToRebuild);
FreeAndNil(BrokenDependencies);
BrokenDependencies := PackageGraph.FindAllBrokenDependencies(nil, AProject.FirstRequiredDependency);
if BrokenDependencies <> nil then
Result := ShowBrokenDependenciesReport(BrokenDependencies);