安徽新华电脑专修学院_安徽电脑培训_安徽电脑培训学校_合肥电脑培训

當前位置:首頁 > 網站舊欄目 > 學習園地 > 設計軟件教程 > 如何使EMF模型對應的編輯控件能處理Undo&Redo操作

如何使EMF模型對應的編輯控件能處理Undo&Redo操作
2010-01-14 22:57:07  作者:  來源:

在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.     }   

安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
主站蜘蛛池模板: 苏州涂附磨具厂家-陶瓷磨具-树脂磨具批发-苏州磨料磨具-苏州远东砂轮有限公司 | 郑州邦达电气有限公司 | 健力普医疗-半导体激光治疗仪,红外偏振光治疗仪,近红外线治疗仪-独家功能,光疗典范 | 沥青灌缝胶-路面贴缝带-灌缝胶厂家-山东晟辉工程材料有限公司 | 室内去除甲醛检测治理十大品牌_去除甲醛公司加盟-优吸环保科技有限公司集团总部官网 | 扬州市德友线缆有限公司-业从事高端特种线缆研发、制造、销售与服务。 | 江门市振达机械制造有限公司_散货输送系统_全密封带式输送机 | 斜管填料_斜板填料_纤维球_果壳活性炭_立体网状填料_纤维球厂家-巩义市德科净水材料有限公司 | 泊头市鸿海泵业有限公司--导热油泵,高温油泵,沥青保温泵,圆弧泵,齿轮油泵,高粘度泵,自吸离心油泵,罗茨油泵为主的专业生产厂家 | 质检报告_COC_CE认证_LFGB测试_REACH_FCC_FDA-冠通检测 | 欣宇航化工-湖北片碱-冰醋酸厂家联系方式-工业氨水价格-工业片碱厂家-武汉宇航化工 | 金相切割机-金相磨抛机-显微/维氏/布氏/洛氏硬度计-自准直仪-金相显微镜-万能材料试验机-清洁度检测仪-淋雨试验机-上海中研精密仪器制造有限公司 | 徐州户外广告,标识标牌,展陈空间,精神堡垒-徐州雅努思文化发展有限公司 | 项目可行性研究报告_稳评能评节能报告_节能报告收费标准-智汇中经(上海)管理咨询有限公司 | 齐东汽车-提供抑尘车|洒水车|压缩垃圾车|餐厨垃圾车|垃圾转运车|清洗吸污车|扫路车价格,图片及视频 | 氢能展,氢能展会,燃料电池展,加氢设备_氢气储运_制氢设备_氢燃料汽车_加氢站成套设备 | 眉山净源居环保科技有限公司,眉山除甲醛公司,眉山甲醛治理,眉山保洁服务,眉山家政保洁,眉山家电维修 - 眉山净源居环保科技有限公司,眉山除甲醛公司,眉山甲醛治理,眉山保洁服务,眉山家政保洁,眉山家电维修 | 玉米脱皮制糁机-玉米深加工机械价格-玉米糁加工机器设备-玉米渣加工成套设备-河南粮院 | 土石_泥石分离机_无轴滚筒筛_振动筛 - 巩义市鑫利重工机械制造有限公司 | 深圳注册公司-工商注册代理-深圳注册公司流程及费用-记帐报税-公司注销-[深圳市悟空企业管理(深圳)有限公司] | 中婴网,推动母婴产业健康·可持续发展,婴童网络专业传媒,母婴网,360孕婴童网,婴童品牌,婴儿用品品牌,婴儿用品加盟店,母婴用品加盟店 | 昆明集装箱-云南住人集装箱活动房厂家|移动板房出租赁定制 | 抛丸机-H型钢结构抛丸机-钢板通过式抛丸机厂家-泓霖喷砂除锈设备 | 领先的一站式_专利申请代理知识产权服务平台_乐知网 | 上海鳞片胶泥-环氧胶泥价格-鳞片涂料批发-乙烯基树脂-环氧结构胶-上海富晨 | 皮革耐折试验机-消字率测试仪-面具全视野测试仪-东莞市誉扬检测仪器有限公司 | 塑料振动筛-防腐蚀振动筛-聚丙烯振动筛-塑料振动筛厂家河南迈能机械设备有限公司 | 南京仁康体检--南京仁康门诊部有限公司 | 七评-爱美儿信息科技有限公司〖官网〗? | 上海办公室租赁-写字楼出租、创意产业园区厂房招商、孵化器众创联合办公空间出租网 | 上海海外置业展_2024海外置业移民留学展_4月5-7日_企业参展处/免费领门票 | 吉安天卓选矿药剂有限公司| 远东齿轮泵|高粘度齿轮泵|三螺杆油泵|沥青保温泵|高粘度稠油泵-远东泵业官网 | 湖南一体化污水处理设备_二氧化氯发生器_一体化净水处理设备_消毒设备厂家-湖南东环环保科技有限公司 | 移动CRM软件_SaaS CRM_crm管理软件系统_crm客户关系管理系统_销售管理软件-上海企能软件科技有限公司 | 永磁电机,防爆电机,调速电机,永磁同步电机_河南华信电机股份有限公司 | 气胀轴丨安全夹头丨电磁制动器丨纠偏系统丨磁粉离合器丨张力控制器厂家- 东莞天机通信科技有限公司 | 九江中澳钽铌有限公司| 金酱酒_金酱酒代理加盟招商_OEM贴牌企业定制! – 金酱酒代理加盟!茅台镇较早的酿酒烧坊,年产优质酱香白酒5000余吨,仁怀市十强白酒企业,主营主品:金酱酒、金酱陈香酒、酱香老酒等系列品牌产品 | 快达物流:电商和微商的仓储物流外包和托管服务-北京快达国际物流服务有限公司官方网站 | 盆底肌修复仪器-产后康复脉冲磁训练仪-南京佳澜健康管理有限公司 |