檢視程式

既然我們已經看過可以直接以 SWT 小組件來實作的工作台 UI 構成要素(如檢視畫面、 編輯器、精靈和對話框),為什麼您還需要使用檢視程式呢?

檢視程式可讓您在使用模型物件的同時建立小組件。如果您直接使用 SWT 小組件,則必須將物件轉換成 SWT 預期的字串和影像。檢視程式充當 SWT 小組件上的配接器,處理用於處理小組件事件的通用程式碼,否則您必須自行實 作。

第一次提到檢視程式是在 Readme 工具的檢視畫面構成要素之 ReadmeSectionsView 內。

public void createPartControl(Composite parent) {
viewer = new ListViewer(parent);
...

附註:檢視程式可用來提供工作台檢視畫面和編輯器的實作。 檢視程式這個詞彙並非代表僅用於實作檢視畫面。例如,TextViewer 用於許 多工作台和外掛程式編輯器的實作中。

標準檢視程式

JFace 提供 SWT 中大部份重要小組件的檢視程式。這些檢視程式最常用於清單 、樹狀結構、表格及文字小組件。

每一個檢視程式都有相關聯的 SWT 小組件。這個小組件可藉由在適合的檢視程式建 構子中提供母項 Composite 來隱含地建立,或藉由先建立它再提供給其建構 子中的檢視程式來明確地建立。

清單導向的檢視程式

從使用者的觀點而言,清單、樹狀結構及表格共用許多的一般功能,例如隨物件移入 、選項、排序及過濾。

這些檢視程式保存一份網域物件(稱為元素)清單,並在其對應的 SWT 小組件中顯示它們。清單檢視程式明白如何從清單中任何元素取得文字標籤。 它從檢視程式上可設定的 ILabelProvider 取得標籤。清單檢視程式明白如何將小組件回覆對映回檢視程式從屬站已知的 許多元素。

使用一般 SWT 小組件的從屬站必須在 SWT 層次上操作 - 此處的項目通常與字串 清單內索引相關的字串和事件。檢視程式提供較高層次語意。從屬站利用提供給檢視 程式的元素來瞭解清單所做的變更與選項。檢視程式處理所有普通工作人員的工作,將 索引對映回元素、調整物件的過濾檢視畫面以及在必要時重新排序它們。

過濾和排序功能經由指定檢視程式的檢視程式排序器 (ViewerSorter) 及/或檢視程式過濾器 (ViewerFilter) 來處理。(除了清單檢視程式以外,樹狀結構和表格檢視程式可指定這些功能。) 從屬站僅需提供一個可比較或過濾清單中物件的類別。檢視程式處理根據指定次序和 過濾器移入清單,以及維護新增及除去元素時的次序和過濾器等詳細資料。

檢視程式並非設計來由從屬站擴充。若要自訂檢視程式,您可以使用自己的內 容和標籤提供者來配置它。

ListViewer 將清單中的元素對映到 SWT List 控制項。

TreeViewer 顯示 SWT Tree 小組件中的階層式物件。它處理展開及收合項目的詳細資料。不同的 SWT 樹狀結構 控制項(純文字樹狀結構、表格樹狀結構、勾選框樹狀結構)有若干不同種類的樹狀 結構檢視程式。

TableViewer 非常類似清單檢視程式,但增加了檢視表格中每一元素多重資訊直欄的能力。 表格檢視程式藉由簡介編輯資料格的概念,明顯地擴增 SWT 表格小組件的功能。 特殊資料格編輯器可讓使用者利用組合框、對話框或文字小組件來編輯表格資料格。 表格檢視程式處理使用者編輯所需的這些小組件之建立和放置。作法是使用 CellEditor 類別,例如 TextCellEditorCheckboxCellEditor

文字檢視程式

文字小組件有許多共用語意,例如按兩下的操作方式、復原、配色及透過索引或指令 行導覽。TextViewer 是用於 SWT StyledText 小組件的配接器。文字檢視程式提供文件模型給從屬站,並且管理文字小組件提供的 文字型資訊文件轉換。

工作台編輯器中有更多關於文字檢視 程式的詳細資訊。

檢視程式架構

欲瞭解檢視程式,您必須熟悉檢視程式的輸入元素、它的內容、它的選項及實際顯示 在所操作小組件中的資訊之間的關係。

輸入元素

輸入元素是檢視程式顯示(或編輯)的主要物件。就檢視程式的觀點而 言,輸入元素可以是任何物件。它不假設任何特定介面由輸入元素實作。 (等一下我們看到內容提供者時,就知道為什麼了。)

檢視程式必須能夠處理輸入元素的變更。如果某個新輸入元素設成檢視程式,則必須 根據新元素重新移入其小組件,並取消它本身與上一個輸入元素的關聯性。 登錄為輸入元素的接聽器並根據元素移入小組件的語意視各個檢視程式而有不同。

內容檢視程式

內容檢視程式是具有定義完善的通信協定的檢視程式,用來取得其輸入元素 的資訊。 內容檢視程式使用兩個專用 Helper 類別來移入其小組件及顯示輸入元素相關資訊, 這兩個類別為: IContentProviderILabelProvider

IContentProvider 提供基本生命週期通信協定,建立內容提供者與輸入元 素的關聯性並處理輸入元素的變更。其他專用內容提供者針對不同的檢視程式實作。 最常用的內容提供者為 IStructuredContentProvider ,它可提供指定輸入元素的物件清單。它使用於清單型檢視程式中,例如清單、表格 或樹狀結構。一般而言,內容提供者明白如何在輸入元素與預期的檢視程式內容之間 對映。

ILabelProvider 執行進一步的步驟。提供檢視程式內容(衍生自輸入元素 和內容檢視程式),它可產生特定的 UI 元素,例如在檢視程式中顯示內容所需的名 稱和圖示。標籤提供者可協助儲存圖示資源,因為它們可確保相同的圖示實例用於檢 視程式中所有類似類型。

附註:特定內容和標籤提供者的實例並非設計於多重檢視程式間共用。 即使您所有檢視程式使用相同類型的內容或標籤提供者,每一個檢視程式仍應以其本 身提供者類別的實例起始設定。提供者生命週期通信協定是針對提供者與其檢視程式 間一對一關係所設計。

輸入元素、內容提供者和標籤檢視程式可讓檢視程式隱藏移入小組件的大部份實作明 細。檢視程式的從屬站僅需擔心移入的檢視程式內含的輸入和內容提供者種類是否正 確。 標籤提供者必須明白如何從檢視程式內容衍生 UI 資訊。

檢視程式和工作台

看看工作台如何使用檢視程式、內容提供者和標籤提供者,就可以知道它們所提供的彈 性。

WorkbenchContentProvider 為結構式內容提供者,它藉由詢問輸入元素子項來取得其內容。為了實作通用功能, 再次使用了配接器概念。當向其輸入元素要求元素清單時,WorkbenchContentProvider 會取得該輸入元素的 IWorkbenchAdapter 。如果已登錄輸入元素的 IWorkbenchAdapter ,內容提供者可安全地假設該元素可對其子項查詢。當工作區變更時, WorkbenchContentProvider 也會執行必要的工作來保持其檢視程式為最新狀態。

WorkbenchLabelProvider 是一個標籤提供者,它從物件取得 IWorkbenchAdapter ,以便尋找其文字和影像。標籤提供者的概念對於工作台物件特別有用,因為它允許 單一標籤提供者快取檢視程式中常用的影像。例如,一旦 WorkbenchLabelProvider 取得用於 IProject 的影像,它便可快取該影像並將它用於檢視程式中顯示的所有 IProject

藉由定義通用配接器 IWorkbenchAdapter ,並對許多平台類型登錄它,我們可以在許多通用檢視程式及含有它們的工作台檢視 畫面中正確地顯示這些類型。