多路复用接口

许多组合部件将知道一个活动的子代。这种部件可能要将一个依赖项动态地连接至当前活动的子代。

例如,我们可能要创建一个视图,该视图将它的子代排列在选项卡文件夹中。父代可能要设置它自己的名称和图标以便与其活动子代的名称和图标相匹配。我们将使用以下模式来完成此操作:

我们将这称为多路复用 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();
    }
}