L'implementazione di una pagina delle preferenze è simile alla creazione di una pagina per una procedura guidata. La pagina delle preferenze fornisce un metodo createContents che crea i controlli SWT che rappresentano il contenuto della pagina e aggiunge listener per tutti gli eventi 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:
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 plug-in 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 una memorizzazione delle preferenze in cui memorizzare i rispettivi valori.
Le memorizzazioni delle preferenze sono simili alle impostazioni delle finestre di dialogo. In Impostazioni delle finestre di dialogo, è stato descritto come la classe AbstractUIPlugin conserva le impostazioni della finestra di dialogo durante tutto il ciclo di vita di un plug-in. La stessa strategia viene impiegata per le preferenze dell'utente. Il plug-in dell'utente può aggiungere voci ad una memorizzazione delle preferenze ed aggiornare i valori man mano che l'utente modifica le impostazioni nella pagina delle preferenze. La piattaforma si occuperà del salvataggio di tali valori nella directory di lavoro del plug-in e dell'inizializzazione della memorizzazione di preferenze in base alle impostazioni salvate.
Il seguente codice in ReadmePreferencePage ottiene la memorizzazione delle preferenze per ReadmePlugin.
protected IPreferenceStore doGetPreferenceStore() { return ReadmePlugin.getDefault().getPreferenceStore(); }
Poiché ReadmePlugin estende la classe AbstractUIPlugin, eredita automaticamente una memorizzazione delle preferenze. Tale memorizzazione viene inizializzata da un file delle preferenze memorizzato nella directory del plug-in. 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 plug-in, quest'ultimo riceverà una memorizzazione di preferenze vuota.
Una volta associata la memorizzazione delle preferenze del plug-in 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 nella memorizzazione 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 nella memorizzazione 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 della memorizzazione delle preferenze sui valori predefiniti specificati nella classe di plug-in. 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)); ... }