【问题标题】:Eclipse RCP Binding Service Sometimes Doesn't find key binding conflictsEclipse RCP 绑定服务有时找不到键绑定冲突
【发布时间】:2017-11-21 21:57:42
【问题描述】:

我的 RCP 应用在我包含的一些功能之间存在键绑定冲突,这些冲突在启动时显示在控制台上。因为我的许多用户都是 Eclipse 新手,所以我想为他们处理这个问题,所以我检测冲突并通过将每个冲突对中的一个命令分配给未使用的自定义上下文来删除它们。

这可以正常工作,只是有时绑定服务无法找到冲突,即使它们已在控制台上报告。这就是我搜索冲突的方式:

IBindingService bs =
   PlatformUI.getWorkbench().getService(IBindingService.class);
KeySequence keySequence = ...//key sequence known to have binding conflicts
Collection<Binding> bindings = 
   bs.getConflictsFor(KeySequence.getInstance(keySequence));

在更改某些冲突绑定的上下文后,我通过bs.savePreferences(bs.getActiveScheme(), bindings.toArray(new Binding[0])); 将它们全部保存(类型设置为 USER)

当我在新的工作空间上执行上述操作时,冲突将按预期解决,以便后续启动。然后为了测试恢复它们的能力(以防某些用户想要指定不同的分辨率),我在General-&gt; Keys 首选项页面上单击“恢复默认值”。有时当我这样做时,我会看到控制台上记录了冲突。在这种情况下,我知道当我重新启动应用程序时,它会再次发现冲突。

但有时我在恢复默认绑定时看不到控制台消息。在这种情况下,对于应用程序的每次后续启动,都会在控制台上报告冲突,但绑定服务不会找到它们。如果我再次单击“恢复默认值”,或者在新的工作区中启动,那么绑定服务会发现冲突。

当应用处于控制台报冲突但绑定服务不报冲突的状态时,设置区文件org.eclipse.ui.workbench.prefs有如下条目:org.eclipse.ui.commands=&lt;?xml version\="1.0" encoding\="UTF-8"?&gt;\n&lt;org.eclipse.ui.commands/&gt;

我无法预测问题何时会发生。它似乎只是随机发生,在恢复默认绑定后接近 50% 的时间。由于从一个新的工作区开始解决了这个问题,除了org.eclipse.core.runtime 设置文件之外,似乎相关状态还存储在某个地方,但我不知道在哪里。

编辑:我发现了它中断的场景。如果我启动应用程序并通过绑定服务保存自定义绑定,然后单击“恢复默认值”(而不是重新启动应用程序然后恢复),我会进入上述失败状态。

此时,自定义绑定不在org.eclipse.ui.workbench.prefs 设置文件中,并且应用模型(workbench.xmi in org.eclipse.e4.workbench)在同一父 &lt;bindingtables&gt; 中具有相同键序列的 &lt;bindings&gt; 元素元素,但绑定服务没有报告任何冲突(尽管控制台日志会报告)。这似乎是一个错误。除非有人不这么认为,否则我会报告它。

EDIT2:一开始我没有注意到,但问题是在失败状态下,(在应用程序模型 xmi 文件中)有一个子 &lt;tags&gt; 元素用于绑定值 deleted。如果我手动删除该标签,则绑定服务会识别出冲突。所以现在是真正的问题,我认为:

当我在同一个应用程序中重置键绑定的默认值时 我保存自定义绑定的会话,默认绑定 已恢复的在应用程序模型中被标记为已删除。

【问题讨论】:

  • 绑定可能存储在更新的应用程序模型中,该模型保存在org.eclipse.e4.workbench 目录中.metadata/.plugins 中的workbench.xmi 文件中
  • 我发现了它中断的场景,这似乎是一个错误。请在我的帖子末尾查看我的 EDIT cmets。
  • 我想我现在对异常有一个简洁的陈述。请参阅 EDIT2 中的评论。

标签: eclipse-rcp settings key-bindings


【解决方案1】:

我通过添加一行从注册表和首选项中读取绑定信息并覆盖绑定服务中的信息来解决了这个问题。我在保存自定义绑定首选项的代码之后添加了这一行。

IBindingService bs = ...
bs.savePreferences(bs.getActiveScheme(), bindings.toArray(new Binding[0]));
bs.readRegistryAndPreferences(null);  //Added this line

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多