Eclipse工作台中的Preference(3)(完)

英文原文

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定义的方法打交道。这

preferencePerformokperformDefaults方法各自使用这些方法来更新和重置List

preference的值。可以参见图3 Bad Words preference page

<shapetype o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f" coordsize="21600,21600" id="_x0000_t75"></shapetype><stroke joinstyle="miter"></stroke><formulas></formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f><lock v:ext="edit" aspectratio="t"></lock><shape alt="" type="#_x0000_t75" style="width: 454.5pt; height: 399pt;" id="_x0000_i1025"></shape><imagedata o:href="http://www.eclipse.org/articles/Article-Preferences/images/badwordpreference.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image001.gif"></imagedata>

/**
* 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,当它改变的时候(<shape alt="" type="#_x0000_t75" style="width: 18pt; height: 9.75pt;" id="_x0000_i1026"></shape><imagedata o:href="http://www.eclipse.org/articles/Article-Preferences/images/tag_1.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image002.gif"></imagedata>)就会更新显示的颜色。当这个视图被创建时,在函数init(IViewSite)中(参见<shape alt="" type="#_x0000_t75" style="width: 18pt; height: 9.75pt;" id="_x0000_i1027"></shape><imagedata o:href="https://i-blog.csdnimg.cn/blog_migrate/aeaf12e59bc040dbfc821006abcc2d35.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image003.gif"></imagedata>),它给preference store添加了一个IpropertyChangeListener,当我们注销它的时候,我们在preference store中把它作为一个listener删去(参见<shape alt="" type="#_x0000_t75" style="width: 18pt; height: 9.75pt;" id="_x0000_i1028"></shape><imagedata o:href="http://www.eclipse.org/articles/Article-Preferences/images/tag_3.gif" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image004.gif"></imagedata>)。Init(IViewSite)方法在IviewPart中定义,注销的方法在IworkbenchPart中定义。

<shape alt="" type="#_x0000_t75" style="width: 18pt; height: 9.75pt;" id="_x0000_i1029"></shape>
<shape alt="" type="#_x0000_t75" style="width: 18pt; height: 9.75pt;"></shape> 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();
}

作为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的用户接口。如果你想查找更多的关于Eclipsepreference,你可以参考帮助透视中的平台插件开发向导。帮助信息在程序员向导PreferenceProperties部分。

这篇文章的例子的实现的代码可以在preferences.zip找到。

(OVER)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值