private void initModuleWizard(
      final Project project,
      final ModulesProvider modulesProvider,
      @Nullable final String defaultPath) {
    myWizardContext = new WizardContext(project);
    if (defaultPath != null) {
      myWizardContext.setProjectFileDirectory(defaultPath);
      myWizardContext.setProjectName(
          defaultPath.substring(
              FileUtil.toSystemIndependentName(defaultPath).lastIndexOf("/") + 1));
    }
    myWizardContext.addContextListener(
        new WizardContext.Listener() {
          public void buttonsUpdateRequested() {
            updateButtons();
          }

          public void nextStepRequested() {
            doNextAction();
          }
        });

    myRootStep =
        new ProjectCreateModeStep(defaultPath, myWizardContext) {
          protected void update() {
            updateButtons();
          }
        };
    addStep(myRootStep);
    for (WizardMode mode : myRootStep.getModes()) {
      appendSteps(mode.getSteps(myWizardContext, modulesProvider));
    }
    init();
  }
 /**
  * Instructs current step to use given mode.
  *
  * @param mode mode to set active
  * @throws IllegalArgumentException if given mode is not registered at the current step (not
  *     contained at {@link #getModes()})
  */
 public void setMode(@NotNull WizardMode mode) throws IllegalArgumentException {
   if (!myModes.contains(mode)) {
     throw new IllegalArgumentException(
         String.format(
             "Can't activate given mode (%s) to the %s object. Reason: it's not contained in registered modes (%s)",
             mode, getClass().getName(), myModes));
   }
   myMode.onChosen(false);
   myMode = mode;
   myMode.onChosen(true);
   update();
 }
  public ProjectCreateModeStep(final String defaultPath, final WizardContext wizardContext) {
    final StringBuilder buf = new StringBuilder();
    for (WizardMode mode : Extensions.getExtensions(WizardMode.MODES)) {
      if (mode.isAvailable(wizardContext)) {
        myModes.add(mode);
        if (defaultPath != null && wizardContext.isCreatingNewProject()) {
          if (mode instanceof CreateFromSourcesMode) {
            myMode = mode;
          }
        } else if (mode instanceof CreateFromScratchMode) {
          myMode = mode;
        }
      }
      final String footnote = mode.getFootnote(wizardContext);
      if (footnote != null) {
        if (buf.length() > 0) buf.append("<br>");
        buf.append(footnote);
      }
    }

    if (myMode == null) {
      myMode = myModes.get(0);
    }

    myWizardContext = wizardContext;
    myWholePanel = new JPanel(new GridBagLayout());
    myWholePanel.setBorder(BorderFactory.createEtchedBorder());

    final Insets insets = new Insets(0, 0, 0, 5);
    GridBagConstraints gc =
        new GridBagConstraints(
            0,
            GridBagConstraints.RELATIVE,
            1,
            1,
            1,
            0,
            GridBagConstraints.NORTHWEST,
            GridBagConstraints.HORIZONTAL,
            insets,
            0,
            0);
    final ButtonGroup group = new ButtonGroup();
    for (final WizardMode mode : myModes) {
      insets.top = 15;
      insets.left = 5;
      final JRadioButton rb = new JRadioButton(mode.getDisplayName(wizardContext), mode == myMode);
      rb.setFont(UIUtil.getLabelFont().deriveFont(Font.BOLD));
      rb.addActionListener(
          new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
              setMode(mode);
            }
          });
      rb.addMouseListener(
          new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
              if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
                wizardContext.requestNextStep();
              }
            }
          });

      myWholePanel.add(rb, gc);
      group.add(rb);
      insets.top = 5;
      insets.left = 20;
      final JLabel description = new JLabel(mode.getDescription(wizardContext));
      myWholePanel.add(description, gc);
      final JComponent settings = mode.getAdditionalSettings(wizardContext);
      if (settings != null) {
        myWholePanel.add(settings, gc);
      }
    }
    myMode.onChosen(true);
    gc.weighty = 1;
    gc.fill = GridBagConstraints.BOTH;
    myWholePanel.add(Box.createVerticalBox(), gc);
    final JLabel note =
        new JLabel(
            "<html>" + buf.toString() + "</html>",
            IconLoader.getIcon("/nodes/warningIntroduction.png"),
            SwingConstants.LEFT);
    note.setVisible(buf.length() > 0);
    gc.weighty = 0;
    gc.fill = GridBagConstraints.HORIZONTAL;
    gc.insets.bottom = 5;
    myWholePanel.add(note, gc);
  }
 @Override
 public boolean validate() throws ConfigurationException {
   return super.validate() && myMode.validate();
 }
 public void updateDataModel() {
   myWizardContext.setProjectBuilder(myMode.getModuleBuilder());
 }