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