(英文原文)
Translated by Frank
Eclipse工作台中的Preference(3)
Bad Words Preference 页
我们已经看到了怎样创建color 这个简单的prefrence页,并把它归类。现在我们将展示如何使用一个复杂的对象作为一个preference页,并且把它存储在preference store中,使之在preference页中是可编辑的。在这个例子中,我们将加上一个bad words preference,它是一个成员为String的数组。
因为PreferenceConverter并没有提供转换String的数组的API,所以我们必须在BadWordCheckerPlugin中,自己来实现它。只要在插件中实现了它,我们就可以把preference要使用的API使之对所有的对象而言可见,这样这些对象就可以访问它。一般来说,我们应该使用PreferenceConverter从存储格式进行来回转换。
首先,必须定义得到缺省的Preference的方法,还有得到和设置Preference的方法。它们分别是getBadWordsDefaultPreference(它返回String类型的数组),getBadWordsPreference(它也返回String类型的数组)和setBadWordsPreference(它以String类型的数组作为参数)。String数组存放在preference store中,作为以分隔符隔开的一个单独的字符串。我们选择分号(;)作为分隔符,之所以选择它是因为它在字符串中没有用到,绝不会与内容造成混淆。
/**
* Return the bad words preference default.
*/
public String[] getDefaultBadWordsPreference(){
return convert(getPreferenceStore().getDefaultString(BAD_WORDS_PREFERENCE));
}
/**
* Returns the bad words preference.
*/
public String[] getBadWordsPreference() {
return convert(getPreferenceStore().getString(BAD_WORDS_PREFERENCE));
}
/**
* Converts PREFERENCE_DELIMITER delimited String to a String array.
*/
private String[] convert(String preferenceValue) {
StringTokenizer tokenizer =
new StringTokenizer(preferenceValue, PREFERENCE_DELIMITER);
int tokenCount = tokenizer.countTokens();
String[] elements = new String[tokenCount];
for (int i = 0; i < tokenCount; i++) {
elements[i] = tokenizer.nextToken();
}
return elements;
}
/**
* Sets the bad words preference.
*/
public void setBadWordsPreference(String[] elements) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < elements.length; i++) {
buffer.append(elements[i]);
buffer.append(PREFERENCE_DELIMITER);
}
getPreferenceStore().setValue(BAD_WORDS_PREFERENCE, buffer.toString());
}
在JFace中没有field editor来编辑String数组,所以我们将定一个list来显示item,并用
它来添加或删除items。我们的performOK方法将把当前内容发送到
setBadWordsPreference方法,performDefaults方法将重置list中的内容,这是通过
getDefaultBadWordsPreference方法实现的。这两个方法都在BadWordCheckerPlugin
定义。作为一个List组件,它把String数组作为它的内容,这样我们就可以通过这些
有用的方法与我们在插件中的为bad words preference定义的方法打交道。这个
preference的Performok和performDefaults方法各自使用这些方法来更新和重置List组件
中preference的值。可以参见图3 Bad Words preference page。
/**
* Sets the contents of the nameEntry field to be the default
*/
protected void performDefaults() {
badWordList.setItems(BadWordCheckerPlugin.getDefault().getDefaultBadWordsPreference());
}
/**
* Saves the author name to the preference store.
*/
public boolean performOk() {
BadWordCheckerPlugin.getDefault().setBadWordsPreference(badWordList.getItems());
return super.performOk();
}
图3:显示Bad Words Preference页的Preference对话框
利用IpropertyChangeListener监控变量的值
Preference被频繁的用来在设置其它对象的值,或者可能需要提供给一个开放的编辑器或者视图。当你被要求如此的时候,你可以利用IpropertyChangeListener来监听这些改变,IPropertyChangeListener是一个类,它主要用来给IPropertyStore添加listener,以便无论何时发生改变使listener能够被通知。无论何时,只要preference通过setValue()改变了,改变就会被通知。显而易见,当按下preference中的OK或Apply按钮的时候,或import一个已存在的preference的时候都属于这种情况。
在这个bad word 检查的例子中,我们已经实现了一个视图用选择的颜色(参见附加的代码)高亮显示bad words,这个视图定义了一个IPropertyChangeListener,当它改变的时候( )就会更新显示的颜色。当这个视图被创建时,在函数init(IViewSite)中(参见 ),它给preference store添加了一个IpropertyChangeListener,当我们注销它的时候,我们在preference store中把它作为一个listener删去(参见 )。Init(IViewSite)方法在IviewPart中定义,注销的方法在IworkbenchPart中定义。
new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(BadWordCheckerPlugin.HIGHLIGHT_PREFERENCE)) {
//Update the colors by clearing the current color,
//updating the view and then disposing the old color.
Color oldForeground = foreground;
foreground = null;
setBadWordHighlights(text.getText());
oldForeground.dispose();
}
if (event.getProperty().equals(BadWordCheckerPlugin.BAD_WORDS_PREFERENCE))
//Only update the text if only the words have changed
setBadWordHighlights(text.getText());
}
};public void init(IViewSite site) throws PartInitException {
super.init(site);
site.getPage().addSelectionListener(...);
BadWordCheckerPlugin
.getDefault()
.getPreferenceStore()
.addPropertyChangeListener(preferenceListener);}
public void dispose() {
getSite().getPage().removeSelectionListener(...);
BadWordCheckerPlugin
.getDefault()
.getPreferenceStore()
.removePropertyChangeListener(preferenceListener);
if (foreground != null)
foreground.dispose();
super.dispose();
}
导入、导出Preference设置
作为Eclipse 2.0,现在你可以导入、导出preferences,以便当你在一个新的工作台中时可以重新读取它们。为了实现这一点,你仅仅只需要利用导入、导出功能就行了。当前preference设置存储在.epf文件中。这个文件中仍然不包含preference的缺省值。当你从一个.epf文件中导入epreference的时候,各个preference的值将会设定为存储的值。不在在.epf文件中存储的preference将不受到影响。
如果你的preference就是用preference store存储和找回值,那么当preference保存的时候,你不必做更多的工作,它们就会被存为可以被导入、导出的preference的一部分。如果再导入的时候你还想执行更多的操作,你需要使用IPropertyChangeListener。
结论
在这篇文章里,我们举例说明怎样运用Eclipse 提供的preferences store 和 preferences pages去操作插件维护和更新preferences,利用preference 对话框导入、导出preference。通过使用preference store,使用prefrence 对话框和提供的field 编辑器。插件开发者可以迅速的开发出管理preference的用户接口。如果你想查找更多的关于Eclipse的preference,你可以参考帮助透视中的平台插件开发向导。帮助信息在程序员向导Preference和Properties部分。
这篇文章的例子的实现的代码可以在preferences.zip找到。
(OVER)