/* * AccountComponent.java * * Status: Functional * * Todo list: * Add a MouseAdapter to switch to journal view on double-click. * Add a ComboBox to jump to other accounts. * Add a Button to Edit. */ package gui; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.table.*; import finance.Account; import finance.AccountEntry; import static finance.Account.DataModel.DATE_COL; import static finance.Account.DataModel.DESC_COL; import static finance.Account.DataModel.DEBIT_COL; import static finance.Account.DataModel.CREDIT_COL; import static finance.Account.DataModel.BALANCE_COL; import static finance.Account.DataModel.COLUMN_COUNT; /** * The user interface component for {@link Account Account}s. */ public final class AccountComponent extends JPanel { private static class CellRenderer extends JLabel implements TableCellRenderer { protected static Border selectedBorder = BorderFactory.createMatteBorder(1, 0, 1, 0, SystemColor.textHighlight); protected static Border unselectedBorder = BorderFactory.createEmptyBorder(1, 0, 1, 0); public CellRenderer() { super(); setOpaque(true); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if(isSelected) setBorder(selectedBorder); else setBorder(unselectedBorder); setBackground(row % 2 == 0 ? Constants.bgRowEven : Constants.bgRowOdd); setFont(table.getFont()); if(column >= DEBIT_COL) setHorizontalAlignment(SwingConstants.RIGHT); else setHorizontalAlignment(SwingConstants.LEFT); if(value instanceof AccountEntry) { AccountEntry entry = (AccountEntry)value; switch(column) { case DATE_COL: setText(Constants.dateShort.format(entry.getDate())); break; case DESC_COL: setText(entry.getDescription()); break; case DEBIT_COL: setText(entry.getDebit()); break; case CREDIT_COL: setText(entry.getCredit()); break; case BALANCE_COL: if(entry.getBalanceType() != entry.getBalance().getType()) setBackground(Constants.bgBalanceAbnormal); setText(entry.getBalanceString()); break; default: setText(""); break; } } else { setText(""); } return this; } } JTable table = null; /** The {@code Account} interfaced to by this {@code AccountComponent}. */ Account account = null; /** * Constructs a new {@code AccountComponent}. * * @param account the {@code Account} interfaced to by this {@code * AccountComponent}. */ public AccountComponent(Account account) { this.account = account; setLayout(new GridLayout(1, 1)); table = new JTable(account.getDataModel()); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.getTableHeader().setReorderingAllowed(false); for(int i=0; i