Assistentes de multi-página

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

Validação e controlo de páginas

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);
   }