Implementar una página de preferencias

Definir la página

El conector JFace proporciona una infraestructura para implementar asistentes, páginas de preferencias y diálogos. La implementación de estos diálogos sigue un patrón común. El contenido de una página o un diálogo se define implementando un método createContents que crea los controles SWT que representan el contenido de página. Este método también debe añadir escuchas para eventos interesantes. 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 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:

Página de preferencias de herramienta readme

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.

Almacén de preferencias del conector

Los almacenes de preferencias son un mecanismo práctico para acceder y almacenar valores de preferencias en una clase de conectores. Proporcionan acceso de nivel de conectores a las preferencias almacenadas realmente mediante el servicio de preferencias de tiempo de ejecución. AbstractUIPlugin define un almacén de preferencias de conectores que se mantiene durante la vida del conector. 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. Dado que los almacenes de preferencias utilizan el servicio de preferencias de la plataforma, se encargarán de guardar los valores de preferencias en el ámbito y ubicación adecuados y de inicializar el almacén de preferencias utilizando los mecanismos adecuados.

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 mediante el servicio de preferencias de la plataforma. Lo único que la clase ReadmePlugin debe hacer es 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 en ningún lugar para un conector, este obtendrá un almacén de preferencias vacío.

Recuperar y guardar preferencias

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));
      ...
   }