diff --git a/components/ideintf/menuintf.pas b/components/ideintf/menuintf.pas index f4f172e8f0..0c53f91e14 100644 --- a/components/ideintf/menuintf.pas +++ b/components/ideintf/menuintf.pas @@ -399,6 +399,11 @@ var DesignerMenuSectionMisc: TIDEMenuSection; DesignerMenuSectionOptions: TIDEMenuSection; + // Project inspector + ProjectInspectorMenuRoot: TIDEMenuSection = nil; + ProjInspMenuSectionFiles: TIDEMenuSection; // e.g. open, sort files, clean up files + ProjInspMenuSectionDependencies: TIDEMenuSection; // e.g. // e.g. open package, remove dependency + // Package editor(s) PackageEditorMenuRoot: TIDEMenuSection = nil; PkgEditMenuSectionFiles: TIDEMenuSection; // e.g. sort files, clean up files @@ -409,7 +414,7 @@ var PkgEditMenuSectionMisc: TIDEMenuSection; // e.g. options PackageEditorMenuFilesRoot: TIDEMenuSection = nil; PkgEditMenuSectionFile: TIDEMenuSection; // e.g. open file, remove file, move file up/down - PkgEditMenuSectionDirectory: TIDEMenuSection; // e.g. change all properties of all files in a directory and ub directories moved .. + PkgEditMenuSectionDirectory: TIDEMenuSection; // e.g. change all properties of all files in a directory and sub directories moved .. PkgEditMenuSectionDependency: TIDEMenuSection; // e.g. open package, remove dependency // Component Palette, pages drop down. (no submenus allowed / only top level / must have OnClick(Proc)) diff --git a/ide/main.pp b/ide/main.pp index 0c254d82b5..2c9410b3d1 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -2564,6 +2564,7 @@ begin RegisterStandardSourceTabMenuItems; RegisterStandardSourceEditorMenuItems; RegisterStandardMessagesViewMenuItems; + RegisterStandardProjectInspectorMenuItems; RegisterStandardCodeExplorerMenuItems; RegisterStandardCodeTemplatesMenuItems; RegisterStandardDesignerMenuItems; diff --git a/ide/projectinspector.lfm b/ide/projectinspector.lfm index fb5701de22..894749d046 100644 --- a/ide/projectinspector.lfm +++ b/ide/projectinspector.lfm @@ -110,8 +110,8 @@ object ProjectInspectorForm: TProjectInspectorForm AnchorSideTop.Control = SortAlphabeticallyButton AnchorSideTop.Side = asrCenter Left = 95 - Height = 32 - Top = -2 + Height = 30 + Top = -1 Width = 365 ButtonWidth = 23 Anchors = [akTop, akLeft, akRight] @@ -157,9 +157,6 @@ object ProjectInspectorForm: TProjectInspectorForm OnPopup = ItemsPopupMenuPopup Left = 72 Top = 112 - object MenuItem1: TMenuItem - Caption = 'New Item1' - end end object AddPopupMenu: TPopupMenu Left = 74 diff --git a/ide/projectinspector.pas b/ide/projectinspector.pas index 38776e3526..63ad7d229e 100644 --- a/ide/projectinspector.pas +++ b/ide/projectinspector.pas @@ -69,12 +69,33 @@ uses ProjectIntf, PackageIntf, PackageLinkIntf, PackageDependencyIntf, // IDEIntf IDEHelpIntf, IDECommands, IDEDialogs, IDEImagesIntf, LazIDEIntf, ToolBarIntf, + MenuIntf, // IDE LazarusIDEStrConsts, MainBase, MainBar, IDEProcs, DialogProcs, IDEOptionDefs, Project, InputHistory, TransferMacros, EnvironmentOpts, BuildManager, BasePkgManager, ProjPackChecks, ProjPackEditing, ProjPackFilePropGui, PackageDefs, AddToProjectDlg, AddPkgDependencyDlg, AddFPMakeDependencyDlg, LResources; +const + ProjectInspectorMenuRootName = 'ProjectInspector'; +var + ProjInspMenuAddDiskFile: TIDEMenuCommand; + ProjInspMenuRemoveNonExistingFiles: TIDEMenuCommand; + ProjInspMenuOpenFolder: TIDEMenuCommand; + ProjInspMenuOpen: TIDEMenuCommand; // open file or dependency + ProjInspMenuRemove: TIDEMenuCommand; + ProjInspMenuCopyMoveFileToDir: TIDEMenuCommand; + ProjInspMenuEnableI18NForLFM: TIDEMenuCommand; + ProjInspMenuDisableI18NForLFM: TIDEMenuCommand; + + ProjInspMenuAddDependency: TIDEMenuCommand; + ProjInspMenuReAddDependency: TIDEMenuCommand; + ProjInspMenuMoveDependencyUp: TIDEMenuCommand; + ProjInspMenuMoveDependencyDown: TIDEMenuCommand; + ProjInspMenuStoreFilenameAsDefaultOfDependencyDown: TIDEMenuCommand; + ProjInspMenuStoreFilenameAsPreferredOfDependencyDown: TIDEMenuCommand; + ProjInspMenuClearPreferredFilenameOfDependencyDown: TIDEMenuCommand; + type TOnAddUnitToProject = function(Sender: TObject; AnUnitInfo: TUnitInfo): TModalresult of object; @@ -93,7 +114,6 @@ type DirectoryHierarchyButton: TSpeedButton; FilterEdit: TTreeFilterEdit; PropsGroupBox: TGroupBox; - MenuItem1: TMenuItem; MenuItem2: TMenuItem; mnuAddFPMakeReq: TMenuItem; mnuAddEditorFiles: TMenuItem; @@ -279,7 +299,7 @@ var function UpdateUnitInfoResourceBaseClass(AnUnitInfo: TUnitInfo; Quiet: boolean): boolean; - +procedure RegisterStandardProjectInspectorMenuItems; implementation @@ -404,6 +424,36 @@ begin end; end; +procedure RegisterStandardProjectInspectorMenuItems; +var + AParent: TIDEMenuSection; +begin + ProjectInspectorMenuRoot :=RegisterIDEMenuRoot(ProjectInspectorMenuRootName); + + // register the section for operations on selected files + ProjInspMenuSectionFiles:=RegisterIDEMenuSection(ProjectInspectorMenuRootName,'Files'); + AParent:=ProjInspMenuSectionFiles; + ProjInspMenuAddDiskFile:=RegisterIDEMenuCommand(AParent,'Add disk file',lisBtnDlgAdd); + ProjInspMenuRemoveNonExistingFiles:=RegisterIDEMenuCommand(AParent,'Remove non existing files',lisRemoveNonExistingFiles); + ProjInspMenuOpenFolder:=RegisterIDEMenuCommand(AParent,'Open folder',lisMenuOpenFolder); + ProjInspMenuAddDependency:=RegisterIDEMenuCommand(AParent,'Add dependency',lisBtnDlgAdd); + ProjInspMenuOpen:=RegisterIDEMenuCommand(AParent,'Open',lisBtnDlgAdd); + ProjInspMenuRemove:=RegisterIDEMenuCommand(AParent,'Remove',lisRemove); + ProjInspMenuCopyMoveFileToDir:=RegisterIDEMenuCommand(AParent,'Copy/Move File to Directory',lisCopyMoveFileToDirectory); + ProjInspMenuEnableI18NForLFM:=RegisterIDEMenuCommand(AParent,'Enable I18N for LFM',lisEnableI18NForLFM); + ProjInspMenuDisableI18NForLFM:=RegisterIDEMenuCommand(AParent,'Disable I18N for LFM',lisDisableI18NForLFM); + + ProjInspMenuSectionDependencies:=RegisterIDEMenuSection(ProjectInspectorMenuRootName,'Dependencies'); + AParent:=ProjInspMenuSectionDependencies; + ProjInspMenuReAddDependency:=RegisterIDEMenuCommand(AParent,'ReAdd dependency',lisPckEditReAddDependency); + ProjInspMenuMoveDependencyUp:=RegisterIDEMenuCommand(AParent,'Move dependency up',lisPckEditMoveDependencyUp); + ProjInspMenuMoveDependencyDown:=RegisterIDEMenuCommand(AParent,'Move dependency down',lisPckEditMoveDependencyDown); + ProjInspMenuStoreFilenameAsDefaultOfDependencyDown:=RegisterIDEMenuCommand(AParent,'Store filename as default of dependency',lisPckEditStoreFileNameAsDefaultForThisDependency); + ProjInspMenuStoreFilenameAsPreferredOfDependencyDown:=RegisterIDEMenuCommand(AParent,'Store filename as preferred of dependency',lisPckEditStoreFileNameAsPreferredForThisDependency); + ProjInspMenuClearPreferredFilenameOfDependencyDown:=RegisterIDEMenuCommand(AParent,'Clear preferred filename of dependency',lisPckEditClearDefaultPreferredFilenameOfDependency); + +end; + { TProjectInspectorForm } @@ -766,26 +816,13 @@ begin end; procedure TProjectInspectorForm.ItemsPopupMenuPopup(Sender: TObject); -var - ItemCnt: integer; - function AddPopupMenuItem(const ACaption: string; AnEvent: TNotifyEvent; - EnabledFlag: boolean = True): TMenuItem; + procedure SetItem(Item: TIDEMenuCommand; AnOnClick: TNotifyEvent; + aShow: boolean = true; AEnable: boolean = true); begin - if ItemsPopupMenu.Items.Count<=ItemCnt then begin - Result:=TMenuItem.Create(Self); - ItemsPopupMenu.Items.Add(Result); - end else - Result:=ItemsPopupMenu.Items[ItemCnt]; - Result.Caption:=ACaption; - Result.OnClick:=AnEvent; - Result.Enabled:=EnabledFlag; - Result.Checked:=false; - Result.ShowAlwaysCheckable:=false; - Result.Visible:=true; - Result.RadioItem:=false; - Result.ImageIndex:=-1; - inc(ItemCnt); + Item.OnClick:=AnOnClick; + Item.Visible:=aShow; + Item.Enabled:=AEnable; end; var @@ -806,8 +843,9 @@ var CanClearDep: Integer; CanMoveFileCount: Integer; OpenItemCapt: String; + OnlyFilesNodeSelected, OnlyDependenciesNodeSelected, CanI18NforLFM: Boolean; begin - ItemCnt:=0; + ProjectInspectorMenuRoot.MenuItem:=ItemsPopupMenu.Items; CanRemoveCount:=0; CanOpenCount:=0; @@ -856,72 +894,50 @@ begin end; end; - if ItemsTreeView.Selected = FFilesNode then - begin - // Only the Files node is selected. - Assert(AddBitBtn.Enabled, 'AddBitBtn not Enabled'); - AddPopupMenuItem(lisBtnDlgAdd, @mnuAddDiskFileClick); - if not LazProject.IsVirtual then - AddPopupMenuItem(lisRemoveNonExistingFiles,@RemoveNonExistingFilesMenuItemClick); - AddPopupMenuItem(cLineCaption, Nil, False); // Separator - AddPopupMenuItem(lisMenuOpenFolder, @mnuOpenFolderClick); - end - else if ItemsTreeView.Selected = FDependenciesNode then - begin - // Only the Required Packages node is selected. - AddPopupMenuItem(lisBtnDlgAdd, @mnuAddReqClick); - end - else begin - // Files, dependencies or everything mixed is selected. - if CanOpenCount>0 then begin - OpenItemCapt := lisOpen; - if Assigned(SingleSelectedDep) then - case SingleSelectedDep.LoadPackageResult of - lprAvailableOnline: - OpenItemCapt:=lisPckEditInstall; - lprNotFound: - if Assigned(OPMInterface) and not OPMInterface.IsPackageListLoaded then - OpenItemCapt:=lisPckEditCheckAvailabilityOnline; - end; - AddPopupMenuItem(OpenItemCapt, @OpenButtonClick); - end; - if CanRemoveCount>0 then - AddPopupMenuItem(lisRemove, @RemoveBitBtnClick); - // files section - if CanMoveFileCount>0 then - AddPopupMenuItem(lisCopyMoveFileToDirectory,@CopyMoveToDirMenuItemClick); - end; + OnlyFilesNodeSelected:=ItemsTreeView.Selected = FFilesNode; + SetItem(ProjInspMenuAddDiskFile,@mnuAddDiskFileClick,OnlyFilesNodeSelected); + SetItem(ProjInspMenuRemoveNonExistingFiles,@RemoveNonExistingFilesMenuItemClick,OnlyFilesNodeSelected and not LazProject.IsVirtual); + SetItem(ProjInspMenuOpenFolder,@mnuOpenFolderClick,OnlyFilesNodeSelected); - if LazProject.EnableI18N and LazProject.EnableI18NForLFM - and (HasLFMCount>0) then begin - AddPopupMenuItem(lisEnableI18NForLFM, - @EnableI18NForLFMMenuItemClick, DisabledI18NForLFMCount>0); - AddPopupMenuItem(lisDisableI18NForLFM, - @DisableI18NForLFMMenuItemClick, DisabledI18NForLFMCount0 then begin + OpenItemCapt := lisOpen; + if Assigned(SingleSelectedDep) then + case SingleSelectedDep.LoadPackageResult of + lprAvailableOnline: + OpenItemCapt:=lisPckEditInstall; + lprNotFound: + if Assigned(OPMInterface) and not OPMInterface.IsPackageListLoaded then + OpenItemCapt:=lisPckEditCheckAvailabilityOnline; + end; + SetItem(ProjInspMenuOpen,@OpenButtonClick,true); + ProjInspMenuOpen.Caption:=OpenItemCapt; + end else begin + SetItem(ProjInspMenuOpen,@OpenButtonClick,false); end; + SetItem(ProjInspMenuRemove,@RemoveBitBtnClick,CanRemoveCount>0); + + // move + SetItem(ProjInspMenuCopyMoveFileToDir,@CopyMoveToDirMenuItemClick,CanMoveFileCount>0); + + // i18n for lfm + CanI18NforLFM:=LazProject.EnableI18N and LazProject.EnableI18NForLFM and (HasLFMCount>0); + SetItem(ProjInspMenuEnableI18NForLFM,@EnableI18NForLFMMenuItemClick,CanI18NforLFM,DisabledI18NForLFMCount>0); + SetItem(ProjInspMenuDisableI18NForLFM,@DisableI18NForLFMMenuItemClick,CanI18NforLFM,DisabledI18NForLFMCount0 then - AddPopupMenuItem(lisPckEditReAddDependency, @ReAddMenuItemClick, true); - if SingleSelectedDep<>nil then begin - AddPopupMenuItem(lisPckEditMoveDependencyUp, @MoveDependencyUpClick, - (SingleSelectedDep.PrevRequiresDependency<>nil)); - AddPopupMenuItem(lisPckEditMoveDependencyDown, @MoveDependencyDownClick, - (SingleSelectedDep.NextRequiresDependency<>nil)); - end; - if HasValidDep>0 then begin - AddPopupMenuItem(lisPckEditStoreFileNameAsDefaultForThisDependency, - @SetDependencyDefaultFilenameMenuItemClick, true); - AddPopupMenuItem(lisPckEditStoreFileNameAsPreferredForThisDependency, - @SetDependencyPreferredFilenameMenuItemClick, true); - end; - if CanClearDep>0 then begin - AddPopupMenuItem(lisPckEditClearDefaultPreferredFilenameOfDependency, - @ClearDependencyFilenameMenuItemClick, true); - end; - - while ItemsPopupMenu.Items.Count>ItemCnt do - ItemsPopupMenu.Items.Delete(ItemsPopupMenu.Items.Count-1); + // undo delete + SetItem(ProjInspMenuReAddDependency,@ReAddMenuItemClick,CanReAddCount>0); + // move up/down + SetItem(ProjInspMenuMoveDependencyUp,@MoveDependencyUpClick,(SingleSelectedDep<>nil) and (SingleSelectedDep.PrevRequiresDependency<>nil)); + SetItem(ProjInspMenuMoveDependencyDown,@MoveDependencyDownClick,(SingleSelectedDep<>nil) and (SingleSelectedDep.NextRequiresDependency<>nil)); + // default and preferred filename + SetItem(ProjInspMenuStoreFilenameAsDefaultOfDependencyDown,@SetDependencyDefaultFilenameMenuItemClick,HasValidDep>0); + SetItem(ProjInspMenuStoreFilenameAsPreferredOfDependencyDown,@SetDependencyPreferredFilenameMenuItemClick,HasValidDep>0); + SetItem(ProjInspMenuClearPreferredFilenameOfDependencyDown,@ClearDependencyFilenameMenuItemClick,CanClearDep>0); end; procedure TProjectInspectorForm.ItemsTreeViewAdvancedCustomDrawItem(