package net.sf.gazpachoquest.questionnaires.components.question.type; import javax.inject.Inject; import net.sf.gazpachoquest.dto.answers.Answer; import net.sf.gazpachoquest.dto.answers.NoAnswer; import net.sf.gazpachoquest.dto.answers.NumericAnswer; import net.sf.gazpachoquest.questionnaires.components.question.AbstractQuestionComponent; import net.sf.gazpachoquest.questionnaires.components.util.CustomIntegerRangeValidator; import net.sf.gazpachoquest.questionnaires.events.AnswerSavedEvent; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.vaadin.addon.cdiproperties.annotation.LabelProperties; import org.vaadin.addon.cdiproperties.annotation.TextFieldProperties; import com.vaadin.data.Validator; import com.vaadin.data.Validator.InvalidValueException; import com.vaadin.event.FieldEvents.TextChangeEvent; import com.vaadin.event.FieldEvents.TextChangeListener; import com.vaadin.server.UserError; import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.ui.Label; import com.vaadin.ui.TextField; public class NumericQuestion extends AbstractQuestionComponent implements TextChangeListener { private static final long serialVersionUID = 53070631753820596L; private static Logger logger = LoggerFactory.getLogger(NumericQuestion.class); @Inject @LabelProperties(contentMode = ContentMode.HTML) private Label questionTitle; @Inject @TextFieldProperties(maxLength = 50, nullRepresentation = "", nullSettingAllowed = true, immediate = true) private TextField answerField; public NumericQuestion() { super(); } @Override public void init() { questionTitle.setValue(String.format("<b>%d</b>. %s", questionDTO.getNumber(), questionDTO .getLanguageSettings().getTitle())); content.addComponent(questionTitle); answerField.addTextChangeListener(this); if (questionDTO.getAnswer() instanceof NumericAnswer) { answerField.setValue(String.valueOf(((NumericAnswer) questionDTO.getAnswer()).getValue())); } answerField.addValidator(new CustomIntegerRangeValidator("{0} is not a valid number", 0, null)); // answerField.setConverter(new StringToIntegerConverter()); content.addComponent(answerField); } @Override public void textChange(TextChangeEvent event) { String newValue = event.getText(); logger.debug("Text Change Event fired in {} with text = {}", NumericQuestion.class.getSimpleName(), newValue); if (isValid(answerField, newValue)) { String questionCode = questionDTO.getCode(); Answer answer = null; if (StringUtils.isEmpty(newValue)) { answer = NoAnswer.create(); } else { answer = NumericAnswer.fromValue(Integer.parseInt(newValue)); } answerSavedEvent.fire(AnswerSavedEvent.with().questionCode(questionCode).answer(answer).build()); answerField.setComponentError(null); } } public boolean isValid(TextField field, String newValue) { boolean valid = true; if (StringUtils.isBlank(newValue)) { if (field.isRequired()) { valid = false; } } else { for (Validator v : field.getValidators()) { try { v.validate(newValue); } catch (InvalidValueException e) { valid = false; logger.warn(e.getMessage()); answerField.setComponentError(new UserError(e.getMessage())); } } } if (valid) { answerField.setComponentError(null); } return valid; } }