복수 페이지 마법사

마법사가 복잡한 타스크를 구현하는 경우, 두 페이지 이상을 사용하여 사용자로부터 정보를 얻을 수 있습니다.

일반적으로 구현 패턴은 단일 페이지 마법사의 경우와 동일합니다.

마법사를 설계할 때 모든 필수 정보는 가능한 첫 번째 페이지에 배치하는 것이 좋습니다. 이렇게 하면 타스크를 완료하기 위해 전체 페이지를 순회하지 않아도 됩니다.  선택적인 정보는 다음 페이지에 포함시킬 수 있습니다.

페이지를 완료하기 전에 사용자로부터 입력이 필요한 경우, setPageComplete(false)를 사용하여 페이지가 완료되지 않았음을 표시하십시오. 페이지가 제어로부터 이벤트를 수신하면 페이지는 그 완료 여부를 다시 확인합니다. 필수 입력이 제공되면 setPageComplete(true)가 완료를 표시합니다.

Wizard 클래스는 페이지 완료 상태에 따라 완료 단추를 사용/사용 안함으로 설정하는 데 필요한 논리를 처리합니다. 완료 단추는 각 페이지의 완료 상태가 'true'로 설정된 경우에만 마법사에서 사용할 수 있습니다.

유효성 검증 및 페이지 제어

WizardNewFileCreationPageCreateReadme1 클래스는 페이지 유효성 검증을 구현하기 위한 공통 패턴을 표시합니다.

WizardNewFileCreationPage는 페이지의 유효성을 검증하는 모든 SWT 이벤트에 대한 공통 이벤트 핸들러를 정의합니다. 이것은 페이지가 리스너를 추가한 위지트(widget)로부터 이벤트가 수신될 때마다 페이지의 유효성이 검증됨을 의미합니다.

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

이 패턴을 사용하면 마법사 페이지가 페이지 유효성 검증 코드 모두를 validatePage() 메소드 하나로 입력할 수 있습니다. 이 메소드는 페이지 초기 상태를 결정하고 그 페이지의 위지트(widget)에서 이벤트를 수신하면 상태를 다시 계산합니다.

섹션 선택란에 리스너를 추가했으므로 선택란이 선택사항 이벤트를 수신할 때마다 올바른 페이지 상태를 다시 계산하게 됩니다. 페이지의 handleEvent 메소드는 이 페이지에 대한 특정 이벤트 처리 외에 상속된 페이지 유효성 검증 동작이 발생하도록 super를 호출해야 합니다.

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