How can I add a key binding for a quickMenu similar to the "Refactor" context menu in JDT?
I want to add a shortcut to my eclipse plugin to show a quick menu with existing bindings. It should work like the "Refactor" quick menu in JDT.
Shortcut for quick menu in JDT:
JDT quick menu:
I already added a binding and a command but it seems there is something missing. The Delete Something entry is also working for the context menu, just the shortcut to the quick menu is missing. Does anybody how to do this?
<extension point="org.eclipse.ui.bindings">
<key
commandId="myplugin.refactoring.actions.DeleteSomething"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="M1+5">
</key>
<key
commandId="myplugin.refactoring.quickMenu"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="M1+9">
</key>
<extension point="org.eclipse.ui.commands">
<command
categoryId="myplugin.category.refactor"
description="Delete Something"
id="myplugin.refactoring.actions.DeleteSomething"
name="Extract Method">
</command>
<command
categoryId="myplugin.category.refactor"
id="myplugin.refactoring.quickMenu"
name="Show Refactor Quick Menu">
</command>
<category
id="myplugin.category.refactor"
name="Refactor">
</category>开发者_如何学Go
You can also do it like this:
Add a command for the quick menu and set a default handler.
<command
defaultHandler="myplugin.refactoring.QuickmenuHandler"
id="myplugin.refactoring.quickMenu"
name="Show Refactor Quick Menu">
</command>
The handler should be able to create the menu. Something like this:
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
...
Menu menu = new Menu(some parent);
new MenuItem(menu, SWT.PUSH).setText("...");
menu.setVisible(true);
return null;
}
Add a shortcut to the command (as you did):
<key
commandId="myplugin.refactoring.quickMenu"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="M1+9">
</key>
Finally bind all of this together in the menu extension point:
<extension
point="org.eclipse.ui.menus">
<menuContribution
allPopups="false"
locationURI="popup:ch.arenae.dnp.frame.popup?after=additions">
<menu
commandId="myplugin.refactoring.quickMenu"
label="Refactor">
<command
commandId="<first refactoring command>"
style="push">
</command>
</menu>
...
</menuContribution>
The important point is the commandId attribute in the menu element. It is used to display the keyboard shortcut in the menu.
You can have a look at how JDT implements the same. For instance, when looking at the Eclipse 3.8.2 source code, you'll see interesting method:
org.eclipse.jdt.ui.actions.RefactorActionGroup.installQuickAccessAction()
which is called when Java editor is opened. This is were programmatic handler association with current editor takes place.
To summarize how it's done in JDT:
First, they have a command declaration in plugin.xml:
<command name="%ActionDefinition.refactorQuickMenu.name" description="%ActionDefinition.refactorQuickMenu.description" categoryId="org.eclipse.jdt.ui.category.refactoring" id="org.eclipse.jdt.ui.edit.text.java.refactor.quickMenu">
They declare a key binding:
<key sequence="M2+M3+T" commandId="org.eclipse.jdt.ui.edit.text.java.refactor.quickMenu" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
They associate this command with a handler once editor is created. The handler itself (
org.eclipse.jdt.internal.ui.actions.JDTQuickMenuCreator
) takes care of filling the quick menu with items.
You don't have to associate a command with a handler programmatically - another option is using org.eclipse.ui.handlers extension point.
精彩评论