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:
- Implementar a interface de ciclo de vida INestedComponent;
- Obter um IMultiplexer em seu construtor e utilizá-lo para acessar a versão
compartilhada de sua interface;
- Armazenar o estado da parte;
- Escutar alterações do estado no filho e atualizar o estado armazenado de maneira apropriada;
- Cada vez que o componente for ativado, ele deverá redirecionar o estado armazenado para a interface compartilhada no multiplexador;
- 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>