EMF学习笔记5——模型变动通知

当我们使用TableViewer或TreeViewer时,每当其input值发生改变,通常要调用视图的refresh方法来执行刷新操作,而使用EMF模型作为视图组件的文本提供器和标签提供器,却可以省略refresh操作。

当构建AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象时,需要传入所需要的适配器工厂类,该适配器工厂类实现了IChangeNotifier接口定义的3个方法,起到了监听器的作用:
addListener(INotifyChangedListener notifyChangedListener):添加监听者
removeListener(INotifyChangedListener notifyChangedListener):删除监听者
fireNotifyChanged(Notification notification):对监听者执行通知操作

而同时AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象都实现了INotifyChangedListener接口,因此在构造方法中,便可将自己注册成为适配器工厂类的监听者:
public AdapterFactoryContentProvider(AdapterFactory adapterFactory){ this.adapterFactory = adapterFactory; if (adapterFactory instanceof IChangeNotifier){ ((IChangeNotifier)adapterFactory).addListener(this);//将自己注册成为adapterFactory的监听者 } }
这样,当适配器工厂类执行fireNotifyChanged方法时,便可将模型改变通知到AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象,执行它们的notifyChanged()方法:
public void notifyChanged(Notification notification){ if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()){ if (notification instanceof IViewerNotification){ if (viewerRefresh == null){ viewerRefresh = new ViewerRefresh(viewer); } if (viewerRefresh.addNotification((IViewerNotification)notification)){ viewer.getControl().getDisplay().asyncExec(viewerRefresh); } } else{ NotifyChangedToViewerRefresh.handleNotifyChanged(viewer,notification.getNotifier(),notification.getEventType(), notification.getFeatur(),notification.getOldValue(),notification.getNewValue(),notification.getPosition()); } } }

由代码可以看出AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象还记录了它们所对应的视图viewer,并在notifyChanged方法中对视图执行了刷新操作。

然而回到上一步,适配器工厂类的fireNotifyChanged方法又是在什么时候触发的呢?

当EMF实体类的类结构发生变化时(如:对某一个属性执行了set方法),会调用eNotify(Notification notification)方法来触发其适配器类的通知操作:
public void eNotify(Notification notification){ Adapter[] eAdapters = eBasicAdapterArray();//返回该实体类所有的适配器类 if (eAdapters != null && eDeliver()){ for (int i = 0, size = eAdapters.length; i < size; ++i) { eAdapters[i].notifyChanged(notification);//执行适配器类的notifyChanged方法。 } } }

而EMF模型适配器类的构造函数中同样传入了adapterFactory适配器工厂类,这样在模型适配器类的notifyChanged方法中,便可进行如下处理:
if (adapterFactory instanceof IChangeNotifier){ IChangeNotifier changeNotifier = (IChangeNotifier)adapterFactory; changeNotifier.fireNotifyChanged(notification); }

以此来触发适配器工厂类的fireNotifyChanged方法。
整个模型改变通知的类图大致如下:

EMF学习笔记5——模型变动通知_第1张图片

1、当模型实体类Company的类结构发生变化时,会触发其适配器类(CompanyItemProvider)的notifyChange()方法;
2、模型适配器类会调用其适配器工厂类的fireNotifyChanged方法,来触发监听器的通知;
3、适配器工厂类对它的监听者(AdapterFactoryContentProvider)进行通知,执行他们的notifyChanged方法;
4、AdapterFactoryContentProvider对象中会执行视图的刷新操作。

你可能感兴趣的:(null,input)