ide: project inspector: register items popup menuitems

This commit is contained in:
mattias 2022-01-30 20:39:47 +01:00
parent 8a8bee71f8
commit ec56ff310b
4 changed files with 108 additions and 89 deletions

View File

@ -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))

View File

@ -2564,6 +2564,7 @@ begin
RegisterStandardSourceTabMenuItems;
RegisterStandardSourceEditorMenuItems;
RegisterStandardMessagesViewMenuItems;
RegisterStandardProjectInspectorMenuItems;
RegisterStandardCodeExplorerMenuItems;
RegisterStandardCodeTemplatesMenuItems;
RegisterStandardDesignerMenuItems;

View File

@ -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

View File

@ -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, DisabledI18NForLFMCount<HasLFMCount);
OnlyDependenciesNodeSelected:=ItemsTreeView.Selected = FDependenciesNode;
SetItem(ProjInspMenuAddDependency,@mnuAddReqClick,OnlyDependenciesNodeSelected);
// open, remove
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;
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,DisabledI18NForLFMCount<HasLFMCount);
// Required packages section
if CanReAddCount>0 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(