[zt]Item Provider之二 Property Source

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():

java 代码
  1. public List getPropertyDescriptors(Object object) {   
  2. if (itemPropertyDescriptors == null) {   
  3. super.getPropertyDescriptors(object);   
  4.   
  5. addNamePropertyDescriptor(object);   
  6. addBandPropertyDescriptor(object);   
  7. addYearPropertyDescriptor(object);   
  8. addNetTypePropertyDescriptor(object);   
  9. addPricePropertyDescriptor(object);   
  10. addCommentsPropertyDescriptor(object);   
  11. add功能PropertyDescriptor(object);   
  12. add配件PropertyDescriptor(object);   
  13. }   
  14. return itemPropertyDescriptors;   
  15. }   

这个方法调用了其他几个生成的方法来创建ItemPropertyDescritpor,并且把它添加到itemProertyDescritptors列表中。默认情况下,所有的属性和非包含(不作为子节点显示的)的reference都将作为其属性被显示在propery sheet上。
下面是一个具体的方法:

java 代码
  1. protected void addNamePropertyDescriptor(Object object) {   
  2. itemPropertyDescriptors.add   
  3. (new ItemPropertyDescriptor   
  4. (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),   
  5. getResourceLocator(),   
  6. getString("_UI_主机_name_feature"),   
  7. getString("_UI_PropertyDescriptor_description""_UI_主机_name_feature""_UI_主机_type"),   
  8. MobilesPackage.eINSTANCE.get主机_Name(),   
  9. true,   
  10. ItemPropertyDescriptor.GENERIC_VALUE_IMAGE));   
  11. }   

它简单的通过构造器new了一个ItemPropertyDescriptor,它的构造器的参数包括:
· 创建Item provider的adapter factory或者它的root。
· 该属性在显示时的属性名,这也是它的ID。
· 属性的描述,当属性栏被选中时会显示在状态条里。
· 属性的feature。
· 是否允许被编辑。
· 属性的图标。

属性名和描述都是从配置文件中读出来的以支持国际化,比较有趣的是属性的描述的读取:

java 代码
  1. 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共用户选择。具体方法也将在以后的文章中描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值