Multiplexing di un'interfaccia

Molte parti composte possono rilevare la presenza di un elemento secondario attivo. Alcune parti possono collegarsi dinamicamente a una dipendenza ad un elemento secondario attivo.

Ad esempio, se si desidera creare una vista che dispone gli elementi secondari in una cartella a schede, l'elemento principale può impostare il proprio nome e icona in modo da corrispondere all'elemento secondario attivo. Per ottenere questa impostazione procedere come segue:

Questo processo viene definito multiplexing dell'interfaccia INameable.

In generale un modello di multiplexing funziona come segue: Poiché questo modello è abbastanza comune, per supportarlo viene fornita la classe Multiplexer. I client che forniscono nuovi tipi di interfaccia utilizzando il punto di estensione org.eclipse.core.component.types, possono fornire anche una versione multiplexing delle interfacce. La versione multiplexing: I client che utilizzano il multiplexing non hanno bisogno dei dettagli del multiplexing di ciascuna interfaccia. Possono collegare semplicemente un INameable al multiplexing come se fosse una parte e collegare il multiplexing a ciascuna parte secondaria come se fosse un INameable. Questa impostazione viene mostrata nel seguente esempio dove l'uso del multiplexing è stato evidenziato in rosso. I multiplexing devono essere eliminati esplicitamente.

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();
    }
}