El entorno de trabajo implementa una arquitectura de preferencias genérica que permite a los conectores guardar valores de preferencia de usuario y contribuir con una página de preferencias al diálogo de preferencias de entorno de trabajo. Para ver cómo se lleva a cabo esto, es preciso volver a consultar el ejemplo de la herramienta readme y, a continuación, parte del soporte subyacente para construir páginas de preferencias.
Los puntos de extensión org.eclipse.ui.preferencePages le permiten contribuir con páginas al diálogo de preferencias (Ventana->Preferencias) del entorno de trabajo. El diálogo de preferencias presenta una lista jerárquica de entradas de preferencias de usuario. Cada entrada visualiza una página de preferencias correspondiente cuando se selecciona.
La herramienta readme utiliza este punto de extensión para añadir la página de preferencias Ejemplo de readme.
<extension
point = "org.eclipse.ui.preferencePages">
<page
id="org.eclipse.ui.examples.readmetool.Page1"
class="org.eclipse.ui.examples.readmetool.ReadmePreferencePage"
name="Readme Example">
</page>
</extension>
Esta marcación define una página de preferencias llamada "Readme Example" que se implementa mediante la clase ReadmePreferencePage. Esta clase debe implementar la interfaz IWorkbenchPreferencePage.
El entorno de trabajo utiliza un PreferenceManager para mantener una lista de todos los nodos del árbol de preferencias y sus páginas correspondientes. Esta lista puede inicializarse a partir de la información del registro del conector sin ejecutar ningún código de conector. La contribución del conector al diálogo de preferencias (la entrada "Readme Example" en el lado izquierdo) se muestra antes que de se ejecute cualquiera de los códigos.
La preferencia "Readme Example" se añade al nivel superior del árbol de preferencias del lado izquierdo. ¿Por qué? Porque se añadirá una contribución de página de preferencias como raíz del árbol a menos que se especifique el atributo categoría. (El nombre categoría puede prestarse a confusión. Tal vez, el nombre más adecuado sea vía de acceso.) El atributo categoría especifica el identificador (o una serie de identificadores del directorio raíz) de la página padre. Por ejemplo, la marcación siguiente crearía una segunda página de preferencias de la herramienta readme, "Readme Example Child Page", como hijo de la página original.
<extension
point = "org.eclipse.ui.preferencePages">
<page
id="org.eclipse.ui.examples.readmetool.Page1"
class="org.eclipse.ui.examples.readmetool.ReadmePreferencePage"
name="Readme Example">
</page>
<page
id="org.eclipse.ui.examples.readmetool.Page2"
class="org.eclipse.ui.examples.readmetool.ReadmePreferencePage2"
name="Readme Example Child
Page"
category="org.eclipse.ui.examples.readmetool.Page1>
</page>
</extension>
En cuanto el usuario selecciona la entrada para una página de preferencias en el árbol del lado izquierdo, el entorno de trabajo crea y visualiza una página de preferencias utilizando la clase especificada en la definición de extensión. Esta acción es lo que activa el conector (en caso de que no lo estuviera debido a otra operación realizada por el usuario).
Implementar una página de preferencias es como crear una página para un asistente. La página de preferencias suministra un método createContents que crea los controles de SWT que representan el contenido de la página y añade escuchadores para cualquier evento de interés. La finalidad de la página es crear y devolver el compuesto que hace que todos los controles de la página sean padres. El segmento siguiente muestra las características principales:
protected Control createContents(Composite parent)
{
...
//composite_textField << parent
Composite composite_textField = createComposite(parent, 2);
Label label_textField = createLabel(composite_textField, "Text Field");
textField = createTextField(composite_textField);
pushButton_textField = createPushButton(composite_textField, "Change");
//composite_tab << parent
Composite composite_tab = createComposite(parent, 2);
Label label1 = createLabel(composite_tab, "Radio Button Options");
tabForward(composite_tab);
//radio button composite << tab composite
Composite composite_radioButton = createComposite(composite_tab, 1);
radioButton1 = createRadioButton(composite_radioButton, "Radio button 1");
radioButton2 = createRadioButton(composite_radioButton, "Radio button 2");
radioButton3 = createRadioButton(composite_radioButton, "Radio button 3");
...
initializeValues();
...
return new Composite(parent, SWT.NULL);
}
La mayor parte del código de este método tiene que ver con la creación y diseño de los controles, por lo que no se mostrará detalladamente aquí. A continuación, se muestra el aspecto de la página correspondiente:
La otra finalidad principal de una página de preferencias es responder al mensaje performOk. Generalmente, este método actualiza y guarda las preferencias del usuario y, si es necesario, actualiza cualquier otro objeto del conector para mostrar los cambios en las preferencias.
Las páginas de preferencias deben alterar temporalmente el método doGetPreferenceStore() para devolver un almacenamiento de preferencias para almacenar sus valores.
Las características de los almacenamientos de preferencias son similares a los valores de diálogo. En Valores de diálogo, se mostró cómo la clase AbstractUIPlugin mantiene valores de diálogo durante la vida de un conector. En el caso de las preferencias de usuario se utiliza el mismo procedimiento. El conector puede añadir entradas en un almacenamiento de preferencias y actualizar los valores a medida que el usuario cambia los valores de la página de preferencias. La plataforma se encargará de guardar estos valores en el directorio de trabajo del conector y de inicializar el almacenamiento de preferencias a partir de los valores guardados.
El código siguiente de ReadmePreferencePage obtiene el almacenamiento de preferencias para ReadmePlugin.
protected IPreferenceStore doGetPreferenceStore() {
return ReadmePlugin.getDefault().getPreferenceStore();
}
Puesto que ReadmePlugin amplía la clase AbstractUIPlugin, hereda automáticamente un almacenamiento de preferencias. Este almacenamiento de preferencias se inicializa a partir del archivo de preferencias almacenado en el directorio del conector. Lo único que ReadmePlugin tiene que hacer es implementar un método que inicialice las preferencias con sus valores por omisión. Estos valores se utilizan la primera vez que se muestra la página de preferencias o cuando el usuario pulsa el botón Valores por omisión de la página de preferencias.
protected void initializeDefaultPreferences(IPreferenceStore store) {
// Estos valores aparecerán la primera vez que se
// abre el diálogo Preferencia.
store.setDefault(IReadmeConstants.PRE_CHECK1, true);
store.setDefault(IReadmeConstants.PRE_CHECK2, true);
store.setDefault(IReadmeConstants.PRE_CHECK3, false);
store.setDefault(IReadmeConstants.PRE_RADIO_CHOICE, 2);
store.setDefault(IReadmeConstants.PRE_TEXT, "Default text");
}
Nota: Si no se han guardado preferencias para un conector, éste obtendrá un almacenamiento de preferencias vacío.
Una vez ha asociado el almacenamiento de preferencias del conector con la página de preferencias, puede implementar la lógica para recuperar y guardar las preferencias.
Las páginas de preferencias se encargan de inicializar los valores de sus controles utilizando los valores de las preferencias del almacenamiento de preferencias. Este proceso es similar a inicializar valores de control de diálogo a partir de valores de diálogo. ReadmePreferencePage inicializa todos sus controles en un sólo método, initializeValues, al que se llama desde su método createContents.
private void initializeValues() {
IPreferenceStore store = getPreferenceStore();
checkBox1.setSelection(store.getBoolean(IReadmeConstants.PRE_CHECK1));
checkBox2.setSelection(store.getBoolean(IReadmeConstants.PRE_CHECK2));
checkBox3.setSelection(store.getBoolean(IReadmeConstants.PRE_CHECK3));
...
Cuando se pulsa el botón Aceptar (o Aplicar), los valores actuales de los controles de la página de preferencias deben volver a almacenarse en el almacenamiento de preferencias. ReadmePreferencePage implementa está lógica en un método aparte, storeValues.
private void storeValues() {
IPreferenceStore store = getPreferenceStore();
store.setValue(IReadmeConstants.PRE_CHECK1, checkBox1.getSelection());
store.setValue(IReadmeConstants.PRE_CHECK2, checkBox2.getSelection());
store.setValue(IReadmeConstants.PRE_CHECK3, checkBox3.getSelection());
...
}
Cuando el usuario pulsa el botón Valores por omisión, la plataforma restaura todos los valores de almacenamiento de preferencias a los valores por omisión especificados en la clase del conector. Sin embargo, la página de preferencias se encarga de mostrar estos valores por omisión en los controles de la página de preferencias. ReadmePreferencePage implementa esto en initializeDefaults.
private void initializeDefaults() {
IPreferenceStore store = getPreferenceStore();
checkBox1.setSelection(store.getDefaultBoolean(IReadmeConstants.PRE_CHECK1));
checkBox2.setSelection(store.getDefaultBoolean(IReadmeConstants.PRE_CHECK2));
checkBox3.setSelection(store.getDefaultBoolean(IReadmeConstants.PRE_CHECK3));
...
}
La implementación de una página de preferencias es, principalmente, código de SWT. El código de SWT se utiliza para crear los controles de páginas de preferencias, establecer los valores de dichos controles y recuperarlos. El paquete org.eclipse.jface.preference proporciona clases de ayuda, llamadas editores de campos, que crean los widgets e implementan los valores y el código de recuperación para los tipos de preferencias más comunes. La plataforma proporciona editores de campos para visualizar y actualizar muchos tipos de valores como, por ejemplo, booleanos, colores, series, enteros, fonts y nombres de archivo.
FieldEditorPreferencePage implementa una página que utiliza estos editores de campo para visualizar y almacenar los valores de preferencias en la página.
En lugar de crear controles de SWT para rellenar su contenido, FieldEditorPreferencePage crea editores de campos para visualizar el contenido.
public void createFieldEditors() {
// La primera serie es el nombre clave de la preferencia
// La segunda serie es la etiqueta que se muestra junto al widget
addField(new BooleanFieldEditor(USE_OLD_MODE, "Use old mode",
getFieldEditorParent()));
addField(new StringFieldEditor(APPLICATION_NAME, "Application Name",
getFieldEditorParent()));
addField(new ColorFieldEditor(COLOR, "Text Color",
getFieldEditorParent()));
...
A cada editor de campos se le asigna el nombre de su clave de preferencia correspondiente y la etiqueta de texto para el control de SWT que creará. El tipo de control que se crea depende del tipo de editor de campos. Por ejemplo, un editor de campos booleano crea un recuadro de selección.
Puesto que la página de preferencias está asociada con un almacenamiento de preferencias (especificado en el método doGetPreferenceStore), el código para almacenar los valores actuales, para inicializar los valores de control a partir del almacenamiento de preferencias y para restaurar los controles a sus valores por omisión puede implementarse en FieldEditorPreferencePage.
FieldEditorPreferencePage utilizará un diseño de cuadrícula con una columna como el diseño por omisión para widgets de editores de campos. Si necesita requisitos de diseño especiales, puede alterar temporalmente el método createContents.