Implementera en inställningssida

Definiera sidan

Med JFace-insticksprogrammet tillhandahålls ett ramverk för implementation av guider, inställningssidor och dialogrutor. Implementationen av dessa dialogrutor följer ett gemensamt mönster. Innehållet på en sida eller i en dialogruta definieras genom att metoden createContents implementeras, vilket skapar de SWT-kontroller som representerar sidinnehållet. Metoden ska också lägga till lyssnare för alla intressanta händelser. Sidan ansvarar för att skapa och returnera den sammansättning som är överordnad alla kontrollerna på sidan. I följande kodstycke visas markeringarna:

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

Det mesta av koden i den här metoden handlar om att skapa och göra layout för kontrollerna, så den går vi inte igenom här. Så här ser motsvarande sida ut:

Inställningssida för readme-verktyget

Det andra primära ansvaret för en inställningssida är att reagera på meddelandet performOk. Vanligen uppdateras och lagras användarinställningarna med hjälp av den här metoden och, om nödvändigt, uppdateras alla andra insticksprogramobjekt för att spegla ändringen av inställningarna. Metoden performDefaults används för att återställa inställningarna till standardläge när användaren trycker på knappen Återställ standardvärden.  

Om du har ytterligare bearbetning kan du åsidosätta performApply när användaren väljer Tillämpa.  Standardimplementationen är att anropa performOk.  

Inställningssidor ska åsidosätta metoden doGetPreferenceStore() för att returnera ett inställningslager för lagring av värdena.

Insticksprogrammets inställningslager

Inställningslager är en praktisk mekanism för att accessa och lagra inställningar i en insticksprogramklass. De ger access till inställningar på insticksprogramnivå, inställningar som verkligen lagras med hjälp av tjänsten för användarinställningar för körning. Med AbstractUIPlugin definieras ett allmänt inställningslager för insticksprogram som underhålls under hela insticksprogrammets livstid. Ditt insticksprogram kan lägga till poster i inställningslagret och uppdatera värdena när användaren ändrar inställningarna på inställningssidan. Eftersom inställningslager använder plattformens inställningstjänst tar de hand om sparande av inställningsvärden i rätt omfattning och på rätt plats samt initierar inställningslagret med hjälp av lämpliga mekanismer.

Följande kod i ReadmePreferencePage får inställningslagret för ReadmePlugin.

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

Eftersom ReadmePlugin utökar klassen AbstractUIPlugin ärver den automatiskt ett inställningslager. Inställningslagret initieras med hjälp av plattformens inställningstjänst. Det enda som ReadmePlugin ska göra är att implementera en metod som initierar inställningskontrollerna till deras standardvärden. Dessa värden används första gången inställningssidan visas eller när användaren trycker på knappen Standardvärden på inställningssidan.

protected void initializeDefaultPreferences(IPreferenceStore store) {
	// Inställningarna vsias när dialogrutan Inställningar
	// öppnas första gången.
	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$
}
Obs!  Om inga inställningar har sparats för ett insticksprogram får insticksprogrammet ett tomt inställningslager.

Hämta och spara inställningar

När du har associerat insticksprogrammets inställningslager med inställningssidan kan du implementera logiken för att hämta och spara inställningarna.

Inställningssidor ansvarar för initiering av kontrollernas värden med hjälp av inställningarna i inställningslagret. Processen påminner om att initiera dialogrutekontrollvärden från dialogruteinställningarna. ReadmePreferencePage initierar alla sina kontroller i en enda metod, initializeValues, vilken anropas från sin createContents-metod.

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

När knappen OK (eller Tillämpa) trycks ned ska de aktuella värdena i kontrollerna på inställningssidan lagras tillbaka till inställningslagret. ReadmePreferencePage implementerar den här logiken i en separat metod, 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());
	...
}

När användaren trycker på knappen Standardvärden återställer plattformen alla inställningslagervärden till de standardvärden som angetts i insticksprogramklassen. Inställningssidan är emellertid ansvarig för att spegla standardvärdena i kontrollerna på inställningssidan. ReadmePreferencePage implementerar detta i 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));
      ...
   }