以编程方式添加 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,但由于这次我没有自定义方案,因此不会失败。现在我们不同方案的管理是我们的问题,但至少这样是可行的。