`
yiliner
  • 浏览: 214526 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《EMF:》读书笔记第三章 :Model Editing with EMF.Edit(上)

    博客分类:
  • EMF
阅读更多

本书的第二章介绍了EMF产生的Model部分的代码,你可以使用EMF Edit Framework来为model构建功能强大的视图和编辑器。在EMF为你生成的编辑器里,可以编辑(复制,粘贴,拖拽等)、显示model,还可以无 限的redo/undo。如果这个编辑器不能完全满足你的需求,你可以在此基础上做一些修改,肯定比从头开始写节约时间。
    Eclipse通过JFace中的一些Viewer来显示结构化的数据,这些Viewer不直接从model中获取要显示的数据,而是通过 ContentProvider和LabelProvider来取得要显示的内容、文本以及图标等信息。不同的Viewer需要不同的 ContentProvider和LabelProvider:
   

 Viewer ContentProvider LabelProvider
 ListViewer
IStructureContentProvider 
ILabelProvider
 TreeViewer ITreeContentProvider
ILabelProvider
 TableViewer IStructureContentProvider
ITableLabelProvider

    其中ILabelProvider有getText(Object)和getImage(Object)两个方 法,ITableLabelProvider有getColumnText(Object, int)和getColumnImage(Object,int)两个方法,它们之间没有继承关系。IStructureContentProvider 有getElements(Object)方法,返回一个Object数组,而ITreeContentProvider是其子类,另有自己的方法 getChildren(Object),getParent(Object)和hasChildren(Objecct)三个方法。
    EMF Edit是把Eclipse UI Framework(JFace)和EMF Framework连接起来的桥梁,包括两部分,其中org.eclipse.emf.edit是与UI无关的部 分,org.eclipse.emf.edit.ui是与UI有关的部分。前一部分主要包括ItemProvider和Commmand。
    1.Item Providers
   
item provider,这个名字来源于它为模型中各个可编辑的"items"(对象)"provides"功能。它通常是EMF Adapters,但是也可以不是。They are used to adapt model objects so the model object can provide all of the interfaces that it needs to be viewed and edited.
    item provider主要有四个功能:作为content和label provider; 为EMF对象提供property source; 担当Command Factory; 将EMF模型的变化通知发送给Viewer。每个item provider可以实现上述全部功能或者部分功能,通常情况下,item provider通过继承EMF Edit的基类ItemProviderAdapter 来实现全部的功能。下面分别介绍这四个功能各自需要哪些方法的支持:
   
    (1)Content and label item providers
    EMF.Edit分别通过AdapterFactoryContentProvider和AdapterFactcoryLabelProvider来提 供content provider和label provider的功能,这两个类的构造函数都需要一个adapter factory(EMF生成的edit部分代码中的**ItemProviderAdapterFactory,负责为特定的类型创建或者定位 adapter),它们的很多方法都通过分发到相应的Item Provider来实现。比如getChildren()的实现如下:

<!---->   public   boolean  hasChildren(Object object)
  {
    
//  Get the adapter from the factory.
    ITreeItemContentProvider treeItemContentProvider  =  
      (ITreeItemContentProvider)adapterFactory.adapt(object, ITreeItemContentProviderClass);

    
//  Either delegate the call or return nothing.
     return  
      treeItemContentProvider 
!=   null    &&  
        treeItemContentProvider.hasChildren(object);
  }

    EMF.Edit为模型中的每个类生成一个**ItemProvider类,负责为UI的显示提供具体的实现。每个类在默认情况下都实现了5个接口,其中 的三个IStructuredItemContentProvider(为ListViewer和TableViewer提供 contentProvider), ITreeItemContentProvider(为TreeViewer提供 contentProvider),IItemLabelProvider(为TreeViewer和ListViewer提供 labelProvider)是支持这一功能的.
    如果我们要用TableViewer显示订单(模型中对应PurchaseOrder类),那么应该修改 PurchaseOrderItemProvider,使它实现ITableItemLabelProvider,同时实现方法 getColumnText和getColumnImage。还要在为该模型生成的POItemProviderAdapterFactory类的构造函 数中添加对ITableItemLabelProvider的支持:

<!---->...
supportedTypes.add(ITableItemLabelProvider.
class );

   
    (2)Item Property Source
    当打开PropertySheet时,AdapterFactoryContentProvider还是通过adapterFactory找到相应的实现 了IItemPropertySource接口的item Provider。EMF.Edit中的PropertySource类实现了这一接口,因此 AdapterFactoryContentProvider返回PropertySource的一个新创建的实例(作为被选中的item provider的wrapper)给PropertySheet,PropertySource把很多方法的实现分发给了 itemPropertySource。其代码如下:

<!---->public  IPropertySource getPropertySource(Object object)
  {
    
if  (object  instanceof  IPropertySource)
    {
      
return  (IPropertySource)object;
    }
    
else
    {
      IItemPropertySource itemPropertySource 
=
        (IItemPropertySource)
          (object 
instanceof  EObject  &&  ((EObject)object).eClass()  ==   null   ?
            
null  :
            adapterFactory.adapt(object, IItemPropertySourceClass));
  
      
return  
        itemPropertySource 
!=   null   ?   createPropertySource(object, itemPropertySource) :  null ;
    }
  }

  
protected  IPropertySource createPropertySource(Object object, IItemPropertySource itemPropertySource)
  {
    
return   new  PropertySource(object, itemPropertySource);
  }

    自动生成的**ItemProvider实现的5个接口中的IItemPropertySource就是支持这一功能的, 其中getPropertyDescriptors()方法返回的列表决定了PropertySheet中显示的内容列表。
   
    (3)Command Factory
    EMF.Edit提供了修改EMF对象(可以undo)的整套机制,并且提供了一些通用的命令。自动生成的**ItemProvider实现的5个接口中 还没提到的IEditingDomainItemProvider就是支持这一功能的。EMF.Edit的Command Framework需要EditngDomain接口,其中类AdapterFactoryEditingDomain如同前面提到的 AdapterFactoryContentProvider和AdapterFactoryLabelProvider,它负责把相应的方法(比如 getChildren(),getParent()等)分发给实现了IEditingDomainItemProvider的Item Provider。
   
    (4)Change Notification
    当**ItemProvider所adapt的对象状态发生变化时,**ItemProvider会收到Notification,其 NotifyChanged()会被调用。ItemProvider作为Observer负责过滤不相关的事件,然后把相关的事件传递给模型的 central change notifier,通常是实现了IChangeNotifier接口的**ItemProviderAdapterFactory。
    当我们在PropertySheet中修改Item(订单项,在模型中对应Item类)的名字时,首先ItemPropertyDescriptor的 setPropertyValue()方法被调用,它会通过SetCommand修改名字或者直接调用Item的eSet(),总之这两种方法都会调用到 ItemImpl的setName()方法,该方法中判断是否需要发送通知,如果需要,则向所有监听item对象的adapter发送通知(即调用它们的 notifyChanged()方法),这些adapter包括ItemItemProvide,它的notifyChanged()方法调用 POItemProviderAdapterFactory(IChangeNotifier类型)的fireNotifyChanged()方法,然后 再调用所有注册的listener的fireNotifyChanged()。这些listener可能是PropertySheet,Outline视 图中的TreeViewer等,收到通知后,更新视图以反映model的变化。当有事件发生需要通知JFace的Viewer时,真正的listener 并不是viewer本身,而是它的content provider。

    EMF.Edit的另一部分重要内容Command Framework留到下一部分介绍。

分享到:
评论

相关推荐

    EMF 自学笔记5

    ### EMF自学笔记知识点详述 #### 一、EMF框架概述 EMF(Eclipse Modeling Framework)是Eclipse项目中的一个子项目,它提供了一套用于构建模型驱动的开发工具和应用程序的框架。EMF的主要目标是简化元数据驱动应用...

    EMF Eclipse Modeling Framework 第二版

    ### EMF Eclipse Modeling Framework 第二版 #### 一、概述 《EMF Eclipse Modeling Framework》第二版是由 Dave Steinberg、Frank Budinsky、Marcelo Paternostro 和 Ed Merks 四位专家编写的权威指南。本书是...

    eclipse的emf插件

    3. **持久性**:EMF支持将模型对象序列化为XML文件,使得模型数据可以在不同时间点保存和恢复,同时也方便了跨系统数据交换。 4. **图形用户界面(GUI)编辑器**:EMF提供了一个框架,可以快速构建基于模型的图形...

    EMF.rar_emf

    3. **EMF的使用场景** - **软件建模**:EMF广泛应用于UML(统一建模语言)和其他业务流程建模,帮助开发者以模型为中心进行系统设计。 - **数据交换**:通过XML或其他格式,EMF可以实现不同系统间的数据交换和集成...

    org.eclipse.emf.ant_2.1.0.jar

    org.eclipse.emf.ant_2.1.0.jarorg.eclipse.emf.ant_2.1.0.jarorg.eclipse.emf.ant_2.1.0.jarorg.eclipse.emf.ant_2.1.0.jar

    emf文件格式详解

    **微软EMF文件格式详解.pdf**:这份文档很可能是微软官方或第三方专家提供的关于EMF格式的详细指南。通常,它会涵盖EMF的基本结构、记录类型、图形操作、颜色管理、图元定义等内容。通过阅读这份文档,读者可以了解...

    EMF.rar_site:www.pudn.com

    3. **EclipseModelingFramework.doc**:介绍了Eclipse建模框架的总体架构和主要功能,可能是对EMF的入门教程。 4. **JaMoPP中文文档.doc**:提供了JaMoPP的中文指南,帮助用户理解和使用JaMoPP进行模型驱动的开发。 ...

    svg2emf:自动从code.google.compsvg2emf导出

    svg2emf 自动从code.google.com/p/svg2emf导出 使用蜡染和FreeHEP VectorGraphics库将SVG(可缩放矢量图形)文件转换为EMF(增强型元文件)文件 public void testConvert() throws IOException { String svgUrl = ...

    imdb2emf:将 IMDb 电影数据库解析为 EMF 模型

    imdb2emf:创建 EMF 模型或 TGraphs 的 IMDb 解析器这个小工具从 IMDb 文件创建一个 EMF 模型(或 )。用法您可以克隆这个存储库并安装 Leiningen 来解析 IMDb 文件,也可以下载一个没有依赖项的预编译 JAR。用法:...

    将EMF图片格式转换成PNG

    3. **运行和测试**:编译并运行这个Java程序,确保它正确地将EMF转换为PNG。你可以在Eclipse中直接运行,或者创建一个批处理脚本来调用Java可执行文件。 转换过程中可能会遇到的问题包括兼容性问题、文件路径问题、...

    EMF文件提取文本,预览,打印

    3. **打印**:EMF文件设计用于打印目的,因为它们可以精确地控制打印质量和细节。将EMF文件发送到打印机涉及将文件中的图形指令翻译成打印机语言,例如PCL或PostScript。这通常通过打印机驱动程序完成,该驱动程序...

    Emf2Png.zip

    3. **转换步骤**: - **加载EMF**:首先需要使用Image.FromFile()方法加载EMF文件到内存中,创建一个Image对象。 - **创建Bitmap对象**:然后,创建一个新的Bitmap对象,设置它的大小为EMF图像的尺寸。 - **创建...

    EMF模型文件对比/比较(emf.compare)

    3. **Guice** 是一个轻量级依赖注入框架,用于简化Java应用的构造和管理。 4. **Gson** 是一个将Java对象转换为JSON字符串,反之亦然的库,非常适用于数据序列化和反序列化。 5. **GWTORM** 和 **GWTJSONRPC** 可能...

    微软emf文件格式详解

    3. **对象表**:记录了所有使用的绘图对象,如笔、刷子等,以及它们的属性设置。 #### 四、EMF格式的应用场景 由于EMF格式的优良特性,它在多个领域得到了广泛应用: - **桌面出版系统**:EMF格式非常适合用于桌面...

    GEF快速入门教程和EMF教程

    3. **视图 (View)**: - 视图层通过`EditPart`来呈现模型。`EditPart`可以包含其他`EditPart`以形成层次化的视图。 - 使用`Draw2D`工具包进行实际的图形绘制。 ### 实现步骤 1. **创建包**: - 在项目中创建三个...

    Eclipse-EMF-GEF资料.rar

    3. **EMF-Edit**: "EMF-edit功能解析.doc" 详细阐述了 EMF-Edit,它是 EMF 集成的一部分,提供了构建图形编辑器的基础。EMF-Edit 允许开发者快速创建与 Ecore 模型相关的图形界面,以直观地操纵和展示模型数据。 4....

Global site tag (gtag.js) - Google Analytics