package fr.openwide.core.wicket.more.markup.html.form; import java.util.Date; import java.util.List; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.model.IModel; import org.apache.wicket.util.convert.IConverter; import org.apache.wicket.validation.validator.DateValidator; import org.wicketstuff.wiquery.ui.datepicker.DateOption; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import fr.openwide.core.wicket.more.util.IDatePattern; import fr.openwide.core.wicket.more.util.convert.converters.CascadingConverter; import fr.openwide.core.wicket.more.util.convert.converters.PatternDateConverter; public class DatePicker extends org.wicketstuff.wiquery.ui.datepicker.DatePicker<Date> { private static final long serialVersionUID = 8051575483617364457L; private static final String AUTOCOMPLETE_ATTRIBUTE = "autocomplete"; private static final String AUTOCOMPLETE_ATTRIBUTE_OFF_VALUE = "off"; private IConverter<Date> converter; private IDatePattern datePattern; private List<IDatePattern> datePatternsToTryBefore = Lists.newArrayList(); private List<IDatePattern> datePatternsToTryAfter = Lists.newArrayList(); private boolean isAutocompleteActive; public DatePicker(String id, IModel<Date> model, IDatePattern datePattern) { this(id, model, datePattern, false); } public DatePicker(String id, IModel<Date> model, IDatePattern datePattern, boolean isAutocompleteActive) { super(id, model, Date.class); this.datePattern = datePattern; this.isAutocompleteActive = isAutocompleteActive; // Options par défaut setShowButtonPanel(true); } public DatePicker addDatePatternToTryBefore(IDatePattern datePatternToTryBefore) { datePatternsToTryBefore.add(datePatternToTryBefore); return this; } public DatePicker addDatePatternToTryAfter(IDatePattern datePatternToTryAfter) { datePatternsToTryAfter.add(datePatternToTryAfter); return this; } public DatePicker setRange(Date minDate, Date maxDate) { if (minDate != null) { setMinDate(new DateOption(minDate)); } if (maxDate != null) { setMaxDate(new DateOption(maxDate)); } add(new DateValidator(minDate, maxDate)); return this; } @Override public void onInitialize() { super.onInitialize(); this.setDateFormat(getString(datePattern.getJavascriptPatternKey())); } @SuppressWarnings("unchecked") @Override public <C> IConverter<C> getConverter(Class<C> type) { if (Date.class.isAssignableFrom(type)) { if (converter == null) { converter = createConverter(); } return (IConverter<C>) converter; } else { return super.getConverter(type); } } private IConverter<Date> createConverter() { IConverter<Date> mainConverter = new PatternDateConverter(datePattern, getString(datePattern.getJavaPatternKey())); if (datePatternsToTryAfter.isEmpty() && datePatternsToTryBefore.isEmpty()) { return mainConverter; } else { ImmutableList.Builder<IConverter<Date>> preemptiveConverters = ImmutableList.builder(); for (IDatePattern datePatternToTryBefore : datePatternsToTryBefore) { preemptiveConverters.add(new PatternDateConverter(datePatternToTryBefore, getString(datePatternToTryBefore.getJavaPatternKey()))); } ImmutableList.Builder<IConverter<Date>> alternativeConverters = ImmutableList.builder(); for (IDatePattern datePatternToTryAfter : datePatternsToTryAfter) { alternativeConverters.add(new PatternDateConverter(datePatternToTryAfter, getString(datePatternToTryAfter.getJavaPatternKey()))); } return new CascadingConverter<>(mainConverter, preemptiveConverters.build(), alternativeConverters.build()); } } @Override protected void detachModel() { super.detachModel(); converter = null; } @Override protected void onComponentTag(ComponentTag tag) { super.onComponentTag(tag); if (!isAutocompleteActive) { tag.put(AUTOCOMPLETE_ATTRIBUTE, AUTOCOMPLETE_ATTRIBUTE_OFF_VALUE); } } @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); response.render(JavaScriptHeaderItem.forReference(DatePickerOverrideJavaScriptResourceReference.get())); } }