Eclipse: Предпочтения OSGI и PreferenceStore

Я работаю над плагином Eclipse (или, фактически, плагином для приложения на основе Eclipse), для которого требуется некоторая конфигурация, которую должен ввести пользователь.

От взгляда на документацию, похоже, есть два предпочтительных API: один в org.eclipse.core.runtime.preferences, расширяющий/реализующий API предпочтительности OSGI, другой, специфичный для JFace, в org.eclipse.jface.preference. Затем мы org.eclipse.ui.preferences.

API OSGI имеет иерархическое дерево Node - предпочтение Node (Preferences или IEclipsePreferences) может иметь несколько поднодов, которые сами могут содержать как отдельные пары значений имени, так и больше подносов. Это кажется правильным для моего варианта использования - у меня есть динамическое количество "групп предпочтений", каждая из которых имеет около трех свойств строки (имя, описание, команда), которые красиво отображались бы на этих узлах.

API JFace не имеет такой иерархии, только плоский IPreferenceStore для каждого плагина. Но он предоставляет страницы редактора предпочтений, которые затем могут быть включены в обычный диалог настроек (Window/Preferences) путем реализации IWorkbenchPreferencePage и с помощью "org.eclipse. ui.preferencePages". (Мне все же приходится выполнять часть страницы предпочтений, но этот API обеспечивает хорошую основу для этого, похоже.)

Кажется, что API org.eclipse.ui.preferences каким-то образом соединяет оба этих API, предоставляя реализацию IPreferenceStore на основе IEclipsePreferences, но я все еще могу" Посмотрите, как это использовать.

Итак, вот мой вопрос: Как я могу использовать иерархический OSGI Preferences в диалоговом окне настроек? Мне нужен только один уровень, но мне нужно, чтобы пользователь мог динамически добавлять новые узлы (с примерно тремя предпочтениями каждый). (Однако эти узлы не должны иметь новых страниц предпочтений.)

Ответ 1

Кажется, что на уровне страницы предпочтений он хочет работать с хранилищем предпочтений. Большинство плагинов получают хранилище предпочтений по умолчанию, предоставляемое org.eclipse.ui.plugin.AbstractUIPlugin.getPreferenceStore(). Это свободно переводится в ScopedPreferenceStore с InstanceScope с node, который соответствует их bundle.id.

Эквивалент для получения соответствующего объекта IEclipsePreferences будет InstanceScope.INSTANCE.getNode("bundle.id"). Это позволит вам добавлять дополнительные узлы под ними, но они не будут доступны из вашего IPreferenceStore. Однако ваша страница предпочтений может установить хранилище предпочтений в основное для вашего плагина и по-прежнему использовать IEclipsePreferences или вторичный объект IPreferenceStore для доступа к дополнительным настройкам (вам просто нужно закодировать его самостоятельно, аналогично org.eclipse.ui.internal.dialogs.EditorsPreferencePage).

Ответ 2

Я решил эту проблему, переопределив хранилище getPreference следующим образом:

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

работает для меня