Eclipse RCP 绑定服务有时找不到键绑定冲突
Eclipse RCP Binding Service Sometimes Doesn't find key binding conflicts
我的 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-> Keys
首选项页面上单击 "Restore Defaults"。有时当我这样做时,我会在控制台上看到记录的冲突。在这种情况下,我知道当我重新启动应用程序时,它会再次发现冲突。
但有时我在恢复默认绑定时看不到控制台消息。在这种情况下,对于应用程序的每次后续启动,都会在控制台上报告冲突,但绑定服务不会发现它们。如果我再单击 "Restore Defaults" 一次,或在新的工作区中启动,绑定服务就会发现冲突。
当应用处于控制台报冲突但绑定服务不报冲突的状态时,设置区文件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
设置文件之外的某个地方,但我不知道在哪里。
编辑:我找到了它崩溃的场景。如果我启动应用程序并通过绑定服务保存自定义绑定,然后我单击 "Restore Defaults"(而不是重新启动应用程序然后恢复),我会进入上述失败状态。
此时,自定义绑定不在 org.eclipse.ui.workbench.prefs
设置文件中,应用程序模型(org.eclipse.e4.workbench
中的 workbench.xmi
)具有 <bindings>
个元素同一父 <bindingtables>
元素中的相同键序列,但绑定服务未报告任何冲突(尽管控制台日志报告)。这似乎是一个错误。除非有人不这么认为,否则我会这样报告。
EDIT2:起初我没有注意到,但问题是在失败状态下,(在应用程序模型 xmi 文件中)有一个子 <tags>
元素用于绑定值 deleted
.如果我手动删除该标签,则绑定服务会识别出冲突。所以现在才是真正的问题,我认为:
When I reset defaults for the key bindings in the same application
session in which I saved customized bindings, the default bindings
that were restored are tagged as deleted in the application model.
我通过添加一行从注册表和首选项读取绑定信息并覆盖绑定服务中的信息解决了这个问题。我在保存自定义绑定首选项的代码之后添加了这一行。
IBindingService bs = ...
bs.savePreferences(bs.getActiveScheme(), bindings.toArray(new Binding[0]));
bs.readRegistryAndPreferences(null); //Added this line
我的 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]));
当我在一个新的工作区上执行上述操作时,冲突会按预期在后续启动中得到解决。然后为了测试恢复它们的能力(以防某些用户想要指定不同的分辨率),我在 General-> Keys
首选项页面上单击 "Restore Defaults"。有时当我这样做时,我会在控制台上看到记录的冲突。在这种情况下,我知道当我重新启动应用程序时,它会再次发现冲突。
但有时我在恢复默认绑定时看不到控制台消息。在这种情况下,对于应用程序的每次后续启动,都会在控制台上报告冲突,但绑定服务不会发现它们。如果我再单击 "Restore Defaults" 一次,或在新的工作区中启动,绑定服务就会发现冲突。
当应用处于控制台报冲突但绑定服务不报冲突的状态时,设置区文件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
设置文件之外的某个地方,但我不知道在哪里。
编辑:我找到了它崩溃的场景。如果我启动应用程序并通过绑定服务保存自定义绑定,然后我单击 "Restore Defaults"(而不是重新启动应用程序然后恢复),我会进入上述失败状态。
此时,自定义绑定不在 org.eclipse.ui.workbench.prefs
设置文件中,应用程序模型(org.eclipse.e4.workbench
中的 workbench.xmi
)具有 <bindings>
个元素同一父 <bindingtables>
元素中的相同键序列,但绑定服务未报告任何冲突(尽管控制台日志报告)。这似乎是一个错误。除非有人不这么认为,否则我会这样报告。
EDIT2:起初我没有注意到,但问题是在失败状态下,(在应用程序模型 xmi 文件中)有一个子 <tags>
元素用于绑定值 deleted
.如果我手动删除该标签,则绑定服务会识别出冲突。所以现在才是真正的问题,我认为:
When I reset defaults for the key bindings in the same application session in which I saved customized bindings, the default bindings that were restored are tagged as deleted in the application model.
我通过添加一行从注册表和首选项读取绑定信息并覆盖绑定服务中的信息解决了这个问题。我在保存自定义绑定首选项的代码之后添加了这一行。
IBindingService bs = ...
bs.savePreferences(bs.getActiveScheme(), bindings.toArray(new Binding[0]));
bs.readRegistryAndPreferences(null); //Added this line