package com.gitblit.wicket; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import org.apache.wicket.Session; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.form.AbstractTextComponent.ITextFormatProvider; import org.apache.wicket.model.IModel; import org.apache.wicket.util.convert.IConverter; import org.apache.wicket.util.convert.converters.DateConverter; public class Html5DateField extends TextField implements ITextFormatProvider { private static final long serialVersionUID = 1L; private static final String DEFAULT_PATTERN = "MM/dd/yyyy"; private String datePattern = null; private IConverter converter = null; /** * Creates a new Html5DateField, without a specified pattern. This is the same as calling * new Html5DateField(id, Date.class) * * @param id * The id of the date field */ public Html5DateField(String id) { this(id, null, defaultDatePattern()); } /** * Creates a new Html5DateField, without a specified pattern. This is the same as calling * new Html5DateField(id, object, Date.class) * * @param id * The id of the date field * @param model * The model */ public Html5DateField(String id, IModel model) { this(id, model, defaultDatePattern()); } /** * Creates a new Html5DateField bound with a specific SimpleDateFormat pattern. * * @param id * The id of the date field * @param datePattern * A SimpleDateFormat pattern * */ public Html5DateField(String id, String datePattern) { this(id, null, datePattern); } /** * Creates a new DateTextField bound with a specific SimpleDateFormat pattern. * * @param id * The id of the date field * @param model * The model * @param datePattern * A SimpleDateFormat pattern */ public Html5DateField(String id, IModel model, String datePattern) { super(id, model, Date.class); this.datePattern = datePattern; converter = new DateConverter() { private static final long serialVersionUID = 1L; /** * @see org.apache.wicket.util.convert.converters.DateConverter#getDateFormat(java.util.Locale) */ @Override public DateFormat getDateFormat(Locale locale) { if (locale == null) { locale = Locale.getDefault(); } return new SimpleDateFormat(Html5DateField.this.datePattern, locale); } }; } /** * Returns the default converter if created without pattern; otherwise it returns a * pattern-specific converter. * * @param type * The type for which the converter should work * * @return A pattern-specific converter */ @Override public IConverter getConverter(Class type) { if (converter == null) { return super.getConverter(type); } else { return converter; } } /** * Returns the date pattern. * * @see org.apache.wicket.markup.html.form.AbstractTextComponent.ITextFormatProvider#getTextFormat() */ public String getTextFormat() { return datePattern; } /** * Try to get datePattern from user session locale. If it is not possible, it will return * {@link #DEFAULT_PATTERN} * * @return date pattern */ private static String defaultDatePattern() { Locale locale = Session.get().getLocale(); if (locale != null) { DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, locale); if (format instanceof SimpleDateFormat) { return ((SimpleDateFormat)format).toPattern(); } } return DEFAULT_PATTERN; } @Override protected String getInputType() { return "date"; } }