/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.navigator.ui.dialog;
import Sirius.navigator.resource.ResourceManager;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.AbstractButton;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JToggleButton;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import de.cismet.tools.gui.StaticSwingTools;
/**
* Dies ist ein Dialog ueber den ein Datum ausgewaehlt werden kann.
*
* @author Pascal Dihe
* @version 1.0 erstellt am 01.03.2000
*/
public class DateChooser extends JDialog {
//~ Static fields/initializers ---------------------------------------------
private static final ResourceManager resources = ResourceManager.getManager();
//~ Instance fields --------------------------------------------------------
private final String[] days = new String[7];
private final String[] months = new String[12];
private int minYear = 1900;
private Calendar calendar;
private JSpinner yearList;
private JComboBox monthComboBox;
private JToggleButton dayButton;
private JToggleButton selectedDayButton;
private JPanel dayPanel;
private JButton cancelButton;
private JButton acceptButton;
private int selectedYear;
private int selectedMonth;
private int selectedDay;
private GridBagConstraints constraints;
private boolean accept = false;
private ActionListener actionListener = new ButtonListener();
//~ Constructors -----------------------------------------------------------
/**
* Creates a new DateChooser object.
*/
public DateChooser() {
this(new JFrame(),
org.openide.util.NbBundle.getMessage(DateChooser.class, "DateChooser.title")); // NOI18N
}
/**
* Creates a new DateChooser object.
*
* @param parent Das Parent Window des DateChoosers.
* @param title Der Titel des DateChoosers.
*/
public DateChooser(final JDialog parent, final String title) {
super(parent, title, true);
reset();
initDateChooser();
}
/**
* Creates a new DateChooser object.
*
* @param parent DOCUMENT ME!
* @param title DOCUMENT ME!
*/
public DateChooser(final JFrame parent, final String title) {
super(parent, title, true);
reset();
initDateChooser();
}
/**
* Creates a new DateChooser object.
*
* @param parent DOCUMENT ME!
* @param title DOCUMENT ME!
* @param date DOCUMENT ME!
*/
public DateChooser(final JDialog parent, final String title, final Date date) {
super(parent, title, true);
setDate(date);
initDateChooser();
}
/**
* Creates a new DateChooser object.
*
* @param parent DOCUMENT ME!
* @param title DOCUMENT ME!
* @param date DOCUMENT ME!
*/
public DateChooser(final JFrame parent, final String title, final Date date) {
super(parent, title, true);
setDate(date);
initDateChooser();
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*/
protected void initDateChooser() {
days[0] = this.getLocalizedDay(1);
days[1] = this.getLocalizedDay(2);
days[2] = this.getLocalizedDay(3);
days[3] = this.getLocalizedDay(4);
days[4] = this.getLocalizedDay(5);
days[5] = this.getLocalizedDay(6);
days[6] = this.getLocalizedDay(7);
months[0] = this.getLocalizedMonth(Calendar.JANUARY);
months[1] = this.getLocalizedMonth(Calendar.FEBRUARY);
months[2] = this.getLocalizedMonth(Calendar.MARCH);
months[3] = this.getLocalizedMonth(Calendar.APRIL);
months[4] = this.getLocalizedMonth(Calendar.MAY);
months[5] = this.getLocalizedMonth(Calendar.JUNE);
months[6] = this.getLocalizedMonth(Calendar.JULY);
months[7] = this.getLocalizedMonth(Calendar.AUGUST);
months[8] = this.getLocalizedMonth(Calendar.SEPTEMBER);
months[9] = this.getLocalizedMonth(Calendar.OCTOBER);
months[10] = this.getLocalizedMonth(Calendar.NOVEMBER);
months[11] = this.getLocalizedMonth(Calendar.DECEMBER);
this.setDefaultCloseOperation(this.DO_NOTHING_ON_CLOSE);
this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
constraints = new GridBagConstraints();
final JPanel controls = new JPanel();
controls.setLayout(new BoxLayout(controls, BoxLayout.X_AXIS));
// Monate =============================================================
monthComboBox = new JComboBox(months);
monthComboBox.setSelectedIndex(selectedMonth);
monthComboBox.addItemListener(new MonthSelectionListener());
controls.add(Box.createHorizontalStrut(4));
controls.add(monthComboBox);
// Jahre ==============================================================
yearList = new JSpinner(new SpinnerNumberModel(selectedYear, minYear, selectedYear, 1));
((JSpinner.NumberEditor)yearList.getEditor()).getFormat().setDecimalSeparatorAlwaysShown(false);
yearList.addChangeListener(new YearSelectionListener());
controls.add(Box.createHorizontalStrut(20));
controls.add(yearList);
controls.add(Box.createHorizontalStrut(4));
controls.setBorder(new EmptyBorder(10, 10, 0, 10));
this.getContentPane().add(controls);
// Tage Ueberschrift ==================================================
final JPanel dayHeadingPanel = new JPanel();
dayHeadingPanel.setLayout(new GridBagLayout());
constraints.insets = new Insets(0, 2, 2, 2);
constraints.anchor = GridBagConstraints.CENTER;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridheight = 1;
constraints.gridwidth = 1;
constraints.weightx = 1.0;
constraints.weighty = 1.0;
constraints.gridx = 0;
constraints.gridy = 0;
JLabel dayLabel;
for (int i = 0; i < days.length; i++) {
dayLabel = new JLabel(days[i]);
dayLabel.setPreferredSize(new Dimension(30, 30));
dayLabel.setHorizontalAlignment(JLabel.CENTER);
dayHeadingPanel.add(dayLabel, constraints);
constraints.gridx++;
}
dayHeadingPanel.setBorder(new EmptyBorder(0, 10, 0, 10));
this.getContentPane().add(dayHeadingPanel);
// Tage ===============================================================
dayPanel = new JPanel();
dayPanel.setLayout(new GridBagLayout());
updateDays();
dayPanel.setBorder(new EmptyBorder(0, 10, 0, 10));
this.getContentPane().add(dayPanel);
// Buttons ============================================================
final JPanel buttons = new JPanel();
final GridLayout gl = new GridLayout(1, 2);
gl.setHgap(10);
buttons.setLayout(gl);
acceptButton = new JButton(org.openide.util.NbBundle.getMessage(
DateChooser.class,
"DateChooser.acceptButton.title")); // NOI18N
acceptButton.setActionCommand("apply"); // NOI18N
acceptButton.addActionListener(actionListener);
cancelButton = new JButton(org.openide.util.NbBundle.getMessage(
DateChooser.class,
"DateChooser.cancelButton.title")); // NOI18N
cancelButton.setActionCommand("cancel"); // NOI18N
cancelButton.addActionListener(actionListener);
buttons.add(acceptButton);
buttons.add(cancelButton);
buttons.setBorder(new EmptyBorder(10, 20, 10, 20));
this.getContentPane().add(buttons);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean isDateAccepted() {
return accept;
}
/**
* DOCUMENT ME!
*/
protected void updateDays() {
dayPanel.removeAll();
final Calendar cday = (Calendar)calendar.clone();
cday.set(selectedYear, selectedMonth, 1);
constraints.insets = new Insets(0, 2, 2, 2);
constraints.anchor = GridBagConstraints.CENTER;
constraints.fill = GridBagConstraints.BOTH;
constraints.gridheight = 1;
constraints.gridwidth = 1;
constraints.weightx = 1.0;
constraints.weighty = 1.0;
constraints.gridx = 0;
constraints.gridy = 0;
constraints.weighty = 1.0;
// die Woche beginnt hier mit Montag, gridx bei 0 deshalb -2.
if ((cday.get(Calendar.DAY_OF_WEEK) - 2) == -1) {
constraints.gridx = 6;
} else {
constraints.gridx = cday.get(Calendar.DAY_OF_WEEK) - 2;
}
while (cday.get(Calendar.MONTH) == selectedMonth) {
if (cday.get(Calendar.DAY_OF_MONTH) == selectedDay) {
dayButton = new JToggleButton(Integer.toString(calendar.get(Calendar.DATE)), true);
dayButton.setSelected(true);
selectedDayButton = dayButton;
} else {
dayButton = new JToggleButton(Integer.toString(cday.get(Calendar.DATE)));
}
dayButton.setHorizontalTextPosition(AbstractButton.CENTER);
dayButton.setVerticalTextPosition(AbstractButton.CENTER);
dayButton.setHorizontalAlignment(AbstractButton.CENTER);
dayButton.setVerticalAlignment(AbstractButton.CENTER);
dayButton.setPreferredSize(new Dimension(30, 30));
dayButton.setMargin(new Insets(1, 1, 1, 1));
dayButton.setActionCommand("day"); // NOI18N
dayButton.addActionListener(actionListener);
dayPanel.add(dayButton, constraints);
constraints.gridx++;
if (constraints.gridx > 6) {
constraints.gridy++;
constraints.gridx = 0;
}
cday.add(Calendar.DAY_OF_MONTH, 1);
}
dayPanel.validate();
dayPanel.repaint();
this.validate();
this.doLayout();
}
/**
* Ueberlaedt toString() und liefert das ausgewaehlte Datum.
*/
/*public String toString()
* { String ret = selectedDay + ". " + getMonthName(this.calendar) + " " + selectedYear; return ret;}*/
public void reset() {
calendar = Calendar.getInstance();
selectedYear = calendar.get(Calendar.YEAR);
selectedMonth = calendar.get(Calendar.MONTH);
selectedDay = calendar.get(Calendar.DAY_OF_MONTH);
}
/**
* Liefert das ausgewaehlte Datum als "Date".
*
* @return Das ausgewaehlte Datum.
*/
public Date getDate() {
return calendar.getTime();
}
/**
* DOCUMENT ME!
*
* @param date DOCUMENT ME!
*/
public void setDate(final Date date) {
calendar = Calendar.getInstance();
calendar.setTime(date);
selectedYear = calendar.get(Calendar.YEAR);
selectedMonth = calendar.get(Calendar.MONTH);
selectedDay = calendar.get(Calendar.DAY_OF_MONTH);
yearList.setValue(new Integer(selectedYear));
monthComboBox.setSelectedIndex(selectedMonth);
this.updateDays();
}
@Override
public void show() {
this.updateDays();
this.pack();
// NOTE: This call can not be substituted by StaticSwingTools.showDialog(this) because
// show() method overwrites JDialog.show(). StaticSwingTools.showDialog() calls
// setVisible(true) which internally calls JDialog show() -> endless recursion if
// StaticSwingTools.showDialog() is called here
super.show();
}
/**
* DOCUMENT ME!
*
* @param date DOCUMENT ME!
*/
public void show(final Date date) {
this.setDate(date);
this.pack();
StaticSwingTools.showDialog(this);
}
/**
* DOCUMENT ME!
*
* @param calendarMonth DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getLocalizedMonth(final int calendarMonth) {
Date date = null;
String monthName = null;
final Calendar cal = Calendar.getInstance();
cal.set(2004, calendarMonth, 1);
date = cal.getTime();
final SimpleDateFormat dateF = new SimpleDateFormat("MMMM"); // NOI18N
monthName = dateF.format(date);
return monthName;
}
/**
* DOCUMENT ME!
*
* @param calendarDay DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getLocalizedDay(final int calendarDay) {
Date date = null;
String dayName = null;
final Calendar cal = Calendar.getInstance();
cal.set(2001, 0, calendarDay);
date = cal.getTime();
final SimpleDateFormat dateF = new SimpleDateFormat("E"); // NOI18N
dayName = dateF.format(date);
return dayName;
}
/**
* .........................................................................
*
* @param args DOCUMENT ME!
*/
public static void main(final String[] args) {
final DateChooser dc = new DateChooser();
((JSpinner.NumberEditor)dc.yearList.getEditor()).getFormat().applyPattern("#"); // NOI18N
System.out.println(dc.yearList.getEditor().getClass());
dc.show();
System.out.println(new SimpleDateFormat().format(dc.getDate()));
System.exit(0);
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class YearSelectionListener implements ChangeListener {
//~ Methods ------------------------------------------------------------
@Override
public void stateChanged(final ChangeEvent e) {
final Calendar tmpCalendar = (Calendar)calendar.clone();
selectedYear = ((Integer)yearList.getValue()).intValue();
// In einem Schaltjahr hat der Februar 29 Tage. Ist der 29.
// Februar ausgewaehlt und es wird ein Jahr selektiert das kein
// Schaltjahr ist, muss der 28. Februar ausgewaehlt werden.
tmpCalendar.set(selectedYear, selectedMonth, 1);
// NavigatorLogger.printMessage(tmpCalendar.getActualMaximum(calendar.DAY_OF_MONTH));
if (selectedDay > tmpCalendar.getActualMaximum(calendar.DAY_OF_MONTH)) {
selectedDay = tmpCalendar.getActualMaximum(calendar.DAY_OF_MONTH);
}
calendar.set(selectedYear, selectedMonth, selectedDay);
updateDays();
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class MonthSelectionListener implements ItemListener {
//~ Methods ------------------------------------------------------------
@Override
public void itemStateChanged(final ItemEvent ie) {
if (ie.getStateChange() == ItemEvent.SELECTED) {
final Calendar tmpCalendar = (Calendar)calendar.clone();
selectedMonth = monthComboBox.getSelectedIndex();
// Wenn der 31. Tag eines Monats ausgewaehlt ist und es wird ein
// Monat selektiert, der nur 30 Tage hat, wird der letzte Tag dieses
// Monats ausgewaehlt, also der 30.
tmpCalendar.set(selectedYear, selectedMonth, 1);
// NavigatorLogger.printMessage(tmpCalendar.getActualMaximum(calendar.DAY_OF_MONTH));
if (selectedDay > tmpCalendar.getActualMaximum(calendar.DAY_OF_MONTH)) {
selectedDay = tmpCalendar.getActualMaximum(calendar.DAY_OF_MONTH);
}
calendar.set(selectedYear, selectedMonth, selectedDay);
updateDays();
}
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class ButtonListener implements ActionListener {
//~ Methods ------------------------------------------------------------
@Override
public void actionPerformed(final ActionEvent e) {
if (e.getActionCommand().equals("day")) // NOI18N
{
if (e.getSource() instanceof JToggleButton) {
selectedDayButton.setSelected(false);
selectedDayButton = (JToggleButton)e.getSource();
selectedDayButton.setSelected(true);
final Integer intTmp = new Integer(selectedDayButton.getText());
selectedDay = intTmp.intValue();
calendar.set(selectedYear, selectedMonth, selectedDay);
dayPanel.repaint();
}
} else if (e.getActionCommand().equals("cancel")) // NOI18N
{
accept = false;
// reset();
// updateDays();
DateChooser.this.setVisible(false);
DateChooser.this.dispose();
} else if (e.getActionCommand().equals("apply")) // NOI18N
{
accept = true;
DateChooser.this.setVisible(false);
DateChooser.this.dispose();
}
}
}
}