Felület többszörözése

Számos összetételrész rendelkezni fog egy aktív utód funkcióival. Az ilyen részek esetén gyakori, hogy dinamikusan szeretnének egy függőséget csatolni az aktuálisan aktív utódhoz.

Például előfordulhat, hogy létre szeretnénk hozni egy nézetet, amely elrendezi az utódjait egy lapmappában. A szülő be szeretné állítani a saját nevét és ikonját az aktív utódjának megfelelően. Ezt a következő minta alapján tehetjük meg:

Erre az "INameable felület többszörözése" kifejezéssel fogunk hivatkozni.

Általában a többszöröző minta az alábbi módon működik: Mivel ez a minta elég általános, ezért biztosítunk egy Multiplexer osztályt ennek támogatására. Az org.eclipse.core.component.types kiterjesztési pont használatával felületek új típusait létrehozó ügyfelek a felületeik többszörözött változatát is biztosíthatják. A többszörözött változat a következőket fogja tenni: A Multiplexer osztályt használó ügyfeleknek nem kell ismerniük minden egyes felület többszörözésének részleteit. Egyszerűen csatolhatnak egy INameable felületet a többszörözőhöz úgy, mintha az egy rész lenne, és a többszörözőt minden egyes utódrészhez csatolhatják úgy, mintha az egy INameable lenne. Ez látható az alábbi példában, ahol a többszöröző használata vörössel van kiemelve. A többszörözőket explicit módon kell eldobni.

public class MultiplexNameView implements IDisposable {
    private Multiplexer mplex;
   
    private ISite view1;
    private ISite view2;
   
    private Listener focusListener = new Listener() {
        /* (nem Javadoc)
         * @lásd: 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);
            }        
        }
       
    };
   
    /**
     * A komponens konstruktora. Ne hívja meg közvetlenül.
     */
    public MultiplexNameView(Composite parent, IPartFactory factory, INameable name) throws CoreException {
       
        // Többszöröző létrehozása. Az INameable átirányítása a többszörözőhöz
        mplex = new Multiplexer(new ContainerContext().addInstance(INameable.class, name));
       
        // Erőforrás-navigátor létrehozása. A navigátornak egy többszörözött INameable felületet adjon, de
        // az alapértelmezéseket használja az összes többi felülethez.
        ContainerContext viewContext1 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view1 = factory.createView(
                IPageLayout.ID_RES_NAV, parent, viewContext1, null);
        view1.getControl().addListener(SWT.Activate, focusListener);
       
        // Tulajdonságnézet létrehozása. A tulajdonságok nézetnek egy többszörözött INameable felületet adjon, de
        // az alapértelmezéseket használja minden máshoz.
        ContainerContext viewContext2 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
        view2.getControl().addListener(SWT.Activate, focusListener);
       
        // Tegye aktívvá a navigátor kezdetben
        mplex.setActivePart(view1);
       
        parent.setLayout(new FillLayout());       
    }
   
    /* (nem Javadoc)
     * @lásd: org.eclipse.core.component.IDisposable#dispose()
     */
    public void dispose() {
        mplex.dispose();
    }
}