// CategoryReportDialog package org.javamoney.examples.ez.money.gui.dialog; import static org.javamoney.examples.ez.common.utility.BorderHelper.createTitledBorder; import static org.javamoney.examples.ez.common.utility.ButtonHelper.buildButton; import static org.javamoney.examples.ez.common.utility.I18NHelper.getSharedProperty; import static org.javamoney.examples.ez.money.ApplicationProperties.getCategoryReportSortByField; import static org.javamoney.examples.ez.money.ApplicationProperties.includeDetailsInReport; import static org.javamoney.examples.ez.money.ApplicationProperties.includeGroupsInReport; import static org.javamoney.examples.ez.money.ApplicationProperties.setCategoryReportSortByField; import static org.javamoney.examples.ez.money.ApplicationProperties.setIncludeDetailsInReport; import static org.javamoney.examples.ez.money.ApplicationProperties.setIncludeGroupsInReport; import static org.javamoney.examples.ez.money.report.TotalReportTypeKeys.EXPENSES; import static org.javamoney.examples.ez.money.report.TotalReportTypeKeys.INCOME; import java.awt.GridBagConstraints; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ButtonGroup; import org.javamoney.examples.ez.money.gui.chooser.CategoryTotalsFilterChooser; import org.javamoney.examples.ez.money.gui.chooser.DatePeriodChooser; import org.javamoney.examples.ez.money.locale.PercentFormat; import org.javamoney.examples.ez.money.report.CategoryReport; import org.javamoney.examples.ez.money.report.CategoryReportSortByKeys; import org.javamoney.examples.ez.money.report.CategoryReportWriter; import org.javamoney.examples.ez.money.report.TotalReportTypeKeys; import org.javamoney.examples.ez.common.gui.CheckBox; import org.javamoney.examples.ez.common.gui.ComboBox; import org.javamoney.examples.ez.common.gui.Panel; import org.javamoney.examples.ez.common.gui.RadioButton; import org.javamoney.examples.ez.common.utility.I18NHelper; /** * This class provides a dialog for customizing a category report. */ public final class CategoryReportDialog extends WebReportDialog { /** * Constructs a new dialog for customizing a category report. */ public CategoryReportDialog() { super(625, 425); setDatePeriodChooser(new DatePeriodChooser()); setFilterChooser(new CategoryTotalsFilterChooser()); setTypeChooser(new ComboBox()); createCheckBoxes(); createRadioButtons(); buildPanel(); } /** * This method shows a dialog for customizing a category report. */ public void showDialog() { runDialog(); } ////////////////////////////////////////////////////////////////////////////// // Start of private methods. ////////////////////////////////////////////////////////////////////////////// private void buildPanel() { Panel panel = getContentPane(); // Build panel. panel.setFill(GridBagConstraints.BOTH); panel.add(createDialogHeader(), 0, 0, 1, 1, 0, 0); panel.add(createCustomizeReportPanel(), 0, 1, 1, 1, 100, 100); panel.add(createOKCancelButtonPanel(getSharedProperty("create"), getSharedProperty("close"), new ActionHandler()), 0, 2, 1, 1, 0, 0); } private void createCheckBoxes() { ActionHandler handler = new ActionHandler(); itsCheckBoxes = new CheckBox[2]; for(int len = 0; len < getCheckBoxes().length; ++len) { getCheckBoxes()[len] = new CheckBox(); } buildButton(getCheckBoxes()[INCLUDE_DETAILS], getProperty("details"), handler); buildButton(getCheckBoxes()[INCLUDE_GROUPS], getProperty("groups"), handler); getCheckBoxes()[INCLUDE_DETAILS].setSelected(includeDetailsInReport()); getCheckBoxes()[INCLUDE_GROUPS].setSelected(includeGroupsInReport()); } private Panel createCustomizeReportPanel() { Panel panel = new Panel(); // Build panel. panel.setFill(GridBagConstraints.BOTH); panel.add(createTypeChooserPanel(), 0, 0, 1, 1, 0, 0); panel.addEmptyCellAt(1, 0); panel.addEmptyCellAt(2, 0); panel.add(getDatePeriodChooser(), 0, 1, 1, 1, 50, 100); panel.add(createSortByPanel(), 3, 1, 1, 2, 50, 0); panel.addEmptyCellAt(0, 3); panel.add(createMoreOptionsPanel(), 0, 3, 4, 1, 0, 0); panel.setInsets(new Insets(10, 15, 5, 15)); getDatePeriodChooser().setBorder(createTitledBorder(getSharedProperty("report_period"), false)); return panel; } private Panel createMoreOptionsPanel() { Panel panel = new Panel(); // Build panel. panel.setAnchor(GridBagConstraints.WEST); panel.add(getCheckBoxes()[INCLUDE_DETAILS], 0, 0, 1, 1,50, 50); panel.add(getCheckBoxes()[INCLUDE_GROUPS], 0, 1, 1, 1, 0, 50); panel.add(getFilterChooser(), 1, 0, 1, 1, 50, 0); panel.setBorder(createTitledBorder(getSharedProperty("more_options"), false)); return panel; } private void createRadioButtons() { ActionHandler handler = new ActionHandler(); ButtonGroup group = new ButtonGroup(); itsRadioButtons = new RadioButton[4]; for(int len = 0; len < getRadioButtons().length; ++len) { getRadioButtons()[len] = new RadioButton(); } buildButton(getRadioButtons()[AMOUNT], getSharedProperty("amount"), handler, group); buildButton(getRadioButtons()[CATEGORY], getSharedProperty("category"), handler, group); buildButton(getRadioButtons()[GROUP], getSharedProperty("group"), handler, group); buildButton(getRadioButtons()[PERCENT], PercentFormat.SYMBOL, handler, group); getRadioButtons()[getCategoryReportSortByField().ordinal()].setSelected(true); } private CategoryReport createReport() { return CategoryReport.createReport(getDatePeriodChooser().getStartDate(), getDatePeriodChooser().getEndDate(), getFilterChooser().getFilter()); } private Panel createSortByPanel() { Panel panel = new Panel(); // Build panel. panel.setAnchor(GridBagConstraints.WEST); panel.add(getRadioButtons()[AMOUNT], 0, 0, 1, 1, 100, 25); panel.add(getRadioButtons()[CATEGORY], 0, 1, 1, 1, 0, 25); panel.add(getRadioButtons()[GROUP], 0, 2, 1, 1, 0, 25); panel.add(getRadioButtons()[PERCENT], 0, 3, 1, 1, 0, 25); panel.setBorder(createTitledBorder(getProperty("sort_by"))); return panel; } private Panel createTypeChooserPanel() { Panel panel = new Panel(); getTypeChooser().addItem(EXPENSES); getTypeChooser().addItem(INCOME); // Build panel. panel.setAnchor(GridBagConstraints.EAST); panel.addEmptyCellAt(0, 0); panel.add(getProperty("report_for") + ": ", 0, 1, 1, 1, 0, 100); panel.setAnchor(GridBagConstraints.WEST); panel.add(getTypeChooser(), 1, 1, 1, 1, 100, 0); panel.addEmptyRowsAt(0, 2, 2); return panel; } private void generateReport() { TotalReportTypeKeys type = null; if(getTypeChooser().getSelectedIndex() == 0) { type = EXPENSES; } else { type = INCOME; } CategoryReportWriter.generate(type, createReport()); } private CheckBox[] getCheckBoxes() { return itsCheckBoxes; } private DatePeriodChooser getDatePeriodChooser() { return itsDatePeriodChooser; } private CategoryTotalsFilterChooser getFilterChooser() { return itsFilterChooser; } private RadioButton[] getRadioButtons() { return itsRadioButtons; } private static String getProperty(String key) { return I18NHelper.getProperty("CategoryReportDialog." + key); } private ComboBox getTypeChooser() { return itsTypeChooser; } private void setDatePeriodChooser(DatePeriodChooser chooser) { itsDatePeriodChooser = chooser; } private void setFilterChooser(CategoryTotalsFilterChooser chooser) { itsFilterChooser = chooser; } private void setTypeChooser(ComboBox comboBox) { itsTypeChooser = comboBox; } ////////////////////////////////////////////////////////////////////////////// // Start of inner classes. ////////////////////////////////////////////////////////////////////////////// private class ActionHandler implements ActionListener { public void actionPerformed(ActionEvent event) { Object source = event.getSource(); if(source == getCheckBoxes()[INCLUDE_DETAILS]) { setIncludeDetailsInReport(!includeDetailsInReport()); } else if(source == getCheckBoxes()[INCLUDE_GROUPS]) { setIncludeGroupsInReport(!includeGroupsInReport()); } else if(source == getRadioButtons()[AMOUNT]) { setCategoryReportSortByField(CategoryReportSortByKeys.AMOUNT); } else if(source == getRadioButtons()[CATEGORY]) { setCategoryReportSortByField(CategoryReportSortByKeys.CATEGORY); } else if(source == getRadioButtons()[GROUP]) { setCategoryReportSortByField(CategoryReportSortByKeys.GROUP); } else if(source == getRadioButtons()[PERCENT]) { setCategoryReportSortByField(CategoryReportSortByKeys.PERCENT); } else { setAccepted(event.getActionCommand().equals(ACTION_OK)); if(wasAccepted() == true) { generateReport(); } else { dispose(); } } } } ////////////////////////////////////////////////////////////////////////////// // Start of class members. ////////////////////////////////////////////////////////////////////////////// private CheckBox[] itsCheckBoxes; private DatePeriodChooser itsDatePeriodChooser; private CategoryTotalsFilterChooser itsFilterChooser; private RadioButton[] itsRadioButtons; private ComboBox itsTypeChooser; private static final int INCLUDE_DETAILS = 0; private static final int INCLUDE_GROUPS = 1; private static final int AMOUNT = 0; private static final int CATEGORY = 1; private static final int GROUP = 2; private static final int PERCENT = 3; }