FROM:http://blog.youkuaiyun.com/nickcen/archive/2005/04/14/346859.aspx
1.
EMF.edit
a)
说明:
EMF.edit
位于
EMF.editor
和
EMF.Ecore
之间,他起了一个中介者的作用。他负责把来自
EMF.editor
的
UI
相关的请求转换成符合
EMF.Ecore
的
UI
无关的调用。他需要提供以下四个功能:实现用于支持
Viewer
显示的
ContentProvider
和
LabelProvider
;实现用于支持属性显示的
IPropertySource
;实现用于支持对模型进行操作的
CommandFramework
;实现用于支持修改通知的
Framework
。
b)
ContentProvider
和
LabelProvider
i.
图:

ii.
说明:当
TreeViewer
需要显示内容时,调用她的
IContentProvider
的
getChildren(Object obj)
方法。这个方法会被转发到
AdapterFactoryContentProvider
内部。她通过她所引用的
ItemProviderAdapterFactory
来获取一个对
obj
的
ITreeItemContentProvider
类型的
Adapter
,这个
Adapter
是由
EMF
生成的对应于
ECore
模型的一个
ItemProviderAdapter
(这里为
TeacherItemProvider
),最后由这个
TeacherItemProvider
负责生成所需要显示的子节点列表。
iii.
代码:
public classAdapterFactoryContentProvider implements ITreeContentProvider {
public Object []getChildren(Object object)
{
ITreeItemContentProvider treeItemContentProvider =
(ITreeItemContentProvider)adapterFactory.adapt(object,
ITreeItemContentProvider.class
);
return treeItemContentProvider.getChildren(object);
}
}
注:红色是
UI
相关的请求,蓝色是
UI
无关的适配器类,粉红色就是
UI
无关的请求。
c)
IPropertySource
i.
图:

ii.
说明:当
PropertySheetPage
需要显示属性内容时,他访问他的
IPropertySourceProvider
的
getPropertySource(Object obj)
方法。这个方法会被转发到
AdapterFactoryContentProvider
内部。她通过她所引用的
ItemProviderAdapterFactory
来获取一个对
obj
的
IItemPropertySource
类型的
Adapter
,这个
Adapter
是由
EMF
生成的对应于
ECore
模型的一个
ItemProviderAdapter
(这里为
TeacherItemProvider
),最后由这个
TeacherItemProvider
负责生成所需要显示的属性列表。
iii.
代码:
public classAdapterFactoryContentProvider implements IPropertySourceProvider{
public IPropertySource getPropertySource(Object object){
IItemPropertySource itemPropertySource =(IItemPropertySource)
adapterFactory.adapt(object,IItemPropertySource.class));
…
}
}
d)
Command Framework
i.
图:

ii.
说明:由于
EMF.editor
并不了解底层的模型细节,因此他不能直接对模型进行操作,他需要生成一些用于操作模型的
Command
对象。当
editor
需要对模型进行修改时,他通过调用他的
createCommand(EditingDomain domain)
方法,创建用于进行模型操作的
Command
对象,该方法最后会被转发到
domain
的
createCommand()
,然后
domain
会根据他所引用的
ItemProviderAdapterFactory
来获取一个
IEditingDomainItemProvider
的适配器,由他来最后生成用于对模型进行操作的
Command
对象。
iii.
代码:
public class DeleteAction extendsCommandActionHandler{
public CommandcreateCommand(Collection selection){
returnRemoveCommand.create(domain, selection);
}
}
public class RemoveCommand extendsAbstractOverrideableCommand{
public static Commandcreate(…){
return domain.createCommand(…);
}
}
public classAdapterFactoryEditingDomain implements EditingDomain{
public CommandcreateCommand(…){
IEditingDomainItemProvider editingDomainItemProvider =
(IEditingDomainItemProvider)adapterFactory.adapt(owner,
IEditingDomainItemProvider
.class);
returneditingDomainItemProvider.createCommand(…);
}
}
注:当需要执行命令时,
editor
会调用
EditingDomain
上的
CommandStack
,并调用他上面的
execute(Command c)
方法。
e)
Notify Framework
i.
图:

ii.
说明:当我们修改了模型的值以后,模型将会向他对应的
ItemProvider
发出一个更新通知,这个通知随后被转发到
ItemProviderAdapterFactory
,然后最终发到
AdapterFactoryContentProvider
处,并由他来负责更新对应的
viewer
。