2011-04-26 26 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; 
} 

作品對我來說