麻豆传媒视频在线,国产91精品不卡视频,欧美jizz19性欧美,污视频网站在线观看,91涩漫在线观看,伊人发布在线,九色porny丨首页在线,福利视频一区,久久av网址,久久人人视频

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

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

EMF.Edit里面有幾個類比較繞,很容易被搞得暈頭轉向,所以需要澄清以下:
★AdapterFactoryContentProvider, ItemProviderAdapterFactory和ItemProviderAdapter之間的關系,ItemProviderAdapterFactory用來創建各種Adapter以及將各種notifier跟這些adapter關聯起來,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(所以它的實現類是AdapterFactoryEditingDomain);另一個對EMF Model(ResourceSet,因此提供了getResource()方法)進行管理

★EditingDomain,AdapterFactoryEditingDomain,EditingDomainItemProvider和Command之間的關系,AdapterFactoryEditingDomain實現了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);  

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

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

通過上面的改寫,差不多實現了一個通用的刪除操作流程
接下來我們可以看看一個command的創建過程,首先是調用指定command的靜態create方法,該方法將調用EditingDomain的createCommand方法,AdapterFactoryEditingDomain作為EditingDomain的實現類,又將command的創建過程代理到EditingDomainItemProvider上,在Itemprovider(實現了EditingDomainItemProvider接口)中,最終使用new創建指定的Command實例
我們可以采用多種方式對command定制,第一種就是復寫generated的EditingDomainItemProvider實現類的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 就是我們自己實現的刪除操作。
第二種方式就是復寫createRemoveCommand()來實現定制:
java 代碼
 
  1. protected Command createRemoveCommand(...)  
  2.   {  
  3.     return new RemoveDepartmentCommand(...);  
  4.   }  


通知的處理
在創建AdapterFactoryContentProvider的時候會將其作為一個listener注冊到AdapterFactory里面,這個AdapterFactory實現了IChangeNotifier接口,而AdapterFactory在創建每一個ItemProvider的時候又會把自己傳遞過去,從而使得AdapterFactory成為model的消息分發中心,在AdapterFactoryContentProvider又會記錄所有需要接受通知的viewer(也就是為其提供了content provider的viewer)。
當model被改變之后,將觸發和該model相關的adapter的notifyChanged()方法(這里面的adapter就包括itemprovider),當然這里還有一個過濾的過程,只把那些跟viewer相關的notification才會發送給viewer。為了將notification繼續傳遞,會使用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的分發器,因此它會將notification發送給所有注冊的listener,我們前面也說過AdapterFactory實現IChangeNotifier接口,并作為listener注冊到adapter factory中去了,因此在最后會調用adapter factory的fireNotifyChanged方法,當然了adapter factory也會將notification代理別的對象(可能是tree或者table的content/label provider,當然在emf中就是itemprovider了)上去,最后viewer被更新了。
 

安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
亚洲桃花岛网站| 三级在线电影| 91精选在线观看| 五月激情六月综合| 亚洲一二三专区| 香港成人在线视频| 日本高清无吗v一区| 色噜噜狠狠成人中文综合| 日韩欧美成人网| 欧美一区二区三区在线电影| 欧美成va人片在线观看| 亚洲欧美国产一区二区三区| 中文字幕亚洲欧美在线| 欧美日本啪啪无遮挡网站| 久久久久久尹人网香蕉| 国产精品免费电影| 伊人色综合久久| 成人动漫在线免费观看| 国内精品一区视频| heyzo高清国产精品| 激情久久一区二区| 日韩免费电影在线观看| 91精品秘密在线观看| 亚洲视频大全| 高清不卡在线观看av| 久久无码av三级| 亚洲国产一二三| 在线不卡a资源高清| 国产性色av一区二区| 久久久久久国产免费| 成人午夜激情| 成人18在线| 日韩欧美看国产| 欧美成人专区| 极品日韩av| 成人国产亚洲欧美成人综合网| 中文字幕色av一区二区三区| 欧美调教femdomvk| 丝袜美腿精品国产二区| 国产精品午夜视频| 国产黄大片在线观看画质优化| 欧美日韩亚洲国产| 国产传媒欧美日韩成人精品大片| 亚洲精品精选| 国产香蕉久久精品综合网| 欧美性受xxxx黑人xyx性爽| 一本色道久久88综合亚洲精品ⅰ | 成人影院www在线观看| 成人午夜在线| 久久久9色精品国产一区二区三区| 日本亚洲三级在线| ㊣最新国产の精品bt伙计久久| 欧美裸体一区二区三区| 日韩一区二区精品视频| 一本免费视频| 99thz桃花论族在线播放| 影视先锋久久| 国产成人免费视频精品含羞草妖精| 亚洲在线一区二区三区| 亚洲欧美三级伦理| 男女午夜视频在线观看| 亚洲淫成人影院| 国产一区日韩欧美| 国产精品久久久久久久午夜片| 日韩精品在线一区| 国产精品香蕉在线观看| 日本а中文在线天堂| 99热在线成人| 一区二区中文字幕在线| 日韩精品中文字幕在线播放| 黄色一级影院| 国产黄色精品| 青青国产91久久久久久| 婷婷中文字幕综合| 欧美激情视频在线观看| 黄色网页网址在线免费| 日韩av有码| 中文字幕av一区二区三区免费看| 欧美精品一区二区三| 91在线电影| 国产精品网站在线看| 国产成人精品在线看| 日韩天堂在线观看| 天堂中文字幕| 校花撩起jk露出白色内裤国产精品| 国产91丝袜在线播放| 亚洲国产成人精品电影| 在线视频国产三级| 九九热精品视频在线观看| 成人av中文字幕| 精品亚洲国产视频| 四虎影视精品成人| 欧美午夜精品一区二区三区电影| www国产成人| 日韩中文字幕在线| 亚洲综合影视| 亚洲在线免费| 在线播放亚洲一区| 中日韩免费毛片| 日本a口亚洲| 亚洲午夜在线视频| 国产精品美乳一区二区免费| 电影91久久久| 26uuu色噜噜精品一区二区| 最好看的2019的中文字幕视频| 1769视频在线播放免费观看| 欧美日韩1区2区3区| 激情久久av一区av二区av三区| 国产精品扒开腿做| 国产精品xxx在线观看| 国产精品久久久久一区二区三区| 欧美www在线| 成人午夜精品| 91丨九色丨蝌蚪富婆spa| 日韩中文字幕不卡视频| 黑森林国产精品av| 国产福利91精品一区二区三区| 亚洲欧美日本另类| 丁香花视频在线观看| 久久黄色级2电影| 亚洲人成在线播放| 白浆在线视频| 成人综合在线视频| 久久国产精品久久久久久| jvid一区二区三区| 国产精品免费网站在线观看| 国产成人精品在线| 国产在线观看91一区二区三区| 亚洲va天堂va国产va久| 国产三级免费观看| 在线成人直播| 日韩午夜三级在线| 黑人极品ⅴideos精品欧美棵| 国产毛片一区二区| 欧美大片在线看免费观看| 日本精品在线播放| 亚洲午夜成aⅴ人片| 一区二区三区视频国产日韩| 在线高清一区| 国产亚洲欧美日韩精品| 99re久久| 亚洲成在线观看| 久草视频在线看| 久久久噜噜噜| www国产亚洲精品久久网站| 中文字幕日本一区| 午夜精品福利一区二区三区蜜桃| 蜜桃av成人| 美国一区二区三区在线播放| 欧美xxxx14xxxxx性爽| 日韩三区视频| 欧美二区三区91| segui88久久综合9999| 国产色综合一区| av手机在线看| 久久伊人亚洲| 久久久噜噜噜久久久| 成人影视亚洲图片在线| 亚洲精品一区在线观看| 青青热久免费精品视频在线18| 亚洲色图19p| 成人18在线| 久久久久久日产精品| 最新理论片影院| 精品一区二区在线免费观看| 欧美又大粗又爽又黄大片视频| 香蕉av一区二区 | 欧美三级电影精品| 超碰在线无需免费| 国产视频在线观看一区二区三区| 香港日本韩国三级| 精品无人码麻豆乱码1区2区 | 成人免费视频在线观看超级碰| 国产综合网站| 久久久国产精彩视频美女艺术照福利| 久久久亚洲欧洲日产| 制服丝袜在线91| 日韩成人一区| 在线播放国产精品二区一二区四区| 亚洲电影观看| 疯狂做受xxxx欧美肥白少妇| 福利影院在线看| 亚洲超丰满肉感bbw| 国产理论在线| 欧美性xxxx在线播放| 免费h视频在线观看| 亚洲国产一区二区a毛片| 国产乱码午夜在线视频| 福利视频一区二区| 国产一区二区色噜噜| 日韩一区二区三区免费看 | 日韩av在线看| 亚洲丝袜美腿一区| 中文字幕av一区二区| 亚洲国产一区二区在线观看| 久久久综合av| 久久成人免费日本黄色| 三上悠亚一区二区三区| 成人黄色a**站在线观看| 成人动漫在线免费观看|