// RemindersPanel package org.javamoney.examples.ez.money.gui.dialog.preferences; 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.UI_DATE_FORMAT; import static org.javamoney.examples.ez.money.model.DataTypeKeys.REMINDER; import static org.javamoney.examples.ez.money.utility.IDHelper.MessageKeys.IN_USE; import static org.javamoney.examples.ez.money.utility.IDHelper.MessageKeys.UNABLE_TO_REMOVE; import static org.javamoney.examples.ez.money.utility.TransactionDateHelper.showDateDialog; import java.awt.GridBagConstraints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date; import javax.swing.AbstractButton; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import org.javamoney.examples.ez.money.model.persisted.reminder.Reminder; import org.javamoney.examples.ez.money.utility.IDHelper; import org.javamoney.examples.ez.common.gui.CheckBox; import org.javamoney.examples.ez.common.gui.Link; import org.javamoney.examples.ez.common.gui.Panel; import org.javamoney.examples.ez.common.utility.I18NHelper; /** * This class facilitates managing the reminders. */ public final class RemindersPanel extends DataElementPanel { /** * Constructs a new preferences panel. */ public RemindersPanel() { super(PreferencesKeys.REMINDERS); setSpinner(new JSpinner(new SpinnerNumberModel(0, 0, 21, 1))); createButtons(); buildPanel(); // Initialize the panel with the selected reminder. displayReminderInfo(); // Prevent users from entering arbitrary data in the spinner. ((JSpinner.NumberEditor)getSpinner().getEditor()).getTextField().setEditable(false); // Add listeners. getChooser().addTreeSelectionListener(new SelectionHandler()); getSpinner().addChangeListener(new ChangeHandler()); } /** * This method updates this panel's view. */ @Override public void updateView() { displayCollectables(); getChooser().selectFirst(); } ////////////////////////////////////////////////////////////////////////////// // Start of protected methods. ////////////////////////////////////////////////////////////////////////////// /** * This method prompts the user for a new unique identifier. */ @Override protected void edit() { Reminder reminder = (Reminder)getChooser().getSelectedElement(); String identifier = IDHelper.promptForEdit(REMINDER, reminder.getIdentifier()); if(identifier != null) { if(getCollection().changeIdentifier(reminder, identifier) == true) { // Update the view, and select the edited element. displayCollectables(); getChooser().setSelectedCollectable(reminder); } else { // It is safe to assume it already existed. IDHelper.showMessage(IN_USE, REMINDER); } } } ////////////////////////////////////////////////////////////////////////////// // Start of private methods. ////////////////////////////////////////////////////////////////////////////// private void add() { String identifier = IDHelper.promptForAdd(REMINDER); if(identifier != null) { Reminder reminder = new Reminder(identifier); if(getCollection().add(reminder) == true) { // Update view and select the new element. displayCollectables(); getChooser().setSelectedCollectable(reminder); } else { // It is safe to assume it already existed. IDHelper.showMessage(IN_USE, REMINDER); } } } private void buildPanel() { ActionHandler handler = new ActionHandler(); // Build panel. setFill(GridBagConstraints.BOTH); add(createChooserPanel(handler), 0, 0, 1, 1, 100, 100); add(createOptionsPanel(), 0, 1, 1, 1, 0, 0); add(createButtonPanel(handler), 0, 2, 1, 1, 0, 0); } private void createButtons() { itsButtons = new AbstractButton[2]; ActionHandler handler = new ActionHandler(); getButtons()[COMPLETED] = new CheckBox(); getButtons()[DUE_BY] = new Link(); // Build buttons. buildButton(getButtons()[COMPLETED], getProperty("completed"), handler); buildButton(getButtons()[DUE_BY], "", handler, "", getSharedProperty("date_tip")); } private Panel createOptionsPanel() { Panel panel = new Panel(); // Build panel. panel.setAnchor(GridBagConstraints.EAST); panel.add(getSharedProperty("due_by") + ": ", 0, 0, 1, 1, 0, 50); panel.add(getProperty("days_to_alarm") + ": ", 2, 0, 1, 1, 0, 0); panel.setAnchor(GridBagConstraints.WEST); panel.add(getButtons()[DUE_BY], 1, 0, 1, 1, 0, 0); panel.add(getSpinner(), 3, 0, 1, 1, 100, 0); panel.addEmptyCellAt(1, 1, 12); panel.setFill(GridBagConstraints.HORIZONTAL); panel.add(getButtons()[COMPLETED], 0, 2, 3, 1, 0, 50); panel.setBorder(createTitledBorder(getProperty("title"))); return panel; } private void displayCollectables() { getChooser().displayCollectables(); enableLinks(); showProperChooserPanel(); } private void displayReminderInfo() { Reminder reminder = (Reminder)getChooser().getSelectedElement(); String date = ""; int daysToAlarm = Reminder.DEFAULT_DAYS_TO_ALARM; boolean done = false; if(reminder != null) { date = UI_DATE_FORMAT.format(reminder.getDueBy()); daysToAlarm = reminder.getDaysToAlarm(); done = reminder.isComplete(); } // Enable or disable. getButtons()[DUE_BY].setEnabled(reminder != null); getButtons()[DUE_BY].setText(date); getButtons()[COMPLETED].setEnabled(reminder != null); getButtons()[COMPLETED].setSelected(done); getSpinner().setEnabled(reminder != null); getSpinner().setValue(new Integer(daysToAlarm)); } private AbstractButton[] getButtons() { return itsButtons; } private static String getProperty(String key) { return I18NHelper.getProperty("RemindersPanel." + key); } private JSpinner getSpinner() { return itsSpinner; } private void remove() { if(IDHelper.confirmRemoval(REMINDER) == true) { Reminder reminder = (Reminder)getChooser().getSelectedElement(); if(getCollection().remove(reminder) == true) { // Update the view. displayCollectables(); if(getChooser().length() != 0) { getChooser().selectFirst(); } else { displayReminderInfo(); } } else { IDHelper.showMessage(UNABLE_TO_REMOVE, REMINDER); } } } private void setSpinner(JSpinner spinner) { itsSpinner = spinner; } ////////////////////////////////////////////////////////////////////////////// // Start of inner classes. ////////////////////////////////////////////////////////////////////////////// private class ActionHandler implements ActionListener { public void actionPerformed(ActionEvent event) { String command = event.getActionCommand(); Object source = event.getSource(); if(source == getButtons()[COMPLETED]) { Reminder reminder = (Reminder)getChooser().getSelectedElement(); reminder.setIsComplete(!reminder.isComplete()); } else if(source == getButtons()[DUE_BY]) { Reminder reminder = (Reminder)getChooser().getSelectedElement(); Date date = showDateDialog(reminder.getDueBy()); if(date != null) { reminder.setDueBy(date); getButtons()[DUE_BY].setText(UI_DATE_FORMAT.format(date)); } } else if(command.equals(ACTION_ADD) == true) { add(); } else if(command.equals(ACTION_EDIT) == true) { edit(); } else if(command.equals(ACTION_REMOVE) == true) { remove(); } } } private class ChangeHandler implements ChangeListener { public void stateChanged(ChangeEvent event) { Reminder reminder = (Reminder)getChooser().getSelectedElement(); if(reminder != null) { int value = Integer.parseInt(getSpinner().getValue().toString()); reminder.setDaysToAlarm(value); } } } private class SelectionHandler implements TreeSelectionListener { public void valueChanged(TreeSelectionEvent event) { displayReminderInfo(); } } ////////////////////////////////////////////////////////////////////////////// // Start of class members. ////////////////////////////////////////////////////////////////////////////// private AbstractButton[] itsButtons; private JSpinner itsSpinner; private static final int COMPLETED = 0; private static final int DUE_BY = 1; }