EMF-edit功能解析

1.      EMF.edit

a)        说明:EMF.edit位于EMF.editorEMF.Ecore之间,他起了一个中介者的作用。他负责把来自EMF.editorUI相关的请求转换成符合EMF.EcoreUI无关的调用。他需要提供以下四个功能:实现用于支持Viewer显示的ContentProviderLabelProvider;实现用于支持属性显示的IPropertySource;实现用于支持对模型进行操作的Command Framework;实现用于支持修改通知的Framework

 

b)        ContentProviderLabelProvider

                      i.              图:

                   ii.              说明:当TreeViewer需要显示内容时,调用她的IContentProvidergetChildren(Object obj)方法。这个方法会被转发到AdapterFactoryContentProvider内部。她通过她所引用的ItemProviderAdapterFactory来获取一个对objITreeItemContentProvider类型的Adapter,这个Adapter是由EMF生成的对应于ECore模型的一个ItemProviderAdapter(这里为TeacherItemProvider),最后由这个TeacherItemProvider负责生成所需要显示的子节点列表。

 

                iii.              代码:

public class AdapterFactoryContentProvider 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需要显示属性内容时,他访问他的IPropertySourceProvidergetPropertySource(Object obj)方法。这个方法会被转发到AdapterFactoryContentProvider内部。她通过她所引用的ItemProviderAdapterFactory来获取一个对objIItemPropertySource类型的Adapter,这个Adapter是由EMF生成的对应于ECore模型的一个ItemProviderAdapter(这里为TeacherItemProvider),最后由这个TeacherItemProvider负责生成所需要显示的属性列表。

                iii.              代码:

public class AdapterFactoryContentProvider 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对象,该方法最后会被转发到domaincreateCommand(),然后domain会根据他所引用的ItemProviderAdapterFactory来获取一个IEditingDomainItemProvider的适配器,由他来最后生成用于对模型进行操作的Command对象。

 

                iii.              代码:

public class DeleteAction extends CommandActionHandler{

public Command createCommand(Collection selection){

return RemoveCommand.create(domain, selection);

}

}

public class RemoveCommand extends AbstractOverrideableCommand{

public static Command create(…){

return domain.createCommand(…);

}

}

public class AdapterFactoryEditingDomain implements EditingDomain{

public Command createCommand(…){

IEditingDomainItemProvider editingDomainItemProvider =

(IEditingDomainItemProvider)adapterFactory.adapt(owner,

IEditingDomainItemProvider.class);

return editingDomainItemProvider.createCommand(…);

}

}

注:当需要执行命令时,editor会调用EditingDomain上的CommandStack,并调用他上面的execute(Command c)方法。

 

e)        Notify Framework

                      i.              图:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值