Netbeans platform and menus

Preamble: the only way to edit menu items that are present in the platform is through one of your own modules. This means that in order to remove or rename a menu item in another module you must first add a module to your application. Your application is not itself a module but a (potential) collection of modules.

The simplest way to edit the menus for an NB Platform based application is the following:

  1. In one of your modules, expand the Important Files node
  2. Expand the XML Layer node (assuming the module has a layer file¹)
  3. Expand the This layer in context node
  4. Expand the Menu Bar node
  5. Right-click on any menu (folder node) or menu item (file node) and select Delete

This will add the necessary entries to your modules layer file (_hidden entry) and as long as this module is loaded these menus and menu items will not be loaded. If you want to restore an item in the future you can either remove the entry from the layer file or right-click the item and select Restore.

Edit

Here's a method for renaming a menu item:

  1. Using the above technique to find the entry you want to rename
  2. Right-click the node and select "Go to Declaration"
  3. Look for the attribute with a name of "SystemFileSystem.localizingBundle"
  4. Open the application's branding interface (right-click on your application's node and select Branding...)
  5. Choose the Resource Bundles tab
  6. Look for the Bundle node that has the value you found in step 3

The name of the menu item will be located in this Bundle's node. Just edit this and it will be changed in your application. The key here is to locate the Bundle that the menu item is named in.

Here's a method for replacing a menu item's action:

  1. Follow steps 1 and 2 from the previous outline
  2. Once you've gotten to the declaration, search (Ctrl + F) the same file for the originalFile value (you're only looking for the .instance declaration)²
  3. Once you've found where the action is defined, copy the structure to your layer file
  4. Using the delegate attribute you can redefine what action is used for this menu item

The point here is to override the menu item's action definition in your layer file, replacing the action with your own. You can also use this technique to override the display name of the action but the Branding technique is simpler if you don't need to replace the action as well.


¹If your module doesn't have a layer file you'll need to create one before you can use this technique. This requires that you create a layer.xml file in one of your module's packages. Then you need to register this file in your Modules Manifest file using the following OpenIDE-Module-Layer: com/example/mymodule/layer.xml

²For this step you can highlight the .instance name of the originalValue attribute's value and press Ctrl + F. For example, if the originalValue attribute's value is Actions/Window/org-netbeans-core-windows-actions-RecentViewListAction.instance you want to highlight only the org-netbeans-core-windows-actions-RecentViewListAction.instance part. The point here is to find where the action is defined (this part of the layer file is only adding the action to the menu).


In addition to what has been nicely explained above, here is a simple trick to add your own global menu item without even looking to the XML file content:

  1. In your module tree go and find the file named layers.xml
  2. click on the layers.xml node to unfold its children, these are two folders:
    • this layer
    • this layer in context
  3. unfold the "this layer in context" node and go to the sub-folder Menu Bar
  4. right click and add a new folder (name it History e.g) inside Menu Bar. The name of this new folder will be used as a category in the global menus of you main GUI window.
  5. To add a sub menu item to this global menu, right click on your module, choose new->action action and when asked to select the menu to place this sub menu in, choose History.

PS: you can also add a category to the Toolbar as you did for the Menu Bar. Thank you


I'm not sure what exactly you want to do, but the layer.xml file is usually the place to do such changes.