Панели и редакторы, как правило, создаются с помощью 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.
*/
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;
}
// ...оставшиеся пустые методы удалены...
}