/* class DateEntryField
*
* Copyright (C) 2001 R M Pitman
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package charva.awt.util;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import charva.awt.Component;
import charva.awt.Dialog;
import charva.awt.FlowLayout;
import charva.awt.Frame;
import charva.awt.Toolkit;
import charva.awt.event.FocusEvent;
import charva.awt.event.FocusListener;
import charva.awt.event.KeyEvent;
import charva.awt.event.KeyListener;
import charvax.swing.JLabel;
import charvax.swing.JOptionPane;
import charvax.swing.JPanel;
import charvax.swing.JTextField;
/**
* This class displays a date entry field in the format CCYY/MM/DD and allows
* the user to edit the contents of the three subfields. It intercepts each
* keystroke and causes a beep if a non-numeric key is typed.
*/
public class DateEntryField extends JPanel implements KeyListener,
FocusListener {
public DateEntryField(Frame owner_) {
this(owner_, TimeZone.getDefault());
}
public DateEntryField(Frame owner_, TimeZone zone_) {
//_owner = owner_;
init(zone_);
}
public DateEntryField(Dialog owner_) {
this(owner_, TimeZone.getDefault());
}
public DateEntryField(Dialog owner_, TimeZone zone_) {
//_owner = owner_;
init(zone_);
}
private void init(TimeZone zone_) {
setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
_cal = new GregorianCalendar(zone_);
add(_yearField);
_yearField.addKeyListener(this);
_yearField.addFocusListener(this);
add(new JLabel("/"));
add(_monthField);
_monthField.addKeyListener(this);
_monthField.addFocusListener(this);
add(new JLabel("/"));
add(_dayField);
_dayField.addKeyListener(this);
_dayField.addFocusListener(this);
}
public void keyPressed(KeyEvent e_) {
/*
* Allow non-printing keys to be processed by the superclass.
*/
return; // pass the event on to its destination.
}
/**
* This is never called.
*/
public void keyReleased(KeyEvent e_) {
}
public void keyTyped(KeyEvent e_) {
int key = e_.getKeyCode();
/*
* If the key is non-numeric, ring the bell and "consume" the keystroke
* so that it doesn't get echoed.
*/
if (key < '0' || key > '9') {
Toolkit.getDefaultToolkit().beep();
e_.consume();
}
Component source = (Component) e_.getSource();
if (source == _yearField && _yearField.getText().length() < 4) return;
if (source == _monthField && _monthField.getText().length() < 2)
return;
if (source == _dayField && _dayField.getText().length() < 2) return;
Toolkit.getDefaultToolkit().beep();
e_.consume();
}
public void focusGained(FocusEvent fe_) {
}
public void focusLost(FocusEvent e_) {
Component source = (Component) e_.getSource();
/*
* Get the absolute origin of this component.
*/
/* Point origin = */getLocationOnScreen();
try {
if (source == _yearField) {
if (_yearField.getText().equals("")) {
String[] msgs = { "A valid year must be ",
"entered in this field "};
JOptionPane.showMessageDialog(_yearField, msgs, "Error",
JOptionPane.ERROR_MESSAGE);
_yearField.requestFocus();
} else {
int year = Integer.parseInt(_yearField.getText());
_cal.set(Calendar.YEAR, year);
}
}
else if (source == _monthField) {
if (_monthField.getText().equals("") == false) {
int month = Integer.parseInt(_monthField.getText());
if (month >= 1 && month <= 12) {
_cal.clear(Calendar.DAY_OF_MONTH);
_cal.set(Calendar.MONTH, month - 1);
return;
}
}
String[] msgs = { "The month must be", "between 1 and 12"};
JOptionPane.showMessageDialog(_monthField, msgs, "Error",
JOptionPane.ERROR_MESSAGE);
_monthField.requestFocus();
}
else if (source == _dayField) {
int maxday = _cal.getActualMaximum(Calendar.DAY_OF_MONTH);
if (_dayField.getText().equals("") == false) {
int day = Integer.parseInt(_dayField.getText());
/*
* By the time we get here, the year and month fields have
* been filled in already, so we can check whether the day
* is valid.
*/
if (day >= 1 && day <= maxday) {
_cal.set(Calendar.DAY_OF_MONTH, day);
return;
}
}
String[] msgs = { "The day must be", "between 1 and " + maxday};
JOptionPane.showMessageDialog(_dayField, msgs, "Error",
JOptionPane.ERROR_MESSAGE);
_dayField.requestFocus();
}
} catch (NumberFormatException e) {
// should never happen because we are trapping non-numeric
// keystrokes.
System.err.println("Number format exception");
}
}
/**
* Set the fields to the current time.
*/
public void set() {
int year = _cal.get(Calendar.YEAR);
_yearField.setText(Integer.toString(year));
int month = _cal.get(Calendar.MONTH) + 1;
_monthField.setText(Integer.toString(month));
int day = _cal.get(Calendar.DAY_OF_MONTH);
_dayField.setText(Integer.toString(day));
}
/**
* Set the year field
*/
public void setYear(int year_) {
_yearField.setText(Integer.toString(year_));
_cal.set(Calendar.YEAR, year_);
}
/**
* Set the month field
*/
public void setMonth(int month_) {
_monthField.setText(Integer.toString(month_));
_cal.set(Calendar.MONTH, month_ - 1);
}
/**
*/
public void setDay(int day_) {
_dayField.setText(Integer.toString(day_));
_cal.set(Calendar.DAY_OF_MONTH, day_);
}
/**
* Get the year value.
*/
public int getYear() {
return Integer.parseInt(_yearField.getText());
}
/**
* Get the month value (between 1 and 12)
*/
public int getMonth() {
return Integer.parseInt(_monthField.getText());
}
/**
* Get the day-of-month value.
*/
public int getDay() {
return Integer.parseInt(_dayField.getText());
}
private JTextField _yearField = new JTextField(4);
private JTextField _monthField = new JTextField(2);
private JTextField _dayField = new JTextField(2);
private GregorianCalendar _cal;
//private final Window _owner;
}