構建基於通用瀏覽器架構(CNF)的視圖 第二部分:增加內容

來源:互聯網
上載者:User
 轉自:http://blog.csdn.net/windy444/archive/2007/12/31/2006304.aspx

由windy444翻譯,轉載請註明

原文名:Building a Common Navigator Framework (CNF) Viewer Part II: Adding Content,作者:MICHAEL ELDER,出處:http://scribbledideas.blogspot.com/(本人從未能開啟過,呵呵)。

先上Copyright

The opinions and ideas expressed herin are my own and do not represent the intent, opinion, or official statement of any company or organization.
All postings by me to this site are copyrighted (C) by Michael D. Elder, 2006 and made available under the terms of the Eclipse Public License 1.0 with the constraint that any reuse of the content must contain this copyright statement.

    在這篇文章中,我們將學習如何為我們上篇文章定義的例子增加一個簡單的內容擴充。為避免陷於過度複雜的內容和標籤提供者,我們將關注於一個簡單的檔案結構模型,簡單文字檔*.properties。當完成時,我們的內容擴充將允許在Example viewer展開任意*.properties檔案,並在下面正確排列出資料。

    首先,讓我們看一下,內容擴充在plugin.xml中看起來是怎樣的。(譯者註:略過一些基本操作,plugin.xml如下:)

    該擴充用id "org.eclipse.ui.examples.navigator.propertiesContent"定義了一個內容擴充,顯示的名稱是"Properties File Contents"。該名稱會出現在過濾器對話方塊的"Available Extensions"標籤中。我們馬上會去看一下內容和標籤提供者的Java代碼,但現在只是注意一下,兩者都被指定了。只指定其中的一個是不行的。

    最後,我們設定一些屬性,告訴架構,我們需要怎樣的擴充:

   • activeByDefault  決定擴充是否在預設配置中被啟用(如:新工作空間)

   • icon  決定在使用者介面引用該擴充時,顯示什麼表徵圖

   • priority  有幾種不同的用法。最主要的作用是指定視圖中項的相對位置(視圖中從上到下排列的分別是最高優先順序(highest priority)項到最低優先順序(lowest priority)項)。一般的說,“一般級”("normal")或“進階”("high")對於大多數的擴充來說,足夠了,兩者分別預示著與資源擴充混合在一起(優先順序一樣的話,則按字母順序)或恰好放在工程下的資源之上。

   在每個<navigatorContent />元素內,我們能指定不同類別的擴充。但在擴充我們的例子之前,我們必須向架構定義,我們的擴充何時被調用。我們必須定義,什麼時候視圖中樹的節點能夠提供children,parents,或者標籤和表徵圖。我們用Eclipse 核心運算式來做這個工作。

   對於內容擴充,這裡有兩個重要的運算式:<triggerPoints /> 和<possibleChildren />。

   <triggerPoints />運算式指定樹中哪種類型的節點對我們的擴充感興趣。當架構找到了匹配<triggerPoints />的節點,我們的擴充會被調用,為該節點提供子項目。我們的擴充並不一定是唯一能有機會為該節點提供子項目的擴充,架構會聚集該節點下所有的子項目(譯者註:可以是不同擴充提供的)。

   

     <possibleChildren />運算式指定我們的擴充能為樹中哪種類型的節點提供標籤或父節點(譯者註:注意與triggerPoints 的不同)。若你的情境中必須在視圖中支援link with editor, 或者 setSelection(),<possibleChildren />運算式必須是完整且正確的。

    一旦我們定義了一個擴充,我們必須把它綁定到想要關聯的視圖上。設定一個<viewerContentBinding />,來指定任何匹配include中模式的擴充,這些擴充對於在<viewerContentBinding />元素中指定的任何viewerId的視圖是可見的。可以參考上一篇文章。

   

    既然我們已經設定好了擴充,現在可以來看一下真正處理事務的代碼了。

    首先,我們需要一個模型。一個屬性檔案的結構是相當簡單的,我們只要用一個模型對象PropertiesTreeData,就能夠建模了。這個對象有三個域:name(屬性的名稱),value(屬性的值),container(擁有屬性模型的檔案)。每一個模型元素,指示屬性檔案中的一條屬性。

    在我們的例子中,模型只有當被內容提供者請求時,才被載入。內容提供者被架構用來決定樹中每個元素的子項目,或者被用來指定給定元素的父元素(可能有多個)。

    我們的樣本內容提供者實現了介面org.eclipse.jface.viewers.ITreeContentProvider,用來提供樹形結構的資訊。通用瀏覽器架構也支援實現org.eclipse.jface.viewers.ITreePathContentProvider介面的內容提供者,但這個超出了本例的範圍。

     PropertiesContentProvider也提供了我們的擴充需要的其它一些功能,比如監聽資源變化和更新模型(以及視圖)。在本文中不會涉及,讀者可以到本文的源碼中瞭解這個是如何工作的。

    現在,我們將關注ITreeContentProvider提供的視圖整合方法。

    ITreeContentProvider必須實現getElements(Object input),getChildren(Object parent), hasChildren(Object element) 和 getParent(Object element)方法。

    getElements()方法被用來查詢在視圖根目錄下有哪些元素。許多實現會直接調用getChildren()來處理,我們在這邊也如此。

   

     getChildren()方法接受一個對象(我們這裡是*.properties結尾的IFile,或者是由於在<triggerPoints />中描述而必須引入的PropertiesTreeData模型執行個體)。

    在接下來的實現中,我們檢查接受的對象是否為org.eclipse.core.resources.IFile,並且是否以*.properties結尾。如果接受的對象滿足這些要求,我們檢查載入模型的緩衝,當未緩衝時,嘗試載入模型。updateModel()方法將為每個屬性建立一個PropertiesTreeData對象,並且在cachedModelMap中緩衝所找到的模型。請讀者在源碼中查看updateModel()方法是如何?的。

    hasChildren()方法被最佳化了,知道當傳入的對象是以*.properties結尾的IFile,就返回true。另一種替換的方法,是在這邊載入檔案,作一些計算,但這樣效能會受損。

    如果傳入的對象是PropertiesTreeData模型元素,則返回false。因為我們的模型元素沒有子項目。(屬性沒有子項目,但其它模型可能就會有了)。

    getParent()方法返回包含PropertiesTreeData項的IFile,若傳入其它參數,返回null。通用瀏覽器架構會繼續詢問其它擴充,直到一個非null的的父元素被找到或者已經遍曆了所有擴充。回憶一下,如果元素匹配<possibleChildren />運算式,擴充會被要求為該元素提供父節點。

     最後,我們內容擴充的標籤提供者,會告訴視圖如何為我們的模型元素(PropertiesTreeData)來展現標籤和表徵圖。既然我們只關注這些元素,我們不必擔心如何為其它元素來提供標籤和表徵圖。這些元素將由其它的擴充來展現標籤和表徵圖。

    PropertiesLabelProvider實現了org.eclipse.jface.viewers.ILabelProvider 和
org.eclipse.ui.navigator.IDescriptionProvider介面。

    ILabelProvider是JFace中提供標籤和表徵圖的預設介面要求。

    IDescriptionProvider是特定用於通用瀏覽器架構的,用於在Eclipse視窗左下角的狀態列顯示文本。

    ILabelProvider要求的方法是getText() 和 getImage()。我們將讓模型標籤顯示"name= value"的字串。對於表徵圖,我們使用平台提供的一個共用表徵圖。

    標籤提供者在下面兩種情況下會被訪問到:1.自己的擴充定義的元素。2.所有匹配<possibleChildren />的元素。如果表徵圖或標籤返回了null,架構會基於<possibleChildren />和視圖bindings,繼續尋找其它擴充(來顯示標籤和表徵圖)。如果你的擴充希望由其它人來定義標籤和表徵圖,則要返回null。

    就這些了,最終的視圖Example View在屬性檔案下列出了屬性。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.