package com.activequant.trading.datamodel; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import javax.swing.Timer; import javax.swing.table.AbstractTableModel; import com.activequant.trading.AbstractTSBase; import com.activequant.utils.events.Event; @SuppressWarnings("serial") public abstract class AQTableDataBase extends AbstractTableModel { private AbstractTSBase abstractTSBase; protected final Event<Integer> rowUpdateEvent = new Event<Integer>(); protected final Event<Object> tableUpdateEvent = new Event<Object>(); // empty placeholder object. private final Object marker = new Object(); private Timer t = null; protected int rowSelected = -1; protected int colSelected = -1; protected boolean toogleSelection; protected DecimalFormat dcf = new DecimalFormat("#.######"); public AQTableDataBase() { dcf.setGroupingUsed(false); } public AQTableDataBase(AbstractTSBase abstractTSBase) { dcf.setGroupingUsed(false); /* * t = new Timer(100, this); t.setInitialDelay(5000); t.start(); */this.abstractTSBase = abstractTSBase; } public String getColumnName(int col) { return getHeader()[col]; } public void clear(){} public int getRowCount() { return getData().length; } public int getColumnCount() { return getHeader().length; } /** * Returns a FORMATTED representation of the data. * This is used by Java's SWING layer. * Do not use this to get the value at a cell. * * Rather use getCell. */ public Object getValueAt(int row, int col) { Object o = getCell(row, col); if (o == null) return ""; if (o.getClass().isAssignableFrom(Double.class)) { // adding a formatter. Double val = (Double) o; return dcf.format(val); } return o; } public boolean isCellEditable(int row, int col) { return false; } public void setValueAt(Object value, int row, int col) { Object[][] x = getData(); if (row >= x.length) return; if (col >= getHeader().length) return; x[row][col] = value; } public abstract Object[][] getData(); public abstract String[] getHeader(); public Object getCell(int row, int col) { if (row > (getData().length-1)) return null; if (col > (getData()[row].length-1)) return null; return getData()[row][col]; } public void signalUpdate() { if(!tableUpdateEvent.isEmpty())tableUpdateEvent.fire(marker); fireTableDataChanged(); } protected List<Object[]> c(Object[][] in) { List<Object[]> rows = new ArrayList<Object[]>(); for (int i = 0; i < in.length; i++) { rows.add(in[i]); } return rows; } protected Object[][] c(List<Object[]> in) { Object[][] out = new Object[in.size()][]; for (int i = 0; i < in.size(); i++) { out[i] = in.get(i); } return out; } public Event<Integer> getRowUpdateEvent() { return rowUpdateEvent; } public AbstractTSBase getAbstractTSBase() { return abstractTSBase; } public int getRowSelected() { return rowSelected; } public void setRowSelected(int rowSelected) { this.rowSelected = rowSelected; } public int getColSelected() { return colSelected; } public void setColSelected(int colSelected) { this.colSelected = colSelected; } public boolean isToogleSelection() { return toogleSelection; } public void setToogleSelection(boolean toogleSelection) { this.toogleSelection = toogleSelection; } public DecimalFormat getDCF() { return dcf; } /** * You can inject a new Decimal Format here. * @param dcf */ public void setDCF(DecimalFormat dcf) { this.dcf = dcf; } }