// CategoryTotalsFilterDialog
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.IconKeys.DIALOG_FILTER;
import static org.javamoney.examples.ez.money.model.DataManager.getAccounts;
import static org.javamoney.examples.ez.money.model.DataManager.getExpenses;
import static org.javamoney.examples.ez.money.model.DataManager.getIncome;
import static org.javamoney.examples.ez.money.model.DataManager.getPayees;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collection;
import java.util.TreeSet;
import org.javamoney.examples.ez.money.gui.chooser.FilterElementChooser;
import org.javamoney.examples.ez.money.gui.chooser.YesNoRadioChooser;
import org.javamoney.examples.ez.money.model.DataElement;
import org.javamoney.examples.ez.money.model.dynamic.total.TotalFilter;
import org.javamoney.examples.ez.common.gui.CheckBox;
import org.javamoney.examples.ez.common.gui.DialogHeader;
import org.javamoney.examples.ez.common.gui.Panel;
import org.javamoney.examples.ez.common.gui.ScrollPane;
import org.javamoney.examples.ez.common.utility.I18NHelper;
/**
* This class facilitates constraining category totals to a specific set of
* criteria.
*/
public
final
class
CategoryTotalsFilterDialog
extends ApplicationDialog
{
/**
* Constructs a new dialog.
*/
public
CategoryTotalsFilterDialog(TotalFilter filter)
{
super(700, 425);
setCheckBox(new CheckBox());
setFilter(filter);
setReconcileChooser(new YesNoRadioChooser());
createChoosers();
buildPanel();
}
/**
* This method displays the dialog and returns true if it was accepted,
* otherwise false.
*
* @return true or false.
*/
public
boolean
showDialog()
{
runDialog();
if(wasAccepted() == true)
{
getFilter().setAccounts(getChoosers()[ACCOUNTS].getSelectedValues());
getFilter().setCategories(getChoosers()[CATEGORIES].getSelectedValues());
getFilter().setPayees(getChoosers()[PAYEES].getSelectedValues());
}
return wasAccepted();
}
//////////////////////////////////////////////////////////////////////////////
// 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(createFilterPanel(), 0, 1, 1, 1, 100, 100);
panel.add(createMoreOptionsPanel(), 0, 2, 1, 1, 0, 0);
panel.add(createOKCancelButtonPanel(new ActionHandler()), 0, 3, 1, 1, 0, 0);
}
private
Panel
createChooserPanel(FilterElementChooser chooser, String title)
{
Panel panel = new Panel();
ActionHandler handler = new ActionHandler();
CheckBox checkBox = new CheckBox();
// Build check box.
buildButton(checkBox, getSharedProperty("all"), handler, title);
checkBox.setSelected(chooser.isEnabled() == false);
// Build panel.
panel.setAnchor(GridBagConstraints.WEST);
panel.add(checkBox, 0, 0, 1, 1, 100, 0);
panel.setFill(GridBagConstraints.BOTH);
panel.add(new ScrollPane(chooser), 0, 1, 1, 1, 0, 100);
panel.setBorder(createTitledBorder(title + " " + getProperty("report_on")));
return panel;
}
private
void
createChoosers()
{
Collection<DataElement> categories = new TreeSet<DataElement>();
itsChoosers = new FilterElementChooser[3];
// Combine expenses and income.
categories.addAll(getExpenses().getCollection());
categories.addAll(getIncome().getCollection());
getChoosers()[ACCOUNTS] = new FilterElementChooser(getAccounts().getCollection());
getChoosers()[CATEGORIES] = new FilterElementChooser(categories);
getChoosers()[PAYEES] = new FilterElementChooser(getPayees().getCollection());
getChoosers()[ACCOUNTS].selectValues(getFilter().getAccounts());
getChoosers()[CATEGORIES].selectValues(getFilter().getCategories());
getChoosers()[PAYEES].selectValues(getFilter().getPayees());
// Determine initial enabled state.
getChoosers()[ACCOUNTS].setEnabled(getFilter().getAccounts().length != 0);
getChoosers()[CATEGORIES].setEnabled(getFilter().getCategories().length != 0);
getChoosers()[PAYEES].setEnabled(getFilter().getPayees().length != 0);
}
private
static
DialogHeader
createDialogHeader()
{
return new DialogHeader(getProperty("header.title"),
getProperty("header.description"), DIALOG_FILTER.getIcon());
}
private
Panel
createFilterPanel()
{
Panel panel = new Panel();
// Build panel.
panel.setFill(GridBagConstraints.BOTH);
panel.add(createChooserPanel(getChoosers()[ACCOUNTS], ACTION_ACCOUNTS), 0, 0, 1, 1, 50, 100);
panel.addEmptyCellAt(1, 0);
panel.add(createChooserPanel(getChoosers()[CATEGORIES], ACTION_CATEGORIES), 2, 0, 1, 1, 50, 0);
panel.addEmptyCellAt(3, 0);
panel.add(createChooserPanel(getChoosers()[PAYEES], ACTION_PAYEES), 4, 0, 1, 1, 50, 0);
panel.setInsets(new Insets(10, 10, 10, 10));
return panel;
}
private
Panel
createMoreOptionsPanel()
{
Panel panel = new Panel();
ActionHandler handler = new ActionHandler();
// Build check box.
buildButton(getCheckBox(), getSharedProperty("reconciled") + ":", handler);
getCheckBox().setSelected(getFilter().reconciledEnabled());
getReconcileChooser().setEnabled(getCheckBox().isSelected());
getReconcileChooser().setNoSelected(!getFilter().reconciledOnly());
getReconcileChooser().setYesSelected(getFilter().reconciledOnly());
// Build panel.
panel.setAnchor(GridBagConstraints.WEST);
panel.add(getCheckBox(), 0, 0, 1, 1, 0, 100);
panel.add(getReconcileChooser(), 1, 0, 1, 1, 100, 0);
panel.setBorder(createTitledBorder(getSharedProperty("more_options"), false));
// Add listeners.
getReconcileChooser().addActionListener(handler);
return panel;
}
private
CheckBox
getCheckBox()
{
return itsCheckBox;
}
private
FilterElementChooser[]
getChoosers()
{
return itsChoosers;
}
private
TotalFilter
getFilter()
{
return itsFilter;
}
private
static
String
getProperty(String key)
{
return I18NHelper.getProperty("CategoryTotalsFilterDialog." + key);
}
private
YesNoRadioChooser
getReconcileChooser()
{
return itsReconcileChooser;
}
private
void
setCheckBox(CheckBox checkBox)
{
itsCheckBox = checkBox;
}
private
void
setFilter(TotalFilter filter)
{
itsFilter = filter;
}
private
void
setReconcileChooser(YesNoRadioChooser chooser)
{
itsReconcileChooser = chooser;
}
//////////////////////////////////////////////////////////////////////////////
// Start of inner classes.
//////////////////////////////////////////////////////////////////////////////
private
class
ActionHandler
implements ActionListener
{
public
void
actionPerformed(ActionEvent event)
{
Object source = event.getSource();
String command = event.getActionCommand();
if(source == getCheckBox())
{
getFilter().setReconciledEnabled(getCheckBox().isSelected());
getReconcileChooser().setEnabled(getCheckBox().isSelected());
}
else if(source == getReconcileChooser())
{
getFilter().setReconciledOnly(getReconcileChooser().isYesSelected());
}
else if(command.equals(ACTION_ACCOUNTS) == true)
{
getChoosers()[ACCOUNTS].setEnabled(!((CheckBox)source).isSelected());
}
else if(command.equals(ACTION_CATEGORIES) == true)
{
getChoosers()[CATEGORIES].setEnabled(!((CheckBox)source).isSelected());
}
else if(command.equals(ACTION_PAYEES) == true)
{
getChoosers()[PAYEES].setEnabled(!((CheckBox)source).isSelected());
}
else
{
setAccepted(command.equals(ACTION_OK));
dispose();
}
}
}
//////////////////////////////////////////////////////////////////////////////
// Start of class members.
//////////////////////////////////////////////////////////////////////////////
private CheckBox itsCheckBox;
private FilterElementChooser[] itsChoosers;
private TotalFilter itsFilter;
private YesNoRadioChooser itsReconcileChooser;
private static final int ACCOUNTS = 0;
private static final int CATEGORIES = 1;
private static final int PAYEES = 2;
private static final String ACTION_ACCOUNTS = getSharedProperty("accounts");
private static final String ACTION_CATEGORIES = getSharedProperty("categories");
private static final String ACTION_PAYEES = getSharedProperty("payees");
}