com.lyonesgamer.propertygrid.properties.DateProperty Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of JPropertyGrid Show documentation
Show all versions of JPropertyGrid Show documentation
A property editor component for Swing.
The newest version!
package com.lyonesgamer.propertygrid.properties;
import com.lyonesgamer.propertygrid.PGProperty;
import com.toedter.calendar.JDateChooser;
import org.joda.time.DateTime;
import javax.swing.*;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.util.*;
import java.util.List;
/**
* A property representing a datetime (using Joda Time).
*/
public class DateProperty extends PGProperty {
/**
* The date-time represented by this property.
*/
protected DateTime value;
/**
* The control to allow editing of the value.
*/
protected DateEditor editor = new DateEditor();
/**
* The control to render this value.
*/
protected DateRenderer renderer = new DateRenderer();
/**
* Creates a new date property.
*
* @param name The name of this property in the display.
* @param value The value initially held by this property.
*/
public DateProperty(String name, DateTime value) {
super(name);
this.value = value;
}
@Override
protected void doAfterAdded() {}
/**
* Returns true because any value held in a DateTime is valid.
*
* @param value The value to be validated.
* @return If the value is valid for this type.
*/
@Override
public boolean onValidateValue(DateTime value) {
return true;
}
@Override
public void onSetValue(DateTime value) {
if (parent != null)
parent.firePropertyChangeEvent(this, value);
this.value = value;
}
/**
* Parses the string into a datetime based on ISO 8601. See {@link org.joda.time.DateTime#parse(String)} for more details.
*
* @param value The string to attempt to set from.
*/
@Override
public void setValueFromString(String value) {
setValue(DateTime.parse(value));
}
/**
* Sets the value to a datetime with the given number of milliseconds from 1/1/1970 00:00:00.
*
* @param value The long to set this value from.
*/
@Override
public void setValueFromLong(long value) {
setValue(new DateTime(value));
}
@Override
public DateTime getValue() {
return value;
}
/**
* Parses the string into a datetime based on ISO 8601. See {@link org.joda.time.DateTime#parse(String)} for more details.
*
* @param value The value to convert to a value type of this property.
* @return The datetime this string represents.
*/
@Override
public DateTime stringToValue(String value) {
return DateTime.parse(value);
}
/**
* Returns a datetime with the given number of milliseconds from 1/1/1970 00:00:00.
*
* @param value The value to convert to a value type of this property.
* @return A datetime from this long.
*/
@Override
public DateTime longToValue(long value) {
return new DateTime(value);
}
/**
* Converts this value to a string representation, which is ISO 8601, i.e. "YYYY-MM-DD'T'hh:mm:ss'Z'+zz:zz.", such
* as "1970-01-01T00:00:00Z+02:00".
*
* @param value The value to convert.
* @return A string representing this date.
*/
@Override
public String valueToString(DateTime value) {
return value.toString();
}
@Override
public PGCellRenderer getRenderer() {
return renderer;
}
@Override
public PGCellEditor getEditor() {
return editor;
}
protected class DateEditor extends JDateChooser implements PGCellEditor {
//No need to use an EventListenerList if we only have one listener type
protected final List listeners = new ArrayList<>();
protected final Set listenersToRemove = new HashSet<>();
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
this.setDate(getValue().toDate());
return this;
}
@Override
public void propertyChange(PropertyChangeEvent event) {
super.propertyChange(event);
onSetValue(new DateTime(this.getDate()));
}
@Override
public Object getCellEditorValue() {
return valueToString(getValue());
}
@Override
public boolean isCellEditable(EventObject anEvent) {
return !disabled;
}
@Override
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
@Override
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}
@Override
public void cancelCellEditing() {
fireEditingCancelled();
}
public void fireEditingCancelled() {
ChangeEvent event = new ChangeEvent(this);
for (CellEditorListener l : listeners)
l.editingCanceled(event);
doClearListeners();
}
public void fireEditingStopped() {
ChangeEvent event = new ChangeEvent(this);
for (CellEditorListener l : listeners)
l.editingStopped(event);
doClearListeners();
}
@Override
public void addCellEditorListener(CellEditorListener l) {
listeners.add(l);
}
@Override
public void removeCellEditorListener(CellEditorListener l) {
listenersToRemove.add(l);
}
protected void doClearListeners() {
listeners.removeAll(listenersToRemove);
listenersToRemove.clear();
}
}
protected class DateRenderer extends JDateChooser implements PGCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
setDate(getValue().toDate());
setToolTipText(helpString);
return this;
}
}
}