マルチページ・ウィザード

ウィザードが複雑なタスクをインプリメントしている場合は、 複数のページを使用してユーザーから情報を得る必要があります。

通常、実装パターンは、単一ページのウィザードの場合と同じです。

ウィザードを設計するときに、可能な場合は、必須の情報をすべて最初のページに置く習慣にすると良いでしょう。 これにより、タスクを終了するために、ユーザーがページのセット全体を 1 つ 1 つ調べながら移動しなくても済みます。  オプション情報は、2 ページ目以降に置くことができます。

ページが終了していないと見なして、ページがユーザーに入力を要求する場合は、 setPageComplete(false) を使用してそのページが未完であることを示します。 ページは、コントロールからイベントを受け取ると、ページが終了しているかどうかを再チェックします。 必須の入力が提供されている場合には、setPageComplete(true) が終了をシグナル通知します。

Wizard クラスは、 ページの終了状態に従って「終了」ボタンを使用可能および使用不可にするために必要なロジックを処理します。  「終了」ボタンは、ウィザードの各ページがその終了状態を true に設定したときにのみ使用可能になります。

妥当性検査とページ制御

クラス WizardNewFileCreationPage および CreateReadme1 は、ページの妥当性検査のための共通パターンを示します。

WizardNewFileCreationPage は、 ページの妥当性検査を行う共通のイベント・ハンドラーをすべての SWT イベントに対して定義します。 つまり、ページによりリスナーが追加されたウィジェットからイベントを受け取るごとに、そのページが妥当性検査されるということです。

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

ReadmeCreationPage はコントロールを作成すると、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());
   }

このパターンを使用してウィザードのページは、 ページの妥当性検査のコードをすべて 1 つのメソッド validatePage() に挿入します。 このメソッドはページの初期状態を決定し、 このページがウィジェットからイベントを受け取るごとにページの状態を再計算します。

選択チェック・ボックスにはすでにリスナーを追加しているので、 そのチェック・ボックスが選択イベントを受け取るごとにそのページの有効な状態が再計算されます。 ページの handleEvent メソッドは、スーパークラスを呼び出して、 このページに対する特定のイベント処理に加えて、 継承されたページの妥当性検査の振る舞いが発生することを保証しなければなりません。

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