Как я могу добавить привязку клавиш для quickMenu, аналогичную контекстному меню "Refactor" в JDT?
Я хочу добавить ярлык к моему плагину eclipse, чтобы показать быстрое меню с существующими привязками. Он должен работать как быстрое меню "Refactor" в JDT.
Ярлык для быстрого меню в JDT:
![Shortcut for "Refactor" quick menu]()
Быстрое меню JDT:
![JDT quickMenu]()
Я уже добавил привязку и команду, но кажется, что чего-то не хватает. Элемент "Удалить что-то" также работает для контекстного меню, просто отсутствует ярлык быстрого меню.
Кто-нибудь, как это сделать?
<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>
Ответы
Ответ 1
Вы также можете сделать это следующим образом:
Добавьте команду для быстрого меню и установите обработчик по умолчанию.
<command
defaultHandler="myplugin.refactoring.QuickmenuHandler"
id="myplugin.refactoring.quickMenu"
name="Show Refactor Quick Menu">
</command>
Обработчик должен иметь возможность создать меню. Что-то вроде этого:
@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;
}
Добавьте ярлык к команде (как и вы):
<key
commandId="myplugin.refactoring.quickMenu"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="M1+9">
</key>
Наконец, свяжите все это вместе в точке расширения меню:
<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>
Важным моментом является атрибут commandId в элементе меню. Он используется для отображения сочетания клавиш в меню.
Ответ 2
Вы можете посмотреть, как JDT реализует то же самое. Например, при просмотре исходного кода Eclipse 3.8.2 вы увидите интересный метод:
org.eclipse.jdt.ui.actions.RefactorActionGroup.installQuickAccessAction()
который вызывается при открытии редактора Java. Это была ассоциация программных обработчиков с текущим редактором.
Подводя итог тому, как это делается в JDT:
-
Во-первых, у них есть объявление команды в файле plugin.xml:
< команда name= "% ActionDefinition.refactorQuickMenu.name" Описание = "% ActionDefinition.refactorQuickMenu.description" CategoryId = "org.eclipse.jdt.ui.category.refactoring" ID = "org.eclipse.jdt.ui.edit.text.java.refactor.quickMenu" >
-
Они объявляют привязку ключа:
< ключ Последовательность = "М2 + М3 + Т" commandId = "org.eclipse.jdt.ui.edit.text.java.refactor.quickMenu" schemeId = "org.eclipse.ui.defaultAcceleratorConfiguration" / >
-
Они связывают эту команду с обработчиком после создания редактора. Сам обработчик (org.eclipse.jdt.internal.ui.actions.JDTQuickMenuCreator
) заботится о заполнении быстрого меню элементами.
Вам необязательно связывать команду с обработчиком программно - в другой опции используется org.eclipse.ui.handlers точка расширения.