傳遞引數到組件

母項會使用 ContainerContext 將引數傳遞給它的子項。環境定義可以把引數傳遞給組件的建構子,或指定 Factory 以建構那些引數。例如,特定的 ContainerContext 可能會指定如下的規則:
如果環境定義不提供特定的相依關係,則子項會從 org.eclipse.core.component.types 延伸點使用預設實作。因為環境定義可以置換組件建構子中的任何引數,因此,母項可以置換組件通常從其網站中取得的任何介面。例如,母項會藉由在環境定義中提供 IActionBars,來強制其子項使用不同的 IActionBars 實作方式。

母項有建構環境定義的數個選項:

下列 DefaultContextViewRedirectContextViewOverrideInstanceView 範例示範每一種可能性。

預設環境定義

下列範例顯示在預設環境定義中建立兩個巢狀子項之視圖的程式碼。在預設環境定義中建立子項表示,母項不論子項的名稱、工具列、選項等等為何皆不預備處理。 如果,假設母項想要用其中一個子項的目前選項來執行某個動作,則它需要將 ISelectionHandler 傳遞到該子項。本範例下面顯示了最後結果。

/**
 * 示範如何用預設環境定義
 * 預設的來建立兩個巢狀子項的視圖。
 */
public class DefaultContextView {
    public DefaultContextView(Composite parent, IPartFactory factory) throws CoreException {
        // 建立資源導覽器
        ContainerContext viewContext1 = new ContainerContext();  
        ISite view1 = factory.createView(
                IPageLayout.ID_RES_NAV, parent, viewContext1, null);
   
        // 建立內容視圖
        ContainerContext viewContext2 = new ContainerContext();
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());       
    }
}

DefaultContextView 的擷取畫面

將相依關係從母項重新導向到子項

本例示範如何將一個網站介面從母項重新導向到子項。這個組合視圖包含了一個資源導覽器和一個內容視圖。它會將它的選項處理常式重新導向到資源導覽器,且會把它的動作列重新導向到內容視圖。結果是 一個視圖,其提供選取資源,以及從內容視圖包含工具列和功能表,如下所示。

public class RedirectContextView {
    /**
     * 元件建構子。不要直接呼叫。
     */
    public RedirectContextView(Composite parent, IPartFactory factory, ISelectionHandler selection, IActionBars actionBars) throws CoreException {
        // 建立資源導覽器。 直接將導覽器的選項重新導向到我們的母項。
        ContainerContext viewContext1 = new ContainerContext()
            .addInstance(ISelectionHandler.class, selection);
        ISite view1 = factory.createView(
                IPageLayout.ID_RES_NAV,
                parent, viewContext1, null);
   
        // 建立內容視圖。容許內容視圖直接使用我們的動作列。
        ContainerContext viewContext2 = new ContainerContext()
            .addInstance(IActionBars.class, actionBars);
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());       
    }
}


RedirectContextView 的擷取畫面

直接提供相依關係

本範例示範如何直接提供子項其中一個相依關係。 在本例中,我們建立了一個包含問題視圖和內容視圖的組合視窗。我們提供問題視圖一個 ISelectionHandler,以在內容說明中顯示所選問題的數量。最後結果顯示如下。

public class OverrideInstanceView {
   
    /**
     * 元件建構子。不要直接呼叫。
     */
    public OverrideInstanceView(Composite parent, IPartFactory factory, final INameable name) throws CoreException {
        ContainerContext viewContext1 = new ContainerContext();
       
        // 將 ISelectionHandler 新增到視圖的環境定義中。一旦視圖變更它的選項,
        // 便會在內容說明中顯示所選項目的數量。
        viewContext1.addInstance(ISelectionHandler.class, new ISelectionHandler() {
            /* (非 Javadoc)
             * @請參閱 org.eclipse.ui.part.services.ISelectionHandler#setSelection(org.eclipse.jface.viewers.ISelection)
             */
            public void setSelection(ISelection newSelection) {
                if (newSelection instanceof IStructuredSelection) {
                    IStructuredSelection sel = (IStructuredSelection)newSelection;
                    int selectionSize = sel.size();
                   
                    name.setContentDescription(MessageFormat.format("{0} problems selected",
                            new String[] {Integer.toString(selectionSize)}));
                }
            }
        });

        // 建立問題視圖
        ISite view1 = factory.createView(
                IPageLayout.ID_PROBLEM_VIEW, parent, viewContext1, null);
   
        // 建立內容視圖
        ContainerContext viewContext2 = new ContainerContext();
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());
    }
}



OverrideInstanceView 的擷取畫面