許多組合組件都有作用中子項的記號。這樣的組件可能想要動態地將相依關係附加到目前處於作用中的子項。
例如,我們可能想要建立一個會在標籤資料夾中安排自己子項的視圖。母項可能想要設定自己的名稱和圖示,以符合其作用中子項的名稱和圖示。我們可以用下列型樣來完成這個動作:
public class MultiplexNameView implements
IDisposable {
private Multiplexer mplex;
private ISite view1;
private ISite view2;
private Listener focusListener = new Listener() {
/* (非 Javadoc)
* @請參閱 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);
}
}
};
/**
* 元件建構子。不要直接呼叫。
*/
public MultiplexNameView(Composite parent, IPartFactory
factory, INameable name) throws CoreException {
// 建立多工器。重新導向 INameable 到多工器
mplex = new Multiplexer(new ContainerContext().addInstance(INameable.class,
name));
// 建立資源導覽器。
給導覽器一個多工的 INameable,
// 但所有其他介面都使用預設值。
ContainerContext viewContext1 = new ContainerContext()
.delegateTo(INameable.class, mplex);
view1 = factory.createView(
IPageLayout.ID_RES_NAV, parent, viewContext1, null);
view1.getControl().addListener(SWT.Activate,
focusListener);
// 建立內容視圖。
給內容視圖一個多工的 INameable,
// 但其他所有項目都使用預設值。
ContainerContext viewContext2 = new ContainerContext()
.delegateTo(INameable.class, mplex);
view2 = factory.createView(IPageLayout.ID_PROP_SHEET,
parent, viewContext2, null);
view2.getControl().addListener(SWT.Activate,
focusListener);
// 使導覽器一開始便處於作用中狀態
mplex.setActivePart(view1);
parent.setLayout(new FillLayout());
}
/* (非 Javadoc)
* @請參閱 org.eclipse.core.component.IDisposable#dispose()
*/
public void dispose() {
mplex.dispose();
}
}