Implementowanie strony preferencji

Definiowanie strony

Moduł dodatkowy JFace udostępnia strukturę umożliwiającą implementowanie kreatorów, stron preferencji i okien dialogowych. Ich implementacja jest przeprowadzana według wspólnego wzorca. Treść strony lub okna dialogowego definiuje się, implementując metodę createContents, która tworzy pola sterujące SWT, reprezentujące treść strony. Metoda ta powinna również dodawać funkcje nasłuchujące zdarzeń, które są ważne dla jej działania. Strona jest odpowiedzialna za utworzenie i zwrócenie elementu nadrzędnego dla pozostałych elementów sterujących strony.Poniższy fragment kodu pokazuje najistotniejsze elementy:

protected Control createContents(Composite parent)
{
	...
	//composite_textField << element nadrzędny
	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 << element nadrzędny
	Composite composite_tab = createComposite(parent, 2);
	Label label1 = createLabel(composite_tab, MessageUtil.getString("Radio_Button_Options")); 

	//
	tabForward(composite_tab);
	//składnik przełącznika << składnik karty
	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 << element nadrzędny
	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);
}

Większość kodu tej metody dotyczy tworzenia elementów sterujących i ich układania, dlatego nie będzie tutaj omawiany. Odpowiednia strona wygląda następująco:

Strona preferencji narzędzia Readme

Innym podstawowym zadaniem strony preferencji jest reagowanie na komunikat performOk. Ta metoda zazwyczaj aktualizuje i zapisuje preferencje użytkownika oraz, jeśli to konieczne, aktualizuje obiekty innych modułów dodatkowych, aby odzwierciedlić zmiany preferencji. Po naciśnięciu przycisku Przywróć wartości domyślne używana jest metoda performDefaults, która odtwarza domyślny stan preferencji.  

Jeśli po naciśnięciu przez użytkownika przycisku Zastosuj mają zostać wykonane dodatkowe czynności, można przesłonić metodę performApply. Domyślna implementacja wywołuje metodę performOk.  

Strony preferencji powinny przesłaniać metodę doGetPreferenceStore() w taki sposób, aby zwracała składnicę preferencji, w której przechowywane są wartości preferencji tych stron.

Składnica preferencji modułu dodatkowego

Składnice preferencji są mechanizmem ułatwiającym dostęp do wartości preferencji i ich przechowywanie w klasie modułu dodatkowego. Umożliwiają uzyskanie dostępu na poziomie modułu dodatkowego do preferencji, które są przechowywane przy użyciu usługi preferencji środowiska wykonawczego. Klasa AbstractUIPlugin definiuje składnicę preferencji dla całego modułu dodatkowego, która pozostaje dostępna tak długo, jak istnieje moduł. Gdy użytkownik zmienia ustawienia na stronie preferencji, moduł dodatkowy może dodawać pozycje do składnicy preferencji i aktualizować ich wartości. Ponieważ składnice preferencji używają usługi preferencji platformy, zajmują się również zapisywaniem wartości we właściwym zasięgu i położeniu oraz inicjowaniem składnicy preferencji przy użyciu odpowiednich mechanizmów.

Poniższy kod strony preferencji ReadmePreferencePage pobiera składnicę preferencji dla modułu dodatkowego ReadmePlugin.

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

Ponieważ moduł dodatkowy ReadmePlugin rozszerza klasę AbstractUIPlugin, automatycznie dziedziczy składnicę preferencji. Ta składnica preferencji jest inicjowana przy użyciu usługi preferencji platformy. Jedyna rzecz, którą musi zrobić moduł dodatkowy ReadmePlugin, to implementacja metody, która zainicjuje elementy sterujące preferencji ich wartościami domyślnymi. Te wartości są używane przy pierwszym wyświetleniu strony preferencji lub gdy użytkownik naciśnie przycisk Domyślne na stronie preferencji.

protected void initializeDefaultPreferences(IPreferenceStore store) {
	// Te ustawienia zostaną pokazane w oknie dialogowym Preferencje
	// przy pierwszym otwarciu.
	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$
}
Uwaga:  Jeśli żadne preferencje modułu dodatkowego nie zostaną nigdzie zapisane, moduł dodatkowy otrzyma pustą składnicę preferencji.

Pobieranie i zapisywanie preferencji

Po powiązaniu składnicy preferencji modułu dodatkowego ze stroną preferencji, można zaimplementować logikę pobierania i zapisywania preferencji.

Strony preferencji odpowiadają za inicjowanie wartości elementów sterujących przy użyciu ustawień preferencji ze składnicy preferencji. Ten proces jest podobny do inicjowania wartości elementów sterujących okna dialogowego na podstawie jego ustawień. Klasa ReadmePreferencePage inicjuje wszystkie jej pola sterujące przy użyciu jednej metody (initializeValues), która jest wywoływana z jej metody 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));
	...
}

Po naciśnięciu przycisku OK (lub Zastosuj) bieżące wartości elementów sterujących strony preferencji powinny zostać zapisane z powrotem w składnicy preferencji. Klasa ReadmePreferencePage implementuje logikę w oddzielnej metodzie (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());
	...
}

Po naciśnięciu przez użytkownika przycisku Domyślne platforma odtworzy wszystkie wartości domyślne składnicy preferencji określone w klasie modułu dodatkowego. Za wyświetlanie tych domyślnych wartości w swoich elementach sterujących odpowiada strona preferencji. Klasa ReadmePreferencePage implementuje to zachowanie w metodzie 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));
      ...
   }