2011-05-04 16 views
0

我们的Eclipse RCP应用程序最初是在3.1/3.2时代构建的,并且在3.2版本上运行,直到我们最近切换到3.6。其IApplication通过PlatformUI.createAndRunWorkbench(...)运行。我们传递给该函数的WorkbenchAdvisor将覆盖createWorkbenchWindowAdvisor(...)以返回WorkbenchWindowAdvisor,其createActionBarAdvisor(...)返回ActionBarAdvisor如何使Eclipse RCP应用程序的键盘快捷键(加速器)在启动后立即工作?

ActionBarAdvisormakeActions(...)创建和register()是个一串的org.eclipse.jface.action.Action S,其中很多做这样的事情在它们的构造setAccelerator(SWT.CTRL | 'O');。随后将Action安装在ActionBarAdvisorfillMenuBar(...)fillCoolBar(...)方法中。

我们遇到的问题(现在我们在Eclipse RCP 3.6上)是这些加速器在显示菜单(即使除了再次关闭菜单之外没有采取任何操作)之前似乎不活动。

我们看到a relevant bug,但在理解如何将其补救措施应用于我们的情况方面存在一些困难。我们认识到,我们“应该”使用命令,处理程序和键绑定,而不是Action。但我们希望我们不必走这条路。

应用程序启动后,我们如何才能让我们的加速器“活着”?

回答

0

狩猎周围和经验中试图从the bug申请的意见后,我们将以下我们WorkbenchWindowAdvisor,这似乎已经完成了招:

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

我们不知道有多好这符合与Workbench的设计期望;可能会有更好的方法。

2

如果你不选择使用o.e.ui.bindings扩展点,那么没有更好的方法。你应该只强制更新menuManager,正如你在答案中所做的那样。

1

正如@Prakash所提到的,如果您想要在RCP应用程序中保留该路径,则必须呈现所有主菜单才能看到您的加速器。

有一个部分升级路径,可以让您在正确的轨道上执行命令,而无需马上强制完成切换。对于菜单中的每个动作,用一个id定义一个命令,并在你的plugin.xml中定义一个你想要的快捷方式的绑定。然后,当您在ActionBarAdvisor中创建动作时,请勿设置加速器。将IAction.setActionDefinitionId(*)设置为命令ID,可以调用register(action);

然后,您不再需要使用menuManager.updateAll(true)来急切地呈现所有主菜单。