org.eclipse.ui.views

檢視畫面是工作台的一部份,可以導覽資訊的階層或顯示物件的內容。通常檢視畫面,通常是要支援對應的編輯器。 比方說,概要檢視畫面會在編輯器中顯示結構化的資訊檢視畫面。內容檢視畫面會顯示目前在編輯之物件的內容。

當使用者在檢視畫面中進行選擇或變更時,變更會立即反映在使用者介面的其它相關部份。 在工作台頁面中,只會顯示任何給定檢視畫面的一個實例。

延伸點 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="&amp;Readme">
    </category>
    <view
        id="org.eclipse.ui.examples.readmetool.views.SectionsView"
        name="Readme Sections"
        icon="icons/basic/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 範例中所見,這是建立代表檢視畫面之小組件的位置。我們將忽略部份程式碼來開始作業。

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);
}

似乎選項轉換成 Readme 區段時所涉及 ReadmeModelFactory 類別,我們了解這些區段是我們在 createPartControl 方法中建立的檢視器的輸入內容。

我們知道在選項中登錄喜好項目的檢視畫面有了改變。 這選項以某方式轉換成我們的檢視器的適當輸入內容。 檢視器執行了某些我們不明白的動作來移入清單小組件。

如果您現在必須立刻得知這是關於什麼的檢視器,請移至檢視器。 現在,我們只這麼說,當檢視器得知它的輸入元素時,它就知道如何將資訊移入清單小組件中。(它究竟是一個 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 檔,我們就可以利用其它方法來剖析區段。 您可以瀏覽 ReadmeModelFactoryMarkElement DefaultSectionsParser 的其餘部份來取得檔案剖析的詳細資料。

我們已在探究過這個副檔名時,瞭解許多一般的工作台概念。 現在,我們要進入另一些工作台延伸項目,並檢查您的外掛程式能不能進一步提供到工作台 UI 中。