在基于Xtext的Eclipse插件中正确初始化和检索首选项

时间:2011-11-01 08:50:14

标签: eclipse eclipse-plugin preferences xtext

我正在使用Xtext 2编写一个Eclipse插件。我通过编写自己的RootPreferencePage类来提供自己的首选项:

package org.grammaticalframework.eclipse.ui.editor.preferences;
import org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage;
public class GFLanguageRootPreferencePage extends LanguageRootPreferencePage {
    @Override
    protected void createFieldEditors() {
        addField(new StringFieldEditor("PREF", "&Label:", getFieldEditorParent()));
    }
    @Override
    public void init(IWorkbench workbench) {
        getPreferenceStore().setDefault("PREF", "default-value");
    }
}

并像往常一样将其绑定在UI模块中:

public Class<? extends org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage> bindLanguageRootPreferencePage() {
    return org.grammaticalframework.eclipse.ui.editor.preferences.GFLanguageRootPreferencePage.class;
}

这很好用;我可以保存首选项,关闭并重新打开Eclipse,再次转到首选项窗口并查看我保存的值。 但问题是当我尝试以编程方式检索首选项值时。我使用以下代码:

IPreferencesService prefs = Platform.getPreferencesService();
String s = prefs.getString(QUALIFIER, "PREV", "fallback", null);

当它停留在Eclipse的同一个实例中时,这可以正常工作,但在重新启动Eclipse后,我尝试以编程方式检索首选项失败。有趣的是,我知道通过检查首选项窗口可以正确保存我的首选项。

我想这是偏好范围的问题,如herehere所述,但我无法弄清楚我的程序设计中出错了什么检索偏好值。

更新

我已经注意到,当我从setDefault(...)方法中删除对init()的调用时,事情就完全正常了。也就是说,我可以通过UI设置首选项,重新加载Eclipse,并以编程方式检索这些值而不会出现问题。

所以问题现在变成我需要找到拨打setDefault(...)的正确位置。基于this same article,我扩展了``扩展点如下:

<extension point="org.eclipse.core.runtime.preferences">
    <initializer
        class="org.grammaticalframework.eclipse.ui.editor.preferences.GFPreferenceInitializer">
    </initializer>
</extension>

以及实施类:

package org.grammaticalframework.eclipse.ui.editor.preferences; 
public class GFPreferenceInitializer extends AbstractPreferenceInitializer {
    @Override
    public void initializeDefaultPreferences() {
        IPreferenceStore store = GFActivator.getInstance().getPreferenceStore();
        store.setDefault("PREV", "default-value");
    }
}

此代码正在执行,但出于某种原因,当我打开我的首选项窗口并单击“恢复默认值”时,字段只是空白..我尝试设置/初始化的默认值似乎没有找到首选项窗口,所以我又被卡住了!

1 个答案:

答案 0 :(得分:5)

好的,我想我已经解决了自己的问题。 我需要在init()方法中指定首选项存储,如下所示:

package org.grammaticalframework.eclipse.ui.editor.preferences;
public class GFLanguageRootPreferencePage extends LanguageRootPreferencePage {
    ...
    @Override
    public void init(IWorkbench workbench) {
        setPreferenceStore(GFActivator.getInstance().getPreferenceStore());
    }
}

我真的应该仔细阅读我链接的文章了!