org.eclipse.ui.elementFactories

根據工作台關閉期間所儲存的資料來重建工作台模型物件的元素 Factory。

在嚴密查閱元素 Factory 延伸項目前,必須檢視整個平台中所使用的一般技術,以 將外掛程式特定的操作方式新增至通用平台模型物件。

IAdaptables 和工作台配接器

當瀏覽各種工作台類別時,您會注意到許多工作台介面延伸 IAdaptable 介面。

外掛程式使用配接器來將特定的操作方式新增至系統中預先存在的類型。 例如,工作台可能要將操作方式新增至資源,以便資源回應標籤和影像來於 UI 中代 表它們自己。我們知道將 UI 特定的操作方式新增至低層次物件並不是好的設計方式 ,所以要如何將這個操作方式新增至資源類型呢?

平台定義了一種技術來動態查詢其特定介面實作方式的物件。 外掛程式可登錄將操作方式新增至預先存在類型的配接器。如此,應用程式碼可稍後 在特定環境定義使用某物件時,於特定配接器中查詢該物件。如果已有為該物件登錄的 配接器,外掛程式可取得該配接器並使用定義於其中的新操作方式。

藉由提供機能來於配接器中動態查詢某個物件,我們也可在發展系統時增進系統彈性。 新外掛程式可針對平台類型來登錄新配接器,而不需要變更原始類型的定義。 方式是向特定配接器要求物件。

//給定一個物件 o,我們想對它執行一些「工作台」的工作。
if (!(o instanceof IAdaptable)) {
    return null;
}
IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class);
if (adapter == null)
    return null;
// 現在我可以把 o 當作 IWorkbenchAdapter
...

如果沒有手動對物件登錄配接器,則會傳回 null 為配接器。從屬站必須準備處理這 個情況。這可讓從屬站適當處理尚未登錄預期配接器的情況。

工作台使用配接器來從基本平台類型取得 UI 資訊,此類型如 IResource。 這可根據特定 UI 知識來保護基本類型,以及讓工作台發展它的介面,而不需要變更 基本類型定義。

若無配接器,則任何可能來回遞入工作台 API 的類別必須實作 UI 介面。 這會混淆了緊密相關的類別定義和簡介。它簡介基核和 UI 類別之間的循環相依性。 有了配接器,每一個類別可實作 IAdaptable 及使用配接器登錄來讓外掛程式擴充基本類型的操作方式。

在整個工作台程式碼中,您會看到在配接器查詢類型的情況。這一切都是為了取得知 道如何回應有關平台基核類型的 UI 導向資訊之物件。

元素 Factory

當使用者關閉了工作台,必須儲存工作台中顯示的 IAdaptable 物件現行狀態。方法是以方便在檔案系統中儲存的特定格式 IMemento 來儲存物件的初始資料參數。也會儲存可根據 IMemento 來重建物件的 Factory ID。

當重新啟動平台後,工作台會尋找與 memento 中已知 Factory ID 相關的元素 Factory。尋找 Factory 的方法是在外掛程式登錄中檢查 org.eclipse.ui.elementFactories 延伸項目的組件。

標記十分簡單。我們只需要指定 Factory ID 和實作 Factory 的對應類別。

下列程式碼片段來自工作台 plugin.xml

<extension
    point = "org.eclipse.ui.elementFactories">
    <factory id ="org.eclipse.ui.internal.model.ResourceFactory"
        class="org.eclipse.ui.internal.model.ResourceFactory">
    </factory>
    <factory id ="org.eclipse.ui.internal.model.WorkspaceFactory"
        class="org.eclipse.ui.internal.model.WorkspaceFactory">
    </factory>
    <factory id ="org.eclipse.ui.part.FileEditorInputFactory"
        class="org.eclipse.ui.part.FileEditorInputFactory">
    </factory>
    <factory id ="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"
        class="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory">
    </factory>
</extension>