/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ctecinf.table;

import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableColumn;
import javax.swing.table.TableRowSorter;

/**
 *
 * @author Cássio Conceição
 * @since 24/09/2019
 * @version 1909
 * @see http://ctecinf.com.br/
 */
public class Table extends JTable {

    {
        setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        setRowHeight(20);
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }

    @Override
    public TableModel getModel() {
        return (TableModel) super.getModel();
    }

    public Table() {
        super(new TableModel());
    }

    public Table(TableModel tableModel) {
        super(new TableModel());
        setModel(tableModel);
    }

    public final void setModel(TableModel tableModel) {

        super.setModel(tableModel);

        getModel().addTableModelListener(new TableModelListener() {
            @Override
            public void tableChanged(TableModelEvent e) {

                if (e.getType() == TableModelEvent.INSERT) {

                    for (int i = 0; i < getColumnCount(); i++) {

                        TableColumn tableColumn = getColumn(getModel().getColumnName(i));
                        tableColumn.setPreferredWidth(getFontMetrics(getFont()).stringWidth(getModel().getColumns().get(i).toString()));

                        if (!(tableColumn.getCellRenderer() instanceof TableCellRendererImpl)) {
                            tableColumn.setCellRenderer(new TableCellRendererImpl());
                        }
                    }
                }
            }
        });

        setRowSorter(new TableRowSorter(getModel()));

        for (int i = 0; i < getColumnCount(); i++) {
            TableColumn tableColumn = getColumn(getModel().getColumnName(i));
            tableColumn.setCellRenderer(new TableCellRendererImpl());
            tableColumn.setPreferredWidth(getFontMetrics(getFont()).stringWidth(getModel().getColumns().get(i).toString()));
        }
    }

    public void addRow(Object row) {
        getModel().addRow(row);
    }

    public void updateRow(int rowIndex, Object row) {
        getModel().updateRow(rowIndex, row);
    }

    public void removeRow(int rowIndex) {
        getModel().removeRow(rowIndex);
    }

    public void removeAllRows() {
        getModel().removeAllRows();
    }

    public void removeSelectedRow() throws Exception {

        if (getSelectedRow() == -1) {
            throw new Exception("Nenhum registro selecionado.");
        }

        int index = getRowSorter().convertRowIndexToModel(getSelectedRow());
        removeRow(index);
    }

    public int getColumnWidth(int columnIndex) {
        return ((br.com.ctecinf.table.TableColumn) getModel().getColumns().get(columnIndex)).getWidth();
    }
}
