Przekazywanie argumentów do części

Element macierzysty przekazuje argumenty elementom potomnym za pomocą metody ContainerContext. Kontekst może przekazywać argumenty do konstruktora części lub określać fabrykę służącą do konstruowania tych argumentów. Na przykład konkretna metoda ContainerContext może określać następujące reguły:
Element potomny użyje implementacji domyślnej z punktu rozszerzenia org.eclipse.core.component.types, jeśli kontekst nie udostępnia danej zależności. Ponieważ kontekst może przesłonić dowolny argument otrzymany przez część w konstruktorze, element macierzysty może przesłonić dowolny interfejs otrzymywany normalnie przez część z serwisu. Element macierzysty mógłby na przykład wymusić na elemencie potomnym użycie innej implementacji interfejsu IActionBars przez dostarczenie interfejsu IActionBars w kontekście.

Element macierzysty ma następujące opcje konstruowania kontekstu:

Znajdujące się poniżej przykłady widoków DefaultContextView, RedirectContextView oraz OverrideInstanceView demonstrują każdą z możliwości.

Kontekst domyślny

Poniższy fragment kodu pochodzi z widoku tworzącego dwa zagnieżdżone elementy potomne w kontekście domyślnym. Utworzenie elementów potomnych w kontekście domyślnym oznacza, że nazwa, pasek narzędzi, wybór itd. nie są istotne dla elementu macierzystego i nie jest on przygotowany do ich obsługi. Gdyby element macierzysty chciał wykonać jakieś operacje na przykład na aktualnym wyborze jednego z elementów potomnych, musiałby przekazać mu interfejs ISelectionHandler. Wynik końcowy został przedstawiony pod przykładem.

/**
 * Widok demonstrujący tworzenie dwóch zagnieżdżonych elementów potomnych
 * w kontekście domyślnym.
 */
public class DefaultContextView {
    public DefaultContextView(Composite parent, IPartFactory factory) throws CoreException {
        // Tworzenie nawigatora zasobów
        ContainerContext viewContext1 = new ContainerContext();  
        ISite view1 = factory.createView(
                IPageLayout.ID_RES_NAV, parent, viewContext1, null);
   
        // Tworzenie widoku właściwości
        ContainerContext viewContext2 = new ContainerContext();
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());       
    }
}

Widok DefaultContextView

Przekierowanie zależności z elementu macierzystego do elementu potomnego

Ten przykład pokazuje, jak przekierować interfejs serwisu z elementu macierzystego do elementu potomnego. Ten widok złożony zawiera nawigator zasobów oraz widok właściwości. Przekierowuje procedurę obsługi wyboru do nawigatora zasobów oraz przekierowuje paski akcji do widoku właściwości. Wynikiem jest widok udostępniający wybór zasobów oraz zawierający pasek narzędzi i menu z widoku właściwości, tak jak pokazano poniżej.

public class RedirectContextView {
    /**
     * Konstruktor komponentu. Nie należy wywoływać bezpośrednio.
     */
    public RedirectContextView(Composite parent, IPartFactory factory, ISelectionHandler selection, IActionBars actionBars) throws CoreException {
        // Tworzenie nawigatora zasobów. Przekierowanie wyboru nawigatora bezpośrednio do elementu macierzystego.
        ContainerContext viewContext1 = new ContainerContext()
            .addInstance(ISelectionHandler.class, selection);
        ISite view1 = factory.createView(
                IPageLayout.ID_RES_NAV,
                parent, viewContext1, null);
   
        // Tworzenie widoku właściwości. Umożliwienie widokowi właściwości bezpośrednie używanie pasków akcji.
        ContainerContext viewContext2 = new ContainerContext()
            .addInstance(IActionBars.class, actionBars);
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());       
    }
}


Widok RedirectContextView

Bezpośrednie udostępnianie zależności

W poniższym przykładzie pokazano, w jaki sposób bezpośrednio dostarczyć zależności elementowi potomnemu. W tym przykładzie tworzony jest widok złożony z widokiem problemów oraz widokiem właściwości. Do widoku problemów dostarczono interfejs ISelectionHandler, aby wyświetlić liczbę wybranych problemów w opisie treści. Wynik końcowy pokazano poniżej.

public class OverrideInstanceView {
   
    /**
     * Konstruktor komponentu. Nie należy wywoływać bezpośrednio.
     */
    public OverrideInstanceView(Composite parent, IPartFactory factory, final INameable name) throws CoreException {
        ContainerContext viewContext1 = new ContainerContext();
       
        // Dodawanie interfejsu ISelectionHandler do kontekstu widoku. Wyświetlanie liczby wybranych elementów w opisie treści
        // przy każdej zmianie wyboru widoku
        viewContext1.addInstance(ISelectionHandler.class, new ISelectionHandler() {
            /* (komentarz nienależący do dokumentacji Javadoc)
             * @see org.eclipse.ui.part.services.ISelectionHandler#setSelection(org.eclipse.jface.viewers.ISelection)
             */
            public void setSelection(ISelection newSelection) {
                if (newSelection instanceof IStructuredSelection) {
                    IStructuredSelection sel = (IStructuredSelection)newSelection;
                    int selectionSize = sel.size();
                   
                    name.setContentDescription(MessageFormat.format("{0} problems selected",
                            new String[] {Integer.toString(selectionSize)}));
                }
            }
        });

        // Tworzenie widoku problemów
        ISite view1 = factory.createView(
                IPageLayout.ID_PROBLEM_VIEW, parent, viewContext1, null);
   
        // Tworzenie widoku właściwości
        ContainerContext viewContext2 = new ContainerContext();
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());
    }
}



Widok OverrideInstanceView