Multiplexen einer Schnittstelle

Viele zusammengesetzte Abschnitte werden die Vorstellung eines aktive untergeordneten Elements haben. Vielleicht wollen solche Abschnitte dynamisch eine Abhängigkeit dem untergeordneten Element zuordnen, das gegenwärtig aktiv ist.

Zum Beispiel wollen wir vielleicht eine Ansicht erstellen, die ihre untergeordneten Elemente in einem Ordner mit Registerkarten anordnet. Vielleicht will das übergeordnete Element seinen eigenen Namen und sein Symbol setzen, um dem seines aktiven untergeordneten Elements zu entsprechen. Wir könnten dies mit Hilfe des folgenden Musters bewerkstelligen:

Wir bezeichnen dies als Multiplexing der INameable-Schnittstelle.

Im Allgemeinen funktioniert das Multiplexer-Muster wie folgt: Da dieses Muster allgemein üblich ist, liefern wir eine Multiplexer-Klasse zu seiner Unterstützung. Clients, die neuartige Schnittstellen unter Verwendung des Erweiterungspunkts org.eclipse.core.component.types liefern, können ebenfalls eine multiplexte Version ihrer Schnittstelle liefern. Die multiplexte Version wird: Clients, die den Multiplexer verwenden, müssen nicht die Einzelheiten des Multiplexing einer jeden Schnittstelle kennen. Sie können de, Multiplexer einfach eine INameable hinzufügen, so als ob es ein Abschnitt wäre, und den Multiplexer jedem untergeordneten Element hinzufügen, so als ob es eine INameable wäre. Dies wird in folgendem Beispiel gezeigt, in dem die Verwendung des Multiplexers in rot hervorgehoben wurde. Multiplexer müssen explizit verwendet werden.

public class MultiplexNameView implements IDisposable {
    private Multiplexer mplex;
   
    private ISite view1;
    private ISite view2;
   
    private Listener focusListener = new Listener() {
        /* (nicht Javadoc)
         * @siehe 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);
            }        
        }
       
    };
   
    /**
     * Komponentenkonstruktor. Nicht direkt aufrufen.
     */
    public MultiplexNameView(Composite parent, IPartFactory factory, INameable name) throws CoreException {
       
        // Erstellt einen Multiplexer. Leitet unsere our INameable an den Multiplexer weiter
        mplex = new Multiplexer(new ContainerContext().addInstance(INameable.class, name));
       
        // Erstellt einen Ressourcennavigator. Gibt dem Navigator eine multiplexte INameable, verwendet aber
        // Standardwerte für alle anderen Schnittstellen.
        ContainerContext viewContext1 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view1 = factory.createView(
                IPageLayout.ID_RES_NAV, parent, viewContext1, null);
        view1.getControl().addListener(SWT.Activate, focusListener);
       
        // Erstellt eine Sicht 'Eigenschaften'. Gibt der Sicht 'Eigenschaften' eine multiplexte INameable, verwendet aber
        // Standardwerte für alles andere.
        ContainerContext viewContext2 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
        view2.getControl().addListener(SWT.Activate, focusListener);
       
        // Aktiviert anfänglich den Navigator
        mplex.setActivePart(view1);
       
        parent.setLayout(new FillLayout());       
    }
   
    /* (nicht Javadoc)
     * @siehe org.eclipse.core.component.IDisposable#dispose()
     */
    public void dispose() {
        mplex.dispose();
    }
}