Se o seu assistente implementar uma tarefa complexa, você pode desejar utilizar mais de uma página para obter informações do usuário.
Geralmente, o padrão de implementação é o mesmo de um assistente de página única.
Crie no seu assistente uma classe filha WizardPage para cada página. Cada página de assistente deve utilizar setPageComplete(true) quando tiver informações suficientes.
Crie uma classe filha Assistente que inclua cada página no assistente.
Implemente um método performFinish para executar a lógica final.
Quando projetar um assistente, é indicado colocar todas as informações necessárias na primeira página, se possível. Dessa forma, o usuário não tem que passar por todo o conjunto de páginas para finalizar a tarefa. Podem aparecer informações opcionais em páginas subseqüentes.
Quando uma página solicitar uma entrada do usuário antes que possa ser considerada concluída, utilize setPageComplete(false) para indicar que não está concluída. À medida que a página recebe eventos dos seus controles, ela verifica novamente se a página está concluída. Assim que a entrada necessária for fornecida, o setPageComplete(true) indica a conclusão.
A classe Assistente trata a lógica necessária para ativar e desativar o botão Concluir de acordo com o estado de conclusão das páginas. O botão Concluir é ativado para um assistente apenas quando cada uma de suas páginas tiver definido seu estado de conclusão para verdadeiro.
As classes WizardNewFileCreationPage e CreateReadme1 mostram um padrão comum para implementar a validação de páginas.
WizardNewFileCreationPage define uma rotina de tratamento de eventos comum para todos os eventos SWT que validam a página. Isso significa que a página será validada sempre que um evento for recebido de um widget ao qual a página tenha incluído um atendente.
public void handleEvent(Event event) {
setPageComplete(validatePage());
}
Uma vez que a página CreateReadme1 cria seus controles, ela define o estado da página usando validatePage.
public void createControl(Composite parent) {
super.createControl(parent);
// cria controles, inclui atendentes e faz o layout de página
...
// amostra de caixas de entrada de geração de seção
sectionCheckbox = new Button(group,SWT.CHECK);
sectionCheckbox.setText("Gerar amostras de títulos de seção");
sectionCheckbox.setSelection(true);
// incluímos um atendente nesta caixa de entrada
sectionCheckbox.addListener(SWT.Selection,this);
...
setPageComplete(validatePage());
}
Utilizando esse padrão, uma página de assistente pode colocar todos os seus códigos de validação de páginas em um método, validatePage(). Esse método determina o estado inicial da página e recalcula o estado a qualquer momento que receber um evento de um widget na sua página.
Já que incluimos um atendente na caixa de entrada da seção, recalcularemos o estado válido da página sempre que a caixa de entrada receber um evento de seleção. Observe que o método handleEvent da página deve ser nomeado super para garantir que o comportamento de validação da página herdada ocorra além de qualquer tratamento de evento específico nesta 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);
}