PreferencePage
扩展org.eclipse.ui.preferencePagesorg时,Eclispe会额外地自动扩展eclipse.core.runtime.preferences。后者用于设置PreferencePage的默认值。
一、定义PreferencePage
public class FavoritesPreferencePage
extends FieldEditorPreferencePage
implements IWorkbenchPreferencePage{}
初始化过程:
FieldEditorPreferencePage.createContent主要执行了以下三个操作:
- 调用虚函数createFieldEditors(), 此方法在FavoritesPreferencePage必须实现,用于创建FieldEditor
- 调用函数initialize(),此方法在FieldEditorPreferencePage有具体实现:配置1所创建的FieldEditor,注册属性改变监听器(FieldEditorPreferencePage本身)是其中之一
- 调用checkState(),此方法FieldEditorPreferencePage有具体实现:调用每个FieldEdior.isValid, 如果有个无效,则设置applyButton为disable.
checkState 还会在一下几种情况下调用:
- performDefault
- PropertyChanged中调用,即 每个EditorField值发生变化的时候
每个FieldEditor值发生变化时,会通过调用FieldEditorPreferencePage.propertyChange来通知监听器
实现复杂的PerferencePage 需要直接实现PreferencePage
二、设置和获取PreferencePage的值
PreferencePage的值都存贮在pref file中,除了defaut value
设置的三种方式
- 通过IPreferenceStore初始化:org.eclipse.core.runtime.preference的initializer节点用于初始化PreferencePage的fieldEditor的值。setter和getter通过name关联到对应的fieldEditor.
- 在程序实现上,所有控件如BooleanFieldEditor的值存放在IPreferenceStore中的Properties(string2string) 类型的成员中两种方式存储,从而将表现层与实体层区分开
- 默认方式存储在defaultProperties, 通过defaultIPreferenceStore.setDefault() 在initializer中调用
- 自定义方式存储在properties,通过IPreferenceStore.setValue 在performOK中调用
- 在程序实现上,所有控件如BooleanFieldEditor的值存放在IPreferenceStore中的Properties(string2string) 类型的成员中两种方式存储,从而将表现层与实体层区分开
- 将值写入ini文件(等同于pref文件)
三、将FieldEditor值的变化通知其他部件
- 通过IPreferenceStore.addPropertyChangeListener(IPropertyChangeListener listener)注册被通知的监听器
- 在注册的监听器中IPreferenceStore.getXXX获取FieldEditor的值,PropertyChangeEvent.getProperty返回的是发生改变的FieldEditor的name
Property page
一、扩展org.eclipse.ui.propertyPages
- 在 createContents 中创建相应控件
- 通过getElement()获取属性需要设置的资源 IResource提供了getPersistentProperty 和 setPersistentProperty可以跨session获取和设置属性,即,及时eclipse重启,这些属性信息还可以能够保留,在FavoriteItemPropertyPage例子中,comment使用了上述方法,重启后comment信息依然存在,颜色属性就不可以做到这点
二、Property view中显示选中对象
- 需要显示对象的类型需要实现IPropertySource(2)接口或实现getAdapter方法,只要此方法返回的类型实现IPropertySource
- IPropertyDescriptor表示呗选中对象需要显示的一个属性值,一般多个IPropertyDescriptor实例组成了被选中对象需要显示的所有属性值,每个属性值的读取和设置分别在getPropertyValue和setPropertyValue中实现,都通过objectID判断出读取和设置哪个属性
三、PropertyPage作为PreferencePage来使用
PropertyPage 实现了PreferencePage因此可以将它作为PreferencePage来使用,只需要在plugin.xml将PreferencePage的class指向PropertyPage对应的类即可