亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区

當前位置:首頁 > 網站舊欄目 > 學習園地 > 設計軟件教程 > 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被更新了。
 

安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区
国产人妻人伦精品| 精品一区2区三区| 男女午夜激情视频| 久久琪琪电影院| 欧美激情网友自拍| 国模吧无码一区二区三区| 久久久成人精品视频| 日韩欧美精品一区二区三区经典| 99国产盗摄| 亚洲综合中文字幕在线| 国产精品国产三级国产专区53| 色综合老司机第九色激情| 国产欧美日韩高清| 亚洲一区二区三区在线观看视频| 国产黄视频在线| 日韩免费不卡av| 欧美成人免费一级人片100| 国产乱码精品一区二区三区不卡| 亚洲区成人777777精品| 久久国产精品久久| 国产suv精品一区二区三区88区| 久久精品99无色码中文字幕| 欧美日本韩国在线| 国产精品国产三级国产专区53| 激情五月五月婷婷| 国产精品久久久久av| 欧美日韩天天操| 久久精品小视频| 韩日午夜在线资源一区二区| 国产精品久久久久久网站| 国产综合福利在线| 国产欧美综合精品一区二区| 国产精品视频免费在线观看| 国产伦精品一区二区| 日韩一级免费看| 精品国产一区二区三区在线| 久久伊人资源站| 国产亚洲精品久久久久久久| 日日夜夜精品网站| 国产欧美欧洲| 日韩一区二区福利| 青草青草久热精品视频在线网站| 精品国产欧美一区二区三区成人| 黄页网站在线观看视频| 久久99精品视频一区97| www.日日操| 日韩精品第一页| 久久中文字幕在线| 99久久99久久精品国产片| 日韩av一二三四区| 国产精品视频免费一区二区三区| 国产视频一区二区三区四区| 亚洲一区三区在线观看| 日韩在线视频线视频免费网站| 免费日韩中文字幕| 亚洲一区二区三区四区中文| 久久久久久久国产精品视频| 欧美精品七区| 亚洲欧美在线网| 按摩亚洲人久久| 国产精品一区二区三区四区五区| 日本精品久久久久影院| 精品伦理一区二区三区| 国产精品99久久久久久大便| 欧美高清性xxxxhd| 亚洲色欲久久久综合网东京热| 久久久久久久久久久亚洲| 国产免费一区二区三区| 日本精品性网站在线观看| 九九热在线精品视频| 久久国产一区| 粉嫩av一区二区三区天美传媒| 日本一区二区三区免费观看| 久久成人免费视频| 久久久久久久97| 99精品在线免费视频| 黑人中文字幕一区二区三区| 日韩av免费一区| 欧美日韩福利视频| 久久精品国产电影| 久久免费在线观看| 国产美女扒开尿口久久久| 欧美在线中文字幕| 日韩av不卡在线播放| 欧美精品成人91久久久久久久| 精品久久久91| 国产爆乳无码一区二区麻豆| 国产乱子伦精品无码专区| 欧美极品日韩| 日韩欧美一区二区三区久久婷婷 | 色综合视频一区中文字幕| 深夜福利一区二区| 91av中文字幕| 国产日本欧美在线观看| 欧美视频在线观看网站| 色噜噜色狠狠狠狠狠综合色一| 欧美情侣性视频| 国产精品日韩在线播放| 久久99欧美| 久久这里只有精品18| 成人a在线观看| 国产日韩精品推荐| 激情小视频网站| 欧美一区二视频在线免费观看| 视频一区国产精品| 亚洲黄色一区二区三区| 一区二区三区国| 欧美人与性动交a欧美精品| 国产精品人成电影在线观看| 久久久国产精品一区| 久久福利电影| 久久久久99精品成人片| 国产精品∨欧美精品v日韩精品| www日韩在线观看| 国产精品亚洲激情| 国产伦理一区二区三区| 国产乱肥老妇国产一区二| 国产欧美日韩精品丝袜高跟鞋| 国产一区二区三区色淫影院 | 久久久久亚洲精品成人网小说| 久热国产精品视频一区二区三区| 成人精品在线视频| 国产伦精品一区二区三区| 国产欧美日韩中文字幕在线| 国产片侵犯亲女视频播放| 国产亚洲欧美一区二区| 国产日产久久高清欧美一区| 国产无套粉嫩白浆内谢的出处| 好吊色欧美一区二区三区视频| 欧美不卡三区| 精品少妇在线视频| 国产一级大片免费看| 国产免费xxx| 97国产在线视频| 国产成人综合精品在线| 久久久久久久久久久久久久一区| 色偷偷噜噜噜亚洲男人| 日韩亚洲国产中文字幕| 久久精品久久久久久国产 免费| 国产精品丝袜高跟| 国产精品户外野外| 一区二区三区一级片| 亚洲欧美在线网| 日本精品一区二区三区视频| 欧美在线一级视频| 国产日韩欧美二区| 91精品久久久久久久久久久久久| 国产成人精品电影久久久 | 苍井空浴缸大战猛男120分钟| 91国偷自产一区二区三区的观看方式| 91精品国产91久久| 久久久久免费精品国产| 国产精品国产三级国产专区51| 久久久久久国产精品美女| 亚洲蜜桃在线| 欧美在线免费观看| 国产日韩在线观看av| …久久精品99久久香蕉国产| 色婷婷久久一区二区| 久久综合色影院| 岛国一区二区三区高清视频| 欧美日韩一区二区在线免费观看| 国产区一区二区三区| 久久久久九九九| 国产精品久久久久久久久久三级| 综合色婷婷一区二区亚洲欧美国产 | 国产亚洲精品自在久久| 91黄在线观看| 国产精品久久久91| 电影午夜精品一区二区三区| 黄瓜视频免费观看在线观看www| 国产欧美精品一区二区三区-老狼| 91精品国产色综合| 久久精品小视频| 亚洲v国产v| 国产在线一区二区三区播放| 国产精品999视频| 国产精品国三级国产av| 亚洲v日韩v欧美v综合| 免费看成人午夜电影| 91高清免费视频| 欧美精品一区二区免费| 日本电影一区二区三区| 国产美女无遮挡网站| 色妞在线综合亚洲欧美| 亚洲伊人久久综合| 国模吧一区二区三区| 国产va亚洲va在线va| 久久综合免费视频| 欧美最大成人综合网| 不卡一区二区三区视频| 国产精品久久久久免费a∨大胸| 日韩在线一级片| 国产日韩一区二区在线观看| 久久久久成人精品免费播放动漫| 久久97久久97精品免视看| 欧美久久久久久| 九九久久九九久久| 亚洲精品蜜桃久久久久久| 国产无套内射久久久国产|