`

如何使EMF模型对应的编辑控件能处理Undo&Redo操作

阅读更多

在EMF自动生成的editor中,只提供了TreeViewer作为编辑控件,自动生成的代码能让TreeViewer处理Redo&Undo操作,如果还需要对EMF对应的Attribute使用Text, Combo等Widget进行编辑的话,那么如何将这些Widget的编辑也能实现Undo&Redo操作呢?

首先我们来分析一下,对于TreeViewer是如何实现Redo&Undo操作的,在生成的editor代码中有类似这样的一句(这个是我改写后的,实际生成的可能有所区别):为了只针对Redo&Undo对UI进行更新,还需要对RedoAction和UndoAction做进一步处理:
其做法就是要让editor知道当前的Action,然后在修改UI的时候,取得该Action看是否是我们指定的Action(RedoAction&UndoAction).

java 代码
  1. viewer.setContentProvider(new AdapterFactoryContentProvider(   
  2.                 getAdapterFactory()));  

AdapterFactoryContentProvider实现了INotifyChangedListener接口,该接口就是用来处理在EMF模型发生变动时,如何更新绑定的UI控件:

java 代码
  1. public void notifyChanged(Notification notification)   
  2.   {   
  3.     if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed())   
  4.     {   
  5.       // If the notification is an IViewerNotification, it specifies how ViewerRefresh should behave.  Otherwise fall   
  6.       // back to NotifyChangedToViewerRefresh, which determines how to refresh the viewer directly from the model   
  7.       // notification.   
  8.       //   
  9.       if (notification instanceof IViewerNotification)   
  10.       {   
  11.         if (viewerRefresh == null)   
  12.         {   
  13.           viewerRefresh = new ViewerRefresh(viewer);   
  14.         }   
  15.   
  16.         if (viewerRefresh.addNotification((IViewerNotification)notification))   
  17.         {   
  18.           viewer.getControl().getDisplay().asyncExec(viewerRefresh);   
  19.         }   
  20.       }   
  21.       else  
  22.       {   
  23.         NotifyChangedToViewerRefresh.handleNotifyChanged(   
  24.           viewer,   
  25.           notification.getNotifier(),   
  26.           notification.getEventType(),   
  27.           notification.getFeature(),   
  28.           notification.getOldValue(),   
  29.           notification.getNewValue(),   
  30.           notification.getPosition());   
  31.       }   
  32.     }   
  33.   }  

再看代码:

java 代码
  1. public AdapterFactoryContentProvider(AdapterFactory adapterFactory)   
  2.   {   
  3.     this.adapterFactory = adapterFactory;   
  4.   
  5.     if (adapterFactory instanceof IChangeNotifier)   
  6.     {   
  7.       ((IChangeNotifier)adapterFactory).addListener(this);   
  8.     }   
  9.   }  

这里关键的一句就是:

java 代码
  1. ((IChangeNotifier)adapterFactory).addListener(this);  

它将更新UI的通知操作与adapterFactory关联起来,然后在EMF模型发生变动的时候,会从adapterFactory来找到所有注册的INotifyChangedListener
因此做法就相当简单了,即将EMF模型对应的编辑控件实现INotifyChangedListener接口,然后拿到adapterFactory,并把该控件注册进去.
下面我的一个实现:
AbstractDoradoSection包含了EMF模型当前节点属性的对应编辑控件集合,让其实现INotifyChangedListener接口

并在构造函数中注册到adapterFactory中:

java 代码
  1. public AbstractDoradoSection(IAdaptable adaptable, Object input,   
  2.             Composite parent, String title, int style) {   
  3.         this.adaptable = adaptable;   
  4.         this.input = input;   
  5.         this.title = title;   
  6.         this.style = ExpandableComposite.TITLE_BAR | style;   
  7.   
  8.         AdapterFactory adapterFactory = (AdapterFactory) adaptable   
  9.                 .getAdapter(AdapterFactory.class);   
  10.         ((IChangeNotifier) adapterFactory).addListener(this);   
  11.   
  12.         initialize(parent);   
  13.     }  
Redo&Undo更新UI处理:
java 代码
  1. /**  
  2.  * 当emf模型发生变化之后,更新ui,主要针对redo和undo处理  
  3.  *   
  4.  * @see org.eclipse.emf.edit.provider.INotifyChangedListener#notifyChanged(org.eclipse.emf.common.notify.Notification)  
  5.  */  
  6. public void notifyChanged(final Notification notification) {   
  7.     IActionProvider actionProvider = (IActionProvider) adaptable   
  8.             .getAdapter(IActionProvider.class);   
  9.     if (actionProvider.getAction() instanceof NotifierAction) {   
  10.         Object feature = notification.getFeature();   
  11.         if (feature instanceof EAttribute && rows != null) {   
  12.             for (Iterator iter = rows.iterator(); iter.hasNext();) {   
  13.                 final AttributeRow row = (AttributeRow) iter.next();   
  14.                 if (row.getAttribute() == feature) {   
  15.                     row.setTextContent(notification.getNewStringValue(), true);   
  16.                     break;   
  17.                 }   
  18.             }   
  19.         }   
  20.     }   
  21. }  
分享到:
评论

相关推荐

    emf eclipse

    文件“如何使EMF模型对应的编辑控件能处理Undo&Redo操作”则揭示了一个常见需求,即在模型编辑中实现撤销/重做功能,这是任何用户友好的编辑环境中的重要特性。 在EMF中,模型的改变通常会触发事件,这些事件可以被...

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

    EMF是Eclipse项目中的一个子项目,它提供了一种创建、操作和共享复杂的领域特定语言(DSL)模型的框架。EMF.compare允许用户比较两个EMF模型实例,识别它们之间的差异,并可选择性地合并这些差异。 这篇博客文章...

    EMF 自学笔记5

    这些编辑器支持模型实例的创建、修改和查看,使开发者能够直观地操作模型数据。 EMF还支持模型验证,可以检查模型实例是否符合模型定义的约束。EMF验证规则可以通过EMF自身的DSL定义,也可以通过外部DSL定义。验证...

    EMF读取XML

    在处理XML数据时,EMF提供了一种高效且灵活的方式,能够将XML文档转换为可操作的对象模型,进而进行读取、解析和编辑。下面将详细介绍EMF读取XML的相关知识点。 1. **EMF模型与XML的关系** - EMF模型是面向对象的...

    eclipse emf&gef

    - **高级编辑器支持**:EMF还支持图形化编辑器,帮助开发者更直观地操作模型数据。 **1.1.3 文档和资源** EMF的官方文档和相关资源可以在Eclipse官方网站上找到,包括用户指南、开发指南和技术文档等。 ##### 1.2...

    使用EMF开发基于模型的Eclipse插件

    2. **EMF.Edit**:这部分建立在Ecore之上,提供了一组用于查看和修改模型的方法,还包括了一个内置的模型编辑器,使得开发人员可以直接在Eclipse环境中对模型进行操作。 #### EMF的适用场景 EMF非常适合于那些需要...

    Eclipse Modeling Framework (EMF) Developer Guide

    此外,还可以使用 EMF 的资源框架来管理模型实例的加载和保存操作。 #### 2. EMF 编辑框架程序员指南 **EMF Edit Framework Programmer's Guide** 重点介绍了如何使用 EMF 创建用户界面,以便编辑和查看 EMF 模型...

    emf教程入门和插件

    通过实际操作,你会学习如何创建一个简单的Ecore模型,生成对应的Java代码,然后使用这些代码创建和操作模型实例。此外,你还将了解如何利用EMF插件进行模型的比较和可视化。 8. **最佳实践** 学习EMF的同时,...

    基于eclipse的EMF插件开发图形化编辑程序

    它们通常包括图形视图、编辑器和控制器,提供拖放、连线和其他直观的交互方式,使得非程序员也能理解和操作模型。 开发基于EMF的图形化编辑程序涉及以下步骤: 1. **定义模型**:首先,你需要定义你的模型结构,这...

    emf-xsd-SDK-2.6.1

    Visual Editor是基于EMF和GEF构建的,专门用于创建可视化的模型编辑器。它提供了一系列预定义的组件和工具,可以快速构建出具有拖放、连接线、属性编辑等功能的图形界面,大大简化了创建复杂编辑器的工作。 在"emf-...

    深入理解EMF&graphiti

    在“深入理解EMF&graphiti”教程中,你可能会学习到如何使用EMF来定义和操作模型,如何利用Ecore生成相应的Java代码,以及如何将这些模型与数据库或其他系统集成。同时,教程还会涵盖Graphiti的基本概念,如图形化的...

    EMF、GEF、VE 适合于Eclipse 3.2.0

    通过结合EMF,开发者可以轻松地将数据模型转化为可交互的图形表示,使得用户能够直观地操作和编辑模型。 VE,即Visual Editor,是Eclipse的一种可视化编辑器,它主要针对Java应用程序的开发。VE 提供了一种拖放式的...

    emf-sdo-xsd-SDK-2.3.2.zip

    - **可视化编辑**:利用SDK中的GUI组件,开发者可以构建可视化的模型编辑器,让用户以图形化方式操作和修改数据模型。 总的来说,"emf-sdo-xsd-SDK-2.3.2.zip"是一个强大的工具,它结合了EMF的模型驱动开发能力、...

    emf-runtime-2.7.2

    5. **图形单元(Graphical User Interface, GUI)支持**:EMF与Eclipse的GMF(Graphical Modeling Framework)结合,可以生成基于模型的图形编辑器,使模型的可视化和编辑变得更加直观。 6. **版本控制**:EMF模型...

    java开发工具EMF插件

    5. 编写应用程序:使用生成的Java类进行编程,利用EMF提供的API操作模型。 总结,Java开发工具EMF插件是Eclipse IDE中的一个强大工具,它简化了模型驱动开发的过程,提高了开发效率。无论是进行软件设计、数据库...

    EMF开发过程整合资料

    5. **编辑器(Editor)**:EMF提供了用于创建图形化或文本编辑器的工具,使用户可以直观地编辑模型实例。 6. **转换(Transformation)**:EMF支持模型到模型(M2M)和模型到文本(M2T)的转换,可以实现不同模型...

    emf-sdo-xsd-SDK-2.3.1

    开发者可以构建基于EMF的Eclipse插件,提供图形化的模型编辑器和验证工具。 7. **扩展性**:EMF的设计使其易于扩展,开发者可以通过实现自定义的适配器、工厂和策略来扩展其功能,以满足特定项目需求。 "eclipse" ...

    EMF.rar_emf

    - **模型编辑器(Model Editor)**:EMF提供了一套图形化的工具,帮助开发者创建、编辑和查看模型。 - **数据持久化(Persistence)**:EMF支持XML和RDF等格式的数据持久化,方便模型的存储和交换。 - **转换与...

Global site tag (gtag.js) - Google Analytics