/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package facturacion.tablas;
import facturacion.tablas.helperTabla.SelectorEntidadTableModel;
import facturacion.tablas.helperTabla.ActionButton;
import facturacion.tablas.editors_renders.CellRendered;
import facturacion.tablas.editors_renders.SelectEditorTable;
import facturacion.accesoDatos.EntityControler;
import facturacion.ConstantesFactura;
import facturacion.tablas.editors_renders.DeleteEditorTable;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.locks.Condition;
import javax.swing.JTable;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
/**
*Se encarga de a partir de una tabla vacia y la clase de la info que contendra de constuirla.
* No se debe especificar modelo alguno ni nada. lo hace automaticamente.
* Agrega tmb una columna de accion.
* @author marcelo
*/
public class EntityTable<T extends Serializable> {
//indica si los valores son tomados de la BD o si los envio a travez de una lista externa.
//Por defecto es true
boolean databaseSource = true;
Class clazz;
EntityControler controler;
private List<T> list;
public EntityTable(Class clazz) {
controler = EntityControler.getInstance();
this.clazz = clazz;
databaseSource = true;
}
public void buildTable(JTable tabla, ActionButton button,ArrayList<String> view, ActionColumnListener<T> listener,ArrayList<OrderCondition> orderCond) {
ArrayList<String> columnNames = new ArrayList<String>();
Field[] declaredFields = clazz.getDeclaredFields();
List<Field> fieldas = Arrays.asList(declaredFields);
for (int i = 0; i < fieldas.size(); i++) {
Field field = fieldas.get(i);
if (view.contains(field.getName())) {
columnNames.add(field.getName());
}
}
//Si es true el origen de los datos es la misma base de datos
if (databaseSource){
String qry = "select e from " + clazz.getSimpleName() + " e";
if (orderCond != null && !orderCond.isEmpty()){
qry = qry + " order by ";
for (int i = 0; i < orderCond.size(); i++) {
OrderCondition condition = orderCond.get(i);
qry =qry + "e." + condition.getCampo() + " " + condition.sentido;
if (i < orderCond.size()-1){
qry = qry + ", ";
}
}
}
System.out.println("qry " + qry);
list = controler.createQuery(qry, clazz).getResultList();
}else{ //sino deben ser enviados a traves del aray list. Esto es util
//para la seleccion de productos a la factura que aun no se persistio
System.out.println("Origen de datos Externo!");
}
SelectorEntidadTableModel<T> model = new SelectorEntidadTableModel<T>(columnNames, list, button);
tabla.setModel(model);
if (ActionButton.SELECT.equals(button)) {
agregarBotonSeleccionar(model, tabla, listener);
} else if (ActionButton.DELETE.equals(button)) {
agregarBotonBorrar(model, tabla, listener);
} else if (ActionButton.EDIT.equals(button)){
agregarBotonEditar(model, tabla, listener);
}else if (ActionButton.NONE.equals(button) || button == null){
//No hago nada
}
}
public void agregarBotonSeleccionar(SelectorEntidadTableModel<T> model, JTable tabla, final ActionColumnListener<T> listener) {
TableColumn selectColumn;
final TableColumnModel columnModel = tabla.getColumnModel();
selectColumn = columnModel.getColumn(model.getColumnByName(ConstantesFactura.TIPO_COLUMNA_SELECCION));
selectColumn.setCellEditor(new SelectEditorTable<T>(tabla, new ActionColumnListener<T>() {
@Override
public void onActionExecute(T entity) {
T c = (T) entity;
listener.onActionExecute(entity);
}
}));
selectColumn.setCellRenderer(new CellRendered(true, "Seleccionar"));
}
public void agregarBotonBorrar(SelectorEntidadTableModel<T> model, JTable tabla, final ActionColumnListener<T> listener) {
TableColumn selectColumn;
final TableColumnModel columnModel = tabla.getColumnModel();
selectColumn = columnModel.getColumn(model.getColumnByName(ConstantesFactura.TIPO_COLUMNA_ELIMINAR));
selectColumn.setCellEditor(new DeleteEditorTable<T>(tabla, new ActionColumnListener<T>() {
@Override
public void onActionExecute(T entity) {
T c = (T) entity;
listener.onActionExecute(entity);
}
}));
selectColumn.setCellRenderer(new CellRendered(true, "Borrar"));
}
public void agregarBotonEditar(SelectorEntidadTableModel<T> model, JTable tabla, final ActionColumnListener<T> listener) {
TableColumn selectColumn;
final TableColumnModel columnModel = tabla.getColumnModel();
selectColumn = columnModel.getColumn(model.getColumnByName(ConstantesFactura.TIPO_COLUMNA_EDICION));
selectColumn.setCellEditor(new SelectEditorTable<T>(tabla, new ActionColumnListener<T>() {
@Override
public void onActionExecute(T entity) {
T c = (T) entity;
listener.onActionExecute(entity);
}
}));
selectColumn.setCellRenderer(new CellRendered(true, "Ver Detalle"));
}
public boolean isDatabaseSource() {
return databaseSource;
}
public void setDatabaseSource(boolean databaseSource) {
this.databaseSource = databaseSource;
}
public void setDataColection(List<T> list) {
this.list = list;
}
}