com.googlecode.wicket.kendo.ui.form.datetime.AjaxDateTimePicker.java Source code

Java tutorial

Introduction

Here is the source code for com.googlecode.wicket.kendo.ui.form.datetime.AjaxDateTimePicker.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.googlecode.wicket.kendo.ui.form.datetime;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.convert.ConversionException;
import org.apache.wicket.util.convert.IConverter;
import org.apache.wicket.util.convert.converter.DateConverter;
import org.apache.wicket.validation.ValidationError;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.googlecode.wicket.jquery.core.JQueryBehavior;
import com.googlecode.wicket.jquery.core.Options;
import com.googlecode.wicket.jquery.core.ajax.IJQueryAjaxAware;
import com.googlecode.wicket.jquery.core.ajax.JQueryAjaxPostBehavior;
import com.googlecode.wicket.jquery.core.event.IValueChangedListener;
import com.googlecode.wicket.kendo.ui.ajax.OnChangeAjaxBehavior;

/**
 * Provides a datetime-picker based on a {@link AjaxDatePicker} and a {@link AjaxTimePicker}<br/>
 * This ajax version will post boht components, using a {@link JQueryAjaxPostBehavior}, when the 'change' javascript method is called.
 *
 * @author Sebastien Briquet - sebfz1
 */
public class AjaxDateTimePicker extends DateTimePicker implements IValueChangedListener {
    private static final long serialVersionUID = 1L;
    private static final Logger LOG = LoggerFactory.getLogger(AjaxDateTimePicker.class);

    /**
     * Constructor
     *
     * @param id the markup id
     */
    public AjaxDateTimePicker(String id) {
        super(id);
    }

    /**
     * Constructor
     *
     * @param id the markup id
     * @param locale the {@code Locale}
     */
    public AjaxDateTimePicker(String id, Locale locale) {
        super(id, locale);
    }

    /**
     * Constructor
     *
     * @param id the markup id
     * @param datePattern the SimpleDateFormat pattern for the date
     * @param timePattern the SimpleDateFormat pattern for the time
     */
    public AjaxDateTimePicker(String id, String datePattern, String timePattern) {
        super(id, datePattern, timePattern);
    }

    /**
     * constructor
     *
     * @param id the markup id
     * @param locale the {@code Locale}
     * @param datePattern the SimpleDateFormat pattern for the date
     * @param timePattern the SimpleDateFormat pattern for the time
     */
    public AjaxDateTimePicker(String id, Locale locale, String datePattern, String timePattern) {
        super(id, locale, datePattern, timePattern);
    }

    /**
     * Constructor
     *
     * @param id the markup id
     * @param model the date {@code IModel}
     */
    public AjaxDateTimePicker(String id, IModel<Date> date) {
        super(id, date);
    }

    /**
     * Constructor
     *
     * @param id the markup id
     * @param model the date {@code IModel}
     * @param locale the {@code LocalDate}
     */
    public AjaxDateTimePicker(String id, IModel<Date> date, Locale locale) {
        super(id, date, locale);
    }

    /**
     * Constructor
     *
     * @param id the markup id
     * @param model the date {@code IModel}
     * @param datePattern the SimpleDateFormat pattern for the date
     * @param timePattern the SimpleDateFormat pattern for the time
     */
    public AjaxDateTimePicker(String id, IModel<Date> date, String datePattern, String timePattern) {
        super(id, date, datePattern, timePattern);
    }

    /**
     * Main constructor
     *
     * @param id the markup id
     * @param model the date {@code IModel}
     * @param locale the {@code Locale}
     * @param datePattern the SimpleDateFormat pattern for the date
     * @param timePattern the SimpleDateFormat pattern for the time
     */
    public AjaxDateTimePicker(String id, IModel<Date> date, Locale locale, String datePattern, String timePattern) {
        super(id, date, locale, datePattern, timePattern);
    }

    // Methods //

    /**
     * Gets a formated value of input(s)<br/>
     * This method is designed to provide the 'value' argument of {@link IConverter#convertToObject(String, Locale)}
     *
     * @param dateInput the date input
     * @param timeInput the time input
     * @return a formated value
     */
    protected String formatInput(String dateInput, String timeInput) {
        if (this.isTimePickerEnabled()) {
            return String.format("%s %s", dateInput, timeInput);
        }

        return dateInput;
    }

    @Override
    public void convertInput() {
        final IConverter<Date> converter = this.getConverter(Date.class);

        String dateInput = this.datePicker.getInput();
        String timeInput = this.timePicker.getInput();

        try {
            String value = this.formatInput(dateInput, timeInput);
            this.setConvertedInput(converter.convertToObject(value, this.getLocale()));
        } catch (ConversionException e) {
            if (LOG.isDebugEnabled()) {
                LOG.debug(e.getMessage(), e);
            }

            ValidationError error = new ValidationError();
            error.addKey("AjaxDateTimePicker.ConversionError"); // wicket6
            error.setVariable("date", dateInput);
            error.setVariable("time", timeInput);

            this.error(error);
        }
    }

    // Properties //

    @Override
    @SuppressWarnings("unchecked")
    public <C> IConverter<C> getConverter(Class<C> type) {
        if (Date.class.isAssignableFrom(type)) {
            return (IConverter<C>) AjaxDateTimePicker.newConverter(this.getTextFormat());
        }

        return super.getConverter(type);
    }

    // Events //

    @Override
    public void onValueChanged(IPartialPageRequestHandler handler) {
        // noop
    }

    // Factories //

    /**
     * Gets a new {@link Date} {@link IConverter}.
     * 
     * @param format the time format
     * @return the converter
     */
    private static IConverter<Date> newConverter(final String pattern) {
        return new DateConverter() {

            private static final long serialVersionUID = 1L;

            @Override
            public DateFormat getDateFormat(Locale locale) {
                return new SimpleDateFormat(pattern, locale != null ? locale : Locale.getDefault());
            }
        };
    }

    @Override
    protected DatePicker newDatePicker(String id, IModel<Date> model, Locale locale, String datePattern,
            Options options) {
        return new AjaxDatePicker(id, model, locale, datePattern, options) {

            private static final long serialVersionUID = 1L;

            @Override
            public JQueryBehavior newWidgetBehavior(String selector) {
                IValueChangedListener listener = new IValueChangedListener() {

                    private static final long serialVersionUID = 1L;

                    @Override
                    public void onValueChanged(IPartialPageRequestHandler handler) {
                        AjaxDateTimePicker.this.processInput();
                        AjaxDateTimePicker.this.onValueChanged(handler);
                    }
                };

                return new DatePickerBehavior(selector, this.options, listener) {

                    private static final long serialVersionUID = 1L;

                    @Override
                    protected JQueryAjaxPostBehavior newOnChangeAjaxBehavior(IJQueryAjaxAware source) {
                        return new OnChangeAjaxBehavior(source, AjaxDateTimePicker.this.datePicker,
                                AjaxDateTimePicker.this.timePicker);
                    }
                };
            }
        };
    }

    @Override
    protected TimePicker newTimePicker(String id, IModel<Date> model, Locale locale, String timePattern,
            Options options) {
        return new AjaxTimePicker(id, model, locale, timePattern, options) {

            private static final long serialVersionUID = 1L;

            @Override
            public JQueryBehavior newWidgetBehavior(String selector) {
                IValueChangedListener listener = new IValueChangedListener() {

                    private static final long serialVersionUID = 1L;

                    @Override
                    public void onValueChanged(IPartialPageRequestHandler handler) {
                        AjaxDateTimePicker.this.processInput();
                        AjaxDateTimePicker.this.onValueChanged(handler);
                    }
                };

                return new TimePickerBehavior(selector, this.options, listener) {

                    private static final long serialVersionUID = 1L;

                    @Override
                    protected JQueryAjaxPostBehavior newOnChangeAjaxBehavior(IJQueryAjaxAware source) {
                        return new OnChangeAjaxBehavior(source, AjaxDateTimePicker.this.datePicker,
                                AjaxDateTimePicker.this.timePicker);
                    }
                };
            }
        };
    }
}