package no.ntnu.fp.gui.timepicker;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.DateFormat;
import java.util.Date;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JTextField;
import no.ntnu.fp.util.StringHelper;
import no.ntnu.fp.util.TimeLord;
public class DateTimePicker extends JPanel implements PropertyChangeListener {
private final static String[] MONTH_NAMES = { "Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desemeber" };
private JButton prevMonthButton;
private JLabel monthLabel;
private JButton nextMonthButton;
private CalendarPanel calendar;
private JTextField hourField;
private JTextField minuteField;
private JButton button;
private DateModel model;
private JTextField field;
public DateTimePicker(JTextField field) {
this.field = field;
model = new DateModel();
model.setHours(12);
model.setMinutes(00);
model.setSeconds(00);
setLayout(new BorderLayout());
JPanel top = new JPanel();
prevMonthButton = new JButton("<");
prevMonthButton.setPreferredSize(new Dimension(20,20));
prevMonthButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int month = model.getMonth();
model.setMonth((month - 1));
}
});
top.add(prevMonthButton);
monthLabel = new JLabel(MONTH_NAMES[model.getMonth()]);
monthLabel.setPreferredSize(new Dimension(70, 20));
top.add(monthLabel);
nextMonthButton = new JButton(">");
nextMonthButton.setPreferredSize(new Dimension(20,20));
nextMonthButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int month = model.getMonth();
model.setMonth(month + 1);
}
});
top.add(nextMonthButton);
add(top, BorderLayout.NORTH);
calendar = new CalendarPanel(model);
add(calendar, BorderLayout.CENTER);
JPanel bottom = new JPanel();
hourField = new JTextField(2);
hourField.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
String hour = hourField.getText();
try{
model.setHours(Integer.parseInt(hour));
} catch (NumberFormatException ex) {}
}
});
hourField.requestFocus();
bottom.add(hourField);
bottom.add(new JLabel(":"));
minuteField = new JTextField(2);
minuteField.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
String minute = minuteField.getText();
try{
model.setMinutes(Integer.parseInt(minute));
} catch (NumberFormatException ex) {}
}
});
bottom.add(minuteField);
button = new JButton("OK");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});
bottom.add(button);
add(bottom, BorderLayout.SOUTH);
setBorder(BorderFactory.createLineBorder(Color.BLACK));
model.addPropertyChangeListener(this);
update();
}
private void updatePanel() {
if (model != null) {
int month = model.getMonth();
monthLabel.setText(MONTH_NAMES[month]);
int hours = model.getHours();
hourField.setText(StringHelper.nullPaddNumber(hours));
int minutes = model.getMinutes();
minuteField.setText(StringHelper.nullPaddNumber(minutes));
}
}
private void updateField() {
if (model != null) {
field.setText(TimeLord.formatDate(model.getDate()));
}
}
public void setModel(DateModel date) {
if (date != null) {
if (model != null) {
model.removePropertyChangeListener(this);
}
model = date;
model.addPropertyChangeListener(this);
updatePanel();
}
}
public DateModel getModel() {
return model;
}
public void setDate(Date date) {
model.setDate(date);
}
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton button = new JButton();
JTextField field = new JTextField(20);
field.addFocusListener(new TimePickableFieldListener(field, frame));
panel.add(button);
panel.add(field);
frame.setPreferredSize(new Dimension (400, 400));
frame.setContentPane(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
update();
}
private void update() {
updatePanel();
updateField();
}
}