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);
}
}