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

當(dāng)前位置:首頁 > 網(wǎng)站舊欄目 > 學(xué)習(xí)園地 > 設(shè)計(jì)軟件教程 > 如何使EMF模型對應(yīng)的編輯控件能處理Undo&Redo操作

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

在EMF自動(dòng)生成的editor中,只提供了TreeViewer作為編輯控件,自動(dòng)生成的代碼能讓TreeViewer處理Redo&Undo操作,如果還需要對EMF對應(yīng)的Attribute使用Text, Combo等Widget進(jìn)行編輯的話,那么如何將這些Widget的編輯也能實(shí)現(xiàn)Undo&Redo操作呢?

首先我們來分析一下,對于TreeViewer是如何實(shí)現(xiàn)Redo&Undo操作的,在生成的editor代碼中有類似這樣的一句(這個(gè)是我改寫后的,實(shí)際生成的可能有所區(qū)別):為了只針對Redo&Undo對UI進(jìn)行更新,還需要對RedoAction和UndoAction做進(jìn)一步處理:
其做法就是要讓editor知道當(dāng)前的Action,然后在修改UI的時(shí)候,取得該Action看是否是我們指定的Action(RedoAction&UndoAction).

java 代碼
 
  1. viewer.setContentProvider(new AdapterFactoryContentProvider(   
  2.                 getAdapterFactory()));  

AdapterFactoryContentProvider實(shí)現(xiàn)了INotifyChangedListener接口,該接口就是用來處理在EMF模型發(fā)生變動(dòng)時(shí),如何更新綁定的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.   }  

這里關(guān)鍵的一句就是:

java 代碼
 
  1. ((IChangeNotifier)adapterFactory).addListener(this);  

它將更新UI的通知操作與adapterFactory關(guān)聯(lián)起來,然后在EMF模型發(fā)生變動(dòng)的時(shí)候,會(huì)從adapterFactory來找到所有注冊的INotifyChangedListener
因此做法就相當(dāng)簡單了,即將EMF模型對應(yīng)的編輯控件實(shí)現(xiàn)INotifyChangedListener接口,然后拿到adapterFactory,并把該控件注冊進(jìn)去.
下面我的一個(gè)實(shí)現(xiàn):
AbstractDoradoSection包含了EMF模型當(dāng)前節(jié)點(diǎn)屬性的對應(yīng)編輯控件集合,讓其實(shí)現(xiàn)INotifyChangedListener接口

并在構(gòu)造函數(shù)中注冊到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.  * 當(dāng)emf模型發(fā)生變化之后,更新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.     }   

安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区
亚洲一区精品电影| 在线视频亚洲自拍| 热久久美女精品天天吊色| 欧美精品午夜视频| 久久久久久久免费视频| 国产精品小说在线| 黄色a级片免费| 日韩不卡一二区| 亚洲欧洲一区二区| 欧美日韩ab片| 久久久国产一区| 97精品久久久| 欧美理论一区二区| 日韩免费在线看| 天天爱天天做天天操| 色综合色综合网色综合| 国产成人精品日本亚洲11| 欧美精品一区在线| 日本精品va在线观看| 色婷婷精品国产一区二区三区 | 国产精品成人aaaaa网站| 国产成人精品在线视频| 91精品国产乱码久久久久久蜜臀| 国产精品专区一| 国产视频福利一区| 黑人中文字幕一区二区三区| 日本久久久久亚洲中字幕| 宅男一区二区三区| 国产精品-区区久久久狼| 国产成人精品午夜| 久久精品成人动漫| 国产精品手机播放| 精品国产一区久久久| 国产成人精品自拍| 国产精品国产三级国产专区53| 国产精品视频免费观看| 国产精品乱子乱xxxx| 久久久国产成人精品| 国产精品美女久久久久av福利| 国产精品欧美日韩久久| 欧美成年人在线观看| 九九精品在线播放| 亚洲一区亚洲二区| 午夜精品一区二区三区在线观看| 午夜精品三级视频福利| 日韩福利一区二区三区| 精品99在线视频| 国产欧美一区二区三区不卡高清| 成人免费网视频| 成人国产在线看| 国产高清一区二区三区| 日韩在线资源网| 精品国产欧美成人夜夜嗨| 国产精品果冻传媒潘| 精品免费久久久久久久| 亚洲免费视频一区| 欧洲熟妇精品视频| 国产内射老熟女aaaa| 91九色丨porny丨国产jk| 久草一区二区| 久久这里有精品| 大地资源第二页在线观看高清版| 日本成人精品在线| 国产又黄又大又粗视频| 91精品国产91久久久久久吃药| 久久久久久中文字幕| 久久国产精品久久久久| 亚洲视频电影| 欧美精品久久久久久久免费| 国产精品一线二线三线| 久久男人资源站| 久久亚洲精品一区| 日日橹狠狠爱欧美超碰| 国内免费精品永久在线视频| 国产精品69久久| 久久亚洲精品国产亚洲老地址| 亚洲高清视频一区| 加勒比成人在线| 国产精品69久久久| 欧美成人午夜剧场免费观看| 亚洲 国产 日韩 综合一区| 欧美在线一区二区三区四区| 黄色免费视频大全| 久久久精彩视频| 久久久久久91| 黄色一级片网址| 国产爆乳无码一区二区麻豆| 久久99久久久久久久噜噜| 日韩精品无码一区二区三区免费| 精品少妇在线视频| 久久精品在线免费视频| 麻豆国产精品va在线观看不卡 | 久久久久资源| 欧美激情一级二级| 欧美高清一区二区| 国产v片免费观看| 免费av在线一区| 欧美精品一区在线发布| 国产精品午夜一区二区欲梦| 欧美自拍视频在线| 国产成人一区二区在线| 中文字幕一区二区三区四区五区 | 91av中文字幕| 欧美激情a∨在线视频播放| 欧美 日韩 国产 激情| 国产成a人亚洲精v品在线观看| 亚洲色欲综合一区二区三区| 国产又黄又猛视频| 久久精品国产欧美激情| 久久天天东北熟女毛茸茸| 亚洲自拍的二区三区| 成人免费在线网| 国产精品久久在线观看| 欧洲日韩成人av| 久久久久久久久久亚洲| 日本精品视频网站| 久久国产日韩欧美| 欧美激情国产高清| 国产九九精品视频| 中文字幕无码不卡免费视频| av一区二区三区免费观看| 亚洲免费久久| 国产精品8888| 日韩av免费看| www.国产一区| 好吊色欧美一区二区三区视频 | 97人人爽人人喊人人模波多| 一区二区三区我不卡| 91九色在线视频| 午夜伦理精品一区| 久久噜噜噜精品国产亚洲综合| 一区二区冒白浆视频| 国产欧美日韩综合精品二区| 色噜噜狠狠狠综合曰曰曰| 懂色中文一区二区三区在线视频| 91久久久在线| 日韩在线综合网| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 国产精品三级在线| 激情内射人妻1区2区3区| 久久99精品国产99久久 | 国产精品久久久久aaaa九色| 免费看日b视频| 国产精品美女诱惑| 精品人妻人人做人人爽| 国产精品久久久久久久久久直播 | 日韩黄色片在线| 国产精品丝袜久久久久久不卡| 国内揄拍国内精品| 在线视频91| 久久狠狠久久综合桃花| 欧美视频在线观看网站| 色综合91久久精品中文字幕| 91精品国产综合久久久久久丝袜| 视频一区二区在线| www.日本久久久久com.| 国语对白做受xxxxx在线中国| 国产精品日韩在线一区| 国产美女作爱全过程免费视频| 性欧美大战久久久久久久| 久久精品成人欧美大片| 成人精品在线观看| 日韩精品一区二区免费| 欧美精品福利视频| 色偷偷噜噜噜亚洲男人| 国产日韩在线一区| 肉大捧一出免费观看网站在线播放| 国产成人精品最新| 草b视频在线观看| 天天综合色天天综合色hd| 色婷婷av一区二区三区在线观看| 国模一区二区三区私拍视频| 国产999视频| 日韩在线免费观看视频| 国产精品一区二区免费| 91精品国产综合久久香蕉最新版 | 久久精品中文字幕免费mv| 国产成人精品电影久久久| 成人av一级片| 男人添女人下部视频免费| 色香蕉在线观看| 精品国产乱码久久久久久108 | 国产乱码精品一区二区三区卡 | 在线精品日韩| 免费av一区二区| 久久精品在线播放| 久久伊人资源站| 国产午夜精品一区| 免费看黄在线看| 日韩欧美激情一区二区| 亚洲天堂av免费在线观看| 欧美成人免费一级人片100| 久久天天狠狠| 国产www精品| 91av中文字幕| 成人中文字幕在线观看| 国内精品在线观看视频| 欧美性视频网站| 日韩视频在线免费播放| 视频一区二区视频|