package com.toedter.calendar; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import javax.swing.JComponent; import javax.swing.JSpinner; import javax.swing.SpinnerDateModel; import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * JSpinnerDateEditor is a date editor based on a JSpinner. * * @author Kai Toedter * @version $LastChangedRevision: 100 $ * @version $LastChangedDate: 2006-06-04 14:36:06 +0200 (So, 04 Jun 2006) $ */ public class JSpinnerDateEditor extends JSpinner implements IDateEditor, FocusListener, ChangeListener { private static final long serialVersionUID = 5692204052306085316L; protected Date date; protected String dateFormatString; protected SimpleDateFormat dateFormatter; public JSpinnerDateEditor() { super (new SpinnerDateModel ()); dateFormatter = (SimpleDateFormat) DateFormat.getDateInstance (DateFormat.MEDIUM); ((JSpinner.DateEditor) getEditor ()).getTextField ().addFocusListener ( this); DateUtil dateUtil = new DateUtil (); setMinSelectableDate (dateUtil.getMinSelectableDate ()); setMaxSelectableDate (dateUtil.getMaxSelectableDate ()); addChangeListener (this); } public Date getDate() { if (date == null) { return null; } return ((SpinnerDateModel) getModel ()).getDate (); } public void setDate(Date date) { setDate (date, true); } public void setDate(Date date, boolean updateModel) { Date oldDate = this.date; this.date = date; if (date == null) { ((JSpinner.DateEditor) getEditor ()).getFormat ().applyPattern (""); ((JSpinner.DateEditor) getEditor ()).getTextField ().setText (""); } else if (updateModel) { if (dateFormatString != null) { ((JSpinner.DateEditor) getEditor ()).getFormat ().applyPattern ( dateFormatString); } ((SpinnerDateModel) getModel ()).setValue (date); } firePropertyChange ("date", oldDate, date); } public void setDateFormatString(String dateFormatString) { try { dateFormatter.applyPattern (dateFormatString); } catch (RuntimeException e) { dateFormatter = (SimpleDateFormat) DateFormat.getDateInstance (DateFormat.MEDIUM); dateFormatter.setLenient (false); } this.dateFormatString = dateFormatter.toPattern (); setToolTipText (this.dateFormatString); if (date != null) { ((JSpinner.DateEditor) getEditor ()).getFormat ().applyPattern ( this.dateFormatString); } else { ((JSpinner.DateEditor) getEditor ()).getFormat ().applyPattern (""); } if (date != null) { String text = dateFormatter.format (date); ((JSpinner.DateEditor) getEditor ()).getTextField ().setText (text); } } public String getDateFormatString() { return dateFormatString; } public JComponent getUiComponent() { return this; } public void setLocale(Locale locale) { super.setLocale (locale); dateFormatter = (SimpleDateFormat) DateFormat.getDateInstance ( DateFormat.MEDIUM, locale); setDateFormatString (dateFormatter.toPattern ()); } /* * (non-Javadoc) * * @see java.awt.event.FocusListener#focusLost(java.awt.event.FocusEvent) */ public void focusLost(FocusEvent focusEvent) { String text = ((JSpinner.DateEditor) getEditor ()).getTextField ().getText (); if (text.length () == 0) { setDate (null); } } /* * (non-Javadoc) * * @see java.awt.event.FocusListener#focusGained(java.awt.event.FocusEvent) */ public void focusGained(FocusEvent e) { } /** * Enables and disabled the compoment. It also fixes the background bug * 4991597 and sets the background explicitely to a * TextField.inactiveBackground. */ public void setEnabled(boolean b) { super.setEnabled (b); if (!b) { ((JSpinner.DateEditor) getEditor ()).getTextField ().setBackground ( UIManager.getColor ("TextField.inactiveBackground")); } } /* (non-Javadoc) * @see com.toedter.calendar.IDateEditor#getMaxSelectableDate() */ public Date getMaxSelectableDate() { return (Date) ((SpinnerDateModel) getModel ()).getEnd (); } /** * @see com.toedter.calendar.IDateEditor#getMinSelectableDate() */ public Date getMinSelectableDate() { return (Date) ((SpinnerDateModel) getModel ()).getStart (); } /** * @see com.toedter.calendar.IDateEditor#setMaxSelectableDate(java.util.Date) */ public void setMaxSelectableDate(Date max) { ((SpinnerDateModel) getModel ()).setEnd (max); } /** * @see com.toedter.calendar.IDateEditor#setMinSelectableDate(java.util.Date) */ public void setMinSelectableDate(Date min) { ((SpinnerDateModel) getModel ()).setStart (min); } /** * @see com.toedter.calendar.IDateEditor#setSelectableDateRange(java.util.Date, java.util.Date) */ public void setSelectableDateRange(Date min, Date max) { setMaxSelectableDate (max); setMinSelectableDate (min); } /** * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent) */ public void stateChanged(ChangeEvent e) { setDate (((SpinnerDateModel) getModel ()).getDate (), false); } }