继续学习八进制的blog.
如何使用自定义类型?
Annotated Java模式使用自定义类型很简单:
Step 1. 添加注解。对blog里的例子,就是为Product接口添加
/**
* @model
*/
RGB getRGB();
Step 2. 更新ecore模型和genmodel模型。由于没有找到直接更新这些模型的手段,目前我是重新生成一个新的genmodel,这步操作会自动更新ecore模型。这样原来的genmodel里面的和ecore模型相关的部分也就自动更新了,而其他部分(如edit部分)维持不变,从而可以保留住以前做的genmodel模型更改。
Step 3. 重新Generate Model Code.
Step 4. 修改自定义类型的持久化代码。
修改工厂类里的 createXXXFromString() 和 convertXXXToString() 方法。
如何使用EMap?
不知道怎样用Annotated Java实现,先放着。
.Edit介绍
.Edit项目里包含一个ItemProviderAdapterFactory类和一组 ItemProviderAdapter的子类,后者是和核心模型的接口一一对应的。
一个例子:NamedElementItemProvider extends ItemProviderAdapter
implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource
另一个例子:ProductItemProvider extends NamedElementItemProvider implements ...
继承关系与模型的继承关系保持一致。
这些ItemProvider具有以下几个作用:
1. 实现了JFace中ContentProvider和LabelProvider的功能。
不再需要手工为不同的tree或是table创建ContentProvider与LabelProvoder.
2. 提供了关联对象的属性表。
每个ItemProvider的getPropertyDescriptors()方法返回在属性视图里显示的属性列表,列表里的每个元素是一个 ItemPropertyDescriptor对象,它决定了每个属性的标签、描述、图标以及是否可编辑。EMF生成的代码会帮我们把模型定义里的每个属性都显示在属性列表里,如果希望隐藏某些属性,可以通过修改这个方法移除之。
3. 生成编辑模型的各种命令。
为了实现Undo/Redo功能,对模型的每个改变都应该使用Command实现,然后把 Command保存在Command栈里,每个Command对象保存Undo/Redo自己的信息。
在ItemProviderAdapter基类里有很多createXXXCommand()方法。它相当于一个生产这些Command的工厂,用户对模型编辑的请求都将通过它转换为对应的Command。
4. 将模型的改变通知到负责显示模型的视图。
在一个Eclipse应用程序里经常会有很多个查看器显示模型,无论用户怎样修改模型,要让这些查看器里显示的内容总是当前的模型,最好的办法是让查看器能够响应模型的变化。ItemProvider作为监听器可以很好的完成这个任务。
模型发生改变时,与被修改的对象相关联的ItemProvider的notifyChanged()方法被调用,事件立即被通知给 ItemProviderAdapterFactory,后者是整个模型的事件处理机构,所有的ItemProvider都是通过 ItemProviderAdapterFactory创建并注册为监听器的,因此ItemProviderAdapterFactory可以把事件通过 fireNotifyChanged()通知给所有这些监听器的notifyChanged()方法去消化。