Multiplexage d'une interface

De nombreux composants "part" composites ont la notion d'un enfant actif. Ces composants peuvent vouloir créer une liaison dynamique entre une dépendance et l'enfant actif.

Par exemple, on peut vouloir créer une vue qui réorganise ces enfants dans un dossier à onglets. Le parent peut vouloir définir son propre nom et son icône en concordance avec le nom et l'icône de son enfant actif. C'est possible en utilisant le motif suivant :

Nous appellerons cela le multiplexage de l'interface INameable.

En général, le modèle de multiplexage fonctionne comme suit : Ce modèle est assez répandu, et nous fournissons une classe multiplexeur pour le prendre en charge. Les clients qui fournissent de nouveaux types d'interfaces en utilisant le point d'extension org.eclipse.core.component.types peuvent également fournir une version multiplexée de leur interface. La version multiplexée : Les clients qui utilisent le multiplexage n'ont pas besoin de connaître les détails du multiplexage de chaque interface. Ils peuvent simplement définir une liaison entre un INameable et le multiplexeur comme s'il s'agissait d'un composant "part", et créer une liaison entre le multiplexeur et chaque composant "part" enfant comme s'il s'agissait d'un INameable. Cette explication est illustrée par l'exemple suivant. L'utilisation du multiplexeur a été mise en évidence en rouge. Les multiplexeurs doivent être expressément disposés.

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