Whenever a menu item or toolbar button is clicked, it would be handy if NetBeans were to tell you 'hey, did you know, you can actually do this via the following keyboard shortcut', if a keyboard shortcut exists for the invoked action.
After all, ultimately, a lot of developers would like to do everything with the keyboard and a key promoter feature of this kind is a helpful tool in learning the keyboard shortcuts related to the menu items and toolbar buttons you're clicking with your mouse.
Above, you see the balloon message that appears for each menu item and toolbar button that you click and, below, you can see a list of all the actions that have been logged in the Notifications window. That happens automatically when an action is invoked (assuming the plugin described in this blog entry is installed), showing the display name of the action, together with the keyboard shortcut, which is presented as a hyperlink which, when clicked, re-invokes the action (which might not always be relevant, especially for context-sensitive actions, though for others it is quite useful, e.g., reopen the New Project wizard).
And here's all the code. Notice that I'm hooking into the 'uigestures' functionality, which was suggested by Tim Boudreau, and I have added my own handler, which was suggested by Jaroslav Tulach, which gets a specific parameter from each new log entry handled by the 'org.netbeans.ui.actions' logger, makes sure that the parameter actually is an action, and then gets the relevant info from the action, if the relevant info exists:
@OnShowingpublic class Startable implements Runnable { @Override public void run() { Logger logger = Logger.getLogger("org.netbeans.ui.actions"); logger.addHandler(new StreamHandler() { @Override public void publish(LogRecord record) { Object[] parameters = record.getParameters(); if (parameters[2] instanceof Action) { Action a = (Action) parameters[2]; JMenuItem menu = new JMenuItem(); Mnemonics.setLocalizedText( menu, a.getValue(Action.NAME).toString()); String name = menu.getText(); if (a.getValue(Action.ACCELERATOR_KEY) != null) { String accelerator = a.getValue(Action.ACCELERATOR_KEY).toString(); NotificationDisplayer.getDefault().notify( name, new ImageIcon("/org/nb/kp/car.png"), accelerator, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { a.actionPerformed(e); } }); } } } }); }}
Indeed, inspired by the Key Promoter in IntelliJ IDEA.
Interested in trying it out? If there's interest in it, I'll put it in the NetBeans Plugin Portal.