package com.softgraf.model.abstrato;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

// 63
abstract public class AbstractGenericTableModel<T extends AbstractVO> extends AbstractTableModel {
	private static final long serialVersionUID = 1L;
	private final List<String> COLUNAS;
	private List<T> listaVO;
	
	// construtor
	public AbstractGenericTableModel(List<String> colunas) {
		this.COLUNAS = colunas;
		this.listaVO = new ArrayList<T>();
	}
	
	// método usado por JTable para obter a quantidade de colunas da tabela
	@Override
	public int getColumnCount() {
		return COLUNAS.size();
	}

	// método usado por JTable para obter a quantidade de linhas da tabela
	@Override
	public int getRowCount() {
		return listaVO.size();
	}

	// metodo usado por JTable para obter o nome das colunas
	@Override
	public String getColumnName(int coluna) {
		return COLUNAS.get(coluna);
	}
	
	// Internamente JTable chama este método em todas as células para setar os valores
	// Obs.: indice da linha e coluna iniciando em 0
	@Override
	public String getValueAt(int linha, int coluna) {
		return listaVO.get(linha).toArray()[coluna];
	}
	
	// método usado por JTable para saber se a célula é editável.
	// neste exemplo nenhuma célula é editável
	public boolean isCellEditable(int linha, int coluna) {
		return false;
	}

	public void setListaVO(ArrayList<T> listaVO) {
		this.listaVO = listaVO == null ? new ArrayList<T>() : listaVO;
		fireTableDataChanged();
	}
	
	public T getVO(int linha) {
		if (linha >= 0 && linha < listaVO.size())
			return listaVO.get(linha);
		else
			return null;
	}
	
	public List<T> getListaVO(){
		return listaVO;
	}

	abstract public void ordenarPorID();
	
	abstract public void ordenarPorNome();
}