Als met uw wizard een complexe taak wordt geïmplementeerd, wilt u wellicht meer dan één pagina gebruiken om informatie van de gebruiker te verkrijgen.
Over het algemeen is het implementatiepatroon voor een wizard met meerdere pagina's hetzelfde als voor een wizard met slechts één pagina.
Bij het ontwerpen van een wizard is het raadzaam om (indien mogelijk) alle vereiste gegevens in te laten voeren op de eerste pagina. Dan hoeft de gebruiker niet alle pagina's te doorlopen om de taak te kunnen voltooien. Optionele gegevens kunnen dan op de volgende pagina's worden ingevoerd.
Wanneer de gebruikers eerst gegevens moet invoeren voordat de pagina kan worden beschouwd als zijnde voltooid, gebruikt u setPageComplete(false) om aan te geven dat deze nog niet volledig is ingevuld. Als de pagina events van de besturingselementen ontvangt, wordt opnieuw gecontroleerd of de pagina is voltooid. Als alle vereiste gegevens zijn ingevoerd, wordt met setPageComplete(true) aangegeven dat de pagina is voltooid.
De klasse Wizard verwerkt de nodige logica om de knop Voltooien in en uit te schakelen, al naar gelang de voltooiingsstatus van elke pagina. De knop Voltooien in een wizard wordt pas ingeschakeld als de voltooiingsstatus van alle pagina's is ingesteld op true.
De klassen WizardNewFileCreationPage en CreateReadme1 vertonen een gemeenschappelijk patroon voor het implementeren van paginavalidatiefuncties.
WizardNewFileCreationPage definieert een algemene eventhandler voor alle SWT-events waarmee de pagina wordt gevalideerd. Dit heeft tot gevolg dat de pagina telkens wordt gevalideerd wanneer een event wordt ontvangen van een widget waaraan door de pagina een listener is toegevoegd.
public void handleEvent(Event event) { setPageComplete(validatePage()); }
Bij aanmaak van de besturingselementen van ReadmeCreationPage, wordt de status van de pagina ingesteld met validatePage.
public void createControl(Composite parent) { super.createControl(parent); // besturingselementen maken, listeners toevoegen en pagina-indeling maken ... // voorbeeldsectie met selectievakjes genereren 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()); }
Met behulp van dit patroon kan alle wizardpaginavalidatiecode in één methode worden geplaatst, namelijk in validatePage(). Deze methode bepaalt de beginstatus van de pagina en berekent de status telkens opnieuw wanneer een event van een widget op de pagina wordt ontvangen.
Omdat we een listener aan het sectieselectievakje hebben toegevoegd, wordt de status van de pagina telkens opnieuw berekend wanneer dat selectievakje een selectie-event ontvangt. Merk op dat de methode handleEvent van de pagina de super moet aanroepen om ervoor te zorgen dat naast het overgenomen paginavalidatiegedrag ook eventuele specifieke events voor deze pagina worden verwerkt.
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); }