eroself

          關于人生的程式,在這里譜寫......
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理

          轉自: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在屬性文件下列出了屬性。



          主站蜘蛛池模板: 萨嘎县| 库伦旗| 灌云县| 寿阳县| 庄浪县| 鄂州市| 清水县| 左云县| 永年县| 漳平市| 平远县| 沂源县| 新密市| 大冶市| 建宁县| 遂昌县| 盱眙县| 彭水| 大姚县| 蓝田县| 渝北区| 余姚市| 西畴县| 普兰店市| 桃园市| 芦溪县| 小金县| 乌拉特中旗| 呼玛县| 平南县| 马公市| 南昌市| 钦州市| 通渭县| 东乡| 文化| 扎鲁特旗| 南通市| 定远县| 南丰县| 庆云县|