Как обеспечить, чтобы мои привязки клавиш имели приоритет над другими определениями - PullRequest
0 голосов
/ 05 сентября 2018

Я разрабатываю приложение RCP. В приложении есть режим выполнения, в котором я хочу включить различные привязки клавиш для управления пуском, остановкой, продолжением, повторением и т. Д. Привязки будут активированы с помощью «ExecutionContext», который устанавливается при активации любого из соответствующих представлений.

Переключение контекста выполняется в каждом из представлений «Выполнение».

@Override
public final void createPartControl(Composite parent)
{
    addPartListener();

    ...
}

private void addPartListener()
{
    this.getViewSite().getPage().addPartListener(new IPartListener2()
    {
        IContextActivation token = null;

        @Override
        public void partDeactivated(IWorkbenchPartReference partRef)
        {
            if (token != null)
            {
                System.out.println("End exec context");
                IContextService contextService = (IContextService) PlatformUI.getWorkbench().getService(
                        IContextService.class);
                contextService.deactivateContext(token);
                token = null;
            }
        }

        @Override
        public void partActivated(IWorkbenchPartReference partRef)
        {
            System.out.println("Set exec context");
            IContextService contextService = (IContextService) PlatformUI.getWorkbench().getService(
                    IContextService.class);
            token = contextService.activateContext("AtfExecutionContext");
        }
    });

}

Я могу видеть через сообщения консоли, что мой контекст установлен, и некоторые привязки клавиш работают как положено.

Однако, если привязка ключа уже была назначена другим плагином, эта привязка имеет приоритет. Например. Я хочу использовать Ctrl + F8 , чтобы остановить, но когда это нажато, я получаю действие «Следующая перспектива», которое является рабочим местом по умолчанию.

Обязательное определение:

   <extension
         point="org.eclipse.ui.bindings">
      <scheme
            id="atfscheme"
            name="atfscheme"
            parentId="org.eclipse.ui.defaultAcceleratorConfiguration">
      </scheme>
      <key
            commandId="com.xxx.atf.model.ui.commands.ExecKey.Start"
            contextId="AtfExecutionContext"
            schemeId="atfscheme"
            sequence="M1+M2+F5">
<!-- F5 does not work but Ctrl-Shift-F5 does -->
      </key>
   </extension>
   <extension
         point="org.eclipse.ui.contexts">
      <context
            id="AtfExecutionContext"
            name="AtfExecutionContext"
            parentId="org.eclipse.debug.ui.debugging">
<!-- have tried various parentid values... -->
      </context>
   </extension>

Кажется, работают только ранее неопределенные ускорители. Что мне нужно сделать, чтобы переопределить существующие определения и активировать мои, когда мой контекст установлен?

1 Ответ

0 голосов
/ 05 сентября 2018

Для каждой части есть отдельный контекстный сервис, вы должны использовать правильный контекстный сервис.

Нет необходимости активировать / деактивировать контекст при активации / деактивации детали. Отдельные контекстные службы будут обрабатывать это автоматически.

Активируйте в createPartControl с помощью:

IContextService contextService = getSite().getService(IContextService.class);

token = contextService.activateContext("AtfExecutionContext");

и отключить при закрытии детали.

Вы также определяете новую схему привязки ключей - она ​​должна активироваться отдельно, а не то, что вам здесь нужно. Просто удалите это и просто используйте org.eclipse.ui.defaultAcceleratorConfiguration как schemeId

...