国产精品一区二区精品_久久小视频_天堂va在线观看_99久久夜色精品国产亚洲96_日本手机在线视频_av成人免费

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

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

在EMF自動生成的editor中,只提供了TreeViewer作為編輯控件,自動生成的代碼能讓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代碼中有類似這樣的一句(這個是我改寫后的,實(shí)際生成的可能有所區(qū)別):為了只針對Redo&Undo對UI進(jìn)行更新,還需要對RedoAction和UndoAction做進(jìn)一步處理:
其做法就是要讓editor知道當(dāng)前的Action,然后在修改UI的時候,取得該Action看是否是我們指定的Action(RedoAction&UndoAction).

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

AdapterFactoryContentProvider實(shí)現(xiàn)了INotifyChangedListener接口,該接口就是用來處理在EMF模型發(fā)生變動時,如何更新綁定的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ā)生變動的時候,會從adapterFactory來找到所有注冊的INotifyChangedListener
因此做法就相當(dāng)簡單了,即將EMF模型對應(yīng)的編輯控件實(shí)現(xiàn)INotifyChangedListener接口,然后拿到adapterFactory,并把該控件注冊進(jìn)去.
下面我的一個實(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ī)劃師為你提供更多幫助【在線咨詢
国产精品一区二区精品_久久小视频_天堂va在线观看_99久久夜色精品国产亚洲96_日本手机在线视频_av成人免费
<button id="0mgmq"><pre id="0mgmq"></pre></button>
  • <tr id="0mgmq"></tr>
  • <abbr id="0mgmq"><source id="0mgmq"></source></abbr> <button id="0mgmq"></button>
  • 久久人人97超碰国产公开结果| 99视频免费观看| 国产中文一区二区| 国产在线视频欧美一区二区三区| 久久久精品日韩| 国产精品hd| 欧美视频观看一区| 久久一区二区三区超碰国产精品| 在线播放豆国产99亚洲| 精品久久久久久一区二区里番| 亚洲三级观看| 一区二区视频在线播放| 久99久在线| 99久久精品免费看国产一区二区三区 | 女同性一区二区三区人了人一| 99精彩视频在线观看免费| 在线看片日韩| 欧美日韩在线精品| 亚洲视频导航| 日韩尤物视频| 欧美日韩精品免费观看视一区二区| 嫩草成人www欧美| 亚洲国产免费| 亚洲国产一区二区三区在线播| 中文精品一区二区三区| 区一区二区三区中文字幕| 久久蜜桃资源一区二区老牛| 亚洲午夜一级| 亚洲国产婷婷| 一本色道精品久久一区二区三区 | 欧美日韩在线精品| 久久久久久久久久久久久久久久av | 国产精品入口| 亚洲精品国产精品国自产观看| 午夜国产精品视频| 欧美国产综合视频| 欧美日一区二区三区在线观看国产免| 亚洲巨乳在线观看| 日韩欧美亚洲日产国| 精品久久中出| 欧美婷婷久久| 你懂的视频一区二区| 欧美精品播放| 亚洲国产精品第一区二区| 亚洲高清毛片| 亚洲综合社区| 99久久伊人精品影院| 国产欧美在线一区二区| 久久综合一区| 亚洲精品在线免费| 黑人一区二区三区四区五区| 亚洲一级影院| 久久精品三级| 狠狠久久综合婷婷不卡| 日韩精品资源| 日韩午夜精品| 成人一区二区在线| 日韩精品久久一区二区三区| 欧美有码视频| 亚洲免费影院| 欧美日韩高清在线一区| 伊人久久大香线蕉av一区| 亚洲日本成人| 国产91免费视频| 欧洲精品亚洲精品| 伊人成人在线| 国产精品久久久久久久小唯西川| 人偷久久久久久久偷女厕| 国产精品啊v在线| 操一操视频一区| 亚洲成人a**址| 亚洲一区二区三区高清不卡| 久久精品二区| 国产精品v欧美精品∨日韩| 国产精品免费一区二区三区在线观看 | 亚洲午夜黄色| 国产传媒一区| 欧美视频官网| 精品视频免费观看| 激情综合视频| 蜜桃传媒视频麻豆第一区免费观看 | 欧美三级午夜理伦三级中文幕| 久久人人97超碰国产公开结果| 中文字幕乱码一区二区三区| 久久久久久九九九九| 色综合久久久久久久久五月| 亚洲人成久久| 午夜精品一区二区三区在线观看| 宅男噜噜噜66国产日韩在线观看| 精品免费日产一区一区三区免费| 国语自产精品视频在线看8查询8| 国产欧美一区二区在线播放| 黑人一区二区| 欧洲一区二区在线| 香蕉国产精品偷在线观看不卡| 热re99久久精品国99热蜜月| 久久久久国产一区二区| 正在播放国产精品| 精品一区二区不卡| 亚洲一区在线直播| 欧美激情一区| 日本精品国语自产拍在线观看| 国产精品一区毛片| 国产一区高清视频| 亚洲国产成人不卡| 国产一区二区三区无遮挡| 久久三级福利| 国产一区二区三区奇米久涩| 在线观看成人一级片| 久久精品五月婷婷| 国产精品区一区二区三含羞草| 亚洲国产一区二区三区在线播| 国产精品日韩一区二区 | 亚洲第一精品影视| 亚洲综合av一区| 欧美连裤袜在线视频| 99电影在线观看| 一区二区三区四区国产| 国产精品v亚洲精品v日韩精品| 日本一区二区三区视频在线观看| 91传媒视频免费| 久久黄色网页| 性高湖久久久久久久久| 亚洲天堂黄色| 欧美日韩久久| 欧美粗暴jizz性欧美20| 亚洲免费不卡| 欧美一区国产在线| 中文字幕中文字幕在线中心一区| 视频一区二区精品| 视频在线观看成人| 日韩在线观看电影完整版高清免费| 精品视频一区二区三区四区| 国产一级二级三级精品| 国产免费一区二区| 久久综合中文色婷婷| 高清国语自产拍免费一区二区三区| 久久久一本精品99久久精品66| 国产精品日韩高清| 97人人干人人| 国产一区二区三区奇米久涩| 久久久久久久久久久久久久久久av| 国产在线观看一区| 欧美高清性xxxxhd| 亚洲一区精彩视频| 任我爽在线视频精品一| 91传媒视频免费| 国产精品日韩一区二区| 精品在线不卡| 欧美人与物videos另类| 老司机精品导航| 99久热re在线精品996热视频| 51国偷自产一区二区三区的来源| 99国产在线观看| 欧美日韩精品免费看| 女人天堂亚洲aⅴ在线观看| 永久久久久久| 91在线看网站| 日本精品一区二区| 欧美日韩免费观看一区| 国产欧美日韩在线播放| 国产精品成人一区二区三区 | 欧美日韩一区二区三区在线视频| 日韩视频久久| 国产亚洲福利社区| 亚洲图片欧洲图片日韩av| 亚洲国产一区二区精品视频| 亚洲二区视频| 国模一区二区三区私拍视频| 亚洲一区二区三区涩| 亚洲综合日本| 日韩av在线电影观看| 尤物在线精品| 精品国产乱码久久久久久蜜柚 | 国产另类第一区| 欧美日本不卡| 国产精品jizz视频| 日韩视频精品| 亚洲日本无吗高清不卡| 美日韩免费视频| 国产一区二区三区黄| 欧美二区在线| 国产日产精品一区二区三区四区| 你懂的视频一区二区| 成人免费观看网站| 黄色亚洲免费| 欧美乱偷一区二区三区在线| 国产精品久久| 欧美性xxxx69| 1区1区3区4区产品乱码芒果精品| 亚洲欧洲一区二区福利| 97超碰人人看人人 | 激情丁香综合| 日韩视频在线播放| 久久综合伊人77777麻豆| 欧美日韩蜜桃| 久久综合伊人77777麻豆| 不卡视频一区二区| 午夜综合激情| 亚洲少妇自拍|