/** * Copyright (c) 2012, Lindsay Bradford and other Contributors. * All rights reserved. * * This program and the accompanying materials are made available * under the terms of the BSD 3-Clause licence which accompanies * this distribution, and is available at * http://opensource.org/licenses/BSD-3-Clause */ package blacksmyth.personalfinancier.view.budget; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.math.BigDecimal; import javax.swing.DefaultListCellRenderer; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.event.TableModelEvent; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import blacksmyth.general.BlacksmythSwingUtilities; import blacksmyth.personalfinancier.model.budget.BudgetModel; import blacksmyth.personalfinancier.view.WidgetFactory; // TODO: Sorting from largest budgetted amount to smallest. @SuppressWarnings("serial") public class BudgetCashFlowSummaryTable extends JTable { private static final int CELL_BUFFER = 15; private static final int ROW_LIMIT = 5; public BudgetCashFlowSummaryTable(BudgetModel budgetModel) { super( new BudgetCashFlowSummaryTableModel(budgetModel) ); setupColumns(); this.setPreferredScrollableViewportSize( new Dimension( (int) this.getPreferredScrollableViewportSize().getWidth(), this.getRowHeight() * ROW_LIMIT ) ); } public void tableChanged(TableModelEvent e) { this.setVisible(false); super.tableChanged(e); this.setVisible(true); } private void setupColumns() { this.tableHeader.setReorderingAllowed(false); this.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); setupBudgettedCol(); getColFromEnum(ACCOUNT_SUMMARY_COLUMNS.Account).setCellRenderer( WidgetFactory.createTableCellRenderer(JTextField.CENTER) ); BlacksmythSwingUtilities.lockColumnWidth( getColFromEnum(ACCOUNT_SUMMARY_COLUMNS.Account), BlacksmythSwingUtilities.getTextWidth( WidgetFactory.ACCOUNT_BUFFER ) + CELL_BUFFER ); getColFromEnum(ACCOUNT_SUMMARY_COLUMNS.Detail).setCellRenderer( WidgetFactory.createTableCellRenderer(JTextField.CENTER) ); } private void setupBudgettedCol() { BlacksmythSwingUtilities.lockColumnWidth( getColFromEnum(ACCOUNT_SUMMARY_COLUMNS.CashFlow), BlacksmythSwingUtilities.getTextWidth( WidgetFactory.DECIMAL_FORMAT_PATTERN ) + CELL_BUFFER ); getColFromEnum(ACCOUNT_SUMMARY_COLUMNS.CashFlow).setCellRenderer( WidgetFactory.createAmountCellRenderer() ); } private TableColumn getColFromEnum(ACCOUNT_SUMMARY_COLUMNS thisEnum) { return this.getColumnModel().getColumn(thisEnum.ordinal()); } public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component cellRenderer = super.prepareRenderer(renderer, row, column); WidgetFactory.prepareTableCellRenderer( this, cellRenderer, row, column ); if (this.getColFromEnum(ACCOUNT_SUMMARY_COLUMNS.CashFlow).getModelIndex() == column) { BigDecimal value = (BigDecimal) this.getModel().getValueAt(row, column); if (value.compareTo(BigDecimal.ZERO) == -1) { cellRenderer.setForeground(Color.RED); } if (value.compareTo(BigDecimal.ZERO) == 1) { cellRenderer.setForeground(Color.GREEN); } } if (this.getColFromEnum(ACCOUNT_SUMMARY_COLUMNS.Detail).getModelIndex() == column && row == this.getRowCount() - 1) { ((JLabel) cellRenderer).setHorizontalAlignment(DefaultListCellRenderer.RIGHT); } return cellRenderer; } }