2011-04-26 24 views
10

我工作的一个Eclipse插件(或事实上,对于一个基于Eclipse的应用程序中的插件)可以由用户输入这就需要进行一些配置。的Eclipse:OSGI偏好与PreferenceStore

从查看文档看来,似乎有两个首选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以某种方式桥接了这两个API,它们提供了一个IPreferenceStore实现,它基于IEclipsePreferences,但我仍然无法看到如何使用它。

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

回答

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)。

+0

谢谢,这也是我迄今收集。我现在正在沿着这个方法工作。 – 2011-04-26 20:41:04

2

我通过重写getPreference店如下解决这个问题:

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

作品对我来说