From 08558f4b92b898ae0dc8765a0f5203dfc847e9da Mon Sep 17 00:00:00 2001 From: balazs Date: Wed, 13 Dec 2017 07:29:59 +0000 Subject: [PATCH] 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 - --- components/ideintf/packagelinkintf.pas | 3 + ide/lazarusidestrconsts.pas | 3 +- ide/projectinspector.pas | 122 +++++++++++++++++++++---- packager/pkgmanager.pas | 1 + 4 files changed, 110 insertions(+), 19 deletions(-) diff --git a/components/ideintf/packagelinkintf.pas b/components/ideintf/packagelinkintf.pas index d054a08340..f127ebee62 100644 --- a/components/ideintf/packagelinkintf.pas +++ b/components/ideintf/packagelinkintf.pas @@ -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 diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index ac327a6240..9eaf3e3543 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -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'; diff --git a/ide/projectinspector.pas b/ide/projectinspector.pas index 0ff4fc55e3..5a9e7b9868 100644 --- a/ide/projectinspector.pas +++ b/ide/projectinspector.pas @@ -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); diff --git a/packager/pkgmanager.pas b/packager/pkgmanager.pas index 0d71726290..0da5f160c0 100644 --- a/packager/pkgmanager.pas +++ b/packager/pkgmanager.pas @@ -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);