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

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

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

    eclipshine

    Eclipse主題站

    EMF.Edit編程學(xué)習(xí)筆記之一: Item Provider機(jī)制

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


    Porvider的概念

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

    image001.png

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

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

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

    1.         org.eclipse.emf.edit: 提供的是底層的與界面無(wú)關(guān)的部分。

    2.         org.eclipse.emf.edit.ui: 提供的是與Eclipse UI相關(guān)的實(shí)現(xiàn)類。

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

    1.         實(shí)現(xiàn)content label provider 的功能。

    2.         EMF objects提供PropertySource的功能。

    3.         作為Command Factory為模型對(duì)象創(chuàng)建相關(guān)的Command

    4.         EMF模型改變通知到Viewers

    特定的Item Provider通常通過(guò)繼承ItemProviderAdapter類來(lái)完成全部或者部分的上述功能。Item Provider可以通過(guò)代碼生成機(jī)制被生成后然后進(jìn)行適當(dāng)?shù)男薷囊詽M足要求;另一方面,EMF.Edit也提供了ReflectiveItemProvider,通過(guò)EObject的反射機(jī)制實(shí)現(xiàn)了上述所有的功能。



    下面看上述的功能是如何在
    EMF.Edit中被實(shí)現(xiàn)的。

    實(shí)現(xiàn)content label provider 的功能

    EMF.Edit提供了通用的AdapterFactoryContentProviderAdapterFactoryLabelProvider實(shí)現(xiàn)。也就是說(shuō)對(duì)于一個(gè)TableViewer而言,它使用AdapterFactoryContentProviderAdapterFactoryLabelProvider作為其ContentProviderLabelProviderAdapterFactoryContentProvider等再將請(qǐng)求轉(zhuǎn)發(fā)到具體的Item Provider上。轉(zhuǎn)發(fā)的過(guò)程如下所示,在AdapterFactoryContentProvider中實(shí)現(xiàn)的ContentProvider所定義的getChildren()方法:

           public Object[] getChildren(Object object) {

                  ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory

                                .adapt(object, ITreeItemContentProvider.class);

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

           }

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

     image003.png

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

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

    l         ITreeItemContentProvider

    l         IStructuredItemContentProvider

    l         ITableItemLabelProvider

    l         IItemLabelProvider

    分別對(duì)應(yīng)于JFace中去掉了Item后的接口。

    EMF objects提供PropertySource的功能

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

     image005.png

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

    作為Command Factory為模型對(duì)象創(chuàng)建相關(guān)的Command

    EMF有其自生的Command框架。在這個(gè)框架中,EditingDomain是一個(gè)類是于JFace中的Provider的接口,提供對(duì)Command的創(chuàng)建。并且,EMF.Edit也有一個(gè)實(shí)現(xiàn)了這個(gè)接口的AdapterFactoryEditingDomain,并將請(qǐng)求轉(zhuǎn)發(fā)到被適配的IEditingDomainItemProvider對(duì)象上。

    EMF模型改變通知到Viewers

    Item Provider作為標(biāo)準(zhǔn)的EMF Adapter,當(dāng)被適配的模型對(duì)象發(fā)生改變的時(shí)候Item ProvidernotifyChanged()會(huì)被調(diào)用。實(shí)際上,ItemProvidernotifyChange()只是將請(qǐng)求(經(jīng)過(guò)過(guò)濾后)轉(zhuǎn)給相應(yīng)的ItemProviderAdapterFacotry,使得其作為模型事件注冊(cè)及響應(yīng)的中心。如下圖所示:

     image007.png

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

    需要注意的是,在這樣情景下,作為內(nèi)容顯示部分的Viewer并不是事件監(jiān)聽(tīng)者,相應(yīng)的Provider對(duì)象才是,它監(jiān)聽(tīng)事件,并調(diào)用Viewerupdate()方法以刷新顯示的內(nèi)容。

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

    評(píng)論

    # re: EMF.Edit編程學(xué)習(xí)筆記之一: Item Provider機(jī)制 2006-06-02 15:17 bobby

    高!實(shí)在是高,
    不僅高,而且高深,不適合我這菜鳥(niǎo)看  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 产传媒61国产免费| 亚洲日本一线产区和二线 | 91免费人成网站在线观看18| 2019中文字幕免费电影在线播放| 999国内精品永久免费观看| 国产成人免费高清在线观看| 伊人久久亚洲综合| 亚洲精品熟女国产| 免费无码国产V片在线观看| 毛片无码免费无码播放| 好吊妞788免费视频播放| 亚洲人成网站色在线入口| 国产精品免费综合一区视频| 亚洲一卡2卡三卡4卡无卡下载| 中文字幕视频免费在线观看| 18勿入网站免费永久| 亚洲乱码一二三四区乱码| 中文字字幕在线高清免费电影| 国产亚洲男人的天堂在线观看| 国产免费人成视频尤勿视频| 免费看黄视频网站| 久久久久久久综合日本亚洲| 亚洲综合色丁香婷婷六月图片| 大地资源在线资源免费观看 | 亚洲一区二区三区久久久久| 成人自慰女黄网站免费大全| 亚洲愉拍99热成人精品热久久| 亚洲日本VA中文字幕久久道具| 国产视频精品免费| 成年免费a级毛片免费看无码| 亚洲第一区香蕉_国产a| 午夜在线免费视频 | 日韩亚洲国产高清免费视频| 日本亚洲欧美色视频在线播放| 久久精品视频免费看| 中文字幕日韩亚洲| 免费夜色污私人影院网站| 亚洲无码在线播放| 日韩免费a级毛片无码a∨| 亚洲欧洲国产精品久久| 5g影院5g天天爽永久免费影院|