Как сделать так, чтобы сочетания клавиш (ускорители) моего приложения Eclipse RCP работали сразу после запуска? - PullRequest
0 голосов
/ 05 мая 2011

Наше приложение Eclipse RCP было изначально создано в эпоху 3.1 / 3.2 и работало на 3.2, пока мы недавно не переключились на 3.6.Его IApplication проходит через PlatformUI.createAndRunWorkbench(...).WorkbenchAdvisor, который мы передаем этой функции, переопределяет createWorkbenchWindowAdvisor(...), чтобы вернуть WorkbenchWindowAdvisor, чье createActionBarAdvisor(...) возвращает ActionBarAdvisor.

Это ActionBarAdvisor 'makeActions(...) создает и register() saгруппа org.eclipse.jface.action.Action s, многие из которых в своих конструкторах делают что-то вроде setAccelerator(SWT.CTRL | 'O');.Action s впоследствии устанавливаются в ActionBarAdvisor fillMenuBar(...) и fillCoolBar(...) методах.

Проблема, с которой мы сталкиваемся (теперь, когда мы работаем на Eclipse RCP 3.6), заключается в том, что эти ускорители не работают.кажется, что они активны до тех пор, пока не отобразятся их меню (даже если не будет предпринято никаких действий, кроме закрытия меню).

Мы видим соответствующую ошибку , но испытываем некоторые трудности с пониманием того, какприменить его средство правовой защиты в нашей ситуации.Мы понимаем, что вместо Action s мы «должны» использовать команды, обработчики и привязки клавиш.Но мы надеемся, что нам пока не нужно идти по этому пути.

Как мы можем заставить наши ускорители «работать», как только приложение запустится?

Ответы [ 3 ]

2 голосов
/ 05 мая 2011

Если вы не решите использовать точку расширения oeui.bindings, то лучшего способа нет.Вам следует только принудительно обновлять menuManager, как вы это сделали в своем ответе.

1 голос
/ 06 мая 2011

Как упоминал @Prakash, если вы хотите сохранить этот путь в своем приложении RCP, вы должны отобразить все основные меню, чтобы увидеть ваши ускорители.

Существует частичный путь обновления, который поможет вам на правильном пути к командам без принудительного полного переключения сразу. Для каждого действия в вашем меню определите команду с идентификатором и определите привязку к нужному ярлыку в вашем plugin.xml. Затем, когда вы создаете действие в ActionBarAdvisor, не устанавливайте ускоритель. Установите IAction.setActionDefinitionId (*) для идентификатора команды, можете вызвать register (action);

Тогда вам больше не нужно использовать menuManager.updateAll (true), чтобы активно рендерить все ваше главное меню.

0 голосов
/ 05 мая 2011

После того, как мы поэкспериментировали и немного поэкспериментировали, пытаясь применить совет от ошибки , мы добавили следующее к нашему WorkbenchWindowAdvisor, что, похоже, сделало свое дело:

@Override
public void postWindowCreate() {
    getWindowConfigurer().getActionBarConfigurer().getMenuManager().updateAll(true);
}

Мы не знаем, насколько это соответствует ожиданиям дизайнера Workbench;может быть лучший способ.

...