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:
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();
}
}