實作喜好設定頁面類似為精靈建立頁面。喜好設定頁面提供 createContents 方法來建立代表頁面內容的 SWT 控制項,並為任何感興趣的事件新增接聽器。該頁面負責建立及傳回行為頁面中所有控制項之母項的組合。下列片段顯示重 點:
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); //圓鈕組合 << 標示組合 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); }
此方法中大部份程式碼與建立及佈置控制項有關,所以在此不做分析。這裡 所談的是對應頁面的外觀:
喜好設定頁面的另一個主要責任是反應 performOk 訊息。一般而言,這個方 法會更新及儲存使用者喜好設定,必要時更新其他任何外掛程式物件來反映喜好設定 中的變更。 performDefaults 方法是用來當使用者按下還原預設值按鈕時, 將喜好設定還原至它們的預設狀態。
如果在使用者選取套用時,您具有其他處理程序, 您可以置換 performApply。預設實作將呼叫 performOk。
喜好設定頁面將置換 doGetPreferenceStore() 方法以傳回儲存其值的喜好 設定儲存庫。
喜好設定儲存庫本質上類似對話框設定。在對話框設定中,我們看到 AbstractUIPlugin 類別如何在外掛程式生命期限期間維護對話框設定,使用者喜好設定使用相同的策略 。 您的外掛程式可新增項目到喜好設定儲存庫,並在使用者變更您喜好設定頁面中的設 定時更新其值。平台負責將這些值儲存在您外掛程式的工作目錄中,及根據儲存的設 定來起始設定喜好設定儲存庫。
ReadmePreferencePage 中的下列程式碼可取得 ReadmePlugin 的喜 好設定儲存庫。
protected IPreferenceStore doGetPreferenceStore() { return ReadmePlugin.getDefault().getPreferenceStore(); }
由於 ReadmePlugin 延伸 AbstractUIPlugin 類別,所以會自動繼承喜好設定儲存庫,這個喜好設定儲存庫自外掛程式目錄中儲 存的喜好設定檔來起始設定。ReadmePlugin 唯一需要做的是實作 將喜好設定控制項起始的方法設定回它們的預設值。第一次顯示喜好設定頁面或使用者按下 喜好設定頁面中的預設值按鈕時,會使用這些值。
protected void initializeDefaultPreferences(IPreferenceStore store) { // 第一次開啟「喜好設定」對話框時, // 這些設定將顯示出來。 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$ }
註:如果沒有針對外掛程式儲存的喜好設定,該外掛程式將取得一個空的喜 好設定儲存庫。
一旦建立外掛程式喜好設定儲存庫與喜好設定頁面的關聯性,您可以實作用於擷取及 儲存喜好設定的邏輯。
喜好設定頁面負責利用喜好設定儲存庫中的喜好設定來起始設定它們控制項的值, 這個程序類似從對話框設定起始設定對話框控制項值。ReadmePreferencePage 在單一方法 initializeValues 中起始設定 其所有控制項,該方法需要從它的 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)); ... }
當按下確定(或套用)按鈕,喜好設定頁面上控制項現行值應存回喜 好設定儲存庫中。ReadmePreferencePage 在個別的方法 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()); ... }
當使用者按下預設值按鈕,平台便會將所有喜好設定儲存值還原成外掛程式 類別中指定的預設值。不過,您的喜好設定頁面負責在喜好設定頁面的控制項中反映 這些預設值。ReadmePreferencePage 在 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)); ... }