我的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]));
当我在新工作区上执行上述操作时,冲突将按照预期进行后续启动。然后测试恢复它们的能力(如果某些用户想要指定不同的分辨率),我点击&#34;恢复默认值&#34;在General-> Keys
首选项页面上。有时当我这样做时,我会看到控制台上记录的冲突。在这种情况下,我知道当我重新启动应用程序时,它将再次发现冲突。
但有时我在恢复默认绑定时看不到控制台消息。在这种情况下,对于应用程序的每次后续启动,将在控制台上报告冲突,但绑定服务将找不到它们。如果我点击&#34;恢复默认值&#34;再一次,或在新的工作区中启动,绑定服务将找到冲突。
当应用程序处于控制台上但未通过绑定服务报告冲突的状态时,设置区域中的文件org.eclipse.ui.workbench.prefs
具有以下条目:org.eclipse.ui.commands=<?xml version\="1.0" encoding\="UTF-8"?>\n<org.eclipse.ui.commands/>
我无法找到问题何时发生的预测因素。它似乎只是随机发生,在恢复默认绑定后接近50%的时间。由于从一个新的工作区开始修复问题,除了org.eclipse.core.runtime
设置文件之外,似乎相关状态存储在某处,但我不知道在哪里。
此时,自定义绑定不在org.eclipse.ui.workbench.prefs
设置文件中,而应用模型(workbench.xmi
中的org.eclipse.e4.workbench
)具有相同键的<bindings>
个元素同一父<bindingtables>
元素中的序列,但绑定服务不报告任何冲突(虽然控制台日志确实存在)。这似乎是一个错误。除非有人另有说法,否则我会这样报告。
EDIT2:我一开始没注意到,但问题是在失败状态下,(在应用程序模型xmi文件中)有一个子<tags>
元素用于绑定值deleted
。如果我手动删除该标记,则绑定服务会识别冲突。所以现在这里是实际问题,我想:
当我在同一个应用程序中重置键绑定的默认值时 我保存自定义绑定的会话,默认绑定 已恢复的已在应用程序模型中标记为已删除。