Создание экземпляров компонентов

Любое взаимодействие с компонентом предусматривает применение ISite. С точки зрения пользователя, создающего компонент, ISite также представляет собой компонент. ISite можно создать с помощью IPartFactory, либо создав экземпляр класса Site.

Для уничтожения компонента следует очистить управляющий элемент связанного ISite.

Создание экземпляров компонентов с помощью IPartFactory

Панели и редакторы, как правило, создаются с помощью IPartFactory. Только IPartFactory может создать компоненты, зарегистрированные в точке расширения панели или редактора. Компоненты, созданные с помощью IPartFactory, зависят от IWorkbenchPage и удаляются вместе с IWorkbenchPage. IPartFactory создает компоненты на основе ИД; класс реализации компонента не должен быть API. IPartFactory можно получить из IWorkbenchPage. Кроме того, компоненты могут указывать IPartFactory в своих конструкторах для создания вложенных дочерних элементов.

В этом примере рассмотрен процесс создания панели с помощью IPartFactory.

/**
 * Применяется для создания экземпляров редакторов и панелей.
 *
 * @since 3.1
 */
public interface IPartFactory {
    /**
     * Создает экземпляр панели. Возвращает <code>ISite</code> новой панели.
     * Завершив работу с компонентом, инициатор должен очистить его основной управляющий элемент. Для этого
     * можно вызвать <code>ISite.getControl().dispose()</code>, либо очистить
     * родительский составной объект.
     *
     * @param viewId - ИД панели в точке расширения org.eclipse.ui.views
     * @param parentComposite - родительский составной объект панели. Если панель создана успешно,
     *        то в этом объекте будет создан один новый дочерний управляющий элемент.
     * @param context - локальный контекст панели. Этот объект может переопределить зависимости панели.
     *        Если зависимость панели отсутствует в локальном контексте, то реализация по умолчанию
     *        предоставляется точкой расширения org.eclipse.core.component.types.
     * @param savedState - предыдущее сохраненное состояние компонента, либо нулевое значение в случае его отсутствия
     * @return ISite новой панели
     * @throws CoreException, если компонент невозможно создать
     */
    public ISite createView(String viewId, Composite parentComposite, IContainerContext context, IMemento savedState) throws CoreException;
   
    /**
     * Создает экземпляр редактора. Возвращает <code>ISite</code> нового редактора.
     * Завершив работу с компонентом, инициатор должен очистить его основной управляющий элемент. Для этого
     * можно вызвать <code>ISite.getControl().dispose()</code>, либо очистить
     * родительский составной объект.
     *
     * @param editorId - ИД редактора в точке расширения org.eclipse.ui.editors
     * @param parentComposite - родительский составной объект редактора. Если редактор создан успешно,
     *        то в этом объекте будет создан один новый дочерний управляющий элемент.
     * @param context - локальный контекст редактора. Этот объект может переопределить зависимости редактора.
     *        Если зависимость редактора отсутствует в локальном контексте, то реализация по умолчанию
     *        предоставляется точкой расширения org.eclipse.core.component.types.
     * @param input - IEditorInput редактора
     * @param savedState - предыдущее сохраненное состояние компонента, либо нулевое значение в случае его отсутствия
     * @return ISite нового редактора
     * @throws CoreException, если компонент невозможно создать
     */
    public ISite createEditor(String editorId, Composite parentComposite, IContainerContext context, IEditorInput input, IMemento savedState) throws CoreException;
}


Далее приведен пример действия, создающего панель с поддержкой IPartFactory

/**
 * Показано, каким образом можно открыть панель с помощью IWorkbenchPage по ее ИД.
 */
public class CreateViewByIdAction implements IWorkbenchWindowActionDelegate {
    private IWorkbenchWindow window;

    public void run(IAction action) {       
        IWorkbenchPage page = window.getActivePage();
       
        if (page == null) {
           
// ...код обработки ошибок, не имеющий отношения к рассматриваемому вопросу, удален...
            return;
        }
       
        final Shell tempShell = new Shell(window.getShell(), SWT.DIALOG_TRIM | SWT.RESIZE);
       
        tempShell.setLayout(new FillLayout());
        tempShell.setText("Problems");
       
        IPartFactory factory = page.getPartFactory();
        try {
            factory.createView(IPageLayout.ID_PROBLEM_VIEW, tempShell, new ContainerContext(), null);
        } catch (CoreException e) {
           
// ...код обработки ошибок, не имеющий отношения к рассматриваемому вопросу, удален...
        }
       
        // Открывается окно диалога
        tempShell.open();
        Display d = tempShell.getDisplay();
        while (!tempShell.isDisposed()) {
            if (!d.readAndDispatch())
                d.sleep();
        }
       
    }

    public void init(IWorkbenchWindow window) {
        this.window = window;
    }

    // ...оставшиеся пустые методы удалены...
}

Создание экземпляров компонентов с помощью класса Site

Компонентами могут быть не только панели и редакторы. Клиенты могут создавать собственные многоразовые компоненты с помощью API компонентов. Такие компоненты не регистрируются в точках расширения панелей и редакторов, однако они могут обращаться ко многим API панелей и редакторов. Хотя клиенты могут реализовать собственные API для многоразовых компонентов, применение шаблонов позволяет встраивать их в любые объекты, поддерживающие встраивание панелей и редакторов.

Компоненты, созданные с помощью класса Site, обладают следующими свойствами: Конструктору сайта следует предоставить класс реализации компонента, а также связанный комплект модулей. Комплект модулей определяет целевое расположение для занесения сообщений об ошибках, а также поиска ресурсов, необходимых для компонента.

В приведенном ниже примере показано, каким образом можно создать экземпляр компонента с помощью класса Site. В этом примере создается экземпляр компонента NameTestView в окне диалога. Хотя NameTestView представляет собой панель и может использовать API панели, его не обязательно регистрировать в точке расширения org.eclipse.ui.views, если рабочая среда явным образом не предполагает его использование в качестве панели.


/**
 * Показано, каким образом компонент можно открыть программным способом с помощью класса Site.
 */
public class ProgrammaticViewCreationExampleAction implements IWorkbenchWindowActionDelegate {
    private IWorkbenchWindow window;

    public void run(IAction action) {       
        // Создание оболочки
        final Shell tempShell = new Shell(window.getShell(), SWT.DIALOG_TRIM | SWT.RESIZE);
        tempShell.setLayout(new FillLayout());
        tempShell.setText("Name test view");
       
        Bundle thisPlugin = ComponentExamplesPlugin.getDefault().getBundle();
       
        try {
            // Создание компонента NameTestView (данный пример приведен ради этой строки)
            // Класс Site применяется вместо вызова конструктора NameTestView.
            Site testPart = new Site(tempShell, new ContainerContext(),
                    thisPlugin,
                    NameTestView.class);           
           
        } catch (CoreException e) {
            // ...код обработки ошибок, не имеющий отношения к рассматриваемому вопросу, удален...
        }
       
        // Открытие модального окна диалога
        tempShell.open();
        Display d = tempShell.getDisplay();
        while (!tempShell.isDisposed()) {
            if (!d.readAndDispatch())
                d.sleep();
        }
       
    }
\
    public void init(IWorkbenchWindow window) {
        this.window = window;
    }

   
// ...оставшиеся пустые методы удалены...
}