/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* DefaultBindableTimestampChooser.java
*
* Created on 01.04.2009, 16:36:50
*/
package de.cismet.cids.editors;
import net.sf.jasperreports.engine.design.events.PropagationChangeListener;
import org.jdesktop.beansbinding.Converter;
import org.jdesktop.beansbinding.Validator;
import org.jdesktop.swingx.calendar.SingleDaySelectionModel;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import de.cismet.cids.editors.converters.SqlTimestampToUtilDateConverter;
import de.cismet.tools.gui.log4jquickconfig.Log4JQuickConfig;
/**
* DOCUMENT ME!
*
* @author thorsten
* @version $Revision$, $Date$
*/
public class DefaultBindableTimestampChooser extends javax.swing.JPanel implements Bindable {
//~ Static fields/initializers ---------------------------------------------
public static final String PROP_TIMESTAMP = "timestamp"; // NOI18N
public static final String CARDS_CHOOSE = "chooseTimestamp"; // NOI18N
public static final String CARDS_CREATE = "createTimestamp"; // NOI18N
//~ Instance fields --------------------------------------------------------
Calendar mainC = Calendar.getInstance();
private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
// private Date timestamp;
private Date date;
private Date time;
private PropertyChangeSupport propertyChangeSupport;
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnCreateTimestamp;
private javax.swing.JFormattedTextField jFormattedTextField1;
private org.jdesktop.swingx.JXDatePicker jXDatePicker1;
private javax.swing.JPanel panChooseTimestamp;
private javax.swing.JPanel panCreateTimestamp;
private org.jdesktop.beansbinding.BindingGroup bindingGroup;
// End of variables declaration//GEN-END:variables
//~ Constructors -----------------------------------------------------------
/**
* Creates new form DefaultBindableTimestampChooser.
*/
public DefaultBindableTimestampChooser() {
mainC.setTimeInMillis(0);
initComponents();
jXDatePicker1.getMonthView().setSelectionModel(new SingleDaySelectionModel());
setTimestamp(null);
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public PropertyChangeSupport getPropertyChangeSupport() {
if (propertyChangeSupport == null) {
propertyChangeSupport = new PropertyChangeSupport(this);
}
return propertyChangeSupport;
}
/**
* Get the value of timestamp.
*
* @return the value of timestamp
*/
public Date getTimestamp() {
try {
final Calendar dateC = Calendar.getInstance();
dateC.setTimeInMillis(0);
if (date != null) {
dateC.setTime(date);
}
final int day = dateC.get(Calendar.DAY_OF_MONTH);
final int month = dateC.get(Calendar.MONTH);
final int year = dateC.get(Calendar.YEAR);
final Calendar timeC = Calendar.getInstance();
timeC.setTimeInMillis(0);
if (time != null) {
timeC.setTime(time);
}
final int hour = timeC.get(Calendar.HOUR_OF_DAY);
final int minute = timeC.get(Calendar.MINUTE);
mainC.set(year, month, day, hour, minute);
return mainC.getTime();
} catch (Exception e) {
if (log.isDebugEnabled()) {
log.debug("Error while fetching timestamp" + e); // NOI18N
}
return null;
}
}
/**
* Set the value of timestamp.
*
* @param timestamp new value of timestamp
*/
public void setTimestamp(final Date timestamp) {
if (log.isDebugEnabled()) {
log.debug("setTimestamp: " + timestamp); // NOI18N
}
if (timestamp == null) {
((CardLayout)getLayout()).show(this, CARDS_CREATE);
} else {
((CardLayout)getLayout()).show(this, CARDS_CHOOSE);
}
try {
final Date oldTimestamp = mainC.getTime();
if (timestamp != null) {
mainC.setTime(timestamp);
}
final int day = mainC.get(Calendar.DAY_OF_MONTH);
final int month = mainC.get(Calendar.MONTH);
final int year = mainC.get(Calendar.YEAR);
final Calendar dateCal = Calendar.getInstance();
dateCal.setTimeInMillis(0);
dateCal.set(year, month, day);
final int hour = mainC.get(Calendar.HOUR_OF_DAY);
final int minute = mainC.get(Calendar.MINUTE);
final Calendar timeCal = Calendar.getInstance();
timeCal.setTimeInMillis(0);
timeCal.set(0, 0, 0, hour, minute);
date = dateCal.getTime();
time = timeCal.getTime();
getPropertyChangeSupport().firePropertyChange(PROP_TIMESTAMP, null, getTimestamp());
bindingGroup.unbind();
bindingGroup.bind();
} catch (Throwable t) {
if (log.isDebugEnabled()) {
log.debug("setTimestamp failed", t); // NOI18N
}
}
}
/**
* Add PropertyChangeListener.
*
* @param listener DOCUMENT ME!
*/
@Override
public void addPropertyChangeListener(final PropertyChangeListener listener) {
if (listener != null) {
getPropertyChangeSupport().addPropertyChangeListener(listener);
}
}
/**
* Remove PropertyChangeListener.
*
* @param listener DOCUMENT ME!
*/
@Override
public void removePropertyChangeListener(final PropertyChangeListener listener) {
getPropertyChangeSupport().removePropertyChangeListener(listener);
}
/**
* This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The
* content of this method is always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
bindingGroup = new org.jdesktop.beansbinding.BindingGroup();
panCreateTimestamp = new javax.swing.JPanel();
btnCreateTimestamp = new javax.swing.JButton();
panChooseTimestamp = new javax.swing.JPanel();
jXDatePicker1 = new org.jdesktop.swingx.JXDatePicker();
jFormattedTextField1 = new javax.swing.JFormattedTextField();
setOpaque(false);
setLayout(new java.awt.CardLayout());
panCreateTimestamp.setLayout(new java.awt.BorderLayout());
btnCreateTimestamp.setText(org.openide.util.NbBundle.getMessage(
DefaultBindableTimestampChooser.class,
"DefaultBindableTimestampChooser.btnCreateTimestamp.text")); // NOI18N
btnCreateTimestamp.setToolTipText(org.openide.util.NbBundle.getMessage(
DefaultBindableTimestampChooser.class,
"DefaultBindableTimestampChooser.btnCreateTimestamp.toolTipText")); // NOI18N
btnCreateTimestamp.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
btnCreateTimestampActionPerformed(evt);
}
});
panCreateTimestamp.add(btnCreateTimestamp, java.awt.BorderLayout.CENTER);
add(panCreateTimestamp, "createTimestamp");
panChooseTimestamp.setOpaque(false);
panChooseTimestamp.setLayout(new java.awt.GridBagLayout());
org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE,
this,
org.jdesktop.beansbinding.ELProperty.create("${date}"),
jXDatePicker1,
org.jdesktop.beansbinding.BeanProperty.create("date"));
bindingGroup.addBinding(binding);
binding.setValidator(new DateValidator());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
panChooseTimestamp.add(jXDatePicker1, gridBagConstraints);
jFormattedTextField1.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(
new javax.swing.text.DateFormatter(java.text.DateFormat.getTimeInstance(java.text.DateFormat.SHORT))));
jFormattedTextField1.setMinimumSize(new java.awt.Dimension(80, 28));
jFormattedTextField1.setPreferredSize(new java.awt.Dimension(80, 28));
binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE,
this,
org.jdesktop.beansbinding.ELProperty.create("${time}"),
jFormattedTextField1,
org.jdesktop.beansbinding.BeanProperty.create("value"));
bindingGroup.addBinding(binding);
binding.setValidator(new TimeValidator());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
panChooseTimestamp.add(jFormattedTextField1, gridBagConstraints);
add(panChooseTimestamp, "chooseTimestamp");
bindingGroup.bind();
} // </editor-fold>//GEN-END:initComponents
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void btnCreateTimestampActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnCreateTimestampActionPerformed
setTimestamp(Calendar.getInstance().getTime());
} //GEN-LAST:event_btnCreateTimestampActionPerformed
@Override
public String getBindingProperty() {
return "timestamp"; // NOI18N
}
@Override
public Converter getConverter() {
return new SqlTimestampToUtilDateConverter();
}
@Override
public Validator getValidator() {
return null;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Date getDate() {
return date;
}
/**
* DOCUMENT ME!
*
* @param date DOCUMENT ME!
*/
public void setDate(final Date date) {
if (log.isDebugEnabled()) {
log.debug("setDate: " + date); // NOI18N
}
this.date = date;
getPropertyChangeSupport().firePropertyChange(PROP_TIMESTAMP, null, getTimestamp());
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Date getTime() {
return time;
}
@Override
public Object getNullSourceValue() {
return null;
}
@Override
public Object getErrorSourceValue() {
return null;
}
/**
* DOCUMENT ME!
*
* @param time DOCUMENT ME!
*/
public void setTime(final Date time) {
if (log.isDebugEnabled()) {
log.debug("setTime: " + time); // NOI18N
}
this.time = time;
getPropertyChangeSupport().firePropertyChange(PROP_TIMESTAMP, null, getTimestamp());
}
/**
* DOCUMENT ME!
*
* @param args DOCUMENT ME!
*/
public static void main(final String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame jf = new JFrame();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.getContentPane().setLayout(new BorderLayout());
jf.setSize(400, 200);
final DefaultBindableTimestampChooser dc = new DefaultBindableTimestampChooser();
// dc.setTimestamp(Calendar.getInstance().getTime());
final JButton cmd = new JButton(
org.openide.util.NbBundle.getMessage(
DefaultBindableTimestampChooser.class,
"DefaultBindableTimestampChooser.main(String).Runnable.run().cmd")); // NOI18N
cmd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
dc.setTimestamp(null);
}
});
jf.getContentPane().add(dc, BorderLayout.NORTH);
jf.getContentPane().add(cmd, BorderLayout.SOUTH);
jf.setVisible(true);
}
});
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
class DateValidator extends Validator<Date> {
//~ Methods ------------------------------------------------------------
@Override
public Result validate(final Date value) {
if (log.isDebugEnabled()) {
log.debug("DateValidator validate: " + value); // NOI18N
}
if (value == null) {
jXDatePicker1.setDate(date);
return new Result(null, "Date is null"); // NOI18N
}
return null;
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
class TimeValidator extends Validator<Date> {
//~ Methods ------------------------------------------------------------
@Override
public Result validate(final Date value) {
if (log.isDebugEnabled()) {
log.debug("TimeValidator validate: " + value); // NOI18N
}
if (value == null) {
return new Result(null, "Time is null"); // NOI18N
}
return null;
}
}
}