Multiplexování rozhraní

Řada aktivních kompozitních částí bude zahrnovat pojem aktivního podřízeného prvku. Takovéto části mohou požadovat dynamické připojování závislosti k podřízenému prvku, který je v této době aktivní.

Například můžeme chtít vytvořit pohled, který uspořádává své podřízené prvky do složky karty. Nadřazený prvek může požadovat nastavení svého vlastního názvu a ikony podle svého aktivního podřízeného prvku. Toto lze provést následujícím způsobem:

Budeme to nazývat multiplexní rozhraní INameable.

V obecném případě multiplexer pracuje tímto způsobem: Toto je velmi používaný postup, a proto jsme pro něj vytvořili třídu Multiplexer. Klienti podporující nové typy rozhraní s použitím bodu rozšíření org.eclipse.core.component.types podporují rovněž multiplexovanou verzi svého rozhraní. Multiplexovaná verze: Klienti používající Multiplexer nemusejí znát podrobnosti multiplexního mechanizmu jednotlivých rozhraní. Mohou jednoduše připojit INameable k multiplexeru jakoby šlo o část a multiplexer připojit k jednotlivým podřízeným částem jakoby šlo o INameable. Toto znázorňuje následující příklad; použití multiplexeru je zvýrazněno červeně. Multiplexery musejí být likvidovány explicitně.

public class MultiplexNameView implementuje IDisposable {
    private Multiplexer mplex;
   
    private ISite view1;
    private ISite view2;
   
    private Listener focusListener = new Listener() {
        /* (mimo Javadoc)
         * @viz 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);
            }        
        }
       
    };
   
    /**
     * Konstruktor komponenty. Nespouštějte přímo.
     */
    public MultiplexNameView(Composite parent, IPartFactory factory, INameable name) throws CoreException {
       
        // Vytvoří multiplexer. Přesměruje náš INameable na multiplexer
        mplex = new Multiplexer(new ContainerContext().addInstance(INameable.class, name));
       
        // Vytvoří navigátor prostředků. Poskytne navigátoru multiplexované INameable, avšak použije
        // výchozí hodnoty pro všechna ostatní rozhraní.
        ContainerContext viewContext1 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view1 = factory.createView(
                IPageLayout.ID_RES_NAV, parent, viewContext1, null);
        view1.getControl().addListener(SWT.Activate, focusListener);
       
        // Vytvoří pohled Vlastnosti. Poskytne pohledu Vlastnosti multiplexované INameable, avšak použije
        // pro vše ostatní výchozí hodnoty.
        ContainerContext viewContext2 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
        view2.getControl().addListener(SWT.Activate, focusListener);
       
        // Provádí počáteční aktivaci navigátoru
        mplex.setActivePart(view1);
       
        parent.setLayout(new FillLayout());       
    }
   
    /* (mimo Javadoc)
     * @viz org.eclipse.core.component.IDisposable#dispose()
     */
    public void dispose() {
        mplex.dispose();
    }
}