mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-03 00:17:18 +01:00
IDE: Support installing online package dependencies also from Package Editor.
git-svn-id: trunk@63962 -
This commit is contained in:
parent
30e70e5c24
commit
41552a49c8
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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.');
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user