package fr.openwide.core.wicket.more.markup.html.form;
import java.util.Date;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.convert.IConverter;
import org.wicketstuff.wiquery.core.javascript.JsQuery;
import org.wicketstuff.wiquery.ui.datepicker.DateOption;
import org.wicketstuff.wiquery.ui.widget.WidgetJavaScriptResourceReference;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.monthpicker.MonthPickerJavaScriptResourceReference;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.monthpicker.MonthPickerLanguageResourceReference;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.monthpicker.MonthPickerOptions;
import fr.openwide.core.wicket.more.util.DatePattern;
import fr.openwide.core.wicket.more.util.convert.converters.PatternDateConverter;
public class MonthPicker extends TextField<Date> {
private static final long serialVersionUID = -573676335913472856L;
private final DatePattern monthPattern;
private final MonthPickerOptions options;
private IConverter<Date> converter;
public MonthPicker(String id, IModel<Date> model, DatePattern monthPattern) {
super(id, model, Date.class);
this.monthPattern = monthPattern;
this.options = new MonthPickerOptions(this);
}
@Override
public void onInitialize() {
super.onInitialize();
this.setDateFormat(getString(monthPattern.getJavascriptPatternKey()));
}
@SuppressWarnings("unchecked")
@Override
public <C> IConverter<C> getConverter(Class<C> type) {
if (Date.class.isAssignableFrom(type)) {
if (converter == null) {
converter = new PatternDateConverter(monthPattern, getString(monthPattern.getJavaPatternKey()));
}
return (IConverter<C>) converter;
} else {
return super.getConverter(type);
}
}
public MonthPicker setDateFormat(String dateFormat) {
options.setDateFormat(dateFormat);
return this;
}
public MonthPicker setYearRange(String yearRange) {
options.setYearRange(yearRange);
return this;
}
public MonthPicker setMinDate(DateOption minDate) {
options.setMinDate(minDate);
return this;
}
public MonthPicker setMaxDate(DateOption maxDate) {
options.setMaxDate(maxDate);
return this;
}
@Override
protected void detachModel() {
super.detachModel();
options.detach();
converter = null;
}
@Override
public void renderHead(IHeaderResponse response) {
response.render(JavaScriptHeaderItem.forReference(WidgetJavaScriptResourceReference.get()));
response.render(JavaScriptHeaderItem.forReference(MonthPickerJavaScriptResourceReference.get()));
MonthPickerLanguageResourceReference mpl = MonthPickerLanguageResourceReference.get(getLocale());
if (mpl != null) {
response.render(JavaScriptHeaderItem.forReference(mpl));
}
response.render(OnDomReadyHeaderItem.forScript(new JsQuery(this).$()
.chain("monthpicker", options.getJavaScriptOptions()).render().toString()));
}
}