package org.nocket.gen.page.visitor.bind.builder.components; import gengui.guiadapter.DateSynchronizer; import java.util.Date; import org.apache.commons.lang.StringUtils; import org.apache.wicket.Component; import org.apache.wicket.extensions.yui.calendar.DatePicker; import org.apache.wicket.markup.html.form.AbstractTextComponent.ITextFormatProvider; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.util.convert.ConversionException; import org.apache.wicket.util.convert.IConverter; import org.nocket.gen.domain.WebDomainProperties; import org.nocket.gen.page.element.PageElementI; import org.nocket.gen.page.element.synchronizer.SynchronizerHelper; public class GeneratedDateTextField extends TextField<Date> implements ITextFormatProvider { private static final long serialVersionUID = 1L; protected String datePattern; protected IConverter<Date> converter = null; @SuppressWarnings("unchecked") public GeneratedDateTextField(PageElementI<?> e) { super(e.getWicketId(), (IModel<Date>) e.getModel()); } /** * Minimal constructor expecting second initialization phase by a call of * postInit. This is of interest for the creation of customized derivations */ public GeneratedDateTextField(String wicketId) { super(wicketId); } public void postInit(PageElementI<?> e) { this.setDefaultModel(e.getModel()); datePattern = extractDateFormat(e); if (new SynchronizerHelper(e).isAssisted()) { // The default implementation of DatePicker has a different logic for // enabling. That's why we are using a derivation here. DatePicker picker = new DatePicker() { @Override public boolean isEnabled(Component component) { return component.isEnabled(); } }; picker.setAutoHide(true); add(picker); } } private static String extractDateFormat(PageElementI<?> e) { String format = new SynchronizerHelper(e).getFormat(); if (format == null) { // Get the default from the gengui.properties format = new WebDomainProperties().getDateFormat(); return StringUtils.isNotBlank(format) ? format : DateSynchronizer.defaultOutFormat; } else { return format; } } @Override public String getTextFormat() { return datePattern; } public void setConverter(IConverter<Date> converter) { this.converter = converter; } public IConverter<Date> getConverter() { return this.converter; } @SuppressWarnings("unchecked") @Override public <C> IConverter<C> getConverter(Class<C> clazz) { if (Date.class.isAssignableFrom(clazz)) { converter = createConverter(); return (IConverter<C>) converter; } else { return super.getConverter(clazz); } } @Override protected Date convertValue(String[] values) throws ConversionException { String value = (values != null && values.length > 0 ? StringUtils.trimToNull(values[0]) : null); if (value == null) { return null; } return getConverter(Date.class).convertToObject(value, this.getLocale()); } private IConverter<Date> createConverter() { return new YearCorrectingDateConverter(datePattern); } }