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="%Views.category">
	</category>
	<view
 	   id="org.eclipse.ui.examples.readmetool.views.SectionsView"
	   name="%Views.ReadmeSections"
	   icon="icons/view16/sections.png"
	   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);
   }

似乎 ReadmeModelFactory 類別是負責轉換選項為 Readme 的區段,而這些區段是我們在 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 中。