檢視畫面是工作台部份,可以導覽階層(關係)資訊或顯示物件內容。只有任何給定的檢視畫面的實例開啟在工作台頁面中。當使用者在檢視畫面中作選擇或其他變更時,這些變更立即反映到工作台中。 通常檢視畫面是要支援對應的編輯器。 比方說,概要檢視畫面會在編輯器中顯示結構化的資訊檢視畫面。內容檢視畫面會顯示目前在編輯之物件的內容。
延伸點 org.eclipse.ui.views 可讓外掛程式新增檢視畫面到工作台中。 提供檢視畫面的外掛程式必須在它們的 plugin.xml 檔中登錄檢視畫面,並提供其配置資訊,如它的實作類別、它所屬檢視畫面的種類(或群組),以及在功能表和標籤中應該用來說明檢視畫面的名稱和圖示。
檢視畫面的介面定義在 IViewPart 中,但外掛程式可以選擇繼承 ViewPart 類別,而不重新實作 IViewPart。
我們在 Hello World 範例中實作了一個最小的檢視畫面延伸項目。 現在,我們要看看知道其他工作台檢視畫面且會回應使用者在工作台中的導覽和選項變更的延伸項目。 首先,我們要看看在 plugin.xml 中的延伸項目宣告。
<extension point="org.eclipse.ui.views"> <category id="org.eclipse.ui.examples.readmetool" name="%Views.category"> </category> <view id="org.eclipse.ui.examples.readmetool.views.SectionsView" name="%Views.ReadmeSections" icon="icons/view16/sections.gif" category="org.eclipse.ui.examples.readmetool" class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView"> </view> </extension>
這應該看起來很熟悉。 我們看到在工作台中提供了一個新檢視畫面 ReadmeSectionsView。 檢視畫面 ID、名稱和種類都是如我們先前所見而指定的。 另外也利用相對於外掛程式安裝目錄的路徑,而提供了檢視畫面的圖示。
現在,我們要看看 ReadmeSectionsView。 您可以選取視窗 -> 顯示檢視畫面 -> 其他...,再從顯示檢視畫面清單中選取檢視畫面,以在工作台中顯示任何檢視畫面。
當我們顯示 ReadmeSectionsView 時,會蹦現出含有一份清單的檢視畫面。 除非我們按一下副檔名為 .readme 的檔案,這時會將 Readme 檔中的各區段移入清單中,否則,清單會是空的。
外掛程式如何辨認 Readme 檔,又如何知道選項的變更? 如果我們向下追蹤這些問題的答案,我們就會逐步了解如何建置整合性工作台外掛程式。
我們將從熟悉的 createPartControl 方法開始。如我們在 Hello World 範例中所見,這是建立代表檢視畫面之 Widget 的位置。我們將忽略部份程式碼來開始作業。
public void createPartControl(Composite parent) {viewer = new ListViewer(parent); ... // 新增自己作為廣域選項接聽器 getSite().getPage().addSelectionListener(this); // 準備選項 selectionChanged(null, getSite().getPage().getSelection()); }
檢視畫面會建立和儲存一個 ListViewer,且會在它的頁面中,將自己登錄為選項接聽器。 它會從含有檢視畫面環境定義相關資訊(如它的工作台視窗、包含項目的頁面及外掛程式) 的 IViewSite 中取得頁面。 當我們獲知選項有了改變時,發生什麼?這時會執行下列程式碼:
public void selectionChanged(IWorkbenchPart part, ISelection sel) { //如果選項是 Readme 檔,就取得它的各區段。 AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel); viewer.setInput(input); }
似乎 ReadmeModelFactory 類別是負責轉換選項為 Readme 的區段,而這些區段是我們在 createPartControl 方法中建立的檢視器的輸入內容。
但檢視器如何移入它的清單 Widget?現在,假設當檢視器得知它的輸入元素時, 它就知道如何將資訊移入清單 Widget 中 - 它畢竟是一個 ListViewre。如果您必須馬上知道檢視器到底是什麼,請跳至檢視器。
我們仍然不知道如何偵測到 Readme 檔或檔案的區段資訊從何而來。快速看一下 ReadmeModelFactory 獲得一些資訊。
public AdaptableList getSections(ISelection sel) { // 如果 sel 不是剛傳回的結構化選項。 if (!(sel instanceof IStructuredSelection)) return null; IStructuredSelection structured = (IStructuredSelection)sel; //如果選項是 Readme 檔,就取得它的各區段。 Object object = structured.getFirstElement(); if (object instanceof IFile) { IFile file = (IFile) object; String extension = file.getFileExtension(); if (extension != null && extension.equals(IReadmeConstants.EXTENSION)) { return getSections(file); } } //選取的物件不是 Readme 檔 return null; }
我們檢查選項來瞭解它是不是結構化(多重)選項。(結構化選項的概念來自 JFace 檢視器。) 對於選項中的第一個物件,我們檢查它是不是檔案(IFile)資源。如果是,我們就檢查它有沒有 ".readme" 副檔名。如果得知我們有一個 Readme 檔,我們就可以利用其他方法來剖析區段。 您可以瀏覽 ReadmeModelFactory、MarkElement 和 DefaultSectionsParser 的其餘部份來取得檔案剖析的詳細資料。
我們已在探究過這個副檔名時,瞭解許多一般的工作台概念。 現在,我們要進入另一些工作台延伸項目,並檢查您的外掛程式能不能提供到工作台 UI 中。