八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  231 随笔 :: 0 文章 :: 2944 评论 :: 11 Trackbacks

假设在ecore模型里定义了两个类:产品(Product)和制造商(Manufacturer),Product通过名为manufacturer的多对一引用与Manufacturer建立关系。在应用程序里,有一些表格(TableViewer)需要在显示产品信息的同时,还要显示制造商相关信息,如制造商名称。缺省条件下,因为这些表格里每一行是一个Product实例,表格的文字更新由AdapterFactoryLabelProvider通过ProductItemProvider实现,所以在制造商名称被改变的时候产品表格无法得到更新。

当然可以直接调用viewer.refresh()方法刷新表格,但这要求具有对viewer的引用,况且我们不知道以后还会有多少个这样的viewer需要刷新。更好的解决办法是修改ProductItemProvider,让它维护一个Adapter(即EMF里的模型监听器),并把这个监听器注册到Product对应的Manufacturer实例上。监听器的注册可以在getText()方法里实现(也许有更合适的地方),别忘了在dispose()方法里要删除这个监听器。此外,要在.genmodel里把Product的Provider Type属性值从缺省的"Singleton"改为"Stateful",如下图,这样每个Product都对应一个ProductItemProvider实例,从而对应一个这样的监听器。


以下是ProductItemProvider里部分相关代码:

  //Define an adapter
    protected Adapter manufacturerAdapter =
         
new AdapterImpl()
         {
           
public void notifyChanged(Notification notification)
           {
             
//notify product viewers if manufacturer's name changed
             if (notification.getFeatureID(Manufacturer.class== ProductPackage.MANUFACTURER__NAME)
               fireNotifyChanged(
new ViewerNotification(notification, ProductItemProvider.this.getTarget(), falsetrue));
           }
         };

    
public String getText(Object object) {
        Product product 
= (Product) object;

        
//Add following codes to maintain the adapter
        Manufacturer manufacturer = product.getManufacturer();
        
if (manufacturer != manufacturerAdapter.getTarget()) {
            
if (manufacturerAdapter.getTarget() != null)
                manufacturerAdapter.getTarget().eAdapters().remove(manufacturerAdapter);
            
if (manufacturer != null)
                manufacturer.eAdapters().add(manufacturerAdapter);
        }

        String label 
= var.getName();
        
return label;
    }

  
//Remove adapter when ProductItemProvider disposes
    public void dispose() {
        
if (manufacturerAdapter.getTarget() != null)
            manufacturerAdapter.getTarget().eAdapters().remove(manufacturerAdapter);
        
super.dispose();
    }

 

最后,需要覆盖ProductItemProvider的notifyChanged()方法,在switch里增加如下代码:

case ProductPackage.Product__Manufacturer:
    fireNotifyChanged(
new ViewerNotification(notification, notification.getNotifier(), falsetrue));
    
return;

 

参考:http://dev.eclipse.org/newslists/news.eclipse.tools.emf/msg18730.html

posted on 2007-09-03 23:31 八进制 阅读(2410) 评论(4)  编辑 收藏 所属分类: EclipseEMF

评论

八进制你好,以前有问题总能在你 的博客里 找到答案,这几天遇到了 一个问题一直没 解决,希望你 有时间帮看一下:我们要做一个多页编辑器,一个页面为图形化的 一个是以xml显示显示的source页,就是每个图形要对应一个xml标签。可是现在得不到source页的 document,因为以后的 标签都要写到这个documen中,请给点代码提示
邮箱 huanxu200111572@yahoo.com.cn
  回复  引用    

#2楼  2007-09-16 10:05 jerry.xu [未注册用户]
问题已解决 ,谢谢

  回复  引用    

#3楼  2008-03-27 16:53 赵勇 [未注册用户]
请教八进制一个问题,在一个 EMF应用中,有一个treeviewer来显示一个巨大的EMF对象(很多item,很多层),当该EMF文件的大小在10M左右的时候,在treeviewer中的 drag and drop 操作会带来5秒左右的延时(该时间内CPU被耗尽),然后才能正确显示结果,查找原因,发现实在ItemProvider里面的notifyChanged方法中 有一行 code :
fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
本人是EMF新手,这个系统的原作者已经无法找到,我简单的注释掉这行代码,然后手工的刷新tree,问题就解决了。 我想问的是
1:就你所知,这样解决合适吗?因为我对EMF和该系统还不是很了解
2:本人不解的是:该行code引起了该model中所有的节点(至少有上万个)都被notify了,因此引起了CPU的占用,请问八进制能否给出一些解释和建议?
  回复  引用    

#4楼 [楼主] 2008-03-30 16:49 八进制      
我觉得需要找出为什么有那么多object都注册了这个事件,也许降低这个数字也能解决问题。
  回复  引用  查看