<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    eclipshine

    Eclipse主題站

    EMF.Edit編程學習筆記之一: Item Provider機制

    (注:大部分翻譯,整理自Eclipse Modeling Framework: A Developer's Guide一書的第3.1, 3.2節的內容)


    Porvider的概念

    對于JFace部分的內容已經比較清楚,這里重點看一下EclipsePropertySheet是如何實現的。這涉及到了三個接口,IPropertySourceProviderIPropertySource,IPropertyDescriptor。而模型對象如果要能夠與PropertySheet進行交互,則必須實現IPropertySource接口。Eclipse能夠自動的通過IPropertySourceProvider(當然也不是自動,用到了Eclipse中的Adapter技術),取得這個實現了IPropertySource的模型對象,并讓PropertySheet對其進行調用。IPropertySourcegetPropertyDescriptors()方法取得所有的屬性描述對象,屬性描述對象定義了一個顯示在PropertySheet中的屬性的名稱等一些相關的性質。IPropertySource中的其它方法,提供了對屬性值的顯示與修改的方法。

    image001.png

    圖摘自(Eclipse Modeling Framework: A Developer's Guide 

    因此可以看到,要實現一個Tree Viewer,則必須有一個實現了ITreeContentProvider 接口的對象為其提供內容,有一個ILabelProvider接口對象為其提供顯示的標簽和圖標。對于PropertySheet也是如此,必須有一些實現了IPropertyDescriptors()接口的對象來提供被編輯的屬性描述。EMF.Edit要做的就是這樣的一個工作:它為EMF模型對象,為這些不同的Viewer生成Provider,使得EMF模型對象能夠通過那些Viewer進行顯示與編輯。EMF.Edit能夠通過兩種方式來完成這樣的工作,反射機制,以及代碼生成的機制。并且EMF.Edit允許方便的更改所生成的代碼,使得其能夠滿足特定的要求。

    EMF.Edit中對EMF模型對象的改變,都是通過一種通用的機制:Command來實現的。EMF.Edit提供了對一些常見的Command的實現,并可支持自定義的Command。從上面的討論可以大概的了解到,EMF.Edit提供的是在Eclipse的界面(JFace, PropertySheet, etc)同EMF模型對象之間的一個橋梁,使得能夠通過Eclipse UI來顯示和修改EMF所定義的模型對象。EMF.Edit分為兩個部分:

    1.         org.eclipse.emf.edit: 提供的是底層的與界面無關的部分。

    2.         org.eclipse.emf.edit.ui: 提供的是與Eclipse UI相關的實現類。

    EMF.Edit中最重要的概念是Item ProviderEMF.Edit使用一種代理機制,使得大部分與模型對象相關的功能都最終被代理到相關的Item Provider上了。因此Item Provider需要完成下面這4種主要的功能:

    1.         實現content label provider 的功能。

    2.         EMF objects提供PropertySource的功能。

    3.         作為Command Factory為模型對象創建相關的Command

    4.         EMF模型改變通知到Viewers。

    特定的Item Provider通常通過繼承ItemProviderAdapter類來完成全部或者部分的上述功能。Item Provider可以通過代碼生成機制被生成后然后進行適當的修改以滿足要求;另一方面,EMF.Edit也提供了ReflectiveItemProvider,通過EObject的反射機制實現了上述所有的功能。



    下面看上述的功能是如何在
    EMF.Edit中被實現的。

    實現content label provider 的功能

    EMF.Edit提供了通用的AdapterFactoryContentProviderAdapterFactoryLabelProvider實現。也就是說對于一個TableViewer而言,它使用AdapterFactoryContentProviderAdapterFactoryLabelProvider作為其ContentProviderLabelProvider。AdapterFactoryContentProvider等再將請求轉發到具體的Item Provider上。轉發的過程如下所示,在AdapterFactoryContentProvider中實現的ContentProvider所定義的getChildren()方法:

           public Object[] getChildren(Object object) {

                  ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory

                                .adapt(object, ITreeItemContentProvider.class);

                  return adapter.getChildren(object).toArray();

           }

    AdapterFactoryContentnProvide通過其adapterFactory,將模型對象object適配到ITreeItemContentProvider上(注意ITreeContentProviderITreeItemContentProvider名稱上的區別),然后調用相應的方法。這里用到的adapter的模式,在EclipseEMF中使用的非常廣泛

     image003.png

    圖摘自(Eclipse Modeling Framework: A Developer's Guide 

    ITreeContentProviderITreeItemContentProvider雖然名稱上有區別,但其實際上功能是類似的,EMF中之所以引入ITreeItemContentProvider,是為了避免對JFace這樣的UI包的依賴,使得其能夠用到其它的非UI或者非JFace的環境中。這樣的接口有:

    l         ITreeItemContentProvider

    l         IStructuredItemContentProvider

    l         ITableItemLabelProvider

    l         IItemLabelProvider

    分別對應于JFace中去掉了Item后的接口。

    EMF objects提供PropertySource的功能

    AdapterFactoryContentProvider實際上也實現了IPropertySourceProvider接口,使用如上所述的相同的方式,將模型對象適配到一個IItemPropertySource接口上,對應于IPropertySource。另外的一個EMFPropertySource通過封裝IItemPropertySource實現了PropertySheet所需要的IPropertySource接口,并被AdapterFactoryContentProvider所返回。同樣的模式被使用到生成IPropertyDescriptorEMF實現PropertyDescriptor上。下面的這個圖可以比較清楚的看到這樣的關系。

     image005.png

    圖摘自(Eclipse Modeling Framework: A Developer's Guide

    作為Command Factory為模型對象創建相關的Command

    EMF有其自生的Command框架。在這個框架中,EditingDomain是一個類是于JFace中的Provider的接口,提供對Command的創建。并且,EMF.Edit也有一個實現了這個接口的AdapterFactoryEditingDomain,并將請求轉發到被適配的IEditingDomainItemProvider對象上。

    EMF模型改變通知到Viewers

    Item Provider作為標準的EMF Adapter,當被適配的模型對象發生改變的時候Item ProvidernotifyChanged()會被調用。實際上,ItemProvidernotifyChange()只是將請求(經過過濾后)轉給相應的ItemProviderAdapterFacotry,使得其作為模型事件注冊及響應的中心。如下圖所示:

     image007.png

    圖摘自(Eclipse Modeling Framework: A Developer's Guide

    需要注意的是,在這樣情景下,作為內容顯示部分的Viewer并不是事件監聽者,相應的Provider對象才是,它監聽事件,并調用Viewerupdate()方法以刷新顯示的內容。

    posted on 2005-07-29 17:21 Living Not Striving 閱讀(2610) 評論(1)  編輯  收藏 所屬分類: EMF

    評論

    # re: EMF.Edit編程學習筆記之一: Item Provider機制 2006-06-02 15:17 bobby

    高!實在是高,
    不僅高,而且高深,不適合我這菜鳥看  回復  更多評論   

    主站蜘蛛池模板: 亚洲不卡AV影片在线播放| 我的小后妈韩剧在线看免费高清版| 亚洲第一页在线播放| 精品熟女少妇aⅴ免费久久 | 亚洲午夜精品久久久久久app| 国产激情免费视频在线观看| 好爽又高潮了毛片免费下载 | 国产午夜无码精品免费看| 亚洲永久精品ww47| 在线观看免费黄网站| 成人毛片手机版免费看| 亚洲欧美日韩一区二区三区在线| 成人免费无码大片A毛片抽搐色欲| 成人亚洲国产va天堂| 国产成人免费片在线观看| 成年大片免费高清在线看黄| 亚洲精品第一国产综合境外资源| 一个人看www免费高清字幕| 亚洲五月综合缴情在线观看| 久9热免费精品视频在线观看| 亚洲高清免费视频| aa级毛片毛片免费观看久| 亚洲精品免费在线观看| caoporm碰最新免费公开视频| 亚洲日韩av无码| 1000部拍拍拍18勿入免费视频下载| 亚洲一区二区三区影院| 香蕉成人免费看片视频app下载| 亚洲乱码一二三四区国产| 国产真人无遮挡作爱免费视频| 久久精品成人免费观看97| 久久亚洲私人国产精品vA| 在线涩涩免费观看国产精品 | 亚洲一区二区三区免费在线观看| 日韩激情淫片免费看| 亚洲三级高清免费| 亚洲国产综合精品一区在线播放| 亚洲电影免费在线观看| 亚洲情A成黄在线观看动漫软件| 亚洲另类激情专区小说图片| 蜜桃AV无码免费看永久|