使用commandId检索活动密钥绑定

时间:2017-01-15 18:47:25

标签: java eclipse eclipse-rcp

我目前正在开发一个Eclipse RCP插件,其中包含一组触发操作的工具栏按钮,也可以通过键盘快捷键触发。

以下是我的 plugin.xml 文件的相关部分,包含上下文,命令和快捷方式的相应键绑定:

<plugin>
   <extension point="org.eclipse.ui.contexts">
      <context id="notepad4e.context" name="In Notepad4e" parentId="org.eclipse.ui.contexts.window" />
   </extension>
   <extension point="org.eclipse.ui.commands">
      <category id="notepad4e.command.category" name="Notepad4e" description="Category for Notepad4e commands" />
      <command categoryId="notepad4e.command.category" id="notepad4e.command.text.bold" description="Sets style to bold" name="Bold" />
   </extension>
   <extension point="org.eclipse.ui.bindings">
      <key commandId="notepad4e.command.text.bold" contextId="notepad4e.context" sequence="CTRL+B" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
   </extension>
</plugin>

在我的Java代码中,我正在为我的视图正确激活notepad4e.context并激活处理程序以侦听相应的键盘事件。键盘快捷键似乎工作正常,用户可以在Eclipse的首选项中重新定义键绑定,以最好地满足他的需求。

我想将工具提示文本设置到工具栏按钮,其中包含有关绑定的信息,如下所示: Button with tool tip text shortcut

我无法对密钥绑定信息进行硬编码,因为用户可能会更改绑定,并且硬编码的值将不再有效。我试图找到一个解决方案,以编程方式检索给定命令的键绑定。我有以下三次尝试使用IBindingService

private String getShortcutDescription1() {
    IBindingService bindingService = getViewSite().getService(IBindingService.class);
    TriggerSequence triggerSequence = bindingService.getBestActiveBindingFor("notepad4e.command.text.bold");
    if (triggerSequence != null) {
        return triggerSequence.format();
    }
    return "";
}

private String getShortcutDescription2() {
    IBindingService bindingService = getViewSite().getService(IBindingService.class);
    TriggerSequence[] triggerSequences = bindingService.getActiveBindingsFor("notepad4e.command.text.bold");
    if (triggerSequences.length > 0) {
        return triggerSequences[0].format();
    }
    return "";
}

private String getShortcutDescription3() {
    IBindingService bindingService = getViewSite().getService(IBindingService.class);
    for (Binding binding : bindingService.getBindings()) {
        if (binding.getParameterizedCommand() != null
                && "notepad4e.command.text.bold".equals(binding.getParameterizedCommand().getId())) {
            return binding.getTriggerSequence().format();
        }
    }
    return "";
}

两个第一个解决方案似乎没有找到与notepad4e.command.text.bold commandId相关联的任何绑定。然而,通过第三种解决方案,我确实找到了预期的绑定。然而,浏览所有Eclipse的绑定似乎不是一个有效的解决方案,更重要的是,如果用户在其首选项中重新定义了默认快捷方式,bindingService.getBindings()调用将返回一个包含非活动默认绑定和活动重新定义的集合。用户一,所以这不会返回我正在寻找的值。

我错过了什么?如何以编程方式检索给定commandId的活动键绑定?

提前致谢,非常感谢任何帮助!

编辑17/01:两个第一个解决方案确实返回了想要的绑定,但是在用户与插件交互后,它们似乎只是这样做了。这是不切实际的,因为我在设置插件时尝试设置工具提示。

2 个答案:

答案 0 :(得分:0)

此处测试看起来您可能在激活上下文后过早调用getBestActiveBindingFor代码。

只需更改代码即可在getShortcutDescription1 Display.asyncExec中调用Runnable,即可使用。因此,在进行此调用之前,需要完成一些设置。

我用过的测试:

Display.getDefault().asyncExec(() ->
  {
    System.out.println("trigger " + getShortcutDescription1());
  });

答案 1 :(得分:0)

最后,我选择了以下解决方案:

#include <cstdio>
using namespace std;
int main()
{
  int n;
  printf("Enter n: ");
  scanf("%i", &n);

  printf("%i\t",n);  
  while(n>1)
  {
  if(n%2==0)
  {

      n=n/2;
  }
  else
  {

      n=(3*n)+1;
  }

  printf("%i\t",n);

}

  return 0;
 }

即使用户尚未与插件进行交互(上下文处于活动状态但视图未处于活动状态),也会返回正确的绑定。如问题中所述,如果用户在其首选项中重新定义默认快捷方式,则上述private String getShortcutDescription() { Binding bestBinding = null; for (Binding binding : getViewSite().getService(IBindingService.class).getBindings()) { if (binding.getParameterizedCommand() != null && "notepad4e.command.text.bold".equals(binding.getParameterizedCommand().getId())) { if (bestBinding == null) { bestBinding = binding; } else if (binding.getType() == Binding.USER) { // Give higher priority to a user type binding (user has overriden default). bestBinding = binding; break; } } } return bestBinding == null ? "" : " " + bestBinding.getTriggerSequence().format(); } 调用将返回包含非活动默认绑定和活动重新定义用户的集合。如果找到,我选择类型为bindingService.getBindings()的那个。如果用户尚未重新定义绑定,则只存在一个类型为Binding.USER的绑定并返回。