package org.vaadin.viritin.v7.fields; import java.lang.reflect.Field; import java.util.logging.Level; import java.util.logging.Logger; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import com.vaadin.v7.data.Validator; import com.vaadin.v7.data.validator.BeanValidator; /** * * @author Matti Tahvonen */ public class IntegerSliderField extends IntegerField { private static final long serialVersionUID = -3019209950602573361L; private Integer max; private Integer min; private Integer step; public IntegerSliderField() { setHtmlFieldType("range"); } @Override public void addValidator(Validator validator) { super.addValidator(validator); if (validator instanceof BeanValidator) { BeanValidator beanValidator = (BeanValidator) validator; // If there is a bean validator and Max/Min values, uses them // automatically on the client side as well try { // Don't ask why I did this like this... Field propertyNameField = BeanValidator.class.getDeclaredField("propertyName"); propertyNameField.setAccessible(true); String fieldName = propertyNameField.get(beanValidator).toString(); Field beanClass = BeanValidator.class.getDeclaredField("beanClass"); beanClass.setAccessible(true); Class<?> beantype = (Class<?>) beanClass.get(beanValidator); Field field = beantype.getDeclaredField(fieldName); field.setAccessible(true); Max maxAnnotation = field.getAnnotation(Max.class); if(maxAnnotation != null) { setMax((int) maxAnnotation.value()); } Min minAnnotation = field.getAnnotation(Min.class); if(minAnnotation != null) { setMin((int) minAnnotation.value()); } } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) { Logger.getLogger(IntegerSliderField.class.getName()). log(Level.SEVERE, null, ex); } } } public Integer getMax() { return max; } public void setMax(Integer max) { this.max = max; } public IntegerSliderField withMax(Integer min) { setMax(min); return this; } public Integer getMin() { return min; } public void setMin(Integer min) { this.min = min; } public IntegerSliderField withMin(Integer min) { setMin(min); return this; } public Integer getStep() { return step; } public void setStep(Integer step) { this.step = step; } public IntegerSliderField withStep(Integer step) { setStep(step); return this; } @Override protected void configureHtmlElement() { super.configureHtmlElement(); if(max != null) { s.setProperty("max", max.toString()); } if(min != null) { s.setProperty("min", min.toString()); } if(step != null) { s.setProperty("step", step.toString()); } } @Override public IntegerSliderField withCaption(String caption) { return (IntegerSliderField) super.withCaption(caption); } }