实现首选项页面

定义页面

实现首选项页面类似于为向导创建页面。首选项页面提供 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);
      //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);
}

此方法中的大多数代码都与控件的创建和布局有关,因此,在此处我们将不会详细研究它。以下是相应页面的外观:

自述文件工具首选项页面

首选项页面的另一主要功能是响应 performOk 消息。通常,此方法更新和存储用户首选项, 并且,如果需要的话,将更新所有其它插件对象以反映首选项中的更改。performDefaults 方法用来当用户按恢复缺省值按钮时将首选项恢复到它们的缺省状态。  

如果当用户选择应用时执行了其它处理,则可能会覆盖 performApply。缺省实现是调用 performOk。  

首选项页面应重设 doGetPreferenceStore() 方法,以返回首选项仓库从而存储它们的值。

插件首选项仓库

首选项仓库的性质类似于对话框设置。在对话框设置中, 我们了解了 AbstractUIPlugin 类如何在插件的有效期内维护对话框设置。为用户首选项部署了相同的战略。插件可以将条目添加到首选项仓库中,并在用户更改首选项页面中的设置时更新这些值。平台将小心地将这些值保存在插件的工作目录中, 并根据保存的设置来初始化首选项仓库。

ReadmePreferencePage 中的以下代码获得了 ReadmePlugin 的首选项仓库。

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

因为 ReadmePlugin 扩展了 AbstractUIPlugin 类,所以它将自动继承首选项仓库。此首选项仓库是根据存储在插件的目录中的首选项文件来进行初始化的。ReadmePlugin 需要做的唯一事情就是实现将首选项控件初始化为它们的缺省值的方法。当首次显示首选项页面,或者当用户按了首选项页面中的缺省值按钮时,就会使用这些值。

   protected void initializeDefaultPreferences(IPreferenceStore store) {
      // These settings will show up when Preference dialog
      // opens up for the first time.
      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));
      ...
   }
Copyright IBM Corporation and others 2000, 2003.