public boolean runWizard(String destFile) {
    MainFrame mainFrame = MainFrame.getMainInstance();

    if (mainFrame == null) return false;

    mainFrame.logOnConsole("Invocato wizard");
    mainFrame.logOnConsole(
        "Pronto ad invocare la nuova finestra..." + Thread.currentThread().getName());

    try {
      // TODO
      // Set the project directory as current directory;

      WizardDialog wd = new WizardDialog(mainFrame, true);

      mainFrame.logOnConsole("Lancio wizard");
      wd.setVisible(true);
      wd.requestFocus();

      Report report = null;
      if (wd.getDialogResult() == javax.swing.JOptionPane.OK_OPTION) {
        report = wd.getReport();
        if (report == null) {
          report = createBlankReport();
        }
      } else {
        report = createBlankReport();
      }

      if (report != null) {
        mainFrame.openNewReportWindow(report);
        report.setFilename(destFile);
        report.saveXMLFile();
        setVisible(true);
      }

    } catch (Exception ex) {
      System.out.println(ex.getMessage());
      ex.printStackTrace();
    }

    return true;
  }
  /** ******************************************************** */
  public static Report createColumnarReport(UserChoicesWizardTemplate ucwt) throws Exception {
    Report template = new Report(ucwt.getTemplateFile());

    template.incrementReportChanges();
    template.setFilename(null);

    // 2. Find detail and column header bands...
    Band detail = null;
    Band columns = null;

    Enumeration e = template.getBands().elements();
    while (e.hasMoreElements()) {
      Band band = (Band) e.nextElement();
      if (band.getName().equals("detail")) {
        detail = band;
      } else if (band.getName().equals("columnHeader")) {
        columns = band;
      }
    }

    // 1. Normalize position to band...
    e = template.getElements().elements();
    while (e.hasMoreElements()) {
      ReportElement rElement = (ReportElement) e.nextElement();
      rElement.trasform(
          new java.awt.Point(0, -template.getBandYLocation(rElement.getBand())),
          TransformationType.TRANSFORMATION_MOVE);
    }

    // 1. Adding groups...
    if (ucwt.getGroupExpressions().size() > 0) {
      Group g = template.getGroupByName("Group1");
      Group g1 =
          new Group(
              template,
              Misc.string_replace("_", " ", "" + ucwt.getGroupExpressions().get(0)),
              g.getGroupFooter().getHeight(),
              g.getGroupHeader().getHeight());
      g1.setGroupExpression("$F{" + ucwt.getGroupExpressions().get(0) + "}");
      template.addGroup(g1);

      // Add to g1 all elements attached to g.header and g.footer...
      e = template.getElements().elements();
      while (e.hasMoreElements()) {
        ReportElement rElement = (ReportElement) e.nextElement();
        if (rElement.getBand() == g.getGroupHeader()) rElement.setBand(g1.getGroupHeader());
        else if (rElement.getBand() == g.getGroupFooter()) rElement.setBand(g1.getGroupFooter());
        // Set text to Group1 label...
        if (rElement instanceof StaticTextReportElement) {
          StaticTextReportElement stre = (StaticTextReportElement) rElement;
          if (stre.getText().equals("G1Label"))
            stre.setText("" + ucwt.getGroupExpressions().get(0));
        } else if (rElement instanceof TextFieldReportElement) {
          TextFieldReportElement tfre = (TextFieldReportElement) rElement;
          if (tfre.getText().equals("G1Field")) {
            tfre.setText("$F{" + ucwt.getGroupExpressions().get(0) + "}");
            // find the class type...
            String fname = "" + ucwt.getGroupExpressions().get(0);
            String fclass = "java.lang.String";
            for (int i = 0; i < ucwt.getDisplayFields().size(); ++i) {
              JRField f = (JRField) ucwt.getDisplayFields().get(i);
              if (f.getName().equals(fname)) {
                fclass = f.getClassType();
                break;
              }
            }
            tfre.setMatchingClassExpression(fclass, true);
          }
        }
      }
    }

    if (ucwt.getGroupExpressions().size() > 1) {
      Group g = template.getGroupByName("Group2");
      Group g2 =
          new Group(
              template,
              Misc.string_replace("_", " ", "" + ucwt.getGroupExpressions().get(1)),
              g.getGroupFooter().getHeight(),
              g.getGroupHeader().getHeight());
      g2.setGroupExpression("$F{" + ucwt.getGroupExpressions().get(1) + "}");
      template.addGroup(g2);

      // Add to g2 all elements attached to g.header and g.footer...
      e = template.getElements().elements();
      while (e.hasMoreElements()) {
        ReportElement rElement = (ReportElement) e.nextElement();
        if (rElement.getBand() == g.getGroupHeader()) rElement.setBand(g2.getGroupHeader());
        else if (rElement.getBand() == g.getGroupFooter()) rElement.setBand(g2.getGroupFooter());
        // Set text to Group2 label...
        if (rElement instanceof StaticTextReportElement) {
          StaticTextReportElement stre = (StaticTextReportElement) rElement;
          if (stre.getText().equals("G2Label"))
            stre.setText("" + ucwt.getGroupExpressions().get(1));
        } else if (rElement instanceof TextFieldReportElement) {
          TextFieldReportElement tfre = (TextFieldReportElement) rElement;
          if (tfre.getText().equals("G2Field")) {
            tfre.setText("$F{" + ucwt.getGroupExpressions().get(1) + "}");
            // find the class type...
            String fname = "" + ucwt.getGroupExpressions().get(1);
            String fclass = "java.lang.String";
            for (int i = 0; i < ucwt.getDisplayFields().size(); ++i) {
              JRField f = (JRField) ucwt.getDisplayFields().get(i);
              if (f.getName().equals(fname)) {
                fclass = f.getClassType();
                break;
              }
            }
            tfre.setMatchingClassExpression(fclass, true);
          }
        }
      }
    }

    if (ucwt.getGroupExpressions().size() > 2) {
      Group g = template.getGroupByName("Group3");
      Group g3 =
          new Group(
              template,
              Misc.string_replace("_", " ", "" + ucwt.getGroupExpressions().get(2)),
              g.getGroupFooter().getHeight(),
              g.getGroupHeader().getHeight());
      g3.setGroupExpression("$F{" + ucwt.getGroupExpressions().get(2) + "}");
      template.addGroup(g3);

      // Add to g3 all elements attached to g.header and g.footer...
      e = template.getElements().elements();
      while (e.hasMoreElements()) {
        ReportElement rElement = (ReportElement) e.nextElement();
        if (rElement.getBand() == g.getGroupHeader()) rElement.setBand(g3.getGroupHeader());
        else if (rElement.getBand() == g.getGroupFooter()) rElement.setBand(g3.getGroupFooter());
        // Set text to Group3 label...
        if (rElement instanceof StaticTextReportElement) {
          StaticTextReportElement stre = (StaticTextReportElement) rElement;
          if (stre.getText().equals("G3Label"))
            stre.setText("" + ucwt.getGroupExpressions().get(2));
        } else if (rElement instanceof TextFieldReportElement) {
          TextFieldReportElement tfre = (TextFieldReportElement) rElement;
          if (tfre.getText().equals("G3Field")) {
            tfre.setText("$F{" + ucwt.getGroupExpressions().get(2) + "}");
            // find the class type...
            String fname = "" + ucwt.getGroupExpressions().get(2);
            String fclass = "java.lang.String";
            for (int i = 0; i < ucwt.getDisplayFields().size(); ++i) {
              JRField f = (JRField) ucwt.getDisplayFields().get(i);
              if (f.getName().equals(fname)) {
                fclass = f.getClassType();
                break;
              }
            }
            tfre.setMatchingClassExpression(fclass, true);
          }
        }
      }
    }

    if (ucwt.getGroupExpressions().size() > 3) {
      Group g = template.getGroupByName("Group4");
      Group g4 =
          new Group(
              template,
              Misc.string_replace("_", " ", "" + ucwt.getGroupExpressions().get(3)),
              g.getGroupFooter().getHeight(),
              g.getGroupHeader().getHeight());
      g4.setGroupExpression("$F{" + ucwt.getGroupExpressions().get(3) + "}");
      template.addGroup(g4);

      // Add to g4 all elements attached to g.header and g.footer...
      e = template.getElements().elements();
      while (e.hasMoreElements()) {
        ReportElement rElement = (ReportElement) e.nextElement();
        if (rElement.getBand() == g.getGroupHeader()) rElement.setBand(g4.getGroupHeader());
        else if (rElement.getBand() == g.getGroupFooter()) rElement.setBand(g4.getGroupFooter());
        // Set text to Group4 label...
        if (rElement instanceof StaticTextReportElement) {
          StaticTextReportElement stre = (StaticTextReportElement) rElement;
          if (stre.getText().equals("G4Label"))
            stre.setText("" + ucwt.getGroupExpressions().get(3));
        } else if (rElement instanceof TextFieldReportElement) {
          TextFieldReportElement tfre = (TextFieldReportElement) rElement;
          if (tfre.getText().equals("G4Field")) {
            tfre.setText("$F{" + ucwt.getGroupExpressions().get(3) + "}");
            // find the class type...
            String fname = "" + ucwt.getGroupExpressions().get(3);
            String fclass = "java.lang.String";
            for (int i = 0; i < ucwt.getDisplayFields().size(); ++i) {
              JRField f = (JRField) ucwt.getDisplayFields().get(i);
              if (f.getName().equals(fname)) {
                fclass = f.getClassType();
                break;
              }
            }
            tfre.setMatchingClassExpression(fclass, true);
          }
        }
      }
    }

    // 1. Adding fields...
    int currentx = template.getLeftMargin() + 10;
    int currenty = 10;
    e = template.getElements().elements();
    StaticTextReportElement detailLabel = null;
    TextFieldReportElement detailField = null;
    while (e.hasMoreElements() && (detailLabel == null || detailField == null)) {
      ReportElement rElement = (ReportElement) e.nextElement();
      if (rElement instanceof StaticTextReportElement) {
        StaticTextReportElement stre = (StaticTextReportElement) rElement;
        if (stre.getText().equalsIgnoreCase("DetailLabel")) detailLabel = stre;
      } else if (rElement instanceof TextFieldReportElement) {
        TextFieldReportElement tfre = (TextFieldReportElement) rElement;
        if (tfre.getText().equalsIgnoreCase("DetailField")) detailField = tfre;
      }
    }

    if (detailField != null) template.getElements().removeElement(detailField);
    if (detailLabel != null) template.getElements().removeElement(detailLabel);

    if (detailField == null) detailField = new TextFieldReportElement(0, 0, 100, 20);
    if (detailLabel == null) detailLabel = new StaticTextReportElement(0, 0, 100, 18);

    int nfields = ucwt.getDisplayFields().size();

    if (ucwt.getGroupExpressions().size() > 0) nfields--;
    if (ucwt.getGroupExpressions().size() > 1) nfields--;
    if (ucwt.getGroupExpressions().size() > 2) nfields--;
    if (ucwt.getGroupExpressions().size() > 3) nfields--;

    int fwidth = template.getColumnWidth() / ((nfields <= 0) ? 1 : nfields);
    int ffheight = detailField.getPosition().y;

    for (int i = 0; i < ucwt.getDisplayFields().size(); ++i) {
      // FIELD
      it.businesslogic.ireport.JRField f =
          (it.businesslogic.ireport.JRField) ucwt.getDisplayFields().get(i);
      template.addField(f);

      if (ucwt.getGroupExpressions().size() > 0
          && f.getName().equalsIgnoreCase("" + ucwt.getGroupExpressions().get(0))) continue;
      if (ucwt.getGroupExpressions().size() > 1
          && f.getName().equalsIgnoreCase("" + ucwt.getGroupExpressions().get(1))) continue;
      if (ucwt.getGroupExpressions().size() > 2
          && f.getName().equalsIgnoreCase("" + ucwt.getGroupExpressions().get(2))) continue;
      if (ucwt.getGroupExpressions().size() > 3
          && f.getName().equalsIgnoreCase("" + ucwt.getGroupExpressions().get(3))) continue;

      TextFieldReportElement re = (TextFieldReportElement) detailField.cloneMe();
      re.setPosition(new java.awt.Point(detailField.getPosition().x, ffheight));
      re.updateBounds();
      re.setText("$F{" + f.getName() + "}");

      re.setBand(detail);
      re.setMatchingClassExpression(f.getClassType(), true);

      template.getElements().addElement(re);

      // COLUMN LABEL...
      StaticTextReportElement sre = (StaticTextReportElement) detailLabel.cloneMe();
      sre.setPosition(new java.awt.Point(detailLabel.getPosition().x, ffheight));
      sre.setWidth(fwidth);
      sre.updateBounds();

      // Get field description from datasource
      // added by Felix Firgau on Oct, 11th 2006
      String columnLabelText = f.getName();
      if (ucwt.isSaveFieldDescriptions()) {
        String description = f.getDescription();
        if (description != null && description.length() > 0) columnLabelText = description;
      }

      sre.setText("" + columnLabelText + "");
      sre.setBand(detail);
      template.getElements().addElement(sre);

      ffheight += detailField.position.y + detailField.height - 10;
    }

    detail.setHeight(ffheight);

    // Remove template groups...****************
    e = template.getElements().elements();
    Vector elements_to_delete = new Vector();
    while (e.hasMoreElements()) {
      ReportElement rElement = (ReportElement) e.nextElement();
      Group g = null;
      if ((g = template.getGroupByName("Group1")) != null
          && (rElement.getBand() == g.getGroupHeader() || rElement.getBand() == g.getGroupFooter()))
        elements_to_delete.addElement(rElement);
      else if ((g = template.getGroupByName("Group2")) != null
          && (rElement.getBand() == g.getGroupHeader() || rElement.getBand() == g.getGroupFooter()))
        elements_to_delete.addElement(rElement);
      else if ((g = template.getGroupByName("Group3")) != null
          && (rElement.getBand() == g.getGroupHeader() || rElement.getBand() == g.getGroupFooter()))
        elements_to_delete.addElement(rElement);
      else if ((g = template.getGroupByName("Group4")) != null
          && (rElement.getBand() == g.getGroupHeader() || rElement.getBand() == g.getGroupFooter()))
        elements_to_delete.addElement(rElement);
    }
    e = elements_to_delete.elements();
    while (e.hasMoreElements()) {
      template.getElements().removeElement(e.nextElement());
    }

    Group g;
    if ((g = template.getGroupByName("Group1")) != null) {
      template.getBands().removeElement(g.getGroupFooter());
      template.getBands().removeElement(g.getGroupHeader());
      template.getGroups().removeElement(g);
    }
    if ((g = template.getGroupByName("Group2")) != null) {
      template.getBands().removeElement(g.getGroupFooter());
      template.getBands().removeElement(g.getGroupHeader());
      template.getGroups().removeElement(g);
    }
    if ((g = template.getGroupByName("Group3")) != null) {
      template.getBands().removeElement(g.getGroupFooter());
      template.getBands().removeElement(g.getGroupHeader());
      template.getGroups().removeElement(g);
    }

    if ((g = template.getGroupByName("Group4")) != null) {
      template.getBands().removeElement(g.getGroupFooter());
      template.getBands().removeElement(g.getGroupHeader());
      template.getGroups().removeElement(g);
    }

    // Positioning columns band...
    /*
    if ((g=template.getGroupByName("Columns"))!=null)
    {
            template.getGroups().removeElement(g);
            template.getBands().removeElement(g.getGroupHeader());
            template.getBands().removeElement(g.getGroupFooter());
            template.addGroup(g);
            // we must adjust band position...
    }
     */
    // Adjust vertical position of elements
    e = template.getElements().elements();
    while (e.hasMoreElements()) {
      ReportElement rElement = (ReportElement) e.nextElement();
      rElement.trasform(
          new java.awt.Point(0, +template.getBandYLocation(rElement.getBand())),
          TransformationType.TRANSFORMATION_MOVE);
    }

    template.setQuery(ucwt.getQuery());
    template.setQueryLanguage(ucwt.getQuery_language());

    return template;
  }
  private Report createBlankReport() {
    Report newReport = new Report();

    newReport.setName(
        it.businesslogic.ireport.util.I18n.getString("untitledReport", "untitled_report_") + "1");
    newReport.setUsingMultiLineExpressions(false); // this.isUsingMultiLineExpressions());
    newReport.setWidth(PageSize.A4.x);
    newReport.setHeight(PageSize.A4.y);
    newReport.setTopMargin(20);
    newReport.setLeftMargin(30);
    newReport.setRightMargin(30);
    newReport.setBottomMargin(20);
    newReport.setColumnCount(1);
    newReport.setColumnWidth(
        newReport.getWidth() - newReport.getLeftMargin() - newReport.getRightMargin());
    newReport.setColumnSpacing(0);

    return newReport;
  }