Multipleksowanie interfejsu

Wiele części złożonych zawiera informacje na temat aktywnego elementu potomnego. Mogą one dynamicznie podłączać zależność elementu potomnego, który jest aktywny.

Możliwe jest na przykład utworzenie widoku, który będzie rozmieszczał swoje elementy potomne w folderze kart. Element macierzysty może ustawić własną nazwę i ikonę w taki sposób, aby były zgodne z nazwą i ikoną aktywnego elementu potomnego. Można to osiągnąć za pomocą następującego wzorca:

Ten proces będzie nazywany multipleksowaniem interfejsu INameable.

Wzorzec multipleksowania wygląda następująco: Ze względu na powszechność tego wzorca dostarczono klasę Multiplexer, która go obsługuje. Klienci dostarczający nowe typy interfejsów za pomocą punktu rozszerzenia org.eclipse.core.component.types mogą także dostarczyć multipleksowaną wersję interfejsu. Multipleksowana wersja będzie miała następujące funkcje: Klienci używający klasy Multiplexer nie muszą znać szczegółów multipleksowania każdego interfejsu. Wystarczy podłączyć interfejs INameable do multipleksera jakby był częścią, a następnie podłączyć multiplekser do każdego elementu potomnego jakby był interfejsem INameable. Ten proces zademonstrowano w poniższym przykładzie; użycie multipleksera zostało wyróżnione na czerwono. Multipleksery należy jawnie utylizować.

public class MultiplexNameView implements IDisposable {
    private Multiplexer mplex;
   
    private ISite view1;
    private ISite view2;
   
    private Listener focusListener = new Listener() {
        /* (komentarz nienależący do dokumentacji 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);
            }        
        }
       
    };
   
    /**
     * Konstruktor komponentu. Nie należy wywoływać bezpośrednio.
     */
    public MultiplexNameView(Composite parent, IPartFactory factory, INameable name) throws CoreException {
       
        // Tworzenie multipleksera. Przekierowanie interfejsu INameable do multipleksera.
        mplex = new Multiplexer(new ContainerContext().addInstance(INameable.class, name));
       
        // Tworzenie nawigatora zasobów. Należy przypisać nawigatorowi multipleksowany interfejs INameable, ale
        // użyć wartości domyślnych dla innych interfejsów.
        ContainerContext viewContext1 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view1 = factory.createView(
                IPageLayout.ID_RES_NAV, parent, viewContext1, null);
        view1.getControl().addListener(SWT.Activate, focusListener);
       
        // Tworzenie widoku właściwości. Należy przypisać widokowi właściwości multipleksowany interfejs INameable, ale
        // użyć wartości domyślnych we wszystkich innych przypadkach.
        ContainerContext viewContext2 = new ContainerContext()
            .delegateTo(INameable.class, mplex);
        view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
        view2.getControl().addListener(SWT.Activate, focusListener);
       
        // Ustawianie, aby nawigator był wstępnie aktywny.
        mplex.setActivePart(view1);
       
        parent.setLayout(new FillLayout());       
    }
   
    /* (komentarz nienależący do dokumentacji Javadoc)
     * @see org.eclipse.core.component.IDisposable#dispose()
     */
    public void dispose() {
        mplex.dispose();
    }
}