/* (c) 2016 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.web.wicket; import java.text.NumberFormat; import java.text.ParseException; 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; /** * A TextField for {@code java.lang.Double} representation as a percentage. * * @author Jody Garnett (Boundless) */ public class PercentageTextField extends TextField<Double> { private static final long serialVersionUID = -4589385113632745745L; private int maximumFractionDigits = 1; private IConverter<Double> percentConverter = new IConverter<Double>() { private static final long serialVersionUID = -8409029711658542273L; @Override public String convertToString(Double value, Locale locale) { NumberFormat format = formatter(locale); return value == null? null : format.format(value); } @Override public Double convertToObject(String value, Locale locale) { if (value == null || value.trim().length() == 0) { return null; } if( !value.endsWith("%")){ value += "%"; } NumberFormat format = formatter(locale); Number parsed; try { parsed = format.parse(value); } catch (ParseException e) { error(e.getMessage()); return null; } return Double.valueOf(parsed.doubleValue()); } }; public PercentageTextField(String id) { super(id, Double.class); } public PercentageTextField(String id, IModel<Double> model) { super(id, model, Double.class); } private NumberFormat formatter(Locale locale) { NumberFormat format = NumberFormat.getPercentInstance(locale); format.setMaximumFractionDigits(maximumFractionDigits); return format; } public void setMaximumFractionDigits(int maximumFractionDigits) { this.maximumFractionDigits = maximumFractionDigits; } @SuppressWarnings("unchecked") @Override public <C> IConverter<C> getConverter(Class<C> type) { if( Double.class.isAssignableFrom(type)){ return (IConverter<C>) percentConverter; } return super.getConverter(type); } }