package mekhq.gui.model;
import java.awt.Color;
import java.awt.Component;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import mekhq.campaign.finances.Transaction;
/**
* A table model for displaying financial transactions (i.e. a ledger)
*/
public class FinanceTableModel extends DataTableModel {
private static final long serialVersionUID = 534443424190075264L;
public final static int COL_DATE = 0;
public final static int COL_CATEGORY = 1;
public final static int COL_DESC = 2;
public final static int COL_DEBIT = 3;
public final static int COL_CREDIT = 4;
public final static int COL_BALANCE = 5;
public final static int N_COL = 6;
public FinanceTableModel() {
data = new ArrayList<Transaction>();
}
public int getRowCount() {
return data.size();
}
@Override
public int getColumnCount() {
return N_COL;
}
@Override
public String getColumnName(int column) {
switch(column) {
case COL_DATE:
return "Date";
case COL_CATEGORY:
return "Category";
case COL_DESC:
return "Notes";
case COL_DEBIT:
return "Debit";
case COL_CREDIT:
return "Credit";
case COL_BALANCE:
return "Balance";
default:
return "?";
}
}
public Object getValueAt(int row, int col) {
Transaction transaction = getTransaction(row);
long amount = transaction.getAmount();
long balance = 0;
for(int i = 0; i <= row; i++) {
balance += getTransaction(i).getAmount();
}
DecimalFormat formatter = new DecimalFormat();
if(col == COL_CATEGORY) {
return transaction.getCategoryName();
}
if(col == COL_DESC) {
return transaction.getDescription();
}
if(col == COL_DEBIT) {
if(amount < 0) {
return formatter.format(-1 * amount);
} else {
return "";
}
}
if(col == COL_CREDIT) {
if(amount > 0) {
return formatter.format(amount);
} else {
return "";
}
}
if(col == COL_BALANCE) {
return formatter.format(balance);
}
if(col == COL_DATE) {
SimpleDateFormat shortDateFormat = new SimpleDateFormat("MM/dd/yyyy");
return shortDateFormat.format(transaction.getDate());
}
return "?";
}
public int getColumnWidth(int c) {
switch(c) {
case COL_DESC:
return 150;
case COL_CATEGORY:
return 100;
default:
return 50;
}
}
public int getAlignment(int col) {
switch(col) {
case COL_DEBIT:
case COL_CREDIT:
case COL_BALANCE:
return SwingConstants.RIGHT;
default:
return SwingConstants.LEFT;
}
}
@Override
public Class<?> getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
@Override
public boolean isCellEditable(int row, int col) {
return false;
}
public Transaction getTransaction(int row) {
return (Transaction)data.get(row);
}
public void setTransaction(int row, Transaction transaction) {
//FIXME
//data.set(row, transaction);
}
public void deleteTransaction(int row) {
data.remove(row);
}
public FinanceTableModel.Renderer getRenderer() {
return new FinanceTableModel.Renderer();
}
public class Renderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 9054581142945717303L;
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
setOpaque(true);
setHorizontalAlignment(getAlignment(column));
setForeground(Color.BLACK);
if (isSelected) {
setBackground(Color.DARK_GRAY);
setForeground(Color.WHITE);
} else {
// tiger stripes
if (row % 2 == 1) {
setBackground(new Color(230,230,230));
} else {
setBackground(Color.WHITE);
}
}
return this;
}
}
}