Assistentes de Páginas Múltiplas

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.

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 pelo conjunto inteiro de páginas para concluir a tarefa.  As informações opcionais podem ser colocadas 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 da 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.

Validação e controle de página

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 ouvinte.

public void handleEvent(Event event) {
setPageComplete(validatePage());
   }

Depois que a ReadmeCreationPage cria seus controles, ela define o estado da página utilizando validatePage.

public void createControl(Composite parent) {
      super.createControl(parent);
      // cria controles, inclui ouvintes e faz o layout da página
      ...
      // exemplos de caixas de opção de geração de seção
      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());
   }

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 incluímos um ouvinte 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);
   }