// RegisterView package org.javamoney.examples.ez.money.gui.view; 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.ApplicationThread.getFrame; import static org.javamoney.examples.ez.money.model.DataManager.getAccounts; import static org.javamoney.examples.ez.money.model.dynamic.transaction.TransactionFilterFieldKeys.ALL; import static org.javamoney.examples.ez.money.model.dynamic.transaction.TransactionFilterFieldKeys.AMOUNT; import static org.javamoney.examples.ez.money.model.dynamic.transaction.TransactionFilterFieldKeys.CHECK; import static org.javamoney.examples.ez.money.model.dynamic.transaction.TransactionFilterFieldKeys.DATE; import static org.javamoney.examples.ez.money.model.dynamic.transaction.TransactionFilterFieldKeys.NOTES; import static org.javamoney.examples.ez.money.model.dynamic.transaction.TransactionFilterFieldKeys.PAYEE; import java.awt.GridBagConstraints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ButtonGroup; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenuItem; import org.javamoney.examples.ez.money.gui.chooser.ElementComboBoxChooser; import org.javamoney.examples.ez.money.gui.view.register.RegisterPanel; import org.javamoney.examples.ez.money.model.dynamic.transaction.TransactionFilter; import org.javamoney.examples.ez.money.model.persisted.account.Account; import org.javamoney.examples.ez.money.model.persisted.transaction.Transaction; import org.javamoney.examples.ez.common.gui.Panel; import org.javamoney.examples.ez.common.gui.PopupMenu; import org.javamoney.examples.ez.common.gui.SearchWidget; import org.javamoney.examples.ez.common.utility.I18NHelper; /** * This class facilitates viewing an account's transactions. */ public final class RegisterView extends View { /** * Constructs a new view. */ public RegisterView() { super(ViewKeys.REGISTER); setAccount(null); setAccountChooser(new ElementComboBoxChooser(getAccounts())); setFilter(new TransactionFilter()); setPanel(new Panel()); setSearchWidget(new SearchWidget(createPopupMenu())); // Build panel. setFill(GridBagConstraints.BOTH); add(createToolsPanel(), 0, 0, 1, 1, 0, 0); add(getPanel(), 0, 1, 1, 1, 100, 100); getAccountChooser().setAllowInactiveAccounts(false); // Add listeners. getAccountChooser().addActionListener(new ActionHandler()); getSearchWidget().addActionListener(new ActionHandler()); } /** * This method unselects all selected transactions in the register's table. */ public void clearTableSelection() { getRegisterPanel().clearTableSelection(); } /** * This method puts all the account's transactions into the register table and * updates its balance. * <p> * <b>Note:</b> This method is for performance improvement over updateView() * when the register view is already visible. * * @param trans The transaction to scroll to. */ public void displayTransactions(Transaction trans) { getRegisterPanel().updateView(getFilter(), trans); } /** * This method returns the account the register has a reference to or null if * there is not one. * * @return The account the register has a reference to. */ public Account getAccount() { return itsAccount; } /** * This method returns true if the register has an account to reference, * otherwise false. * * @return true of false. */ public boolean hasAccount() { return getAccount() != null; } /** * This method sets the account the register has a reference to. * * @param account The account to reference. */ public void setAccount(Account account) { itsAccount = account; } /** * This method updates the view by redisplaying all the account's * transactions. */ @Override public void updateView() { // Stop responding to events. setAllowEvents(false); getAccountChooser().displayElements(getAccounts()); getPanel().removeAll(); // Get new reference to account incase the type or collection has changed. setAccount(getProperAccountReference()); if(getAccount() != null) { setRegisterPanel(new RegisterPanel(getAccount())); getAccountChooser().setSelectedItem(getAccount().getIdentifier()); getFilter().updateFormats(); // Build panel. getPanel().setFill(GridBagConstraints.BOTH); getPanel().add(getRegisterPanel(), 0, 0, 1, 1, 100, 100); displayTransactions(null); } // Resume responding to events. setAllowEvents(true); } ////////////////////////////////////////////////////////////////////////////// // Start of private methods. ////////////////////////////////////////////////////////////////////////////// private boolean allowEvents() { return itsAllowEvents; } private static JMenuItem createMenuItem(String command, ActionHandler handler, ButtonGroup group, boolean selected) { JCheckBoxMenuItem item = new JCheckBoxMenuItem(); // Build items. buildButton(item, command, handler, group); item.setSelected(selected); return item; } private PopupMenu createPopupMenu() { PopupMenu menu = new PopupMenu(); ActionHandler handler = new ActionHandler(); ButtonGroup group = new ButtonGroup(); JMenuItem item = new JMenuItem(getSharedProperty("search")); item.setEnabled(false); // Add items to menu. menu.add(item); menu.add(createMenuItem(ACTION_ALL, handler, group, true)); menu.addSeparator(); menu.add(createMenuItem(ACTION_AMOUNT, handler, group, false)); menu.add(createMenuItem(ACTION_CHECK, handler, group, false)); menu.add(createMenuItem(ACTION_DATE, handler, group, false)); menu.add(createMenuItem(ACTION_NOTES, handler, group, false)); menu.add(createMenuItem(ACTION_PAYEE, handler, group, false)); menu.setBehaveLikeMenu(true); return menu; } private Panel createToolsPanel() { Panel panel = new Panel(); getSearchWidget().setToolTipText(getProperty("search_tip")); // Build panel. panel.setAnchor(GridBagConstraints.EAST); panel.add(getSharedProperty("account") + ": ", 0, 1, 1, 1, 0, 100); panel.setFill(GridBagConstraints.HORIZONTAL); panel.add(getAccountChooser(), 1, 1, 1, 1, 0, 0); panel.add(getSearchWidget(), 3, 1, 1, 1, 0, 0); panel.setAnchor(GridBagConstraints.CENTER); panel.setFill(GridBagConstraints.NONE); panel.add(getSharedProperty("search"), 3, 2, 1, 1, 0, 0); // Aesthetic spacers. panel.addEmptyCellAt(1, 0, 24); panel.addSpacer(2, 0, 1, 1, 100, 0); panel.addEmptyCellAt(3, 0, 24); panel.addEmptyCellAt(4, 3); return panel; } private ElementComboBoxChooser getAccountChooser() { return itsAccountChooser; } private TransactionFilter getFilter() { return itsFilter; } private Panel getPanel() { return itsPanel; } private Account getProperAccountReference() { Account account = getAccount(); if(account != null) { account = (Account)getAccounts().get(getAccount().getIdentifier()); // Non-active accounts cannot be referenced. if(account != null && account.isActive() == false) { account = null; } } return account; } private static String getProperty(String key) { return I18NHelper.getProperty("RegisterView." + key); } private RegisterPanel getRegisterPanel() { return itsRegisterPanel; } private SearchWidget getSearchWidget() { return itsSearchWidget; } private void setAccountChooser(ElementComboBoxChooser chooser) { itsAccountChooser = chooser; } private void setAllowEvents(boolean value) { itsAllowEvents = value; } private void setFilter(TransactionFilter filter) { itsFilter = filter; } private void setPanel(Panel panel) { itsPanel = panel; } private void setRegisterPanel(RegisterPanel panel) { itsRegisterPanel = panel; } private void setSearchWidget(SearchWidget searchWidget) { itsSearchWidget = searchWidget; } ////////////////////////////////////////////////////////////////////////////// // Start of inner classes. ////////////////////////////////////////////////////////////////////////////// private class ActionHandler implements ActionListener { public void actionPerformed(ActionEvent event) { Object source = event.getSource(); if(source == getAccountChooser() && allowEvents() == true) { String id = getAccountChooser().getSelectedItem(); Account account = (Account)getAccounts().get(id); if(account != getAccount()) { // Show the account's register. getFrame().getViews().openRegisterFor(account); } } else if(source != getAccountChooser()) { if(source == getSearchWidget()) { String text = getSearchWidget().getSearchText(); if(text.length() == 0) { text = null; } getFilter().setFilterText(text); } else { String command = event.getActionCommand(); if(command.equals(ACTION_ALL) == true) { getFilter().setFilterField(ALL); } else if(command.equals(ACTION_AMOUNT) == true) { getFilter().setFilterField(AMOUNT); } else if(command.equals(ACTION_CHECK) == true) { getFilter().setFilterField(CHECK); } else if(command.equals(ACTION_DATE) == true) { getFilter().setFilterField(DATE); } else if(command.equals(ACTION_NOTES) == true) { getFilter().setFilterField(NOTES); } else { getFilter().setFilterField(PAYEE); } // The popup takes the focus away from the search widget. getSearchWidget().requestFocus(); } displayTransactions(null); } } } ////////////////////////////////////////////////////////////////////////////// // Start of class members. ////////////////////////////////////////////////////////////////////////////// private Account itsAccount; private ElementComboBoxChooser itsAccountChooser; private boolean itsAllowEvents; private TransactionFilter itsFilter; private Panel itsPanel; private RegisterPanel itsRegisterPanel; private SearchWidget itsSearchWidget; private static final String ACTION_ALL = getSharedProperty("all"); private static final String ACTION_AMOUNT = getSharedProperty("amount"); private static final String ACTION_CHECK = getSharedProperty("check_number"); private static final String ACTION_DATE = getSharedProperty("date"); private static final String ACTION_NOTES = getSharedProperty("notes"); private static final String ACTION_PAYEE = getSharedProperty("payee"); }