Eclipse:OSGI首选项与PreferenceStore

时间:2011-04-26 15:22:47

标签: java eclipse osgi preferences jface

我正在开发一个Eclipse插件(或者实际上是一个基于Eclipse的应用程序的插件),需要用户输入一些配置。

通过查看文档,似乎有两个首选项API - 一个在org.eclipse.core.runtime.preferences中,一个是扩展/实现OSGI prefererence API,另一个是特定于JFace的org.eclipse.jface.preference。然后我们也有org.eclipse.ui.preferences

OSGI API具有分层节点树 - 首选节点(PreferencesIEclipsePreferences)可以有多个子节点,这些子节点本身可以​​包含单个名称 - 值对以及更多子节点。这似乎适合我的用例 - 我有一个动态数量的“首选项组”,每个都有大约三个字符串属性(名称,描述,命令),这将很好地映射到这些节点。

JFace API没有这样的层次结构,每个插件只有一个平面IPreferenceStore。但它提供了首选项编辑器页面,然后可以通过实现IWorkbenchPreferencePageusing the "org.eclipse.ui.preferencePages" extension point将其包含在常用首选项对话框(窗口/首选项)中。 (我仍然需要自己实现首选项页面的一部分,但是这个API为此提供了一个很好的基础,似乎。)

似乎org.eclipse.ui.preferences API通过提供基于IEclipsePreferences的IPreferenceStore实现以某种方式桥接这两个API,但我仍然看不到如何使用它。

所以我的问题在这里:如何在偏好设置对话框中使用分层OSGI Preferences我只需要一个级别,但我需要用户能够动态添加新节点(每个节点大约有三个首选项)。 (但是,这些节点不必具有新的首选项页面。)

2 个答案:

答案 0 :(得分:14)

似乎在首选项页面级别,它希望使用首选项存储。大多数插件从org.eclipse.ui.plugin.AbstractUIPlugin.getPreferenceStore()提供的默认值中获取其首选项存储。这会松散地转换为带有InstanceScope的ScopedPreferenceStore,其节点与其bundle.id匹配。

获取匹配的IEclipsePreferences对象的等价物将是InstanceScope.INSTANCE.getNode("bundle.id")。这将允许您在下面添加更多节点,但无法从IPreferenceStore访问它们。但是,您的首选项页面可以将其首选项存储设置为您的插件的主要存储库,并仍然使用IEclipsePreferences或辅助IPreferenceStore来访问额外的首选项(您只需自己编写代码,类似于org.eclipse.ui.internal.dialogs.EditorsPreferencePage)。

答案 1 :(得分:2)

我通过覆盖getPreference存储来解决这个问题,如下所示:

@Override
public IPreferenceStore getPreferenceStore() {
    if (preferenceStore == null) {
        preferenceStore = new ScopedPreferenceStore( InstanceScope.INSTANCE, ID );
    }
    return preferenceStore;
}

适合我