许多组合部件将知道一个活动的子代。这种部件可能要将一个依赖项动态地连接至当前活动的子代。
例如,我们可能要创建一个视图,该视图将它的子代排列在选项卡文件夹中。父代可能要设置它自己的名称和图标以便与其活动子代的名称和图标相匹配。我们将使用以下模式来完成此操作:
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); }
} }; /** * Component constructor. Do not invoke directly. */ public MultiplexNameView(Composite parent, IPartFactory
factory, INameable name) throws CoreException { // Create a multiplexer. Redirect
our INameable to the multiplexer mplex = new Multiplexer(new ContainerContext().addInstance(INameable.class,
name)); // Create a resource navigator.
Give the navigator a multiplexed INameable, but use // defaults for all of the
other 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); // Create property view. Give
the properties view a multiplexed INameable, but use // defaults for everything
else.
ContainerContext viewContext2 = new ContainerContext()
.delegateTo(INameable.class, mplex); view2 = factory.createView(IPageLayout.ID_PROP_SHEET,
parent, viewContext2, null); view2.getControl().addListener(SWT.Activate,
focusListener); // Make the navigator active
initially
mplex.setActivePart(view1); parent.setLayout(new FillLayout());
} /* (non-Javadoc) * @see org.eclipse.core.component.IDisposable#dispose() */ public void dispose() { mplex.dispose(); }}