package event.editor;

import javax.swing.*;
import java.util.*;
import javax.swing.table.*;


class MyTableModel extends AbstractTableModel
{
    private JTable table;

    protected static String[] columnNames = {"Role", "Dialog"};
    private Vector<Vector<String>> rowData = new Vector<Vector<String>>();

    public String getColumnName(int col) {
        return columnNames[col].toString();
    }
    public int getRowCount() { return rowData.size(); }
    public int getColumnCount() { return columnNames.length; }
    public Object getValueAt(int row, int col) {
        return rowData.get(row).get(col);
    }
    public boolean isCellEditable(int row, int col)
        { return col != 0; }

    public void setValueAt(Object value, int row, int col) {
        rowData.get(row).set(col, (String) value);
        fireTableCellUpdated(row, col);
    }
    public void setTable(JTable theTable)
    {
        table = theTable;
    }
    public void addRow(String role, String dialog)
    {
        Vector<String> theRow = new Vector<String>();

        theRow.add(role);
        theRow.add(dialog);
        rowData.add(theRow);
        this.fireTableRowsInserted(getRowCount() - 1, getRowCount() - 1 );
    }
    public void deleteRow(int row)
    {
        if (row >= 0)
        {
            rowData.remove(row);
            this.fireTableRowsDeleted(row, row);
        }
    }
}
/**
 *
 * @author nathaniellehrer
 */
public class GenericTable {

    public static JTable genericizeTable(JScrollPane scrollPane,
            final HashMap<JButton, String> types, JButton removeButton)
    {
        final JTable dialogTable = new JTable(new MyTableModel());
        ((MyTableModel) dialogTable.getModel()).setTable(dialogTable);
        dialogTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        dialogTable.getColumnModel().getColumn(0).setPreferredWidth(80);
        dialogTable.getColumnModel().getColumn(1).setPreferredWidth(733);
        scrollPane.setViewportView(dialogTable);

        for (final JButton button : types.keySet())
        {
            button.addMouseListener(new java.awt.event.MouseAdapter() {
                @Override
                public void mouseClicked(java.awt.event.MouseEvent evt)
                {
                    ((MyTableModel) dialogTable.getModel()).addRow(types.get(button), "");
                }
            });
        }

        removeButton.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt)
            {
                ((MyTableModel) dialogTable.getModel()).deleteRow(dialogTable.getSelectedRow());
            }
        });

        return dialogTable;
    }


    public static JTable genericizeTable(JScrollPane scrollPane,
            final JComboBox types, JButton addButton, JButton removeButton)
    {
        final JTable dialogTable = genericizeTable(scrollPane, new HashMap<JButton, String>(), removeButton);

        addButton.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt)
            {
                ((MyTableModel) dialogTable.getModel()).addRow((String) types.getSelectedItem(), "");;
            }
        });
        return dialogTable;
    }

    public static JTable genericizeTable(JScrollPane scrollPane,
            final JComboBox types, JButton addButton, JButton removeButton,
            String header1, String header2)
    {
        MyTableModel.columnNames[0] = header1;
        MyTableModel.columnNames[1] = header2;

        return GenericTable.genericizeTable(scrollPane, types, addButton, removeButton);
    }

    public static JTable genericizeNumberedTable(JScrollPane scrollPane, JButton addButton, JButton removeButton)
    {
        MyTableModel.columnNames[0] = "#";
        final JTable dialogTable = genericizeTable(scrollPane, new HashMap<JButton, String>(), removeButton);

        addButton.addMouseListener(new java.awt.event.MouseAdapter() {
            private int counter = 1;
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt)
            {   
                ((MyTableModel) dialogTable.getModel()).addRow("" + counter++, "");;
            }
        });
        return dialogTable;
    }
}
