package fr.openwide.core.wicket.more.markup.html.form; import java.math.BigDecimal; import java.text.NumberFormat; import java.util.Locale; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.util.convert.IConverter; import org.apache.wicket.util.convert.converter.BigDecimalConverter; import org.apache.wicket.validation.IValidator; import org.apache.wicket.validation.validator.RangeValidator; import fr.openwide.core.wicket.markup.html.form.FormComponentHelper; public class PositiveBigDecimalTextField extends TextField<BigDecimal> { private static final long serialVersionUID = 183668115931774497L; private static final PositiveBigDecimalConverter DEFAULT_CONVERTER = new PositiveBigDecimalConverter(); private IConverter<BigDecimal> customConverter; private static final IValidator<BigDecimal> MINIMUM_VALIDATOR = RangeValidator.minimum(BigDecimal.ZERO); public PositiveBigDecimalTextField(String id, IModel<BigDecimal> model, String fieldName) { this(id, model, fieldName, null); } public PositiveBigDecimalTextField(String id, IModel<BigDecimal> model, String fieldName, IConverter<BigDecimal> customConverter) { super(id, model, BigDecimal.class); add(MINIMUM_VALIDATOR); FormComponentHelper.setLabel(this, fieldName); this.customConverter = customConverter; } @SuppressWarnings("unchecked") @Override public <C> IConverter<C> getConverter(Class<C> type) { if (BigDecimal.class.isAssignableFrom(type)) { if (customConverter != null) { return (IConverter<C>) customConverter; } else { return (IConverter<C>) DEFAULT_CONVERTER; } } else { return super.getConverter(type); } } /** * custom converter to disable grouping (thousand separator) in text fields */ private static class PositiveBigDecimalConverter implements IConverter<BigDecimal> { private static final long serialVersionUID = 5045582390770004920L; private static final BigDecimalConverter WICKET_CONVERTER = new BigDecimalConverter(); @Override public BigDecimal convertToObject(String value, Locale locale) { return WICKET_CONVERTER.convertToObject(value, locale); } @Override public String convertToString(BigDecimal value, Locale locale) { NumberFormat numberFormat = NumberFormat.getNumberInstance(locale); numberFormat.setGroupingUsed(false); return numberFormat.format((BigDecimal) value); } } }