package org.lodder.subtools.multisubdownloader.gui.dialog;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

import net.miginfocom.swing.MigLayout;

import org.lodder.subtools.multisubdownloader.Messages;
import org.lodder.subtools.multisubdownloader.gui.extra.table.CustomTable;
import org.lodder.subtools.multisubdownloader.gui.extra.table.SubtitleTableColumnName;
import org.lodder.subtools.multisubdownloader.gui.extra.table.SubtitleTableModel;
import org.lodder.subtools.sublibrary.model.Release;
import org.lodder.subtools.sublibrary.model.Subtitle;

public class SelectDialog extends MultiSubDialog {

  public enum SelectionType {
    OK(1), ALL(999999), CANCEL(-1);

    private int code;

    private SelectionType(int c) {
      code = c;
    }

    public int getSelectionCode() {
      return code;
    }
  }

  /**
     *
     */
  private static final long serialVersionUID = -4092909537478305235L;
  private SelectionType answer = SelectionType.CANCEL;
  private List<Subtitle> subtitles;
  private Release release;
  private CustomTable customTable;
  private JFrame frame;


  /**
   * Create the dialog.
   */
  public SelectDialog(JFrame frame, List<Subtitle> subtitles, Release release) {
    super(frame, Messages.getString("SelectDialog.SelectCorrectSubtitle"), false);
    this.subtitles = subtitles;
    this.release = release;
    this.frame = frame;
    initialize();
    pack();
    setDialogLocation(frame);
    setVisible(true);
  }

  private void initialize() {
    setBounds(100, 100, 850, 100);
    getContentPane().setLayout(new MigLayout("", "[grow,fill]", "[][::100px,fill][grow]"));
    JLabel lblNewLabel =
        new JLabel(Messages.getString("SelectDialog.SelectCorrectSubtitleThisRelease")
            + release.getFilename());
    getContentPane().add(lblNewLabel, "cell 0 0");
    {
      JScrollPane scrollPane = new JScrollPane();
      getContentPane().add(scrollPane, "cell 0 1,grow");
      customTable = createCustomTable();
      scrollPane.setViewportView(customTable);
      JPanel buttonPane = new JPanel();
      buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
      getContentPane().add(buttonPane, "cell 0 2,grow");
      {
        JButton okButton = new JButton(Messages.getString("SelectDialog.OK"));
        okButton.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent arg0) {
            if (testSelection()) {
              answer = SelectionType.OK;
              setVisible(false);
            } else {
              String message = Messages.getString("SelectDialog.MultipleSubtitlesSelected");
              JOptionPane.showConfirmDialog(frame, message, Messages.getString("SelectDialog.Name"), JOptionPane.CLOSED_OPTION, JOptionPane.ERROR_MESSAGE);
            }
          }
        });
        okButton.setActionCommand("OK");
        buttonPane.add(okButton);
        getRootPane().setDefaultButton(okButton);
      }
      {
        JButton allButton = new JButton(Messages.getString("SelectDialog.Everything"));
        allButton.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent arg0) {
            answer = SelectionType.ALL;
            setVisible(false);
          }
        });
        allButton.setActionCommand("Alles");
        if (subtitles.size() == 1) allButton.setEnabled(false);
        buttonPane.add(allButton);
      }
      {
        JButton cancelButton = new JButton(Messages.getString("SelectDialog.Cancel"));
        cancelButton.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent arg0) {
            answer = SelectionType.CANCEL;
            setVisible(false);
          }
        });
        cancelButton.setActionCommand("Cancel");
        buttonPane.add(cancelButton);
      }
    }
  }

  private CustomTable createCustomTable() {
    CustomTable customTable = new CustomTable();
    customTable.setModel(SubtitleTableModel.getDefaultSubtitleTableModel());
    final RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(customTable.getModel());
    customTable.setRowSorter(sorter);
    customTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

    SubtitleTableModel subtitleTableModel = (SubtitleTableModel) customTable.getModel();

    int columnId = customTable.getColumnIdByName(SubtitleTableColumnName.SELECT);
    customTable.getColumnModel().getColumn(columnId).setResizable(false);
    customTable.getColumnModel().getColumn(columnId).setPreferredWidth(65);
    customTable.getColumnModel().getColumn(columnId).setMaxWidth(65);

    columnId = customTable.getColumnIdByName(SubtitleTableColumnName.SCORE);
    customTable.getColumnModel().getColumn(columnId).setResizable(false);
    customTable.getColumnModel().getColumn(columnId).setPreferredWidth(70);
    customTable.getColumnModel().getColumn(columnId).setMaxWidth(70);

    columnId = customTable.getColumnIdByName(SubtitleTableColumnName.FILENAME);
    customTable.getColumnModel().getColumn(columnId).setResizable(true);
    customTable.getColumnModel().getColumn(columnId).setPreferredWidth(300);
    customTable.getColumnModel().getColumn(columnId).setMaxWidth(500);

    for (Subtitle subtitle : subtitles) {
      subtitleTableModel.addRow(subtitle);
    }

    return customTable;
  }
  
  private boolean testSelection() {
    int count = 0;
    SubtitleTableModel subtitleTableModel = (SubtitleTableModel) customTable.getModel();
    for (int i = 0; i < subtitleTableModel.getRowCount(); i++) {
      if ((Boolean) subtitleTableModel.getValueAt(i,
          customTable.getColumnIdByName(SubtitleTableColumnName.SELECT))) {
        count++;
      }
    }
    return !(count > 1);
  }

  public int getSelection() {
    int selectedRow = -1;
    if (answer == SelectionType.OK) {
      SubtitleTableModel subtitleTableModel = (SubtitleTableModel) customTable.getModel();
      for (int i = 0; i < subtitleTableModel.getRowCount(); i++) {
        if ((Boolean) subtitleTableModel.getValueAt(i,
            customTable.getColumnIdByName(SubtitleTableColumnName.SELECT))) {
          selectedRow = i;
        }
      }
    }
    return selectedRow;
  }

  public SelectionType getAnswer() {
    return answer;
  }

}

@@ -1663,20 +1663,19 @@
 itle%22), 
-fals
+tru
 e);%0A    

Fix wait state of input dialog