/** Shows the {@link OpenDialogForm}. */
  public final void show() {
    logger.debug("show", "show the open dialog"); // $NON-NLS-1$ //$NON-NLS-2$

    int x = this.parent.getBounds().x + (this.parent.getWidth() / 2) - (this.gui.getWidth() / 2);
    int y = this.parent.getBounds().y + (this.parent.getHeight() / 2) - (this.gui.getHeight() / 2);
    this.gui.setBounds(x, y, this.gui.getWidth(), this.gui.getHeight());
    this.gui.setVisible(true);
  }
  /** Handles the open event. */
  public final void handleOpen() {
    logger.debug("handleOpen", "handle open"); // $NON-NLS-1$ //$NON-NLS-2$

    if (this.gui.jGTIFileChooser.getUI() instanceof BasicFileChooserUI) {
      BasicFileChooserUI ui = (BasicFileChooserUI) this.gui.jGTIFileChooser.getUI();
      ui.getApproveSelectionAction().actionPerformed(null);
    } else {
      throw new RuntimeException("ui is not a BasicFileChooserUI"); // $NON-NLS-1$
    }
    if ((getSelectedFile() != null) && !getSelectedFile().isDirectory()) {
      this.confirmed = true;
      this.gui.dispose();
    }
  }
  /**
   * Allocates a new {@link OpenDialog}.
   *
   * @param parent The parent {@link JFrame}.
   * @param workingPath The working path.
   */
  public OpenDialog(JFrame parent, String workingPath) {
    logger.debug("OpenDialog", "allocate a new open dialog"); // $NON-NLS-1$ //$NON-NLS-2$
    this.parent = parent;
    this.gui = new OpenDialogForm(this, parent);
    this.gui.jGTIFileChooser.setCurrentDirectory(new File(workingPath));

    // Source files
    FileFilter sourceFileFilter =
        new FileFilter() {

          @Override
          public boolean accept(File file) {
            if (file.isDirectory()) {
              return true;
            }
            for (String current : Machine.AVAILABLE_MACHINES) {
              if (file.getName()
                  .toLowerCase()
                  .matches(".+\\." + current.toLowerCase())) // $NON-NLS-1$
              {
                return true;
              }
            }
            for (String current : Grammar.AVAILABLE_GRAMMARS) {
              if (file.getName()
                  .toLowerCase()
                  .matches(".+\\." + current.toLowerCase())) // $NON-NLS-1$
              {
                return true;
              }
            }
            if (file.getName()
                .toLowerCase()
                .matches(".+\\." + RegexType.REGEX.getFileEnding())) // $NON-NLS-1$
            {
              return true;
            }
            return false;
          }

          @Override
          public String getDescription() {
            StringBuilder result = new StringBuilder();
            result.append(Messages.getString("OpenDialog.FilterFiles")); // $NON-NLS-1$
            result.append(" ("); // $NON-NLS-1$
            for (int i = 0; i < Machine.AVAILABLE_MACHINES.length; i++) {
              result.append("*."); // $NON-NLS-1$
              result.append(Machine.AVAILABLE_MACHINES[i].toLowerCase());
              if (i != Machine.AVAILABLE_MACHINES.length - 1) {
                result.append("; "); // $NON-NLS-1$
              }
            }
            if ((Machine.AVAILABLE_MACHINES.length > 0)
                && (Grammar.AVAILABLE_GRAMMARS.length > 0)) {
              result.append("; "); // $NON-NLS-1$
            }
            for (int i = 0; i < Grammar.AVAILABLE_GRAMMARS.length; i++) {
              result.append("*."); // $NON-NLS-1$
              result.append(Grammar.AVAILABLE_GRAMMARS[i].toLowerCase());
              if (i != Grammar.AVAILABLE_GRAMMARS.length - 1) {
                result.append("; "); // $NON-NLS-1$
              }
            }
            result.append("*."); // $NON-NLS-1$
            result.append(RegexType.REGEX.getFileEnding());
            result.append(")"); // $NON-NLS-1$
            return result.toString();
          }
        };

    // Machine files
    FileFilter machineFileFilter =
        new FileFilter() {

          @Override
          public boolean accept(File file) {
            if (file.isDirectory()) {
              return true;
            }
            for (String current : Machine.AVAILABLE_MACHINES) {
              if (file.getName()
                  .toLowerCase()
                  .matches(".+\\." + current.toLowerCase())) // $NON-NLS-1$
              {
                return true;
              }
            }
            return false;
          }

          @Override
          public String getDescription() {
            StringBuilder result = new StringBuilder();
            result.append(Messages.getString("OpenDialog.FilterFilesMachine")); // $NON-NLS-1$
            result.append(" ("); // $NON-NLS-1$
            for (int i = 0; i < Machine.AVAILABLE_MACHINES.length; i++) {
              result.append("*."); // $NON-NLS-1$
              result.append(Machine.AVAILABLE_MACHINES[i].toLowerCase());
              if (i != Machine.AVAILABLE_MACHINES.length - 1) {
                result.append("; "); // $NON-NLS-1$
              }
            }
            result.append(")"); // $NON-NLS-1$
            return result.toString();
          }
        };

    // Grammar files
    FileFilter grammarFileFilter =
        new FileFilter() {

          @Override
          public boolean accept(File file) {
            if (file.isDirectory()) {
              return true;
            }
            for (String current : Grammar.AVAILABLE_GRAMMARS) {
              if (file.getName()
                  .toLowerCase()
                  .matches(".+\\." + current.toLowerCase())) // $NON-NLS-1$
              {
                return true;
              }
            }
            return false;
          }

          @Override
          public String getDescription() {
            StringBuilder result = new StringBuilder();
            result.append(Messages.getString("OpenDialog.FilterFilesGrammar")); // $NON-NLS-1$
            result.append(" ("); // $NON-NLS-1$
            for (int i = 0; i < Grammar.AVAILABLE_GRAMMARS.length; i++) {
              result.append("*."); // $NON-NLS-1$
              result.append(Grammar.AVAILABLE_GRAMMARS[i].toLowerCase());
              if (i != Grammar.AVAILABLE_GRAMMARS.length - 1) {
                result.append("; "); // $NON-NLS-1$
              }
            }
            result.append(")"); // $NON-NLS-1$
            return result.toString();
          }
        };

    // Grammar files
    FileFilter regexFileFilter =
        new FileFilter() {

          @Override
          public boolean accept(File file) {
            if (file.isDirectory()) {
              return true;
            }

            if (file.getName()
                .toLowerCase()
                .matches(".+\\." + RegexType.REGEX.getFileEnding())) // $NON-NLS-1$
            {
              return true;
            }
            return false;
          }

          @Override
          public String getDescription() {
            StringBuilder result = new StringBuilder();
            result.append(Messages.getString("OpenDialog.FilterFilesRegex")); // $NON-NLS-1$
            result.append(" (*."); // $NON-NLS-1$
            result.append(RegexType.REGEX.getFileEnding());
            result.append(")"); // $NON-NLS-1$
            return result.toString();
          }
        };

    this.gui.jGTIFileChooser.addChoosableFileFilter(sourceFileFilter);
    this.gui.jGTIFileChooser.addChoosableFileFilter(machineFileFilter);
    this.gui.jGTIFileChooser.addChoosableFileFilter(grammarFileFilter);
    this.gui.jGTIFileChooser.addChoosableFileFilter(regexFileFilter);
    this.gui.jGTIFileChooser.setFileFilter(sourceFileFilter);
  }
  /** Closes the {@link OpenDialogForm}. */
  public final void handleCancel() {
    logger.debug("handleCancel", "handle cancel"); // $NON-NLS-1$ //$NON-NLS-2$

    this.confirmed = false;
    this.gui.dispose();
  }
/**
 * The {@link OpenDialog}.
 *
 * @author Christian Fehler
 * @version $Id$
 */
public final class OpenDialog implements LogicClass<OpenDialogForm> {

  /** The {@link Logger} for this class. */
  private static final Logger logger = Logger.getLogger(OpenDialog.class);

  /** The {@link OpenDialogForm}. */
  private OpenDialogForm gui;

  /** The parent {@link JFrame}. */
  private JFrame parent;

  /** Flag that indicates if the dialog was confirmed. */
  private boolean confirmed = false;

  /**
   * Allocates a new {@link OpenDialog}.
   *
   * @param parent The parent {@link JFrame}.
   * @param workingPath The working path.
   */
  public OpenDialog(JFrame parent, String workingPath) {
    logger.debug("OpenDialog", "allocate a new open dialog"); // $NON-NLS-1$ //$NON-NLS-2$
    this.parent = parent;
    this.gui = new OpenDialogForm(this, parent);
    this.gui.jGTIFileChooser.setCurrentDirectory(new File(workingPath));

    // Source files
    FileFilter sourceFileFilter =
        new FileFilter() {

          @Override
          public boolean accept(File file) {
            if (file.isDirectory()) {
              return true;
            }
            for (String current : Machine.AVAILABLE_MACHINES) {
              if (file.getName()
                  .toLowerCase()
                  .matches(".+\\." + current.toLowerCase())) // $NON-NLS-1$
              {
                return true;
              }
            }
            for (String current : Grammar.AVAILABLE_GRAMMARS) {
              if (file.getName()
                  .toLowerCase()
                  .matches(".+\\." + current.toLowerCase())) // $NON-NLS-1$
              {
                return true;
              }
            }
            if (file.getName()
                .toLowerCase()
                .matches(".+\\." + RegexType.REGEX.getFileEnding())) // $NON-NLS-1$
            {
              return true;
            }
            return false;
          }

          @Override
          public String getDescription() {
            StringBuilder result = new StringBuilder();
            result.append(Messages.getString("OpenDialog.FilterFiles")); // $NON-NLS-1$
            result.append(" ("); // $NON-NLS-1$
            for (int i = 0; i < Machine.AVAILABLE_MACHINES.length; i++) {
              result.append("*."); // $NON-NLS-1$
              result.append(Machine.AVAILABLE_MACHINES[i].toLowerCase());
              if (i != Machine.AVAILABLE_MACHINES.length - 1) {
                result.append("; "); // $NON-NLS-1$
              }
            }
            if ((Machine.AVAILABLE_MACHINES.length > 0)
                && (Grammar.AVAILABLE_GRAMMARS.length > 0)) {
              result.append("; "); // $NON-NLS-1$
            }
            for (int i = 0; i < Grammar.AVAILABLE_GRAMMARS.length; i++) {
              result.append("*."); // $NON-NLS-1$
              result.append(Grammar.AVAILABLE_GRAMMARS[i].toLowerCase());
              if (i != Grammar.AVAILABLE_GRAMMARS.length - 1) {
                result.append("; "); // $NON-NLS-1$
              }
            }
            result.append("*."); // $NON-NLS-1$
            result.append(RegexType.REGEX.getFileEnding());
            result.append(")"); // $NON-NLS-1$
            return result.toString();
          }
        };

    // Machine files
    FileFilter machineFileFilter =
        new FileFilter() {

          @Override
          public boolean accept(File file) {
            if (file.isDirectory()) {
              return true;
            }
            for (String current : Machine.AVAILABLE_MACHINES) {
              if (file.getName()
                  .toLowerCase()
                  .matches(".+\\." + current.toLowerCase())) // $NON-NLS-1$
              {
                return true;
              }
            }
            return false;
          }

          @Override
          public String getDescription() {
            StringBuilder result = new StringBuilder();
            result.append(Messages.getString("OpenDialog.FilterFilesMachine")); // $NON-NLS-1$
            result.append(" ("); // $NON-NLS-1$
            for (int i = 0; i < Machine.AVAILABLE_MACHINES.length; i++) {
              result.append("*."); // $NON-NLS-1$
              result.append(Machine.AVAILABLE_MACHINES[i].toLowerCase());
              if (i != Machine.AVAILABLE_MACHINES.length - 1) {
                result.append("; "); // $NON-NLS-1$
              }
            }
            result.append(")"); // $NON-NLS-1$
            return result.toString();
          }
        };

    // Grammar files
    FileFilter grammarFileFilter =
        new FileFilter() {

          @Override
          public boolean accept(File file) {
            if (file.isDirectory()) {
              return true;
            }
            for (String current : Grammar.AVAILABLE_GRAMMARS) {
              if (file.getName()
                  .toLowerCase()
                  .matches(".+\\." + current.toLowerCase())) // $NON-NLS-1$
              {
                return true;
              }
            }
            return false;
          }

          @Override
          public String getDescription() {
            StringBuilder result = new StringBuilder();
            result.append(Messages.getString("OpenDialog.FilterFilesGrammar")); // $NON-NLS-1$
            result.append(" ("); // $NON-NLS-1$
            for (int i = 0; i < Grammar.AVAILABLE_GRAMMARS.length; i++) {
              result.append("*."); // $NON-NLS-1$
              result.append(Grammar.AVAILABLE_GRAMMARS[i].toLowerCase());
              if (i != Grammar.AVAILABLE_GRAMMARS.length - 1) {
                result.append("; "); // $NON-NLS-1$
              }
            }
            result.append(")"); // $NON-NLS-1$
            return result.toString();
          }
        };

    // Grammar files
    FileFilter regexFileFilter =
        new FileFilter() {

          @Override
          public boolean accept(File file) {
            if (file.isDirectory()) {
              return true;
            }

            if (file.getName()
                .toLowerCase()
                .matches(".+\\." + RegexType.REGEX.getFileEnding())) // $NON-NLS-1$
            {
              return true;
            }
            return false;
          }

          @Override
          public String getDescription() {
            StringBuilder result = new StringBuilder();
            result.append(Messages.getString("OpenDialog.FilterFilesRegex")); // $NON-NLS-1$
            result.append(" (*."); // $NON-NLS-1$
            result.append(RegexType.REGEX.getFileEnding());
            result.append(")"); // $NON-NLS-1$
            return result.toString();
          }
        };

    this.gui.jGTIFileChooser.addChoosableFileFilter(sourceFileFilter);
    this.gui.jGTIFileChooser.addChoosableFileFilter(machineFileFilter);
    this.gui.jGTIFileChooser.addChoosableFileFilter(grammarFileFilter);
    this.gui.jGTIFileChooser.addChoosableFileFilter(regexFileFilter);
    this.gui.jGTIFileChooser.setFileFilter(sourceFileFilter);
  }

  /** Approve this {@link OpenDialog}. */
  public final void approve() {
    if (!getSelectedFile().isDirectory()) {
      this.confirmed = true;
      this.gui.dispose();
    }
  }

  /**
   * Returns the current directory.
   *
   * @return The current directory.
   */
  public final File getCurrentDirectory() {
    return this.gui.jGTIFileChooser.getCurrentDirectory();
  }

  /**
   * {@inheritDoc}
   *
   * @see LogicClass#getGUI()
   */
  public final OpenDialogForm getGUI() {
    return this.gui;
  }

  /**
   * Returns the selected {@link File}.
   *
   * @return The selected {@link File}.
   */
  public final File getSelectedFile() {
    return this.gui.jGTIFileChooser.getSelectedFile();
  }

  /**
   * Returns the selected {@link File}s.
   *
   * @return The selected {@link File}s.
   */
  public final ArrayList<File> getSelectedFiles() {
    ArrayList<File> result = new ArrayList<File>();
    for (File current : this.gui.jGTIFileChooser.getSelectedFiles()) {
      result.add(current);
    }
    return result;
  }

  /** Closes the {@link OpenDialogForm}. */
  public final void handleCancel() {
    logger.debug("handleCancel", "handle cancel"); // $NON-NLS-1$ //$NON-NLS-2$

    this.confirmed = false;
    this.gui.dispose();
  }

  /** Handles the open event. */
  public final void handleOpen() {
    logger.debug("handleOpen", "handle open"); // $NON-NLS-1$ //$NON-NLS-2$

    if (this.gui.jGTIFileChooser.getUI() instanceof BasicFileChooserUI) {
      BasicFileChooserUI ui = (BasicFileChooserUI) this.gui.jGTIFileChooser.getUI();
      ui.getApproveSelectionAction().actionPerformed(null);
    } else {
      throw new RuntimeException("ui is not a BasicFileChooserUI"); // $NON-NLS-1$
    }
    if ((getSelectedFile() != null) && !getSelectedFile().isDirectory()) {
      this.confirmed = true;
      this.gui.dispose();
    }
  }

  /**
   * Returns the confirmed.
   *
   * @return The confirmed.
   * @see #confirmed
   */
  public final boolean isConfirmed() {
    return this.confirmed;
  }

  /** Shows the {@link OpenDialogForm}. */
  public final void show() {
    logger.debug("show", "show the open dialog"); // $NON-NLS-1$ //$NON-NLS-2$

    int x = this.parent.getBounds().x + (this.parent.getWidth() / 2) - (this.gui.getWidth() / 2);
    int y = this.parent.getBounds().y + (this.parent.getHeight() / 2) - (this.gui.getHeight() / 2);
    this.gui.setBounds(x, y, this.gui.getWidth(), this.gui.getHeight());
    this.gui.setVisible(true);
  }
}