All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.lyonesgamer.propertygrid.properties.DateProperty Maven / Gradle / Ivy

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;
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy