// CalendarDialog package org.javamoney.examples.ez.money.gui.dialog; import static java.text.DateFormat.LONG; import static java.text.DateFormat.getDateInstance; import java.awt.GridBagConstraints; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Calendar; import java.util.GregorianCalendar; import javax.swing.BorderFactory; import javax.swing.JLabel; import org.javamoney.examples.ez.money.gui.chooser.DayChooser; import org.javamoney.examples.ez.money.gui.chooser.MonthChooser; import org.javamoney.examples.ez.money.gui.chooser.YearChooser; 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 choosing a calendar date from a dialog that has * selectable days, months, and years. */ public final class CalendarDialog extends ApplicationDialog { /** * Constructs a new dialog initialized with the specified date. * * @param calendar The date to initialize the dialog. * @param firstDayOfWeek The weekday the day chooser should start with. */ public CalendarDialog(GregorianCalendar calendar, int firstDayOfWeek) { super(getProperty("title"), 325, 375); setCalendar(calendar); setDateLabel(new JLabel()); setDayChooser(new DayChooser(getCalendar(), firstDayOfWeek)); setMonthChooser(new MonthChooser(getCalendar().get(Calendar.MONTH))); setYearChooser(new YearChooser(getCalendar().get(Calendar.YEAR))); buildPanel(); } /** * This method runs the dialog and then returns the selected calendar date, or * null if the dialog was canceled. * * @return The selected calendar date, or null if the dialog was canceled. */ public GregorianCalendar showDialog() { GregorianCalendar calendar = null; runDialog(); if(wasAccepted() == true) { calendar = getCalendar(); } return calendar; } ////////////////////////////////////////////////////////////////////////////// // Start of private methods. ////////////////////////////////////////////////////////////////////////////// private void buildPanel() { ActionHandler handler = new ActionHandler(); Panel panel = getContentPane(); // Build panel. panel.setInsets(new Insets(10, 10, 10, 10)); panel.setFill(GridBagConstraints.BOTH); panel.add(createDateLabelPanel(), 0, 0, 2, 1, 0, 0); panel.add(createChooserPanel(), 0, 1, 2, 1, 100, 100); panel.add(createTodayLinkPanel(), 0, 2, 1, 1, 0, 0); panel.add(createOKCancelButtonPanel(handler), 1, 2, 1, 1, 0, 0); getDateLabel().setText(getDateFormat()); // Add listeners. getDayChooser().addActionListener(handler); getMonthChooser().addActionListener(handler); getYearChooser().addActionListener(handler); } private Panel createChooserPanel() { Panel panel = new Panel(); // Build panel. panel.setFill(GridBagConstraints.BOTH); panel.addEmptyCellAt(0, 0); panel.add(createMonthYearChooserPanel(), 0, 1, 1, 1, 0, 0); panel.addEmptyCellAt(0, 2); panel.add(getDayChooser(), 0, 3, 1, 1, 100, 100); panel.setBorder(BorderFactory.createEtchedBorder()); return panel; } private Panel createDateLabelPanel() { Panel panel = new Panel(); // Build panel. panel.setAnchor(GridBagConstraints.WEST); panel.add(getDateLabel(), 0, 0, 1, 1, 100, 100); return panel; } private Panel createMonthYearChooserPanel() { Panel panel = new Panel(); // Build panel. panel.setFill(GridBagConstraints.HORIZONTAL); panel.add(getMonthChooser(), 0, 0, 1, 1, 50, 100); panel.add(getYearChooser(), 1, 0, 1, 1, 50, 0); return panel; } private Panel createTodayLinkPanel() { Panel panel = new Panel(); Link link = new Link(ACTION_TODAY, new ActionHandler()); // Build panel. panel.add(link, 0, 0, 1, 1, 100, 100); link.setToolTipText(getDateFormat()); return panel; } private GregorianCalendar getCalendar() { return itsCalendar; } private String getDateFormat() { return getDateInstance(LONG).format(getCalendar().getTime()); } private JLabel getDateLabel() { return itsDateLabel; } private DayChooser getDayChooser() { return itsDayChooser; } private MonthChooser getMonthChooser() { return itsMonthChooser; } private static String getProperty(String key) { return I18NHelper.getProperty("CalendarDialog." + key); } private YearChooser getYearChooser() { return itsYearChooser; } private void setCalendar(GregorianCalendar calendar) { itsCalendar = calendar; } private void selectToday() { GregorianCalendar calendar = new GregorianCalendar(); // Setting a selected value invokes an action event. Unfortunately in this // case the days will be rendered three times. getDayChooser().setSelectedDay(calendar.get(Calendar.DATE)); getMonthChooser().setSelectedMonth(calendar.get(Calendar.MONTH)); getYearChooser().setSelectedYear(calendar.get(Calendar.YEAR)); } private void setDateLabel(JLabel label) { itsDateLabel = label; } private void setDayChooser(DayChooser chooser) { itsDayChooser = chooser; } private void setMonthChooser(MonthChooser chooser) { itsMonthChooser = chooser; } private void setYearChooser(YearChooser chooser) { itsYearChooser = chooser; } private void updateCalendar() { getCalendar().set(Calendar.DATE, getDayChooser().getSelectedDay()); getCalendar().set(Calendar.MONTH, getMonthChooser().getSelectedMonth()); getCalendar().set(Calendar.YEAR, getYearChooser().getSelectedYear()); getDateLabel().setText(getDateFormat()); } ////////////////////////////////////////////////////////////////////////////// // Start of inner classes. ////////////////////////////////////////////////////////////////////////////// private class ActionHandler implements ActionListener { public void actionPerformed(ActionEvent event) { String command = event.getActionCommand(); if(command.equals(ACTION_OK) == true || command.equals(ACTION_CANCEL) == true) { setAccepted(command.equals(ACTION_OK)); dispose(); } else if(command.equals(ACTION_TODAY) == true) { selectToday(); } else if(command.equals(DayChooser.ACTION_DAY_CHOSEN) == true) { setAccepted(true); dispose(); } else { if(event.getSource() == getMonthChooser()) { getDayChooser().setMonth(getMonthChooser().getSelectedMonth()); } else if(event.getSource() == getYearChooser()) { getDayChooser().setYear(getYearChooser().getSelectedYear()); } updateCalendar(); } } } ////////////////////////////////////////////////////////////////////////////// // Start of class members. ////////////////////////////////////////////////////////////////////////////// private GregorianCalendar itsCalendar; private JLabel itsDateLabel; private DayChooser itsDayChooser; private MonthChooser itsMonthChooser; private YearChooser itsYearChooser; private static final String ACTION_TODAY = getProperty("today"); }