既然我們已經看過可以直接以 SWT Widget 來實作的工作台 UI 構成要素(如檢視畫面、 編輯器、精靈和對話框),為什麼您還需要使用檢視器呢?
檢視器可讓您在使用模型物件的同時建立 Widget。如果您直接使用 SWT Widget,則必須將物件轉換成 SWT 預期的字串和影像。檢視器充當 SWT Widget 上的配接器,處理用於處理 Widget 事件的通用程式碼,否則您必須自行實 作。
第一次提到檢視器是在 Readme 工具的檢視畫面構成要素之 ReadmeSectionsView 內。
public void createPartControl(Composite parent) {viewer = new ListViewer(parent); ... }
附註:檢視器可用來提供工作台檢視畫面和編輯器的實作。 檢視器這個詞彙並非代表僅用於實作檢視畫面。例如,TextViewer 用於許 多工作台和外掛程式編輯器的實作中。
JFace 提供 SWT 中大部份重要 Widget 的檢視器。這些檢視器最常用於清單 、樹狀結構、表格及文字 Widget。
每一個檢視器都有相關聯的 SWT Widget。這個 Widget 可藉由在適合的檢視器建 構子中提供母項 Composite 來隱含地建立,或藉由先建立它再提供給其建構 子中的檢視器來明確地建立。
從使用者的觀點而言,清單、樹狀結構及表格共用許多的一般功能,例如隨物件移入 、選項、排序及過濾。
這些檢視器保存一份網域物件(稱為元素)清單,並在其對應的 SWT Widget 中顯示它們。清單檢視器明白如何從清單中任何元素取得文字標籤。 它從檢視器上可設定的 ILabelProvider 取得標籤。清單檢視器明白如何將 Widget 回覆對映回檢視器用戶端已知的 許多元素。
使用一般 SWT Widget 的用戶端必須在 SWT 層次上操作 - 此處的項目通常與字串 清單內索引相關的字串和事件。檢視器提供較高層次語意。用戶端利用提供給檢視器的元素來瞭解清單所做的變更與選項。檢視器處理所有普通工作人員的工作,將 索引對映回元素、調整物件的過濾檢視畫面以及在必要時重新排序它們。
過濾和排序功能經由指定檢視器的檢視器排序器(ViewerSorter)及/或檢視器過濾條件(ViewerFilter)來處理。(除了清單檢視器以外,樹狀結構和表格檢視器可指定這些功能。) 用戶端僅需提供一個可比較或過濾清單中物件的類別。檢視器處理根據指定次序和 過濾條件移入清單,以及維護新增及除去元素時的次序和過濾條件等詳細資料。
檢視器並非設計來由用戶端擴充。若要自訂檢視器,您可以使用自己的內 容和標籤提供者來配置它。
ListViewer 將清單中的元素對映到 SWT List 控制項。
TreeViewer 顯示 SWT Tree Widget中的階層式物件。它處理展開及收合項目的詳細資料。不同的 SWT 樹狀結構 控制項(純文字樹狀結構、表格樹狀結構、勾選框樹狀結構)有若干不同種類的樹狀 結構檢視器。
TableViewer 非常類似清單檢視器,但增加了檢視表格中每一元素多重資訊直欄的能力。 表格檢視器藉由簡介編輯資料格的概念,明顯地擴增 SWT 表格 Widget 的功能。 特殊資料格編輯器可讓使用者利用組合框、對話框或文字 Widget 來編輯表格資料格。 表格檢視器處理使用者編輯所需的這些 Widget 之建立和放置。作法是使用 CellEditor 類別,例如 TextCellEditor 和 CheckboxCellEditor。
文字 Widget 有許多共用語意,例如按兩下的行為、復原、配色及透過索引或指令 行導覽。TextViewer 是用於 SWT StyledText Widget 的配接器。文字檢視器提供文件模型給用戶端,並且管理文字 Widget 提供的 文字型資訊文件轉換。
在工作台編輯器中有更多關於文字檢視器的詳細資料。
欲瞭解檢視器,您必須熟悉檢視器的輸入元素、它的內容、它的選項及實際顯示 在所操作 Widget 中的資訊之間的關係。
輸入元素是檢視器顯示(或編輯)的主要物件。就檢視器的觀點而 言,輸入元素可以是任何物件。它不假設任何特定介面由輸入元素實作。 (等一下我們看到內容提供者時,就知道為什麼了。)
檢視器必須能夠處理輸入元素的變更。如果某個新輸入元素設成檢視器,則必須 根據新元素重新移入其 Widget,並取消它本身與上一個輸入元素的關聯性。 登錄為輸入元素的接聽器並根據元素移入 Widget 的語意視各個檢視器而有不同。
內容檢視器是具有定義完善的通訊協定的檢視器,用來取得其輸入元素 的資訊。 內容檢視器使用兩個專用 Helper 類別來移入其 Widget 及顯示輸入元素相關資訊, 這兩個類別為: IContentProvider 和 ILabelProvider 。
IContentProvider 提供基礎生命週期通訊協定,建立內容提供者與輸入元 素的關聯性並處理輸入元素的變更。其他 private 內容提供者針對不同的檢視器實作。 最常用的內容提供者為 IStructuredContentProvider ,它可提供指定輸入元素的物件清單。它使用於清單型檢視器中,例如清單、表格 或樹狀結構。一般而言,內容提供者明白如何在輸入元素與預期的檢視器內容之間 對映。
ILabelProvider 執行進一步的步驟。提供檢視器內容(衍生自輸入元素 和內容檢視器),它可產生特定的 UI 元素,例如在檢視器中顯示內容所需的名 稱和圖示。標籤提供者可協助儲存圖示資源,因為它們可確保相同的圖示實例用於檢視器中所有類似類型。
附註:特定內容和標籤提供者的實例並非設計於多重檢視器間共用。 即使您所有檢視器使用相同類型的內容或標籤提供者,每一個檢視器仍應以其本 身提供者類別的實例起始設定。提供者生命週期通訊協定是針對提供者與其檢視器 間一對一關係所設計。
輸入元素、內容提供者和標籤檢視器可讓檢視器隱藏移入 Widget 的大部份實作詳細資料。檢視器的用戶端僅需擔心移入的檢視器內含的輸入和內容提供者種類是否正 確。 標籤提供者必須明白如何從檢視器內容衍生 UI 資訊。
看看工作台如何使用檢視器、內容提供者和標籤提供者,就可以知道它們所提供的彈 性。
WorkbenchContentProvider 為結構式內容提供者,它藉由詢問輸入元素子項來取得其內容。為了實作通用功能, 再次使用了配接器概念。當向其輸入元素要求元素清單時,WorkbenchContentProvider 會取得該輸入元素的 IWorkbenchAdapter 。如果已登錄輸入元素的 IWorkbenchAdapter ,內容提供者可安全地假設該元素可對其子項查詢。當工作區變更時, WorkbenchContentProvider 也會執行必要的工作來保持其檢視器為最新狀態。
WorkbenchLabelProvider 是一個標籤提供者,它從物件取得 IWorkbenchAdapter ,以便尋找其文字和影像。標籤提供者的概念對於工作台物件特別有用,因為它允許 單一標籤提供者快取檢視器中常用的影像。例如,一旦 WorkbenchLabelProvider 取得用於 IProject 的影像,它便可快取該影像並將它用於檢視器中顯示的所有 IProject 。
藉由定義通用配接器 IWorkbenchAdapter ,並對許多平台類型登錄它,我們可以在許多通用檢視器及含有它們的工作台檢視 畫面中正確地顯示這些類型。