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

當前位置:首頁 > 網(wǎng)站舊欄目 > 學習園地 > 設計軟件教程 > Command Framework如何實現(xiàn)EMF Model的編輯

Command Framework如何實現(xiàn)EMF Model的編輯
2010-01-14 22:47:19  作者:  來源:
源于《EMF.Edit Framework Programmgering's Guide》

EMF.Edit里面有幾個類比較繞,很容易被搞得暈頭轉向,所以需要澄清以下:
★AdapterFactoryContentProvider, ItemProviderAdapterFactory和ItemProviderAdapter之間的關系,ItemProviderAdapterFactory用來創(chuàng)建各種Adapter以及將各種notifier跟這些adapter關聯(lián)起來,AdapterFactoryContentProvider包裝了一個ItemProviderAdapterFactory(AdapterFactory),它用來將JFace需要的content provider代理到item content provider上,對content provider各種方法的調用將調用到相應的item content provider上,對org.eclipse.jface.viewers.IStructuredContentProvider的調用將代理到IStructuredItemContentProvider上,對ITreeContentProvider的調用將代理到ITreeItemContentProvider上,而對IPropertySourceProvider的調用將代理到IItemPropertySource,而ItemProviderAdapter是所有ItemProvider的基類,AdapterFactoryLabelProvider和ItemProviderAdapter之間也存在類似的關系

★為了顯示model內容,我們需要使用content provider和label provider,而編輯model內容則需要使用到editing domain,AdapterFactoryEditingDomain是一個和AdapterFactoryContentProvider、AdapterFactoryLabelProvider類似的東東

★editing domain主要有兩個功能:一個是作為command的factory(所以它的實現(xiàn)類是AdapterFactoryEditingDomain);另一個對EMF Model(ResourceSet,因此提供了getResource()方法)進行管理

★EditingDomain,AdapterFactoryEditingDomain,EditingDomainItemProvider和Command之間的關系,AdapterFactoryEditingDomain實現(xiàn)了EditingDomain接口,AdapterFactoryEditingDomain和AdapterFactoryContentProvider一樣,也是用來將EditingDomain的方法代理到EditingDomainItemProvider上去。

從一般的操作說起,比如從一個company對象上刪除一個department對象,通常我們的做法是:
 
java 代碼
  1. Department d = ...  
  2.   Company c = ...  
  3.   c.getDepartments().remove(d);  

但是如果是使用command,則會這樣做:
 
java 代碼
 
  1. Department d = ...  
  2.   Company c = ...  
  3.   EditingDomain ed = ...  
  4.   RemoveCommand cmd =  
  5.     new RemoveCommand(ed, c, CompanyPackage.eINSTANCE.getCompany_Departments(), d);  
  6.   ed.getCommandStack().execute(cmd);  

不過這個做法有一個問題,就是不是很通用,因為所有的刪除操作基本上都差不多,所以還需要繼續(xù)抽象,這時就必須引入EditingDomain.
EditingDomain的接口定義如下:
java 代碼
 
  1. public interface EditingDomain  
  2.   {  
  3.     ...  
  4.     Command createCommand(Class commandClass, CommandParameter commandParameter);  
  5.     ...  
  6.   }  

為了創(chuàng)建一個Command對象,我們需要構造一個CommandParameter對象。在createCommand方法里面會調用指定的Command的靜態(tài)create方法來創(chuàng)建指定的Command對象,通過使用create方法,我們可以對上面的操作做進一步的改寫:
java 代碼
  1. Department d = ...  
  2. EditingDomain ed = ...  
  3. Command cmd = RemoveCommand.create(ed, d);  
  4. ed.getCommandStack().execute(cmd);  

通過上面的改寫,差不多實現(xiàn)了一個通用的刪除操作流程
接下來我們可以看看一個command的創(chuàng)建過程,首先是調用指定command的靜態(tài)create方法,該方法將調用EditingDomain的createCommand方法,AdapterFactoryEditingDomain作為EditingDomain的實現(xiàn)類,又將command的創(chuàng)建過程代理到EditingDomainItemProvider上,在Itemprovider(實現(xiàn)了EditingDomainItemProvider接口)中,最終使用new創(chuàng)建指定的Command實例
我們可以采用多種方式對command定制,第一種就是復寫generated的EditingDomainItemProvider實現(xiàn)類的createCommand方法:
java 代碼
 
  1. public class CompanyItemProvider ...  
  2. {  
  3.   ...  
  4.   
  5.   public Command createCommand(final Object object, ...)  
  6.   {  
  7.     if (commandClass == RemoveCommand.class)  
  8.     {  
  9.       return new RemoveDepartmentCommand(...);  
  10.     }  
  11.     return super.createCommand(...);  
  12.   }  
  13. }  

這里的RemoveDepartmentCommand 就是我們自己實現(xiàn)的刪除操作。
第二種方式就是復寫createRemoveCommand()來實現(xiàn)定制:
java 代碼
 
  1. protected Command createRemoveCommand(...)  
  2.   {  
  3.     return new RemoveDepartmentCommand(...);  
  4.   }  


通知的處理
在創(chuàng)建AdapterFactoryContentProvider的時候會將其作為一個listener注冊到AdapterFactory里面,這個AdapterFactory實現(xiàn)了IChangeNotifier接口,而AdapterFactory在創(chuàng)建每一個ItemProvider的時候又會把自己傳遞過去,從而使得AdapterFactory成為model的消息分發(fā)中心,在AdapterFactoryContentProvider又會記錄所有需要接受通知的viewer(也就是為其提供了content provider的viewer)。
當model被改變之后,將觸發(fā)和該model相關的adapter的notifyChanged()方法(這里面的adapter就包括itemprovider),當然這里還有一個過濾的過程,只把那些跟viewer相關的notification才會發(fā)送給viewer。為了將notification繼續(xù)傳遞,會使用ViewerNotification這樣一個對象來對notifation以及其他的信息進行封裝,因此它繼承了Notification,除了Notification相關的信息之外,還封裝了要更新的viewer的相關元素,IViewerNotification 的定義如下:
 
java 代碼
 
  1. public interface IViewerNotification extends Notification  
  2.   {  
  3.     Object getElement();  
  4.     boolean isContentRefresh();  
  5.     boolean isLabelUpdate();  
  6.   }  

對于消息的傳遞還會進行分類,這個是在notifyChanged這個方法里面做的,如下面的代碼:
java 代碼
 
  1. public void notifyChanged(Notification notification)  
  2.   {  
  3.     ...  
  4.     switch (notification.getFeatureID(Company.class))  
  5.     {  
  6.       case CompanyPackage.COMPANY__NAME:  
  7.     //ViewerNotification(Notification decoratedNotification, Object element,
  8. boolean contentRefresh, boolean labelUpdate)  
  9.         fireNotifyChanged(new ViewerNotification(notification, ..., falsetrue));  
  10.         return;  
  11.       case CompanyPackage.COMPANY__DEPARTMENT:  
  12.         fireNotifyChanged(new ViewerNotification(notification, ..., truefalse));  
  13.         return;  
  14.     }  
  15.     super.notifyChanged(notification);  
  16.   }  

可以看出,如果是attribute,那么會對label進行更新,如果是reference,那么需要更新content了,否則什么都不做。fireNotifyChanged方法是在ItemProviderAdapter(就是所有ItemProvider的基類)里面定義的,它會把notifaction傳給adapter factory,前面我們說過adapter factory是notification的分發(fā)器,因此它會將notification發(fā)送給所有注冊的listener,我們前面也說過AdapterFactory實現(xiàn)IChangeNotifier接口,并作為listener注冊到adapter factory中去了,因此在最后會調用adapter factory的fireNotifyChanged方法,當然了adapter factory也會將notification代理別的對象(可能是tree或者table的content/label provider,當然在emf中就是itemprovider了)上去,最后viewer被更新了。
 

安徽新華電腦學校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
主站蜘蛛池模板: 滑动轴承_无油自润滑轴承_复合干式_含油铜套_石墨铜套-嘉善盛元自润滑轴承厂 | 交通标志牌-交通标牌-铝圆牌-铝三角片-铝滑槽-公路警示指示牌-方牌-高速道路反光牌毛坯-交通设施安全警示标识牌-路名指示限速限高牌-厂家加工交通标牌铝板半成品毛坯-上海吕盟铝业有限公司 | 荧光显微镜,倒置显微镜,显微镜相机,荧光光源——广州市明美光电技术有限公司 | 太原铁艺围栏-山西泓宸辉铁艺工程有限公司 | 资质代办-企业施工资质代办,湖南建筑资质代办公司-[小凯企服] | 射频导纳物位开关|雷达液位计|安全光栅光幕传感器|音叉料位开关|两级跑偏开关|双向拉绳开关|纵向撕裂保护装置-山东卓信机械有限公司 | 九江守信建筑工程有限公司| 展馆展厅设计_数字多媒体展厅_3D全息投影_三维动画制作_企业宣传片|深圳市华南数字科技有限公司 斩天手游网_高质量手机游戏下载中心 | 全自动圆木多片锯_立式圆木多片锯价格_大型圆木多片锯厂家-邢台友创机械制造有限公司 | 泊头市特种油泵阀制造有限公司 - 渣油泵,重油泵,沥青泵,高压齿轮泵,煤焦油泵,导热油泵,三螺杆泵,圆弧齿轮泵,不锈钢齿轮泵, | 辽宁大卯新能源供热设备制造有限公司官方网站,大卯新能源,大卯新能源供热设备 | 软化水设备_锅炉软水设备_全自动软化设备【安装维护、更换树脂】-青岛水处理设备厂家 | 液压万能试验机价格_电子万能试验机|摩擦磨损试验机厂家-济南辰达试验机制造有限公司 | 外圆/圆管抛光机_方管抛光机/除锈机_活塞杆抛光机-不锈钢管抛光机-邢台欧邦机械 | 铸造厂_铸造厂家_硅溶胶熔模铸造-盐城市春秋精密机械有限公司 | 临沂网站建设,临沂网站制作,临沂网络公司,临沂小程序开发,临沂网站设计,沂水网站建设,沂南网站建设,蒙阴网站建设,平邑网站建设,费县网站建设,兰陵网站建设,郯城网站建设,临沭网站建设,莒南网站建设,兰山网络公司 | 上海五相仪器仪表有限公司-鼓风干燥箱-拍击式无菌均质器生产厂家 | 山东腾达源金属材料官网-耐磨板nm400,nm400耐磨钢板,nm500耐磨钢板切割,耐候板批发,高强板现货【价格】 | 商易网-b2b电子商务平台网站大全免费B2B发布供求信息网站 | 智慧社区_【功能更全、价格更低、案例更多】 - | 無谷轻食官网_沙拉轻食加盟_轻食加盟总部_轻食加盟费用 | 生态护坡砖_护坡砖_合肥植草砖-巢湖市华林新型建材有限公司 | 型煤锅炉进煤机|型煤链条炉排 |重型板链除渣机 |丹东刮板输送机|丹东脱硫除尘器-铧洋机械 | 树脂井盖,复合井盖,井盖厂家-山东宝盖新材料 | 铨盛国际供应链-PC增韧剂/硅系增韧剂/耐寒增韧剂/耐化学增韧剂 | 南京样本设计,彩页制作,宣传册设计,画册设计印刷,包装设计公司,南京台历制作 | 精密铸造-不锈钢精密铸件-硅溶胶铸造-常州思泉汽车科技有限公司 精密铸造,精密铸件,不锈钢铸造,不锈钢铸件-常州鸿雁行机械科技有限公司 | 仪器仪表维修_示波器维修_进口分析仪维修_热像仪维修_上海仰光电子仪器仪表维修部 | 网站客服系统_在线客服系统【莺语客服】 | 青岛除甲醛公司|青岛甲醛治理|青岛除甲醛|甲醛检测|光触媒除甲醛|装修除味除甲醛|新房除甲醛|青岛室内环境污染检测治理|青岛闪洁环保科技有限公司官网 | 柔性防水套管_刚性防水套管-河南恒生管道制造有限公司 | 首创十载—广州专业美博会展览设计公司_美博会展台搭建工厂 | 艺考培训-中影人教育 【官网】-中国艺考教育的引航者 | 眉山净源居环保科技有限公司,眉山除甲醛公司,眉山甲醛治理,眉山保洁服务,眉山家政保洁,眉山家电维修 - 眉山净源居环保科技有限公司,眉山除甲醛公司,眉山甲醛治理,眉山保洁服务,眉山家政保洁,眉山家电维修 | 真空清洗炉_真空煅烧炉_铸铝加热器-盐城市钰凯电器有限公司 | 南昌今工科技有限公司 | 无锡心理咨询_江阴心理咨询_强迫症咨询_无锡笑一心理咨询有限公司 | 南尔智能科技 南尔 小南管家 智慧中控屏 智能语音面板 - 深圳市南尔智能科技有限公司 | 铸铁平台,三维柔性焊接平台,划线平台,大理石平台,检验平板,花岗石平台_泊头市恒量机械设备有限公司 | 基坑护栏,临边护栏网,爬架网,爬架网片,铁路防护栅栏,公路护栏网,河北昊坤金属制品有限公司 | 四川方法数码科技有限公司|