Multiplexando uma Interface

Muitas partes compostas terão a noção de um filho ativo. Essas partes podem desejar conectar uma dependência dinamicamente ao filho está ativo no momento.

Por exemplo, podemos criar uma visualização que organiza seus filhos em uma pasta com guia. O pai pode desejar configurar seu próprio nome e ícone para corresponder ao do filho ativo. Faremos isso utilizando o seguinte padrão:

Voltaremos a isso ao multiplexar a interface INameable.

Em geral, o padrão do multiplexador funciona da seguinte maneira: Como esse padrão é muito comum, fornecemos uma classe Multiplexer para suportá-lo. Os clientes que fornecem novos tipos de interfaces utilizando o ponto de extensão org.eclipse.core.component.types podem também fornecer uma versão multiplexada de sua interface. A versão multiplexada irá: Clientes que utilizam o Multiplexador não precisam saber os detalhes da multiplexação de cada interface. Eles podem simplesmente conectar um INameable ao multiplexador como se ele fosse uma parte e conectar o multiplexador a cada parte filha como se ela fosse um INameable. Isso é mostrado no exemplo a seguir, o uso do multiplexador foi realçado em vermelho. Os multiplexadores precisam ser descartados explicitamente.

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);
            }        
        }
       
    };
   
    /**
     * Construtor de componente. Não chamar diretamente.
     */
    public MultiplexNameView(Composite parent, IPartFactory factory, INameable name) throws CoreException {
       
        // Criar um multiplexador. Redirecionar nosso INameable ao multiplexador
        mplex = new Multiplexer(new ContainerContext().addInstance(INameable.class, name));
       
        // Criar um navegador de recurso. Dar ao navegador um INameable multiplexado, mas utilizar
        // padrões para todas as outras 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);
       
        // Criar visualização de propriedade. Dar à visualização de propriedades um INameable multiplexado, mas utilizar
        // padrões para tudo mais.
        ContainerContext viewContext2 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
        view2.getControl().addListener(SWT.Activate, focusListener);
       
        // Tornar o navegador ativo inicialmente
        mplex.setActivePart(view1);
       
        parent.setLayout(new FillLayout());       
    }
   
    /* (non-Javadoc)
     * @see org.eclipse.core.component.IDisposable#dispose()
     */
    public void dispose() {
        mplex.dispose();
    }
}