Package com.toedter.calendar

Source Code of com.toedter.calendar.JSpinnerDateEditor

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.JFormattedTextField;
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: 147 $
* @version $LastChangedDate: 2011-06-06 20:36:53 +0200 (Mo, 06 Jun 2011) $
*/
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());
    ((JSpinner.DateEditor)getEditor()).getTextField().setFocusLostBehavior(JFormattedTextField.PERSIST);
    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);
    setEditor(new JSpinner.DateEditor(this, dateFormatter.toPattern()));
    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);
  }

}
TOP

Related Classes of com.toedter.calendar.JSpinnerDateEditor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.