Eclipse: настройки OSGI против PreferenceStore - PullRequest
10 голосов
/ 26 апреля 2011

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

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

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

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

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

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

Ответы [ 2 ]

14 голосов
/ 27 апреля 2011

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

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

2 голосов
/ 22 октября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...