EMF.edit framework提供了一些可重用的类来帮助建立模型的editor.它提供了:
1.content provider,label provider,property source support等支持JFace 的类.
2.一个command framework
3.一个code generator
一.content provider----显示的数据内容,对应的label provider----数据的显示方式
JFace能使用任何java.lang.Object类型的对象,实现这点是通过content provider这个Adapter来实现的.content provider把任何对象都adapter成JFace能使用的对象,Adapter正好满足这个要求.这有点类似于将data bean与view bean之间的转换.如treeViewer使用的是实现了ITreeContentProvider接口的类(如 purchaseOrderItemProvider,这个类在生成的代码实现了IEditingDomainItemProvider,
IStructuredItemContentProvider,
ITreeItemContentProvider,
IItemLabelProvider,
IItemPropertySource)
IStructuredItemContentProvider,
ITreeItemContentProvider,
IItemLabelProvider,
IItemPropertySource)
![](https://p-blog.csdn.net/images/p_blog_csdn_net/kevinz26/122.jpg)
并且这个purchaseOrderItemProvider extends ItemProviderAdapter,在ItemProviderAdapter提供了几个接口的默认实现,其中就包含有ITreeItemContentProvider,所以在purchaseOrderItemProvider中就不用实现ITreeItemContentProvider的方法了.
XXXItemProviderAdapterFactory与YYYItemProvider见下图:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/kevinz26/1223.jpg)
在viewer层有AdapterFactoryContentProvider.它把ITreeContentProvider与ITreeItemContentProvider对应起来,代码如下:
public
Object [] getChildren(Object object)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// Get the adapter from the factory.
//
ITreeItemContentProvider treeItemContentProvider =
(ITreeItemContentProvider)adapterFactory.adapt(object, ITreeItemContentProviderClass);/*在XXXEditor中可以找到传递进来的adapterFactory是什么类型,进而跟踪到adapt的具体实现.这个object可以是EMF object也可以是非EMF object,一个item provider想让view显示一个non-EMF items只需返回任何这个non-EMF对象即可.(如getChildren()方法)*/
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Either delegate the call or return nothing.
//
return
(treeItemContentProvider != null ?
treeItemContentProvider.getChildren(object) :
Collections.EMPTY_LIST).toArray();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
也就是说AdapterFactoryContentProvider的作用就是将content provider methods分派给真正知道怎么服务请求的specific item provider (adapter).
二.label provider
其相关机制同content provider类似.也实现了接口IItemLabelProvider.
对前图进行扩充如下:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/kevinz26/33.jpg)
从XXXEditor.createPages()摘取小段代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
[
AdapterFactoryContentProvider]
在设置content Provider的同时,也给adapter factory(ComposedAdapterFactory)添加listener.也就是说ComposedAdapterFactory是notifier,而AdapterFacotryContentProvider做为监听这个notifier的listener.
什么地方被使用?
底层传递notification上来,到了XXXItemProviderAdapterFactory,里面会调用一个parentAdapterFatory.fireChangeNotifier()(这个parentAdapterFactory就是ComposedAdapterFatory类型)
ComposedAdapterFactory构建过程
[XXXEditor.constructor]
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
[ComposedAdapterFactory]
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
public void addListener(INotifyChangedListener notifyChangedListener)
{
changeNotifier.add(notifyChangedListener);//该addListener方法在这里被调用
}
{
changeNotifier.add(notifyChangedListener);//该addListener方法在这里被调用
}
public void fireNotifyChanged(Notification notification)
{
changeNotifier.fireNotifyChanged(notification);
{
changeNotifier.fireNotifyChanged(notification);
if (parentAdapterFactory != null)
{
parentAdapterFactory.fireNotifyChanged(notification);
}
}
{
parentAdapterFactory.fireNotifyChanged(notification);
}
}