FROM:http://www.rcp.org.cn/bbs_topic.do?forumID=8&postID=7
这部分是Eclipse实现的比较复杂费解的一部分,我们知道, Eclipse通过property sheet来显示某个对象的现实的时候通常涉及以下几个类:
IPropertySource: 代表其属性要被显示的类,它会提供一个IPropertyDescripter列表,描述它有哪些属性要被显示。比如我们的“主机”。
IPropertyDescripter: 它描述了IProertySource每个属性的具体信息,例如类型和显示在property sheet上的属性名称,它也肩负着从IProertySource取值的责任。
IPropertySourceProvider:由property sheet调用,提供IProertySource作为其输入。
然而对于EMF的实现,有一套于上述接口类似的另外的接口,功能也类似:
IItemPropertySource 相当于IPropertySource
IItemPropertyDescriptor 相当于IPropertyDescripter
AdapterFactoryContentProvider 相当于IPropertySourceProvider
为什么这样做以及它如何做到的将在以后祥述。
Item Provider实现了IItemPropertySource,并且重写了其父类的方法getPropertyDescriptors():
- public List getPropertyDescriptors(Object object) {
- if (itemPropertyDescriptors == null) {
- super.getPropertyDescriptors(object);
- addNamePropertyDescriptor(object);
- addBandPropertyDescriptor(object);
- addYearPropertyDescriptor(object);
- addNetTypePropertyDescriptor(object);
- addPricePropertyDescriptor(object);
- addCommentsPropertyDescriptor(object);
- add功能PropertyDescriptor(object);
- add配件PropertyDescriptor(object);
- }
- return itemPropertyDescriptors;
- }
这个方法调用了其他几个生成的方法来创建ItemPropertyDescritpor,并且把它添加到itemProertyDescritptors列表中。默认情况下,所有的属性和非包含(不作为子节点显示的)的reference都将作为其属性被显示在propery sheet上。
下面是一个具体的方法:
- protected void addNamePropertyDescriptor(Object object) {
- itemPropertyDescriptors.add
- (new ItemPropertyDescriptor
- (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
- getResourceLocator(),
- getString("_UI_主机_name_feature"),
- getString("_UI_PropertyDescriptor_description", "_UI_主机_name_feature", "_UI_主机_type"),
- MobilesPackage.eINSTANCE.get主机_Name(),
- true,
- ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));
- }
它简单的通过构造器new了一个ItemPropertyDescriptor,它的构造器的参数包括:
· 创建Item provider的adapter factory或者它的root。
· 该属性在显示时的属性名,这也是它的ID。
· 属性的描述,当属性栏被选中时会显示在状态条里。
· 属性的feature。
· 是否允许被编辑。
· 属性的图标。
属性名和描述都是从配置文件中读出来的以支持国际化,比较有趣的是属性的描述的读取:
- getString("_UI_PropertyDescriptor_description", "_UI_主机_name_feature", "_UI_主机_type")
可以从plugin.property文件中分别读出这三个key的value:
_UI_PropertyDescriptor_description = The {0} of the {1}
_UI_\u4e3b\u673a_name_feature = Name
_UI_\u4e3b\u673a_type = \u4e3b\u673a
EMF用java.text.MessageFormat来读取_UI_PropertyDescriptor_description,{0}代表着_UI_主机_name_feature的值,{1}代表着_UI_主机_type的值。也就是说最后的结果会是:The Name of the 主机。
默认情况下所有的属性和非包含的reference都是可以编辑的,你可以通过修改ecore里的changeable属性来设置。
属性的图标将决定于它的类型,而非包含的reference的图标将由property descriptor找到reference对象的adapter,由它找到reference的label provider然后调用getImage()方法获得。
除了getPropertyDescriptors(),IItemPropertySource还包含其他两个方法,它们都由父类实现。第一个,getPropertyDescriptor(),它根据参数中传来的feature id返回特定的property descriptor,其实就是遍历getPropertyDescriptors()返回的列表找到第一个id相同的。另一个getEditableValue(),返回被遍记的值,你可以隐藏一部分不想被编辑的值。通常并不需要,所以缺省的实现对值没有做任何改变。
如果你希望添加更多的属性,你可以修改getPropertyDescriptors()方法。通过传给ItemPropertyDescriptor构造器的参数,你可以控制属性的名称,描述,图标,你甚至可以自己继承PropertyDescriptor,修改AdapterFactoryContentProvider来实现自己需要的属性编辑框,比如对于日期属性,将弹出一个calendar共用户选择。具体方法也将在以后的文章中描述。