jgnash.ui.budget.BudgetPeriodPanel.java Source code

Java tutorial

Introduction

Here is the source code for jgnash.ui.budget.BudgetPeriodPanel.java

Source

/*
 * jGnash, a personal finance application
 * Copyright (C) 2001-2012 Craig Cavanaugh
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package jgnash.ui.budget;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.factories.CC;
import com.jgoodies.forms.layout.FormLayout;

import java.awt.EventQueue;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.Date;
import java.util.List;

import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.ToolTipManager;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.JTableHeader;

import jgnash.engine.AccountGroup;
import jgnash.engine.EngineFactory;
import jgnash.engine.budget.BudgetPeriodDescriptor;
import jgnash.message.Message;
import jgnash.message.MessageListener;
import jgnash.text.CommodityFormat;
import jgnash.ui.components.ShadowBorder;
import jgnash.ui.util.JTableUtils;

import org.jdesktop.swingx.JXTitledPanel;

/**
 * Panel for displaying one budget budgetPeriod
 *
 * @author Craig Cavanaugh
 *
 */
final class BudgetPeriodPanel extends JPanel {

    private static final long serialVersionUID = 1L;

    private JXTitledPanel periodHeader;

    private JPanel periodFooter;

    private JTable table;

    private JTable footerTable;

    private BudgetPeriodModel model;

    public BudgetPeriodPanel(final BudgetPeriodModel model) {
        this.model = model;
        layoutMainPanel();
    }

    /**
     * Determines if the specified date lies within or inclusive of this panel's budgetPeriod
     *
     * @param date check date
     * @return true if the date lies within this budgetPeriod
     * @see BudgetPeriodDescriptor#isBetween(java.util.Date)
     * @see BudgetPeriodModel#isBetween(java.util.Date)
     */
    boolean isBetween(final Date date) {
        return model.isBetween(date);
    }

    /**
     * Sets the height, in pixels, of all cells to rowHeight, revalidates, and repaints. The height of the cells will be
     * equal to the row height minus the row margin.
     *
     * @param rowHeight new row height
     * @see AccountRowHeaderPanel#getRowHeight()
     * @see JTable#setRowHeight(int)
     */
    protected void setRowHeight(final int rowHeight) {
        table.setRowHeight(rowHeight);
    }

    private void layoutMainPanel() {
        FormLayout layout = new FormLayout("d:g", "d");

        DefaultFormBuilder builder = new DefaultFormBuilder(layout, this);

        setLayout(layout);

        NumberFormat format = CommodityFormat.getShortNumberFormat(model.getCurrency());

        table = new BudgetResultsTable(model, format);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setFocusable(false);
        table.setCellSelectionEnabled(false);

        JTableHeader header = new JTableHeader(table.getColumnModel());
        header.setReorderingAllowed(false);
        header.setResizingAllowed(false);
        header.setTable(table);

        buildHeader(header);
        buildFooter();

        JTableUtils.packTables(table, footerTable);

        builder.add(table, CC.xy(1, 1));

        setBorder(ShadowBorder.getCompondShadowBorder());

        ToolTipManager.sharedInstance().unregisterComponent(table);
        ToolTipManager.sharedInstance().unregisterComponent(header);
    }

    public JComponent getPeriodHeader() {
        return periodHeader;
    }

    private void buildHeader(final JTableHeader header) {
        periodHeader = new JXTitledPanel(model.getPeriodDescription(), header);
        periodHeader.setBorder(ShadowBorder.getCompondShadowBorder());
    }

    private void buildFooter() {

        FormLayout layout = new FormLayout("d:g", "d");

        DefaultFormBuilder builder = new DefaultFormBuilder(layout, new JPanel());

        NumberFormat format = CommodityFormat
                .getShortNumberFormat(EngineFactory.getEngine(EngineFactory.DEFAULT).getDefaultCurrency());

        footerTable = new BudgetResultsTable(new FooterModel(), format);
        footerTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        footerTable.setFocusable(false);
        footerTable.setCellSelectionEnabled(false);

        builder.add(footerTable, CC.xy(1, 1));

        builder.setBorder(ShadowBorder.getCompondShadowBorder());

        periodFooter = builder.getPanel();
    }

    public JComponent getPeriodFooter() {
        return periodFooter;
    }

    /**
     * AccountTable model to for the summary footer that computes results by account group
     */
    private class FooterModel extends AbstractTableModel implements MessageListener {

        private List<AccountGroup> groups;

        FooterModel() {

            groups = model.getExpandingBudgetTableModel().getAccountGroups();
            registerListeners();
        }

        private void registerListeners() {

            model.addTableModelListener(new TableModelListener() {
                @Override
                public void tableChanged(TableModelEvent e) {
                    fireTableDataChanged();
                }
            });

            model.addMessageListener(this);
        }

        @Override
        public int getRowCount() {
            return groups.size();
        }

        @Override
        public int getColumnCount() {
            return 3;
        }

        @Override
        public Class<?> getColumnClass(final int columnIndex) {
            return BigDecimal.class;
        }

        @Override
        public Object getValueAt(final int rowIndex, final int columnIndex) {
            switch (columnIndex) {
            case 0:
                return getTotalBudgeted(groups.get(rowIndex));
            case 1:
                return getTotalChange(groups.get(rowIndex));
            case 2:
                return getTotalRemaining(groups.get(rowIndex));
            default:
                return BigDecimal.ZERO;
            }
        }

        protected BigDecimal getTotalRemaining(final AccountGroup group) {
            return model.getRemainingTotal(group);
        }

        protected BigDecimal getTotalChange(final AccountGroup group) {
            return model.getChangeTotal(group);
        }

        protected BigDecimal getTotalBudgeted(final AccountGroup group) {
            return model.getBudgetedTotal(group);
        }

        @Override
        public void messagePosted(final Message event) {
            switch (event.getEvent()) {
            case ACCOUNT_ADD:
            case ACCOUNT_REMOVE:
            case ACCOUNT_MODIFY:
            case BUDGET_UPDATE:
                groups = model.getExpandingBudgetTableModel().getAccountGroups();
                EventQueue.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        fireTableDataChanged();
                        JTableUtils.packTables(table, footerTable);
                    }
                });
            default:
            }
        }
    }
}