好男人天堂网,久久精品国产这里是免费,国产精品成人一区二区,男人天堂网2021,男人的天堂在线观看,丁香六月综合激情

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

安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
久草免费在线观看| 欧美日本免费| 精品视频在线观看免费| 色综合久久天天综合观看| 天天做日日爱| 99热精品在线| 欧美α片无限看在线观看免费| 国产91素人搭讪系列天堂| 国产91精品一区| a级黄色毛片免费播放视频| 色综合久久天天综合| 欧美一区二区三区在线观看| 精品视频免费观看| 韩国毛片免费| 亚欧成人乱码一区二区| 国产精品免费精品自在线观看| 你懂的日韩| 国产一区二区精品久| 青青青草视频在线观看| 精品国产一区二区三区免费 | 日韩女人做爰大片| 韩国三级一区| 香蕉视频亚洲一级| 国产91精品露脸国语对白| 精品国产一区二区三区精东影业| 国产高清在线精品一区a| 黄视频网站免费| 国产伦精品一区二区三区无广告 | 青草国产在线观看| 中文字幕97| 亚洲 欧美 成人日韩| 国产极品白嫩美女在线观看看| 91麻豆精品国产高清在线| 免费国产在线观看不卡| 免费一级片在线观看| 97视频免费在线观看| 精品国产一区二区三区国产馆| 国产成人精品综合在线| 日韩综合| 欧美激情一区二区三区视频| 一级片片| 久草免费资源| 国产国产人免费视频成69堂| 久久精品道一区二区三区| 日韩免费在线| 色综合久久天天综合| 日本特黄一级| 成人影院一区二区三区| 91麻豆精品国产综合久久久| 尤物视频网站在线观看| 欧美日本国产| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 九九久久国产精品大片| 久久99中文字幕久久| 免费国产一级特黄aa大片在线| 日韩男人天堂| 亚飞与亚基在线观看| 精品国产一区二区三区久| 精品视频免费看| 日韩专区第一页| 国产一区精品| 精品视频免费看| 欧美电影免费| 久久成人性色生活片| 日日爽天天| 国产一区二区精品| 国产一区精品| 免费国产在线视频| 欧美激情伊人| 午夜激情视频在线播放| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 精品视频在线观看一区二区三区| 99热精品一区| 成人免费观看男女羞羞视频| 香蕉视频一级| 麻豆系列 在线视频| 青草国产在线观看| 国产成人精品影视| 麻豆污视频| 国产一区精品| 欧美激情一区二区三区视频高清 | 精品视频在线观看免费| 欧美一级视频高清片| 亚洲精品影院一区二区| 日本在线www| 国产精品自拍亚洲| 97视频免费在线观看| 高清一级毛片一本到免费观看| 欧美大片毛片aaa免费看| 一级女性大黄生活片免费| 免费国产在线观看不卡| 成人免费网站视频ww| 成人在免费观看视频国产| 四虎影视库| 韩国三级视频网站| 日韩女人做爰大片| 久久99这里只有精品国产| 一本高清在线| 免费的黄视频| 国产一区二区精品尤物| 成人免费福利片在线观看| 国产高清视频免费观看| 国产麻豆精品高清在线播放| 欧美一区二区三区性| 免费国产在线观看不卡| 在线观看成人网| 夜夜操网| 青青青草影院| 99热视热频这里只有精品| 精品视频在线观看视频免费视频| 免费毛片基地| 国产亚洲精品成人a在线| 久久国产精品自线拍免费| 国产一区二区精品在线观看| 91麻豆精品国产自产在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 999精品在线| 精品国产一区二区三区国产馆| 日韩一级黄色| 国产伦精品一区二区三区无广告| 青青青草视频在线观看| 久久国产精品自由自在| 国产成人啪精品视频免费软件| 国产一区二区精品| 国产综合91天堂亚洲国产| 一级片片| 九九九网站| 久久99这里只有精品国产| 一级女性大黄生活片免费| 天天色色网| 国产精品免费久久| 精品视频在线观看免费| 精品视频在线观看一区二区| 日韩在线观看视频网站| 国产激情一区二区三区| 国产a毛片| 999久久久免费精品国产牛牛| 日本免费乱理伦片在线观看2018| 九九干| 精品视频在线看 | 人人干人人插| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品国产一区二区三区久久久狼| 99色视频在线| 国产美女在线一区二区三区| 99久久网站| 天堂网中文在线| 成人高清视频免费观看| 国产a毛片| 精品视频在线观看一区二区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产伦精品一区二区三区无广告| 成人免费观看男女羞羞视频| 色综合久久久久综合体桃花网| 久久99欧美| 日日爽天天| 麻豆污视频| 成人免费网站视频ww| 91麻豆精品国产自产在线| 国产成人精品影视| 久久精品人人做人人爽97| 91麻豆tv| 可以免费看毛片的网站| 国产麻豆精品高清在线播放| 午夜在线亚洲| 精品国产一区二区三区久| 韩国三级视频网站| 精品久久久久久综合网| 久久国产一区二区| 久久久成人影院| 青青久久网| 四虎影视久久| 夜夜操网| 国产成人啪精品视频免费软件| 国产a毛片| 亚洲 激情| 亚洲第一视频在线播放| 成人免费观看的视频黄页| 欧美1区| 国产精品123| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产美女在线一区二区三区| 99色视频在线| 尤物视频网站在线| 国产精品1024在线永久免费| 免费的黄视频| 青青久久精品| 久久久久久久免费视频| 国产原创中文字幕| 毛片高清| 日本在线不卡视频| 麻豆午夜视频| 精品视频一区二区| 午夜精品国产自在现线拍| 国产不卡高清| 国产一区二区高清视频| 美女被草网站| 日本伦理黄色大片在线观看网站| 精品国产三级a| 香蕉视频久久|