Se o assistente implementar uma tarefa complexa, poderá ser útil utilizar mais do que uma página para obter informações do utilizador.
Regra geral, o padrão de implementação é o mesmo que para um assistente de página única.
Ao conceber um assistente, é boa prática colocar todas as informações necessárias na primeira página, se possível. Desta forma, o utilizador não tem de atravessar o conjunto de páginas inteiro para finalizar a tarefa. As informações opcionais podem ficar em páginas seguintes.
Quando uma página implicar intervenção do utilizador antes de poder ser considerada completa, utilize setPageComplete(false) para indicar que não está completa. À medida que a página receber eventos dos seus controlos, torna a verificar para ver se está completa. Uma vez efectuada a intervenção necessária, setPageComplete(true) assinala a conclusão.
A classe Wizard trata a lógica necessária para activar e desactivar o botão Terminar segundo o estado de conclusão das páginas. O botão Terminar só está activado para um assistente quando cada uma das suas páginas tiver definido o respectivo estado de conclusão como verdadeiro (true).
As classes WizardNewFileCreationPage e CreateReadme1 mostram um padrão comum para implementar validação de páginas.
WizardNewFileCreationPage define uma rotina de tratamento de eventos comum para todos os eventos SWT que validem a página. Significa isto que a página será validada sempre que seja recebido um evento de um widget ao qual a página tenha adicionado um ouvinte.
public void handleEvent(Event event) { setPageComplete(validatePage()); }
Assim que a ReadmeCreationPage criar os seus controlos, definirá o estado da página com validatePage.
public void createControl(Composite parent) { super.createControl(parent); // create controls, add listeners, and layout the page ... // sample section generation checkboxes 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()); }
Com este padrão, uma página de assistente pode colocar todo o seu código de validação de página num único método, validatePage(). Este método determina o estado inicial da página e volta a calcular o estado em qualquer altura que receba um evento de um widget na sua página.
Dado que adicionámos um ouvinte à caixa de verificação da secção, iremos recalcular o estado válido da página sempre que a caixa de verificação receba um evento de selecção. Repare que o método handleEvent da página deve chamar super para assegurar que o comportamento de validação da página herdada ocorre além de qualquer rotina de tratamento de eventos específica desta página.
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); }