package mekhq.gui.model; import java.awt.Color; import java.awt.Component; import java.text.DateFormat; import java.text.DecimalFormat; import java.util.ArrayList; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.table.DefaultTableCellRenderer; import mekhq.campaign.finances.Finances; import mekhq.campaign.finances.Loan; /** * A table model for displaying active loans */ public class LoanTableModel extends DataTableModel { private static final long serialVersionUID = 534443424190075264L; public final static int COL_DESC = 0; public final static int COL_RATE = 1; public final static int COL_PRINCIPAL = 2; public final static int COL_COLLATERAL = 3; public final static int COL_VALUE = 4; public final static int COL_PAYMENT = 5; public final static int COL_SCHEDULE = 6; public final static int COL_NLEFT = 7; public final static int COL_NEXT_PAY = 8; public final static int N_COL = 9; public LoanTableModel() { data = new ArrayList<Loan>(); } public int getRowCount() { return data.size(); } public int getColumnCount() { return N_COL; } @Override public String getColumnName(int column) { switch(column) { case COL_DESC: return "Description"; case COL_COLLATERAL: return "Collateral"; case COL_VALUE: return "Remaining"; case COL_PAYMENT: return "Payment"; case COL_NLEFT: return "# Left"; case COL_NEXT_PAY: return "Next Payment Due"; case COL_RATE: return "APR"; case COL_SCHEDULE: return "Schedule"; case COL_PRINCIPAL: return "Principal"; default: return "?"; } } public Object getValueAt(int row, int col) { Loan loan = getLoan(row); if(col == COL_DESC) { return loan.getDescription(); } if(col == COL_COLLATERAL) { return DecimalFormat.getInstance().format(loan.getCollateralAmount()); } if(col == COL_VALUE) { return DecimalFormat.getInstance().format(loan.getRemainingValue()); } if(col == COL_PAYMENT) { return DecimalFormat.getInstance().format(loan.getPaymentAmount()); } if(col == COL_PRINCIPAL) { return DecimalFormat.getInstance().format(loan.getPrincipal()); } if(col == COL_SCHEDULE) { return Finances.getScheduleName(loan.getPaymentSchedule()); } if(col == COL_RATE) { return loan.getInterestRate() + "%"; } if(col == COL_NLEFT) { return loan.getRemainingPayments(); } if(col == COL_NEXT_PAY) { return DateFormat.getDateInstance().format(loan.getNextPayDate()); } return "?"; } public int getColumnWidth(int c) { switch(c) { case COL_DESC: return 200; case COL_RATE: return 20; default: return 50; } } public int getAlignment(int col) { switch(col) { case COL_NLEFT: case COL_RATE: return SwingConstants.CENTER; case COL_DESC: return SwingConstants.LEFT; default: return SwingConstants.RIGHT; } } @Override public Class<?> getColumnClass(int c) { return getValueAt(0, c).getClass(); } @Override public boolean isCellEditable(int row, int col) { return false; } public Loan getLoan(int row) { return (Loan)data.get(row); } public LoanTableModel.Renderer getRenderer() { return new LoanTableModel.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)); Loan loan = getLoan(table.convertRowIndexToModel(row)); setForeground(Color.BLACK); if (isSelected) { setBackground(Color.DARK_GRAY); setForeground(Color.WHITE); } else { if(loan.isOverdue()) { setBackground(Color.RED); } else { setBackground(Color.WHITE); } } return this; } } }