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; DesignerMenuSectionMisc: TIDEMenuSection;
DesignerMenuSectionOptions: 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) // Package editor(s)
PackageEditorMenuRoot: TIDEMenuSection = nil; PackageEditorMenuRoot: TIDEMenuSection = nil;
PkgEditMenuSectionFiles: TIDEMenuSection; // e.g. sort files, clean up files PkgEditMenuSectionFiles: TIDEMenuSection; // e.g. sort files, clean up files
@ -409,7 +414,7 @@ var
PkgEditMenuSectionMisc: TIDEMenuSection; // e.g. options PkgEditMenuSectionMisc: TIDEMenuSection; // e.g. options
PackageEditorMenuFilesRoot: TIDEMenuSection = nil; PackageEditorMenuFilesRoot: TIDEMenuSection = nil;
PkgEditMenuSectionFile: TIDEMenuSection; // e.g. open file, remove file, move file up/down 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 PkgEditMenuSectionDependency: TIDEMenuSection; // e.g. open package, remove dependency
// Component Palette, pages drop down. (no submenus allowed / only top level / must have OnClick(Proc)) // Component Palette, pages drop down. (no submenus allowed / only top level / must have OnClick(Proc))

View File

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

View File

@ -110,8 +110,8 @@ object ProjectInspectorForm: TProjectInspectorForm
AnchorSideTop.Control = SortAlphabeticallyButton AnchorSideTop.Control = SortAlphabeticallyButton
AnchorSideTop.Side = asrCenter AnchorSideTop.Side = asrCenter
Left = 95 Left = 95
Height = 32 Height = 30
Top = -2 Top = -1
Width = 365 Width = 365
ButtonWidth = 23 ButtonWidth = 23
Anchors = [akTop, akLeft, akRight] Anchors = [akTop, akLeft, akRight]
@ -157,9 +157,6 @@ object ProjectInspectorForm: TProjectInspectorForm
OnPopup = ItemsPopupMenuPopup OnPopup = ItemsPopupMenuPopup
Left = 72 Left = 72
Top = 112 Top = 112
object MenuItem1: TMenuItem
Caption = 'New Item1'
end
end end
object AddPopupMenu: TPopupMenu object AddPopupMenu: TPopupMenu
Left = 74 Left = 74

View File

@ -69,12 +69,33 @@ uses
ProjectIntf, PackageIntf, PackageLinkIntf, PackageDependencyIntf, ProjectIntf, PackageIntf, PackageLinkIntf, PackageDependencyIntf,
// IDEIntf // IDEIntf
IDEHelpIntf, IDECommands, IDEDialogs, IDEImagesIntf, LazIDEIntf, ToolBarIntf, IDEHelpIntf, IDECommands, IDEDialogs, IDEImagesIntf, LazIDEIntf, ToolBarIntf,
MenuIntf,
// IDE // IDE
LazarusIDEStrConsts, MainBase, MainBar, IDEProcs, DialogProcs, IDEOptionDefs, Project, LazarusIDEStrConsts, MainBase, MainBar, IDEProcs, DialogProcs, IDEOptionDefs, Project,
InputHistory, TransferMacros, EnvironmentOpts, BuildManager, BasePkgManager, InputHistory, TransferMacros, EnvironmentOpts, BuildManager, BasePkgManager,
ProjPackChecks, ProjPackEditing, ProjPackFilePropGui, PackageDefs, ProjPackChecks, ProjPackEditing, ProjPackFilePropGui, PackageDefs,
AddToProjectDlg, AddPkgDependencyDlg, AddFPMakeDependencyDlg, LResources; 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 type
TOnAddUnitToProject = TOnAddUnitToProject =
function(Sender: TObject; AnUnitInfo: TUnitInfo): TModalresult of object; function(Sender: TObject; AnUnitInfo: TUnitInfo): TModalresult of object;
@ -93,7 +114,6 @@ type
DirectoryHierarchyButton: TSpeedButton; DirectoryHierarchyButton: TSpeedButton;
FilterEdit: TTreeFilterEdit; FilterEdit: TTreeFilterEdit;
PropsGroupBox: TGroupBox; PropsGroupBox: TGroupBox;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem; MenuItem2: TMenuItem;
mnuAddFPMakeReq: TMenuItem; mnuAddFPMakeReq: TMenuItem;
mnuAddEditorFiles: TMenuItem; mnuAddEditorFiles: TMenuItem;
@ -279,7 +299,7 @@ var
function UpdateUnitInfoResourceBaseClass(AnUnitInfo: TUnitInfo; Quiet: boolean): boolean; function UpdateUnitInfoResourceBaseClass(AnUnitInfo: TUnitInfo; Quiet: boolean): boolean;
procedure RegisterStandardProjectInspectorMenuItems;
implementation implementation
@ -404,6 +424,36 @@ begin
end; end;
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 } { TProjectInspectorForm }
@ -766,26 +816,13 @@ begin
end; end;
procedure TProjectInspectorForm.ItemsPopupMenuPopup(Sender: TObject); procedure TProjectInspectorForm.ItemsPopupMenuPopup(Sender: TObject);
var
ItemCnt: integer;
function AddPopupMenuItem(const ACaption: string; AnEvent: TNotifyEvent; procedure SetItem(Item: TIDEMenuCommand; AnOnClick: TNotifyEvent;
EnabledFlag: boolean = True): TMenuItem; aShow: boolean = true; AEnable: boolean = true);
begin begin
if ItemsPopupMenu.Items.Count<=ItemCnt then begin Item.OnClick:=AnOnClick;
Result:=TMenuItem.Create(Self); Item.Visible:=aShow;
ItemsPopupMenu.Items.Add(Result); Item.Enabled:=AEnable;
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);
end; end;
var var
@ -806,8 +843,9 @@ var
CanClearDep: Integer; CanClearDep: Integer;
CanMoveFileCount: Integer; CanMoveFileCount: Integer;
OpenItemCapt: String; OpenItemCapt: String;
OnlyFilesNodeSelected, OnlyDependenciesNodeSelected, CanI18NforLFM: Boolean;
begin begin
ItemCnt:=0; ProjectInspectorMenuRoot.MenuItem:=ItemsPopupMenu.Items;
CanRemoveCount:=0; CanRemoveCount:=0;
CanOpenCount:=0; CanOpenCount:=0;
@ -856,72 +894,50 @@ begin
end; end;
end; end;
if ItemsTreeView.Selected = FFilesNode then OnlyFilesNodeSelected:=ItemsTreeView.Selected = FFilesNode;
begin SetItem(ProjInspMenuAddDiskFile,@mnuAddDiskFileClick,OnlyFilesNodeSelected);
// Only the Files node is selected. SetItem(ProjInspMenuRemoveNonExistingFiles,@RemoveNonExistingFilesMenuItemClick,OnlyFilesNodeSelected and not LazProject.IsVirtual);
Assert(AddBitBtn.Enabled, 'AddBitBtn not Enabled'); SetItem(ProjInspMenuOpenFolder,@mnuOpenFolderClick,OnlyFilesNodeSelected);
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;
if LazProject.EnableI18N and LazProject.EnableI18NForLFM OnlyDependenciesNodeSelected:=ItemsTreeView.Selected = FDependenciesNode;
and (HasLFMCount>0) then begin SetItem(ProjInspMenuAddDependency,@mnuAddReqClick,OnlyDependenciesNodeSelected);
AddPopupMenuItem(lisEnableI18NForLFM,
@EnableI18NForLFMMenuItemClick, DisabledI18NForLFMCount>0); // open, remove
AddPopupMenuItem(lisDisableI18NForLFM, if CanOpenCount>0 then begin
@DisableI18NForLFMMenuItemClick, DisabledI18NForLFMCount<HasLFMCount); 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; 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 // Required packages section
if CanReAddCount>0 then // undo delete
AddPopupMenuItem(lisPckEditReAddDependency, @ReAddMenuItemClick, true); SetItem(ProjInspMenuReAddDependency,@ReAddMenuItemClick,CanReAddCount>0);
if SingleSelectedDep<>nil then begin // move up/down
AddPopupMenuItem(lisPckEditMoveDependencyUp, @MoveDependencyUpClick, SetItem(ProjInspMenuMoveDependencyUp,@MoveDependencyUpClick,(SingleSelectedDep<>nil) and (SingleSelectedDep.PrevRequiresDependency<>nil));
(SingleSelectedDep.PrevRequiresDependency<>nil)); SetItem(ProjInspMenuMoveDependencyDown,@MoveDependencyDownClick,(SingleSelectedDep<>nil) and (SingleSelectedDep.NextRequiresDependency<>nil));
AddPopupMenuItem(lisPckEditMoveDependencyDown, @MoveDependencyDownClick, // default and preferred filename
(SingleSelectedDep.NextRequiresDependency<>nil)); SetItem(ProjInspMenuStoreFilenameAsDefaultOfDependencyDown,@SetDependencyDefaultFilenameMenuItemClick,HasValidDep>0);
end; SetItem(ProjInspMenuStoreFilenameAsPreferredOfDependencyDown,@SetDependencyPreferredFilenameMenuItemClick,HasValidDep>0);
if HasValidDep>0 then begin SetItem(ProjInspMenuClearPreferredFilenameOfDependencyDown,@ClearDependencyFilenameMenuItemClick,CanClearDep>0);
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);
end; end;
procedure TProjectInspectorForm.ItemsTreeViewAdvancedCustomDrawItem( procedure TProjectInspectorForm.ItemsTreeViewAdvancedCustomDrawItem(