Если мастер применяется для реализации сложной задачи, то для ввода информации пользователю можно предоставить несколько страниц.
В общем случае принцип реализации аналогичен мастеру, состоящему из одной страницы.
В процессе разработки мастера рекомендуется размещать всю обязательную информацию на первой странице. В этом случае для завершения задачи пользователю не потребуется переходить по всем страницам мастера. Необязательную информацию можно указать на следующих страницах.
Если страница предусматривает ввод пользователем данных, метод setPageComplete(false) позволяет указать, что страница еще не завершена. Каждый раз получая события от управляющих элементов, страница выполняет повторную проверку состояния. После ввода необходимой информации с помощью метода setPageComplete(true) следует указать, что она завершена.
Класс Wizard управляет доступностью кнопки Готово в соответствии с состоянием завершения страниц. Кнопка Готово включается только в том случае, если значение true указано в качестве состояния завершения для всех страниц мастера.
Классы WizardNewFileCreationPage и CreateReadme1, обеспечивающие проверку страниц, применяют для этой цели аналогичные подходы.
WizardNewFileCreationPage задает общий обработчик событий, поддерживающий все события SWT. Он необходим для проверки страницы. Таким образом, страница проверяется каждый раз при получении события от управляющего элемента, в который добавлен обработчик.
public void handleEvent(Event event) { setPageComplete(validatePage()); }
После создания управляющих элементов класс ReadmeCreationPage задает состояние страницы с помощью метода validatePage.
public void createControl(Composite parent) { super.createControl(parent); // создание управляющих элементов, добавление обработчиков и форматирование страницы ... // переключателей создания примеров разделов 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); ... setPageComplete(validatePage()); }
Таким образом страница мастера может разместить весь исходный код проверки в одном методе validatePage(). Он определяет начальное состояние страницы, а также повторно вычисляет состояние каждый раз при поступлении событий от управляющих элементов, расположенных на странице.
Поскольку обработчик событий добавлен в переключатель создания раздела, каждый раз при выборе переключателя состояние страницы вычисляется заново. Обратите внимание, что метод handleEvent, указанный для страницы, должен вызывать базовый метод, поскольку помимо локальной обработки событий требуется выполнить наследованную проверку.
public void handleEvent(Event e) { Widget source = e.widget; if (source == sectionCheckbox) { if (!sectionCheckbox.getSelection()) subsectionCheckbox.setSelection(false); subsectionCheckbox.setEnabled(sectionCheckbox.getSelection()); } super.handleEvent(e); }