Точка расширения org.eclipse.ui.newWizards позволяет добавить мастер в меню Файл > Создать >. В примере утилиты readme определение этой точки расширения применяется для добавления мастера Файл Readme:
<extension point = "org.eclipse.ui.newWizards"> <category id = "org.eclipse.ui.examples.readmetool.new" parentCategory="org.eclipse.ui.Examples" name="%NewWizard.category"> </category> <wizard id = "org.eclipse.ui.examples.readmetool.wizards.new.file" name = "%NewWizard.name" class="org.eclipse.ui.examples.readmetool.ReadmeCreationWizard" category="org.eclipse.ui.Examples/org.eclipse.ui.examples.readmetool.new" icon="icons/obj16/newreadme_wiz.png"> <description>%NewWizard.desc</description> <selection class="org.eclipse.core.resources.IResource"/> </wizard> </extension>
Элемент category описывает способ группировки мастера. Необязательный атрибут parentCategory указывает, что новая категория создается на основе существующей родительской категории.
Категории верхнего уровня отображаются в меню Файл > Создать. В этом примере в атрибуте parentCategory указана категория "Примеры". Каким образом можно определить источник родительской категории? В тексте на языке описания модуля org.eclipse.ui задается стандартная категория примеров:
<extension point="org.eclipse.ui.newWizards"> <category name="%NewWizards.Category.Examples" id="org.eclipse.ui.Examples"> </category> ...
Эта категория доступна в меню Файл > Создать.
Элемент name, указанный в категории утилиты readme, задает метку для уровня группировки, следующего за родительской категорией. Эти категории отображаются в качестве второго уровня дерева, показанного в мастере Создать Пример. Имя и значок мастера, указанные с помощью атрибутов name и icon отображаются под именем развернутой категории. Описание выбранного мастера, указанное с помощью атрибута description отображается сверху.
Отображение этих сведений о мастере обусловлено только содержимым файла plugin.xml. Исходный код модуля выполняется только после нажатия кнопки Далее. В результате нажатия этой кнопки рабочая среда создает экземпляр класса мастера, указанного в тексте на языке описания, и передает его ожидаемому классу выбора.
Класс, указанный в этом расширении (ReadmeCreationWizard), должен применять интерфейс INewWizard. Как правило, для этой цели мастеры расширяют класс платформы Wizard. Однако такой подход представляет собой механизм реализации и для точки расширения его применять необязательно.
Функция непосредственно мастера ограничивается созданием собственных страниц. Прежде чем продолжить описание мастера, рассмотрим реализацию страниц.
Рабочая среда предоставляет базовые классы страниц мастера, поддерживающие способы обработки, предусмотренные для каждой точки расширения мастера. Вы можете воспользоваться этими страницами в исходном виде, либо расширить, добавив дополнительные возможности.
Основные задачи мастера ReadmeCreationWizard: создание нового файла, добавление в него обязательного содержимого, а также открытие в редакторе, если это необходимо. На странице следует задать управляющие элементы, позволяющие пользователю указать содержимое файла, а также необходимость открытия редактора.
Страница мастера ReadmeCreationPage создается путем расширения WizardNewFileCreationPage. Управляющие элементы страницы мастера задаются аналогично управляющим элементам панели или редактора. Страница реализует метод createControl, который создает все необходимые управляющие элементы SWT в качестве дочерних элементов класса Composite. Поскольку управляющие элементы, поддерживающие обработку новых файлов, уже предусмотрены в базовом классе, в данном примере требуется только расширить метод createControl на странице мастера, добавив дополнительные переключатели, управляющие созданием разделов и открытием редактора.
public void createControl(Composite parent) { // наследование контейнера по умолчанию и управляющих элементов super.createControl(parent); Composite composite = (Composite)getControl(); ... // группа, связанная с созданием разделов Group group = new Group(composite,SWT.NONE); group.setLayout(new GridLayout()); group.setText(MessageUtil.getString("Automatic_sample_section_generation")); group.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); ... // переключатели, управляющие созданием разделов sectionCheckbox = new Button(group,SWT.CHECK); sectionCheckbox.setText(MessageUtil.getString("Generate_sample_section_titles")); sectionCheckbox.setSelection(true); sectionCheckbox.addListener(SWT.Selection,this); subsectionCheckbox = new Button(group,SWT.CHECK); subsectionCheckbox.setText(MessageUtil.getString("Generate_sample_subsection_titles")); subsectionCheckbox.setSelection(true); subsectionCheckbox.addListener(SWT.Selection,this); ... // переключатель, позволяющий открыть файл в редакторе openFileCheckbox = new Button(composite,SWT.CHECK); openFileCheckbox.setText(MessageUtil.getString("Open_file_for_editing_when_done")); openFileCheckbox.setSelection(true); ... }
Для лучшего понимания этого исходного кода рекомендуется ознакомиться с разделом Standard Widget Toolkit.
Ниже перечислены основные принципы реализации страницы:
Класс ReadmeCreationPage наследует многие свойства из класса WizardNewFileCreationPage. За дополнительной информацией обратитесь к реализации этих классов.
Рассмотрев особенности работы страницы, вернемся к мастеру.
Мастер отвечает за создание отдельных страниц и реализацию логики "завершения".
Ниже перечислены основные принципы реализации мастера:
public void init(IWorkbench workbench,IStructuredSelection selection) { this.workbench = workbench; this.selection = selection; setWindowTitle(MessageUtil.getString("New_Readme_File")); setDefaultPageImageDescriptor(ReadmeImages.README_WIZARD_BANNER); }
public void addPages() { mainPage = new ReadmeCreationPage(workbench, selection); addPage(mainPage); }
public boolean performFinish() { return mainPage.finish(); }
Завершенный мастер выглядит следующим образом: