以编程方式添加 JFace 密钥方案
Add JFace Key Scheme Programmatically
我考虑重新利用 org.eclipse.jface.bindings.Scheme
来为每个用户群存储键绑定:
String userName = "Bob";
BindingManager bindingManager = ((BindingService) PlatformUI.getWorkbench().getService(IBindingService.class)).getBindingManager();
Scheme scheme = bindingManager.getScheme(userName);
scheme.define(userName, "Scheme for user " + userName, DEFAULT_SCHEME);
bindingManager.setActiveScheme(scheme);
这在某些时候效果很好,但是每当从首选项(例如通过 CommandPersistence#reRead
)加载方案时,只有 plugin.xml[=25= 中定义的方案] 将被读取,其他所有内容都将被丢弃。
特别是classBindingService
这个方法有问题:
public final void savePreferences(final Scheme activeScheme,
final Binding[] bindings) throws IOException {
// store everything in preferences, then read everything
// -> custom schemes get removed
BindingPersistence.write(activeScheme, bindings);
// now the removed (undefined) scheme gets set
bindingManager.setActiveScheme(activeScheme);
bindingManager.setBindings(bindings);
}
由于我无法通过 plugin.xml 真正注册所有用户,我如何以编程方式注册方案?
作为 "solution",我刚刚为我们的用例重新实现了方案:
String userName = "Bob";
String keyBindings = MyPlugin.getDefault().getPreferenceStore().getString("keyBindings." + userName);
PlatformUI.getPreferenceStore().setValue(PlatformUI.PLUGIN_ID + ".commands", keyBindings);
这也会触发 CommandPersistence#reRead
,但由于这次我没有自定义方案,因此不会失败。现在我们不同方案的管理是我们的问题,但至少这样是可行的。
我考虑重新利用 org.eclipse.jface.bindings.Scheme
来为每个用户群存储键绑定:
String userName = "Bob";
BindingManager bindingManager = ((BindingService) PlatformUI.getWorkbench().getService(IBindingService.class)).getBindingManager();
Scheme scheme = bindingManager.getScheme(userName);
scheme.define(userName, "Scheme for user " + userName, DEFAULT_SCHEME);
bindingManager.setActiveScheme(scheme);
这在某些时候效果很好,但是每当从首选项(例如通过 CommandPersistence#reRead
)加载方案时,只有 plugin.xml[=25= 中定义的方案] 将被读取,其他所有内容都将被丢弃。
特别是classBindingService
这个方法有问题:
public final void savePreferences(final Scheme activeScheme,
final Binding[] bindings) throws IOException {
// store everything in preferences, then read everything
// -> custom schemes get removed
BindingPersistence.write(activeScheme, bindings);
// now the removed (undefined) scheme gets set
bindingManager.setActiveScheme(activeScheme);
bindingManager.setBindings(bindings);
}
由于我无法通过 plugin.xml 真正注册所有用户,我如何以编程方式注册方案?
作为 "solution",我刚刚为我们的用例重新实现了方案:
String userName = "Bob";
String keyBindings = MyPlugin.getDefault().getPreferenceStore().getString("keyBindings." + userName);
PlatformUI.getPreferenceStore().setValue(PlatformUI.PLUGIN_ID + ".commands", keyBindings);
这也会触发 CommandPersistence#reRead
,但由于这次我没有自定义方案,因此不会失败。现在我们不同方案的管理是我们的问题,但至少这样是可行的。