將組件實例化

所有和組件的互動都透過 ISite 發生。從某人建立一個組件的觀點來看,這個組件就是 ISite。ISite 可以從 IPartFactory 建立,或藉由直接將「網站」類別實例化的方式來建立。

如果要損毀一個組件,請除去它的 ISite 控制。

用 IPartFactory 來將組件實例化

通常用 IPartFactory 和 IPartFactory 所建立的視圖和編輯器,只能建立用視圖或編輯器延伸點來登錄的組件。 用 IPartFactory 所建立的組件視 IWorkbenchPage 而定,而且存在時間不能比 IWorkbenchPage 還久。IPartFactory 用 ID 來建立組件,且組件的實作類別不需要是 API。您可以從 IWorkbenchPage 取得 IPartFactory。 組件也會在它們的建構子中採用 IPartFactory,以建立巢狀子項。

本範例示範如何使用 IPartFactory 來建立視圖。

/**
 * 用來建立編輯器和視圖的實例。
 *
 * @自 3.1
 */
public interface IPartFactory {
    /**
     * 建立視圖的實例。傳回新建視圖的 <code>ISite</code>。
     * 用組件完成呼叫程式時,呼叫程式應除去組件的主要控制。
     * 做法是呼叫 <code>ISite.getControl().dispose()</code>,
     * 或除去母項組合。
     *
     * 視圖的 @param viewId ID,以 org.eclipse.ui.views 延伸點登錄
     * @param parentComposite 視圖的母項組合。如果已順利完成建立視圖,
     *        它會在這個組合中建立一個完新的子項控制項。
     * @param context 視圖的本端環境定義。這個物件可以置換視圖的所有相依關係。
     *        如果視圖有一個在本端環境定義中找不到的相依關係,
     *        org.eclipse.core.component.types 延伸點便會提供預設實作。
     * @param savedState 前次儲存的組件狀態,如果沒有的話,就是空值
     * @傳回新建視圖的 ISite
     * @如果無法建立組件,便會擲出 CoreException
     */
    public ISite createView(String viewId, Composite parentComposite, IContainerContext context, IMemento savedState) throws CoreException;
   
    /**
     * 建立編輯器的實例。傳回新建編輯器的 <code>ISite</code>。
     * 用組件完成呼叫程式時,呼叫程式應除去組件的主要控制。
     * 做法是呼叫 <code>ISite.getControl().dispose()</code>,
     * 或除去母項組合。
     *
     * 編輯器的 @param editorId ID,以 org.eclipse.ui.editors 延伸點登錄
     * @param parentComposite 編輯器的母項組合。如果已順利完成建立編輯器,
     *        它會在這個組合中建立一個完新的子項控制項。
     * @param context 編輯器的本端環境定義。這個物件可以置換組件的所有相依關係。
     *        如果組件有一個在本端環境定義中找不到的相依關係,
     *        org.eclipse.core.component.types 延伸點便會提供預設實作。
     * @param input 這個編輯器的 IEditorInput
     * @param savedState 前次儲存的組件狀態,如果沒有的話,就是空值
     * @傳回新建編輯器的 ISite
     * @如果無法建立組件,便會擲出 CoreException
     */
    public ISite createEditor(String editorId, Composite parentComposite, IContainerContext context, IEditorInput input, IMemento savedState) throws CoreException;
}


下列是使用 IPartFactory 來建立視圖的動作範例

/**
 * 示範如何從 IWorkbenchPage 利用視圖 ID 來開啟視圖。
 */
public class CreateViewByIdAction implements IWorkbenchWindowActionDelegate {
    private IWorkbenchWindow window;

    public void run(IAction action) {       
        IWorkbenchPage page = window.getActivePage();
       
        if (page == null) {
           
// ...已移除不想要的錯誤處理程式碼...
            return;
        }
       
        final Shell tempShell = new Shell(window.getShell(), SWT.DIALOG_TRIM | SWT.RESIZE);
       
        tempShell.setLayout(new FillLayout());
        tempShell.setText("Problems");
       
        IPartFactory factory = page.getPartFactory();
        try {
            factory.createView(IPageLayout.ID_PROBLEM_VIEW, tempShell, new ContainerContext(), null);
        } catch (CoreException e) {
           
// ...已移除不想要的錯誤處理程式碼...
        }
       
        // 開啟對話框
        tempShell.open();
        Display d = tempShell.getDisplay();
        while (!tempShell.isDisposed()) {
            if (!d.readAndDispatch())
                d.sleep();
        }
       
    }

    public void init(IWorkbenchWindow window) {
        this.window = window;
    }

    // ...已移除其餘的(空白)方法...
}

用「網站」類別來將組件實例化

不是所有組件都是視圖或編輯器。用戶端也可以使用組件 API 來建立它們自己的可重複使用元件。該組件不是用視圖或編輯器延伸點來登錄的,但可以使用視圖和編輯器可用的大部分 API。雖然沒有東西可以阻止用戶端為可重複使用的元件,創造它們自己的 API,但使用組件型樣可讓元件內嵌到支援視圖或編輯器的任何東西中。

使用「網站」類別建立的組件擁有下列內容: 您必須提供「網站」建構子該組件的實作類別,以及相關的外掛程式軟體組。外掛程式軟體組決定要記載日誌錯誤訊息的地方,以及在它自己的外掛程式裡尋找資源時,組件應該搜尋何處。

下列範例示範如何使用「網站」類別以直接建立組件的實例。在本範例中,我們在一個對話框中,建立 NameTestView 組件的實例。雖然 NameTestView 被稱為視圖,且可以使用視圖 API,但它實際上不需要用 org.eclipse.ui.views 延伸點來登錄,除非工作台真的要將它當成視圖使用。


/**
 * 示範如何依程式的方式用「網站」類別來開啟組件。
 */
public class ProgrammaticViewCreationExampleAction implements IWorkbenchWindowActionDelegate {
    private IWorkbenchWindow window;

    public void run(IAction action) {       
        // 建立 Shell
        final Shell tempShell = new Shell(window.getShell(), SWT.DIALOG_TRIM | SWT.RESIZE);
        tempShell.setLayout(new FillLayout());
        tempShell.setText("Name test view");
       
        Bundle thisPlugin = ComponentExamplesPlugin.getDefault().getBundle();
       
        try {
            // 建立 NameTestView 組件的實例(這一行是這個範例的重點)
            // 它示範了如何在不呼叫 NameTestView 的建構子的情況下,使用「網站」類別。
            Site testPart = new Site(tempShell, new ContainerContext(),
                    thisPlugin,
                    NameTestView.class);           
           
        } catch (CoreException e) {
            // ...已移除不想要的錯誤處理程式碼...
        }
       
        // 開啟限制模式的對話框
        tempShell.open();
        Display d = tempShell.getDisplay();
        while (!tempShell.isDisposed()) {
            if (!d.readAndDispatch())
                d.sleep();
        }
       
    }
\
    public void init(IWorkbenchWindow window) {
        this.window = window;
    }

   
// ...已移除其餘的(空白)方法...
}