From 5800ad0cf3e42b12388a28c3e3b66076ff2d07b9 Mon Sep 17 00:00:00 2001 From: mattias Date: Sun, 27 Apr 2003 20:31:53 +0000 Subject: [PATCH] implemented open package for component palette git-svn-id: trunk@4100 - --- ide/componentpalette.pas | 69 +++++++++++++++++++++++++++++++++++--- ide/mainbar.pas | 2 ++ packager/packagedefs.pas | 19 ++++++++++- packager/packagesystem.pas | 2 +- packager/pkgmanager.pas | 53 +++++++++++++++++++++++++++++ 5 files changed, 138 insertions(+), 7 deletions(-) diff --git a/ide/componentpalette.pas b/ide/componentpalette.pas index fa32201508..ada6b6fb96 100644 --- a/ide/componentpalette.pas +++ b/ide/componentpalette.pas @@ -38,8 +38,8 @@ unit ComponentPalette; interface uses - Classes, SysUtils, Dialogs, Graphics, ExtCtrls, Buttons, LResources, AVL_Tree, - ComponentReg, PackageDefs, LazarusIDEStrConsts; + Classes, SysUtils, Dialogs, Graphics, ExtCtrls, Buttons, Menus, LResources, + AVL_Tree, ComponentReg, PackageDefs, LazarusIDEStrConsts; const ComponentPaletteBtnWidth = 25; @@ -47,18 +47,24 @@ const type TComponentPalette = class(TBaseComponentPalette) + PopupMenu: TPopupMenu; + OpenPackageMenuItem: TMenuItem; procedure ActivePageChanged(Sender: TObject); + procedure OpenPackageClicked(Sender: TObject); + procedure PopupMenuPopup(Sender: TObject); private + fComponents: TAVLTree; // tree of TRegisteredComponent sorted for componentclass FNoteBook: TNotebook; fNoteBookNeedsUpdate: boolean; + FOnOpenPackage: TNotifyEvent; FSelected: TRegisteredComponent; - fUpdatingNotebook: boolean; - fComponents: TAVLTree; // tree of TRegisteredComponent sorted for componentclass fUnregisteredIcon: TBitmap; + fUpdatingNotebook: boolean; procedure SetNoteBook(const AValue: TNotebook); procedure SelectionToolClick(Sender: TObject); procedure ComponentBtnClick(Sender: TObject); procedure SetSelected(const AValue: TRegisteredComponent); + procedure CreatePopupMenu; protected procedure DoEndUpdate(Changed: boolean); override; procedure OnPageAddedComponent(Component: TRegisteredComponent); override; @@ -78,6 +84,7 @@ type function FindComponent(const CompClassName: string): TRegisteredComponent; override; property NoteBook: TNotebook read FNoteBook write SetNoteBook; property Selected: TRegisteredComponent read FSelected write SetSelected; + property OnOpenPackage: TNotifyEvent read FOnOpenPackage write FOnOpenPackage; end; implementation @@ -114,13 +121,42 @@ begin Selected:=nil; end; +procedure TComponentPalette.OpenPackageClicked(Sender: TObject); +var + PkgComponent: TPkgComponent; +begin + PkgComponent:=TPkgComponent(FindButton(PopupMenu.PopupComponent)); + if (PkgComponent=nil) or (PkgComponent.PkgFile=nil) + or (PkgComponent.PkgFile.LazPackage=nil) then exit; + if Assigned(OnOpenPackage) then + OnOpenPackage(PkgComponent.PkgFile.LazPackage); +end; + +procedure TComponentPalette.PopupMenuPopup(Sender: TObject); +var + PkgComponent: TPkgComponent; + APackage: TLazPackage; +begin + PkgComponent:=TPkgComponent(FindButton(PopupMenu.PopupComponent)); + APackage:=nil; + if (PkgComponent<>nil) and (PkgComponent.PkgFile<>nil) then + APackage:=PkgComponent.PkgFile.LazPackage; + if APackage=nil then begin + OpenPackageMenuItem.Visible:=false; + end else begin + OpenPackageMenuItem.Caption:='Open Package '+APackage.IDAsString; + OpenPackageMenuItem.Visible:=true; + end; +end; + procedure TComponentPalette.SetNoteBook(const AValue: TNotebook); begin if FNoteBook=AValue then exit; ClearButtons; FNoteBook:=AValue; - if FNoteBook<>nil then + if FNoteBook<>nil then begin FNoteBook.OnPageChanged:=@ActivePageChanged; + end; UpdateNoteBookButtons; end; @@ -164,6 +200,22 @@ begin end; end; +procedure TComponentPalette.CreatePopupMenu; +begin + if PopupMenu<>nil then exit; + PopupMenu:=TPopupMenu.Create(nil); + PopupMenu.OnPopup:=@PopupMenuPopup; + PopupMenu.Name:='ComponentPalettePopupMenu'; + + OpenPackageMenuItem:=TMenuItem.Create(PopupMenu); + with OpenPackageMenuItem do begin + Name:='OpenPackageMenuItem'; + Caption:='Open package'; + OnClick:=@OpenPackageClicked; + end; + PopupMenu.Items.Add(OpenPackageMenuItem); +end; + procedure TComponentPalette.DoEndUpdate(Changed: boolean); begin if Changed then UpdateNoteBookButtons; @@ -231,6 +283,11 @@ end; procedure TComponentPalette.ClearButtons; begin Selected:=nil; + if PopupMenu<>nil then begin + PopupMenu.Free; + PopupMenu:=nil; + OpenPackageMenuItem:=nil; + end; inherited ClearButtons; end; @@ -318,6 +375,7 @@ begin if CurComponent.Button=nil then begin CurBtn:=TSpeedButton.Create(nil); CurComponent.Button:=CurBtn; + CreatePopupMenu; with CurBtn do begin Name:='PaletteBtnPage'+IntToStr(i)+'_'+IntToStr(j) +'_'+CurComponent.ComponentClass.ClassName; @@ -331,6 +389,7 @@ begin Hint := CurComponent.ComponentClass.ClassName; SetBounds(ButtonX,0,ComponentPaletteBtnWidth,ComponentPaletteBtnHeight); inc(ButtonX,ComponentPaletteBtnWidth+2); + PopupMenu:=Self.PopupMenu; end; end; end else if CurComponent.Button<>nil then begin diff --git a/ide/mainbar.pas b/ide/mainbar.pas index f35796bc0a..779c2eadda 100644 --- a/ide/mainbar.pas +++ b/ide/mainbar.pas @@ -389,6 +389,8 @@ type function DoSaveStringToFile(const Filename, Src, FileDescription: string): TModalResult; virtual; abstract; + function DoShowProjectInspector: TModalResult; virtual; abstract; + function DoBuildLazarus(Flags: TBuildLazarusFlags): TModalResult; virtual; abstract; function DoSaveForBuild: TModalResult; virtual; abstract; function DoCheckFilesOnDisk: TModalResult; virtual; abstract; diff --git a/packager/packagedefs.pas b/packager/packagedefs.pas index f21275e543..eb0fdb9863 100644 --- a/packager/packagedefs.pas +++ b/packager/packagedefs.pas @@ -663,7 +663,9 @@ function FindCompatibleDependencyInList(First: TPkgDependency; ListType: TPkgDependencyList; ComparePackage: TLazPackageID): TPkgDependency; function GetDependencyWithIndex(First: TPkgDependency; ListType: TPkgDependencyList; Index: integer): TPkgDependency; - +function IndexOfDependencyInList(First: TPkgDependency; + ListType: TPkgDependencyList; FindDependency: TPkgDependency): integer; + function FindLowestPkgDependencyWithName(const PkgName: string): TPkgDependency; function FindLowestPkgDependencyNodeWithName(const PkgName: string): TAVLTreeNode; function FindNextPkgDependecyNodeWithSameName(Node: TAVLTreeNode): TAVLTreeNode; @@ -926,6 +928,21 @@ begin Result:=true; end; +function IndexOfDependencyInList(First: TPkgDependency; + ListType: TPkgDependencyList; FindDependency: TPkgDependency): integer; +var + Dependency: TPkgDependency; +begin + Result:=-1; + Dependency:=First; + while Dependency<>nil do begin + inc(Result); + if Dependency=FindDependency then exit; + Dependency:=Dependency.NextDependency[ListType]; + end; + Result:=-1; +end; + function FindLowestPkgDependencyWithName(const PkgName: string): TPkgDependency; var ANode: TAVLTreeNode; diff --git a/packager/packagesystem.pas b/packager/packagesystem.pas index 5dfa798d9c..2d8e886221 100644 --- a/packager/packagesystem.pas +++ b/packager/packagesystem.pas @@ -886,7 +886,7 @@ begin AutoCreated:=true; Name:='SynEdit'; Filename:='$(LazarusDir)/components/synedit/'; - Version.SetValues(1,0,1,1); + Version.SetValues(1,0,0,0); Author:='SynEdit - http://sourceforge.net/projects/synedit/'; License:='LGPL-2'; AutoInstall:=pitStatic; diff --git a/packager/pkgmanager.pas b/packager/pkgmanager.pas index 0cf5635e15..223dbf4a21 100644 --- a/packager/pkgmanager.pas +++ b/packager/pkgmanager.pas @@ -90,6 +90,7 @@ type procedure PackageGraphEndUpdate(Sender: TObject; GraphChanged: boolean); procedure IDEComponentPaletteEndUpdate(Sender: TObject; PaletteChanged: boolean); + procedure IDEComponentPaletteOpenPackage(Sender: TObject); private FirstInstalledDependency: TPkgDependency; FirstAutoInstallDependency: TPkgDependency; @@ -217,6 +218,12 @@ begin UpdateVisibleComponentPalette; end; +procedure TPkgManager.IDEComponentPaletteOpenPackage(Sender: TObject); +begin + if (Sender=nil) or (not (Sender is TLazPackage)) then exit; + DoOpenPackage(TLazPackage(Sender)); +end; + procedure TPkgManager.MainIDEitmPkgAddCurUnitToPkgClick(Sender: TObject); begin DoAddActiveUnitToAPackage; @@ -622,8 +629,10 @@ function TPkgManager.CheckPackageGraphForCompilation(APackage: TLazPackage; FirstDependency: TPkgDependency): TModalResult; var PathList: TList; + Dependency: TPkgDependency; begin writeln('TPkgManager.CheckPackageGraphForCompilation A'); + // check for unsaved packages PathList:=PackageGraph.FindUnsavedDependencyPath(APackage,FirstDependency); if PathList<>nil then begin @@ -637,6 +646,20 @@ begin // check for broken dependencies PathList:=PackageGraph.FindBrokenDependencyPath(APackage,FirstDependency); if PathList<>nil then begin + if (PathList.Count=1) then begin + Dependency:=TPkgDependency(PathList[0]); + if Dependency is TPkgDependency then begin + // check if project + if Dependency.Owner is TProject then begin + MainIDE.DoShowProjectInspector; + Result:=MessageDlg('Broken dependency', + 'The project requires the package "'+Dependency.AsString+'".'#13 + +'But it was not found. See Project -> Project Inspector.', + mtError,[mbCancel,mbAbort],0); + exit; + end; + end; + end; DoShowPackageGraphPathList(PathList); Result:=MessageDlg('Broken dependency', 'A required packages was not found. See package graph.', @@ -1120,6 +1143,7 @@ begin inherited Create(TheOwner); IDEComponentPalette:=TComponentPalette.Create; IDEComponentPalette.OnEndUpdate:=@IDEComponentPaletteEndUpdate; + TComponentPalette(IDEComponentPalette).OnOpenPackage:=@IDEComponentPaletteOpenPackage; PkgLinks:=TPackageLinks.Create; PkgLinks.UpdateAll; @@ -1963,6 +1987,15 @@ var begin PackageGraph.BeginUpdate(false); try + // check if package is designtime package + if APackage.PackageType=lptRunTime then begin + Result:=MessageDlg('Package is no designtime package', + 'The package '+APackage.IDAsString+' is a runtime only package.'#13 + +'Runtime only packages can not be installed in the IDE.', + mtError,[mbCancel,mbAbort],0); + exit; + end; + // save package if APackage.IsVirtual or APackage.Modified then begin Result:=DoSavePackage(APackage,[]); @@ -2006,9 +2039,29 @@ end; function TPkgManager.DoCompileAutoInstallPackages( Flags: TPkgCompileFlags): TModalResult; +var + Dependency: TPkgDependency; + OldDependency: TPkgDependency; begin PackageGraph.BeginUpdate(false); try + Dependency:=FirstAutoInstallDependency; + while Dependency<>nil do begin + OldDependency:=Dependency; + Dependency:=Dependency.NextRequiresDependency; + if OldDependency.LoadPackageResult<>lprSuccess then begin + Result:=MessageDlg('Package not found', + 'The package "'+OldDependency.AsString+'" is marked for installation,' + +' but can not be found.'#13 + +'Remove dependency from the installation list of packages?', + mtError,[mbYes,mbNo,mbAbort],0); + if Result=mrNo then Result:=mrCancel; + if Result<>mrYes then exit; + OldDependency.RemoveFromList(FirstAutoInstallDependency,pdlRequires); + OldDependency.Free; + end; + end; + // check consistency Result:=CheckPackageGraphForCompilation(nil,FirstAutoInstallDependency); if Result<>mrOk then exit;