インターフェースの多重化

多くの複合パーツにはアクティブな子の概念があります。 そのようなパーツでは、現在アクティブな子に対して依存関係を動的に付加しなければならない場合があります。

例えば、子をタブ・フォルダーに配置するビューを作成する必要がある場合があります。 親では、そのアクティブな子に一致する独自の名前およびアイコンを設定します。 以下のパターンを使用することにより、これを実現できます。

これは、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() {
        /* (non-Javadoc)
         * @see 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);
            }        
        }
       
    };
   
    /**
     * Component constructor. Do not invoke directly.
     */
    public MultiplexNameView(Composite parent, IPartFactory factory, INameable name) throws CoreException {
       
        // Create a multiplexer. Redirect our INameable to the multiplexer
        mplex = new Multiplexer(new ContainerContext().addInstance(INameable.class, name));
       
        // Create a resource navigator. Give the navigator a multiplexed INameable, but use
        // defaults for all of the other interfaces.
        ContainerContext viewContext1 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view1 = factory.createView(
                IPageLayout.ID_RES_NAV, parent, viewContext1, null);
        view1.getControl().addListener(SWT.Activate, focusListener);
       
        // Create property view. Give the properties view a multiplexed INameable, but use
        // defaults for everything else.
        ContainerContext viewContext2 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
        view2.getControl().addListener(SWT.Activate, focusListener);
       
        // Make the navigator active initially
        mplex.setActivePart(view1);
       
        parent.setLayout(new FillLayout());       
    }
   
    /* (non-Javadoc)
     * @see org.eclipse.core.component.IDisposable#dispose()
     */
    public void dispose() {
        mplex.dispose();
    }
}