Как я могу добавить привязку клавиш для 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 точка расширения.