package com.aerodynelabs.habtk.ui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import org.jfree.ui.DateChooserPanel;
/**
* A class to facilitate easier selection of a date/time
* @author Ethan Harstad
*
*/
@SuppressWarnings("serial")
public class DateTimePicker extends JDialog {
/*
* Type Constants
*/
public static final int DATE = 0;
public static final int TIME = 1;
public static final int DATETIME = 2;
private boolean accepted = false;
private Calendar value;
private JSpinner hour, minute;
// private JSpinner second;
private DateChooserPanel calendarWidget;
/**
* Create a picker of the given type.
* @param type
*/
public DateTimePicker(int type) {
this(type, new Date());
}
/**
* Create a picker of the given type, with the given starting value.
* @param type
* @param cur
*/
public DateTimePicker(int type, Date cur) {
super();
if(type == DATE) {
setTitle("Choose Date");
} else if(type == TIME) {
setTitle("Choose Time");
} else {
setTitle("Choose Date and Time");
}
setModal(true);
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
getContentPane().add(panel);
value = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.getDefault());
value.setTime(cur);
// Date selection fields
JPanel datePanel = new JPanel();
calendarWidget = new DateChooserPanel();
calendarWidget.setDate(value.getTime());
calendarWidget.setChosenDateButtonColor(Color.BLUE);
datePanel.add(calendarWidget);
if(type != TIME) panel.add(datePanel);
// Time selection fields
JPanel timePanel = new JPanel();
setLayout(new FlowLayout(FlowLayout.CENTER));
timePanel.add(new JLabel("Hour:"));
SpinnerModel hourModel = new HourModel(value.get(Calendar.HOUR_OF_DAY));
hour = new JSpinner(hourModel);
timePanel.add(hour);
timePanel.add(new JLabel("Minute:"));
SpinnerModel minuteModel = new MinuteModel((value.get(Calendar.MINUTE)/15)*15);
minute = new JSpinner(minuteModel);
timePanel.add(minute);
// timePanel.add(new JLabel("Second:"));
// SpinnerModel secondModel = new SpinnerNumberModel(0, 0, 60, 5);
// second = new JSpinner(secondModel);
// timePanel.add(second);
if(type != DATE) panel.add(timePanel);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
JButton cancel = new JButton("Cancel");
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
accepted = false;
dispose();
}
});
buttonPanel.add(cancel);
JButton ok = new JButton("Ok");
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
accepted = true;
Calendar date = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
date.setTime(calendarWidget.getDate());
value.set(date.get(Calendar.YEAR),
date.get(Calendar.MONTH),
date.get(Calendar.DAY_OF_MONTH)-1,
((Number)hour.getValue()).intValue(),
((Number)minute.getValue()).intValue());
dispose();
}
});
buttonPanel.add(ok);
panel.add(buttonPanel);
pack();
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((screen.width - getWidth()) / 2, (screen.height - getHeight()) / 2);
setVisible(true);
}
/**
* Test if the dialog was accepted.
* @return
*/
public boolean wasAccepted() {
return accepted;
}
/**
* Get the date/time from the dialog.
* @return
*/
public Date getValue() {
return value.getTime();
}
/**
* Custom hour spinner
*/
class HourModel extends SpinnerNumberModel {
public HourModel(int value) {
super(value, 0, 23, 1);
}
@Override
public Object getNextValue() {
Object value = super.getNextValue();
if(value == null) value = super.getMinimum();
return value;
}
@Override
public Object getPreviousValue() {
Object value = super.getPreviousValue();
if(value == null) value = super.getMaximum();
return value;
}
}
/**
* Custom minute spinner
*/
class MinuteModel extends SpinnerNumberModel {
public MinuteModel(int value) {
super(value, 0, 45, 15);
}
@Override
public Object getNextValue() {
Object value = super.getNextValue();
if(value == null) value = super.getMinimum();
return value;
}
@Override
public Object getPreviousValue() {
Object value = super.getPreviousValue();
if(value == null) value = super.getMaximum();
return value;
}
}
}