多工介面

許多組合組件都有作用中子項的記號。這樣的組件可能想要動態地將相依關係附加到目前處於作用中的子項。

例如,我們可能想要建立一個會在標籤資料夾中安排自己子項的視圖。母項可能想要設定自己的名稱和圖示,以符合其作用中子項的名稱和圖示。我們可以用下列型樣來完成這個動作:

多工 INameable 介面時便可參照這個。

一般而言,多工器型樣的運作如下: 因為這個型樣非常常見,因此我們提供一個「多工器」類別來支援它。 用 org.eclipse.core.component.types 延伸點提供新介面類型的用戶端,也可以提供其介面的多工版本。多工版本會執行下列動作: 使用「多工器」的用戶端不需要知道多工每一個介面的詳細資料。他們可以把 INameable 當成組件一樣附加到多工器即可,並將多工器當成 INameable 一樣附加到每一個子項組件。這顯示在下列範例中,多工器的使用會以紅色強調顯示。多工器需要明確除去。

public class MultiplexNameView implements IDisposable {
    private Multiplexer mplex;
   
    private ISite view1;
    private ISite view2;
   
    private Listener focusListener = new Listener() {
        /* (非 Javadoc)
         * @請參閱 org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
         */
        public void handleEvent(Event e) {
            if (e.widget == view1.getControl()) {
                mplex.setActivePart(view1);
            } else if (e.widget == view2.getControl()) {
                mplex.setActivePart(view2);
            }        
        }
       
    };
   
    /**
     * 元件建構子。不要直接呼叫。
     */
    public MultiplexNameView(Composite parent, IPartFactory factory, INameable name) throws CoreException {
       
        // 建立多工器。重新導向 INameable 到多工器
        mplex = new Multiplexer(new ContainerContext().addInstance(INameable.class, name));
       
        // 建立資源導覽器。 給導覽器一個多工的 INameable,
        // 但所有其他介面都使用預設值。
        ContainerContext viewContext1 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view1 = factory.createView(
                IPageLayout.ID_RES_NAV, parent, viewContext1, null);
        view1.getControl().addListener(SWT.Activate, focusListener);
       
        // 建立內容視圖。 給內容視圖一個多工的 INameable,
        // 但其他所有項目都使用預設值。
        ContainerContext viewContext2 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
        view2.getControl().addListener(SWT.Activate, focusListener);
       
        // 使導覽器一開始便處於作用中狀態
        mplex.setActivePart(view1);
       
        parent.setLayout(new FillLayout());       
    }
   
    /* (非 Javadoc)
     * @請參閱 org.eclipse.core.component.IDisposable#dispose()
     */
    public void dispose() {
        mplex.dispose();
    }
}