Implementando Componentes de Multiplexação

Para serem utilizadas em um Multiplexador, as interfaces do site precisam registrar uma implementação padrão alternativa com o escopo org.eclipse.ui.part.SiteMultiplexerInitializer. Como isso estende o escopo do site, a versão mais específica do multiplexador terá prioridade sobre a versão padrão quando utilizada em um Multiplexador.

Um componente multiplexado quase sempre utilizará o seguinte padrão:
  1. Implementar a interface de ciclo de vida INestedComponent;
  2. Obter um IMultiplexer em seu construtor e utilizá-lo para acessar a versão compartilhada de sua interface;
  3. Armazenar o estado da parte;
  4. Escutar alterações do estado no filho e atualizar o estado armazenado de maneira apropriada;
  5. Cada vez que o componente for ativado, ele deverá redirecionar o estado armazenado para a interface compartilhada no multiplexador;
  6. Enquanto o componente estiver ativo, ele deverá redirecionar as alterações de estado diretamente para a interface compartilhada.
O seguinte exemplo demonstra o código utilizado pelo workbench para multiplexar a interface ISelectionHandler com ChildSelectionHandler.
/**
 * Versão multiplexada da interface ISelectionHandler
 *
 * @since 3.1
 */
public class ChildSelectionHandler implements ISelectionHandler, INestedComponent {

    private ISelectionHandler parent;
    private ISelection selection;
    private boolean isActive = false;
    private IMultiplexer multiplexer;

    public ChildSelectionHandler(IMultiplexer mplex) throws DependencyException {
        this.multiplexer = mplex;
        // Obter acesso ao ISelectionHandler compartilhado que está sendo multiplexado (devemos
        // apenas modificá-lo quando formos o filho ativo)
        this.parent = (ISelectionHandler)
            mplex.getSharedComponents().getComponent(ISelectionHandler.class);
                
        // Configurar o estado inicial (a seleção inicial da parte será nula  
        // até que seja configurada explicitamente).
    }        

    public IMultiplexer getMultiplexer() {
        // Retornar o multiplexador com o qual fomos criados
        return multiplexer;
    }

    public void activate() {
        // Redirecionar nossa seleção armazenada para a interface compartilhada         parent.setSelection(selection);
        isActive = true;
    }        
            
    public void deactivate() {
        isActive = false;
    }        

    public void setSelection(ISelection newSelection) {
        // Lembrar-se da seleção nova do filho
        selection = newSelection;
        if (isActive) {
             // Se estivermos ativos, redirecionar a seleção diretamente para a 
             //  interface compartilhada
             parent.setSelection(newSelection);
        }        
    }        
}        
A seguir está a marcação do ponto de extensão associada para ChildSelectionHandler.
<extension point="org.eclipse.core.component.types">
    <component
            implementation="org.eclipse.ui.internal.part.services.ChildSelectionHandler"
            interface="org.eclipse.ui.part.services.ISelectionHandler"
            singleton="false"
            initializer="org.eclipse.ui.part.SiteMultiplexerInitializer"/>
 </extension>
Captura de Tela de TestCompositeView