Multiplexación de una interfaz

Muchos componentes compuestos tendrán la noción de un hijo activo. Puede que estos componentes quieran conectar dinámicamente una dependencia al hijo que está activo actualmente.

Por ejemplo, supongamos que queremos crear una vista que ordena sus hijos en una carpeta con pestañas. Tal vez el padre quiera establecer su propio nombre e icono para que coincida con el de su hijo activo. Es posible conseguirlo utilizando el patrón siguiente:

Nos referiremos a esta acción como multiplexación de la interfaz INameable.

En general, el patrón de multiplexor funciona de la manera siguiente: Dado que este patrón es muy común, se proporciona una clase Multiplexer para darle soporte. Los clientes que proporcionan nuevos tipos de interfaces mediante el punto de extensión org.eclipse.core.component.types también pueden proporcionar una versión multiplexada de su interfaz. La versión multiplexada realizará lo siguiente: Los clientes que utilizan el Multiplexor no necesitan conocer los detalles de multiplexación de cada interfaz. Simplemente pueden conectar un INameable al multiplexor como si fuera un componente y conectar el multiplexor a cada componente hijo como si fuera un INameable. Así se muestra en el ejemplo siguiente; el uso del multiplexor aparece resaltado en color rojo. Es preciso desechar explícitamente los multiplexores.

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);
            }        
        }
       
    };
   
    /**
     * Constructor de componentes. No debe invocarse directamente.
     */
    public MultiplexNameView(Composite parent, IPartFactory factory, INameable name) throws CoreException {
       
        // Crear un multiplexor. Redirigir el INameable al multiplexor
        mplex = new Multiplexer(new ContainerContext().addInstance(INameable.class, name));
       
        // Crear un navegador de recursos. Dar al navegador un INameable multiplexado, pero
        // utilizar valores por omisión para todas las demás 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);
       
        // Crear vista de propiedades. Dar a la vista de propiedades un INameable multiplexado, pero
        // utilizar valores por omisión para todo lo demás.
        ContainerContext viewContext2 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
        view2.getControl().addListener(SWT.Activate, focusListener);
       
        // Activar el navegador inicialmente
        mplex.setActivePart(view1);
       
        parent.setLayout(new FillLayout());       
    }
   
    /* (non-Javadoc)
     * @see org.eclipse.core.component.IDisposable#dispose()
     */
    public void dispose() {
        mplex.dispose();
    }
}