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)

并且这个purchaseOrderItemProvider extends ItemProviderAdapter,在ItemProviderAdapter提供了几个接口的默认实现,其中就包含有ITreeItemContentProvider,所以在purchaseOrderItemProvider中就不用实现ITreeItemContentProvider的方法了.
XXXItemProviderAdapterFactory与YYYItemProvider见下图:

在viewer层有AdapterFactoryContentProvider.它把ITreeContentProvider与ITreeItemContentProvider对应起来,代码如下:
public
Object [] getChildren(Object object)

...
{
// 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()方法)*/

// Either delegate the call or return nothing.
//
return
(treeItemContentProvider != null ?
treeItemContentProvider.getChildren(object) :
Collections.EMPTY_LIST).toArray();
}















也就是说AdapterFactoryContentProvider的作用就是将content provider methods分派给真正知道怎么服务请求的specific item provider (adapter).
二.label provider
其相关机制同content provider类似.也实现了接口IItemLabelProvider.
对前图进行扩充如下:

从XXXEditor.createPages()摘取小段代码如下:



[
AdapterFactoryContentProvider]
在设置content Provider的同时,也给adapter factory(ComposedAdapterFactory)添加listener.也就是说ComposedAdapterFactory是notifier,而AdapterFacotryContentProvider做为监听这个notifier的listener.
什么地方被使用?
底层传递notification上来,到了XXXItemProviderAdapterFactory,里面会调用一个parentAdapterFatory.fireChangeNotifier()(这个parentAdapterFactory就是ComposedAdapterFatory类型)
ComposedAdapterFactory构建过程
[XXXEditor.constructor]





[ComposedAdapterFactory]









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);
}
}