Implementazione di una pagina delle preferenze

Definizione della pagina

Il plugin JFace fornisce un framework per l'implementazione di procedure guidate, pagine delle preferenze e finestre. L'implementazione di queste finestre segue un modello comune. Il contenuto di una pagina o di una finestra è definito dall'implementazione di un metodo createContents che crea i controlli SWT che rappresentano il contenuto della pagina. Questo metodo inoltre aggiunge listener per qualsiasi evento di interesse. La pagina è responsabile della creazione e della restituzione del composto da cui derivano tutti i controlli presenti nella pagina. Nel seguente frammento sono illustrati i punti di maggiore interesse:

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 maggior parte del codice in questo metodo riguarda la creazione e la disposizione dei controlli e pertanto non verrà descritto dettagliatamente. La pagina corrispondente dovrebbe presentare il seguente aspetto:

Pagina delle preferenze dello Strumento readme

L'altra responsabilità principale di una pagina delle preferenze è di "reagire" al messaggio performOk. Generalmente, questo metodo aggiorna e memorizza le preferenze dell'utente e, se necessario, aggiorna qualsiasi altro oggetto del plugin per riflettere la modifica nelle preferenze. Il metodo performDefaults viene utilizzato per ripristinare lo stato predefinito delle preferenze quando l'utente preme il pulsante Ripristina predefiniti.  

Quando l'utente seleziona Applica è possibile sostituire performApply in presenza di un'ulteriore elaborazione. L'implementazione predefinita prevede la chiamata a performOk.  

Le pagine delle preferenze dovrebbero sostituire il metodo doGetPreferenceStore() per restituire un archivio delle preferenze in cui memorizzare i rispettivi valori.

Archivio delle preferenze dei plugin

Gli archivi di preferenze sono un meccanismo per accedere e memorizzare i valori delle preferenze in una classe di plugin. Forniscono un accesso di livello plugin alle preferenze effettivamente memorizzate utilizzando il servizio di preferenze di runtime. AbstractUIPlugin definisce un archivio di preferenze di plugin gestito per tutta l'esistenza del plugin. Il plugin dell'utente può aggiungere voci ad un archivio delle preferenze ed aggiornare i valori man mano che l'utente modifica le impostazioni nella pagina delle preferenze. Poiché gli archivi delle preferenze utilizzano il servizio di preferenze della piattaforma, salvano questi valori nell'ambito e nel percorso appropriati e inizializzano l'archivio delle preferenze mediante i meccanismi appropriati.

Il seguente codice in ReadmePreferencePage ottiene l'archivio delle preferenze per ReadmePlugin.

   protected IPreferenceStore doGetPreferenceStore() {
      return ReadmePlugin.getDefault().getPreferenceStore();
   }

Poiché ReadmePlugin estende la classe AbstractUIPlugin, eredita automaticamente un archivio delle preferenze. Questo archivio delle preferenze viene inizializzato mediante il servizio di preferenze della piattaforma. La sola operazione che ReadmePlugin deve eseguire è l'implementazione di un metodo che inizializzi i controlli delle preferenze sui valori predefiniti. Questi valori vengono utilizzati alla prima apertura della pagina delle preferenze oppure quando l'utente preme il pulsante Impostazioni predefinite della pagina delle preferenze.

protected void initializeDefaultPreferences(IPreferenceStore store) {
// Queste impostazioni verranno visualizzate quando la finestra Preferenze
// verrà aperta per la prima volta.
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: se non esistono preferenze salvate per un plugin, quest'ultimo riceverà una memorizzazione di preferenze vuota.

Richiamo e salvataggio delle preferenze

Una volta associato l'archivio delle preferenze del plugin alla pagina delle preferenze, è possibile implementare la logica per il richiamo e il salvataggio delle preferenze.

Le pagine delle preferenze sono responsabili dell'inizializzazione dei valori dei rispettivi controlli mediante le impostazioni presenti nell'archivio delle preferenze. Questo processo è simile all'inizializzazione dei valori di controllo delle finestre di dialogo presenti nelle impostazioni delle finestre di dialogo. ReadmePreferencePage inizializza tutti i propri controlli in un singolo metodo, initializeValues, richiamato dal rispettivo metodo 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));
	...
}

Quando viene premuto il pulsante OK (o Applica), i valori correnti dei controlli, presenti sulla pagina delle preferenze, dovrebbero essere inseriti nell'archivio delle preferenze. ReadmePreferencePage implementa questa logica in un metodo separato, 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());
	...
}

Quando l'utente preme il pulsante Impostazioni predefinite, la piattaforma ripristinerà i valori delle preferenze sui valori predefiniti specificati nella classe di plugin. Tuttavia, la pagina delle preferenze dell'utente ha la responsabilità di riportare questi valori predefiniti nei controlli sulla pagina delle preferenze. ReadmePreferencePage effettua questa implementazione in 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));
      ...
   }