2011-04-26 13 views
10

Estoy trabajando en un plugin de Eclipse (o de hecho, un complemento para una aplicación basada en Eclipse) que necesita alguna configuración para ser ingresada por el usuario.Eclipse: Preferencias de OSGI frente a PreferenceStore

De su análisis de la documentación, parece que hay dos API de preferencias - uno en org.eclipse.core.runtime.preferences, que se extienden/aplicación del OSGI prefererence API, otro, JFace específica, en org.eclipse.jface.preference. Luego tenemos org.eclipse.ui.preferences, también.

El API OSGI tiene un árbol de nodos jerárquica - un nodo de preferencia (Preferences o IEclipsePreferences) puede tener múltiples subnodos, que a su vez puede contener tanto nombre-valor pares individuales, así como más subnodos. Esto parece ser el correcto para mi caso de uso: tengo un número dinámico de "grupos de preferencias", cada uno con aproximadamente tres propiedades de cadena (nombre, descripción, comando), que se correlacionaría perfectamente con estos nodos.

La API de JFace no tiene dicha jerarquía, solo un plano IPreferenceStore para cada complemento. Pero proporciona páginas de editor de preferencias, que luego se pueden incluir en el cuadro de diálogo de preferencias habituales (Ventana/Preferencias) implementando IWorkbenchPreferencePage y using the "org.eclipse.ui.preferencePages" extension point. (Todavía tengo que implementar parte de la página de preferencias, pero esta API proporciona una buena base para esto, al parecer.)

Parece que la API org.eclipse.ui.preferences de alguna manera une estas API al proporcionar una implementación de IPreferenceStore basada en la IEclipsePreferences, pero todavía no puedo ver cómo usar esto.

Así que aquí mi pregunta: ¿Cómo puedo utilizar el OSGI Preferences jerárquico en el cuadro de diálogo de preferencias? Solo necesito un nivel, pero necesito que el usuario pueda agregar dinámicamente nuevos nodos (con aproximadamente tres preferencias cada uno). (Sin embargo, estos nodos no tienen que tener nuevas páginas de preferencias.)

Respuesta

14

Parece que en el nivel de página de preferencias, quiere trabajar con un almacén de preferencias. La mayoría de los complementos obtienen su tienda de preferencia del valor predeterminado proporcionado por org.eclipse.ui.plugin.AbstractUIPlugin.getPreferenceStore(). Esto se traduce de forma general en ScopedPreferenceStore con InstanceScope con un nodo que coincide con bundle.id.

El equivalente para obtener el objeto correspondiente IEclipsePreferences sería InstanceScope.INSTANCE.getNode("bundle.id"). Eso le permitiría agregar más nodos debajo, pero no serían accesibles desde su IPreferenceStore. Sin embargo, su página de preferencias podría establecer su almacenamiento de preferencia en el principal para su complemento, y aún usar IEclipsePreferences o un IPreferenceStore secundario para acceder a preferencias adicionales (solo tiene que codificarlo usted mismo, similar al org.eclipse.ui.internal.dialogs.EditorsPreferencePage).

+0

Gracias, esto también es lo que he reunido hasta el momento. Estoy trabajando en este enfoque ahora. –

2

Abordé este problema reemplazando la tienda getPreference de la siguiente manera:

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

funciona para mí

Cuestiones relacionadas