Viele zusammengesetzte Abschnitte werden die Vorstellung eines aktive untergeordneten Elements haben. Vielleicht wollen solche Abschnitte dynamisch eine Abhängigkeit dem
untergeordneten Element zuordnen, das gegenwärtig aktiv ist.
Zum Beispiel wollen wir vielleicht eine Ansicht erstellen, die ihre untergeordneten Elemente in einem Ordner mit Registerkarten anordnet. Vielleicht will das übergeordnete Element seinen eigenen Namen und sein
Symbol setzen, um dem seines aktiven untergeordneten Elements zu entsprechen. Wir könnten dies mit Hilfe des folgenden Musters bewerkstelligen:
public class MultiplexNameView implements
IDisposable {
private Multiplexer mplex;
private ISite view1;
private ISite view2;
private Listener focusListener = new Listener() {
/* (nicht Javadoc)
* @siehe 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);
}
}
};
/**
* Komponentenkonstruktor. Nicht direkt aufrufen.
*/
public MultiplexNameView(Composite parent, IPartFactory
factory, INameable name) throws CoreException {
// Erstellt einen Multiplexer. Leitet unsere
our INameable an den Multiplexer weiter
mplex = new Multiplexer(new ContainerContext().addInstance(INameable.class,
name));
// Erstellt einen Ressourcennavigator.
Gibt dem Navigator eine multiplexte INameable, verwendet aber
// Standardwerte für alle anderen Schnittstellen.
ContainerContext viewContext1 = new ContainerContext()
.delegateTo(INameable.class, mplex);
view1 = factory.createView(
IPageLayout.ID_RES_NAV, parent, viewContext1, null);
view1.getControl().addListener(SWT.Activate,
focusListener);
// Erstellt eine Sicht 'Eigenschaften'. Gibt der Sicht 'Eigenschaften' eine multiplexte INameable, verwendet aber
// Standardwerte für alles andere.
ContainerContext viewContext2 = new ContainerContext()
.delegateTo(INameable.class, mplex);
view2 = factory.createView(IPageLayout.ID_PROP_SHEET,
parent, viewContext2, null);
view2.getControl().addListener(SWT.Activate,
focusListener);
// Aktiviert anfänglich den Navigator
mplex.setActivePart(view1);
parent.setLayout(new FillLayout());
}
/* (nicht Javadoc)
* @siehe org.eclipse.core.component.IDisposable#dispose()
*/
public void dispose() {
mplex.dispose();
}
}