La tarea de implementar una página de preferencias es semejante a la de 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 los eventos que sean de interés. La página se encarga de crear y devolver el compuesto que será el padre de todos los controles de la página. El siguiente fragmento de código 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, MessageUtil.getString("Text_Field")); textField = createTextField(composite_textField); pushButton_textField = createPushButton(composite_textField, MessageUtil.getString("Change")); //composite_tab << parent Composite composite_tab = createComposite(parent, 2); Label label1 = createLabel(composite_tab, MessageUtil.getString("Radio_Button_Options")); // tabForward(composite_tab); //radio button composite << tab composite Composite composite_radioButton = createComposite(composite_tab, 1); radioButton1 = createRadioButton(composite_radioButton, MessageUtil.getString("Radio_button_1")); radioButton2 = createRadioButton(composite_radioButton, MessageUtil.getString("Radio_button_2")); radioButton3 = createRadioButton(composite_radioButton, MessageUtil.getString("Radio_button_3")); //composite_tab2 << parent Composite composite_tab2 = createComposite(parent, 2); Label label2 = createLabel(composite_tab2, MessageUtil.getString("Check_Box_Options")); //$NON-NLS-1$ // tabForward(composite_tab2); //composite_checkBox << composite_tab2 Composite composite_checkBox = createComposite(composite_tab2, 1); checkBox1 = createCheckBox(composite_checkBox, MessageUtil.getString("Check_box_1")); checkBox2 = createCheckBox(composite_checkBox, MessageUtil.getString("Check_box_2")); checkBox3 = createCheckBox(composite_checkBox, MessageUtil.getString("Check_box_3")); initializeValues(); return new Composite(parent, SWT.NULL); }
La mayor parte del código de este método concierne a la creación y el 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 la de responder al mensaje performOk. Por lo general, este método actualiza y almacena las preferencias del usuario y, si es necesario, actualiza cualquier otro objeto del conector para que reflejen el cambio en las preferencias. El método performDefaults se utiliza para restaurar las preferencias en su estado por omisión cuando el usuario pulsa el botón Restaurar valores por omisión.
Puede alterar temporalmente performApply si tiene procesos adicionales cuando el usuario selecciona Aplicar. La implementación por omisión es llamar a performOk.
Las páginas de preferencias deben alterar temporalmente el método doGetPreferenceStore() con objeto de devolver un almacén de preferencias para almacenar sus valores.
Los almacenes de preferencias tienen una naturaleza similar a la de los valores de diálogo. En el tema Valores de diálogo vimos cómo la clase AbstractUIPlugin mantiene los valores del diálogo durante la vida de un conector. En el caso de las preferencias de usuario se utiliza la misma estrategia. El conector puede añadir entradas a un almacén 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 almacén de preferencias a partir de los valores guardados.
El código siguiente del objeto ReadmePreferencePage obtiene el almacén de preferencias del conector ReadmePlugin.
protected IPreferenceStore doGetPreferenceStore() { return ReadmePlugin.getDefault().getPreferenceStore(); }
La clase ReadmePlugin amplía la clase AbstractUIPlugin, y por ello hereda automáticamente un almacén de preferencias. Este almacén de preferencias se inicializa a partir de un archivo de preferencias almacenado en el directorio del conector. La clase ReadmePlugin tan solo debe implementar un método que inicialice los controles de preferencias en los correspondientes 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 son los que se mostrarán cuando el diálogo Preferencias // se abra por primera vez. 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, MessageUtil.getString("Default_text")); //$NON-NLS-1$ }
Nota: si no se han guardado preferencias para un conector, este obtendrá un almacén de preferencias vacío.
Una vez que haya asociado el almacén de preferencias del conector a la página de preferencias, podrá implementar la lógica destinada a recuperar y guardar las preferencias.
Las páginas de preferencias se encargan de inicializar los valores de sus controles utilizando los valores de preferencias del almacén de preferencias. Este proceso es similar al de inicializar los valores de los controles del diálogo a partir de valores del diálogo. El objeto ReadmePreferencePage inicializa todos sus controles en un solo método, initializeValues, al que se llama desde el correspondiente 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 almacenarse de nuevo en el almacén de preferencias. El objeto ReadmePreferencePage implementa esta 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 restaurará todos los valores del almacén de preferencias en los valores por omisión especificados en la clase del conector. Sin embargo, la página de preferencias se encarga de reflejar estos valores por omisión en los controles de la página de preferencias. El objeto ReadmePreferencePage implementa todo este mecanismo en el método 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)); ... }