Передача аргументов компоненту

Родительский объект передает аргументы своим дочерним объектам с помощью ContainerContext. Контекст может передать аргументы конструктору компонента, либо указать фабрику для создания этих аргументов. Например, конкретный ContainerContext может указать следующие правила:
Если контекст не предоставляет конкретную зависимость, дочерний элемент использует реализацию по умолчанию из точки расширения org.eclipse.core.component.types. Поскольку контекст может переопределить аргументы, передаваемые конструктору компонента, родительский объект может переопределить интерфейсы, получаемые компонентом от сайта. Например, родительский объект может принудительно применить в дочернем другую реализацию IActionBars, указав IActionBars в контексте.

Ниже перечислены различные варианты создания контекста родительским объектом:

Каждый из вариантов рассмотрен в следующих примерах DefaultContextView, RedirectContextView и OverrideInstanceView.

Контекст по умолчанию

В следующем примере приведен исходный код панели, создающей в контексте по умолчанию два вложенных дочерних объекта. Создание дочерних объектов в контексте по умолчанию означает, что родительский объект не указывает имя, панель инструментов и другие параметры дочернего объекта и не предусматривает взаимодействие с ними. Для работы с текущими элементами, выбранными в дочернем объекте, родительскому объекту потребовалось бы передать ISelectionHandler. Конечный результат приведен после примера.

/**
 * Панель с примером создания двух вложенных дочерних объектов
 * с контекстом по умолчанию.
 */
public class DefaultContextView {
    public DefaultContextView(Composite parent, IPartFactory factory) throws CoreException {
        // Создание навигатора ресурсов
        ContainerContext viewContext1 = new ContainerContext();  
        ISite view1 = factory.createView(
                IPageLayout.ID_RES_NAV, parent, viewContext1, null);
   
        // Создание панели свойств
        ContainerContext viewContext2 = new ContainerContext();
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());       
    }
}

DefaultContextView

Перенаправление зависимостей из родительского в дочерний объект

В этом примере показано, каким образом интерфейс сайта можно перенаправить из родительского в дочерний объект. Данная составная панель содержит навигатор ресурсов и панель свойств. Она перенаправляет обработчик выбранных элементов навигатору ресурсов, а также перенаправляет панели действий в панель свойств. В результате создается панель, позволяющая выбирать ресурсы, в состав которой входит панель инструментов и меню панели свойств (см. рисунок ниже).

public class RedirectContextView {
    /**
     * Конструктор компонента. Не следует вызывать непосредственно.
     */
    public RedirectContextView(Composite parent, IPartFactory factory, ISelectionHandler selection, IActionBars actionBars) throws CoreException {
        // Создание навигатора ресурсов. Элементы, выбранные в навигаторе ресурсов, перенаправляются непосредственно родительскому объекту.
        ContainerContext viewContext1 = new ContainerContext()
            .addInstance(ISelectionHandler.class, selection);
        ISite view1 = factory.createView(
                IPageLayout.ID_RES_NAV,
                parent, viewContext1, null);
   
        // Создание панели свойств. Панели свойств разрешено непосредственно использовать панели действий.
        ContainerContext viewContext2 = new ContainerContext()
            .addInstance(IActionBars.class, actionBars);
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());       
    }
}


RedirectContextView

Непосредственное предоставление зависимостей

В этом примере показано, каким образом зависимости можно передать непосредственно дочернему объекту. В этом примере создается составная панель, в состав которой входит панель неполадок и панель свойств. Панели неполадок передается ISelectionHandler для отображения числа неполадок, выбранных в описании информационного наполнения. Конечный результат показан ниже.

public class OverrideInstanceView {
   
    /**
     * Конструктор компонента. Не следует вызывать непосредственно.
     */
    public OverrideInstanceView(Composite parent, IPartFactory factory, final INameable name) throws CoreException {
        ContainerContext viewContext1 = new ContainerContext();
       
        // Добавление ISelectionHandler в контекст панели. При изменении элемента, выбранного на панели,
        // отображение числа выбранных элементов в описании информационного наполнения
        viewContext1.addInstance(ISelectionHandler.class, new ISelectionHandler() {
            /* (не документация по Java)
             * @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)}));
                }
            }
        });

        // Создание панели неполадок
        ISite view1 = factory.createView(
                IPageLayout.ID_PROBLEM_VIEW, parent, viewContext1, null);
   
        // Создание панели свойств
        ContainerContext viewContext2 = new ContainerContext();
        ISite view2 = factory.createView(IPageLayout.ID_PROP_SHEET, parent, viewContext2, null);
   
        parent.setLayout(new FillLayout());
    }
}



OverrideInstanceView