// BudgetPanel package org.javamoney.examples.ez.money.gui.view.totals; import static org.javamoney.examples.ez.money.KeywordKeys.TOTAL; import static org.javamoney.examples.ez.money.gui.GUIConstants.COLOR_BACKGROUND_FILL; import static org.javamoney.examples.ez.money.gui.dialog.PreferencesDialog.showPreferencesDialog; import static org.javamoney.examples.ez.money.gui.dialog.preferences.PreferencesKeys.EXPENSES; import static org.javamoney.examples.ez.money.gui.dialog.preferences.PreferencesKeys.INCOME; import static org.javamoney.examples.ez.money.model.dynamic.total.CategoryTotalTypeKeys.BUDGET_SUMMARY; import static org.javamoney.examples.ez.money.model.dynamic.total.CategoryTotalTypeKeys.EXPENSE; import java.awt.GridBagConstraints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Date; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.javamoney.examples.ez.money.gui.table.BudgetTable; import org.javamoney.examples.ez.money.model.dynamic.total.Budget; import org.javamoney.examples.ez.money.model.dynamic.total.TotalFilter; import org.javamoney.examples.ez.money.model.persisted.category.Category; import org.javamoney.examples.ez.money.report.BudgetReport; import org.javamoney.examples.ez.common.gui.Panel; import org.javamoney.examples.ez.common.gui.ScrollPane; /** * This class facilitates management of the budget table and displaying * information for a select budget. */ public final class BudgetPanel extends TotalPanel { /** * */ private static final long serialVersionUID = -4543784256981304199L; /** * Constructs a new budgets panel. */ public BudgetPanel() { setPieChartPanel(new BudgetPieChartPanel()); setTable(new BudgetTable()); buildPanel(); // Add listeners. getTable().addMouseListener(new MouseHandler()); getTable().getSelectionModel().addListSelectionListener(new SelectionHandler()); } /** * This method updates the budget table for the specified date range and * filter. * * @param start The start date. * @param end The end date. * @param filter The filter to use. */ public void updateView(Date start, Date end, TotalFilter filter) { int row = getTable().getSelectedRow(); updateFor(start, end, filter); // Select the budget that was already selected. if(row < getTable().getElementCount()) { getTable().selectRow(row); } } ////////////////////////////////////////////////////////////////////////////// // Start of private methods. ////////////////////////////////////////////////////////////////////////////// private void addSummary(BudgetReport report) { Category category = new Category(TOTAL.toString()); Budget summary = new Budget(BUDGET_SUMMARY, category); // Create a total budget to be displayed in the table. category.setBudget(report.getBudgetTotal()); category.setHasRolloverBudget(true); summary.setChange(report.getChangeTotal()); summary.setStartingBalance(report.getRolloverTotal()); // Add all the transaction details into the total. for(Budget budget : getTable().getList()) { summary.getTransactionDetails().addAll(budget.getTransactionDetails()); } getTable().add(summary); } private void buildPanel() { // Build panel. setFill(GridBagConstraints.BOTH); add(createTablePanel(), 0, 0, 1, 1, 100, 100); add(getPieChartPanel(), 1, 0, 1, 4, 0, 0); addEmptyCellAt(0, 1); addEmptyCellAt(0, 2); add(getTransactionDetailPanel(), 0, 3, 1, 1, 0, 0); } private Panel createTablePanel() { Panel panel = new Panel(); ScrollPane scrollPane = new ScrollPane(getTable()); // Build scroll pane. scrollPane.setBackground(COLOR_BACKGROUND_FILL); // Build panel. panel.setFill(GridBagConstraints.BOTH); panel.add(scrollPane, 0, 0, 1, 1, 100, 100); panel.addEmptyCellAt(1, 0); return panel; } private BudgetPieChartPanel getPieChartPanel() { return itsPieChartPanel; } private BudgetTable getTable() { return itsTable; } private void setPieChartPanel(BudgetPieChartPanel panel) { itsPieChartPanel = panel; } private void setTable(BudgetTable table) { itsTable = table; } private void updateFor(Date start, Date end, TotalFilter filter) { BudgetReport report = BudgetReport.createReport(start, end, filter); getTable().clear(); getPieChartPanel().clear(); getTransactionDetailPanel().clear(); // Add the budgets to the table. for(Budget budget : report.getBudgets()) { getTable().add(budget); } addSummary(report); getTable().display(); } ////////////////////////////////////////////////////////////////////////////// // Start of inner classes. ////////////////////////////////////////////////////////////////////////////// private class MouseHandler extends MouseAdapter { @Override public void mouseClicked(MouseEvent event) { if(event.getButton() == MouseEvent.BUTTON1 && event.getClickCount() == 2) { Budget budget = getTable().getSelectedElement(); if(budget != null) { if(budget.getType() == EXPENSE) { showPreferencesDialog(EXPENSES); } else { showPreferencesDialog(INCOME); } } } } } private class SelectionHandler implements ListSelectionListener { public void valueChanged(ListSelectionEvent event) { if(event.getValueIsAdjusting() == false && getTable().getSelectedRow() != -1) { Budget budget = getTable().get(getTable().getSelectedRow()); getPieChartPanel().updateView(budget); getTransactionDetailPanel().updateView(budget.getTransactionDetails()); } } } ////////////////////////////////////////////////////////////////////////////// // Start of class members. ////////////////////////////////////////////////////////////////////////////// private BudgetPieChartPanel itsPieChartPanel; private BudgetTable itsTable; }