package org.nocket.component.form;
import java.util.Locale;
import java.util.Map;
import org.apache.wicket.markup.html.form.NumberTextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.convert.ConversionException;
import org.apache.wicket.util.convert.IConverter;
import org.apache.wicket.util.lang.Classes;
import org.apache.wicket.util.lang.Objects;
import org.apache.wicket.validation.ValidationError;
/**
* At present Firefox and IE fail to support the html5 input fields with type number. The w3c demands, that the browsers job is to convert the
* number in a number field to the locale defined in the browser. <br>
* Because of this, the DMDNumberTextField doesn't support input fields with type number. It uses input fields with type text and the the locale
* that is stored in the component or page or session.
*
* @author meis026
*
* @param <N>
*/
public class DMDNumberTextField<N extends Number & Comparable<N>> extends NumberTextField<N> {
private static final long serialVersionUID = 1L;
public DMDNumberTextField(String id, IModel<N> model, Class<N> type) {
super(id, model, type);
}
public DMDNumberTextField(String wicketId) {
super(wicketId);
}
@Override
protected String getInputType()
{
return "text";
}
@Override
protected String getModelValue()
{
Number value = getModelObject();
if (value == null)
{
return "";
}
else
{
IConverter<Number> converter = (IConverter<Number>) getConverter(value.getClass());
if (converter != null) {
return converter.convertToString(value, this.getLocale());
} else {
return Objects.stringValue(value);
}
}
}
/**
* Always use locale from component or page or component to parse the input.
*/
@Override
protected void convertInput()
{
IConverter<N> converter = getConverter(getNumberType());
try
{
// use locale from component or page or session
setConvertedInput(converter.convertToObject(getInput(), this.getLocale()));
} catch (ConversionException e)
{
ValidationError error = new ValidationError();
if (e.getResourceKey() != null)
{
error.addMessageKey(e.getResourceKey());
}
if (e.getTargetType() != null)
{
error.addMessageKey("ConversionError." + Classes.simpleName(e.getTargetType()));
}
error.addMessageKey("ConversionError");
final Locale locale = e.getLocale();
if (locale != null)
{
error.setVariable("locale", locale);
}
error.setVariable("exception", e);
Map<String, Object> variables = e.getVariables();
if (variables != null)
{
error.getVariables().putAll(variables);
}
error(error);
}
}
protected Class<N> getNumberType()
{
Class<N> numberType = getType();
if (numberType == null && getModelObject() != null)
{
numberType = (Class<N>) getModelObject().getClass();
}
return numberType;
}
}