package fr.openwide.core.wicket.more.markup.html.form; import java.math.BigDecimal; import java.math.RoundingMode; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.util.convert.IConverter; import fr.openwide.core.wicket.markup.html.form.FormComponentHelper; import fr.openwide.core.wicket.more.markup.html.basic.PercentageBigDecimalConverter; import fr.openwide.core.wicket.more.markup.html.basic.PercentageValidator; public class PercentageTextField extends TextField<BigDecimal> { private static final long serialVersionUID = -3071860178961793589L; private static final int DEFAULT_SCALE = 2; private static final RoundingMode DEFAULT_ROUNDING_MODE = RoundingMode.HALF_UP; private static final int DEFAULT_MAX_PRECISION = 6; private boolean modelIsRatio; public PercentageTextField(String id, IModel<BigDecimal> model, String fieldName) { this(id, model, fieldName, true); } public PercentageTextField(String id, IModel<BigDecimal> model, String fieldName, boolean modelIsRatio) { super(id, model, BigDecimal.class); this.modelIsRatio = modelIsRatio; FormComponentHelper.setLabel(this, fieldName); addValidator(); if (getRoundingMode() == null) { throw new IllegalArgumentException("The roundingMode parameter must not be null."); } } @SuppressWarnings("unchecked") @Override public <C> IConverter<C> getConverter(Class<C> type) { if (BigDecimal.class.isAssignableFrom(type)) { return (IConverter<C>) new PercentageBigDecimalConverter( getScale(), getRoundingMode(), getMaxPrecision(), modelIsRatio); } else { return super.getConverter(type); } } protected void addValidator() { if (modelIsRatio) { this.add(PercentageValidator.getDefaultPercentageAsRatioValidator()); } else { this.add(PercentageValidator.getDefaultPercentageValidator()); } } protected int getScale() { return DEFAULT_SCALE; } protected RoundingMode getRoundingMode() { return DEFAULT_ROUNDING_MODE; } protected int getMaxPrecision() { return DEFAULT_MAX_PRECISION; } }