package de.elatexam.editor.components.panels.tasks.mc; import java.util.List; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.markup.html.form.IFormModelUpdateListener; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.form.validation.AbstractFormValidator; import org.apache.wicket.markup.html.form.validation.IFormValidator; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.validation.validator.MinimumValidator; import de.elatexam.editor.components.panels.tasks.SubtaskSpecificsInputPanel; import de.elatexam.model.McSubTaskDef; import de.elatexam.model.McSubTaskDef.McSubTaskDefAnswerDefinitionsItem; import de.elatexam.model.McSubTaskDef.Type; /** * @author Steffen Dienst * */ public class McSubtaskDefInputPanel extends SubtaskSpecificsInputPanel<McSubTaskDef> implements IFormModelUpdateListener { private final MCAnswersInputPanel mcAnswers; final TextField<Integer> numanswersInput, minCorrectAnswers, maxCorrectAnswers; public McSubtaskDefInputPanel(final String id, final IModel<McSubTaskDef> model) { super(id, model); boolean showMoveButtons = model.getObject().isPreserveOrderOfAnswers(); mcAnswers = new MCAnswersInputPanel("answers", new PropertyModel<List<McSubTaskDef.McSubTaskDefAnswerDefinitionsItem>>(model, "answerDefinitionsItems"), model.getObject().getCategory(), showMoveButtons); add(mcAnswers.setOutputMarkupId(true)); add(new AjaxCheckBox("preserveOrderOfAnswers") { @Override protected void onUpdate(AjaxRequestTarget target) { mcAnswers.setMoveButtonsVisible(getModelObject()); target.add(mcAnswers); } }); numanswersInput = new TextField<Integer>("displayedAnswers"); numanswersInput.add(new MinimumValidator<Integer>(1)); add(numanswersInput); // TODO add validator (min<=max, min >0, max<=#answers) add(minCorrectAnswers = new TextField<Integer>("minCorrectAnswers")); minCorrectAnswers.add(new MinimumValidator<Integer>(1)); add(maxCorrectAnswers = new TextField<Integer>("maxCorrectAnswers")); } /* * (non-Javadoc) * * @see de.elatexam.editor.components.panels.tasks.SubtaskSpecificsInputPanel#getFormValidator() */ @Override public IFormValidator getFormValidator() { return new AbstractFormValidator() { @Override public void validate(Form<?> form) { Integer numAnswers = numanswersInput.getConvertedInput(); Integer min = minCorrectAnswers.getConvertedInput(); Integer max = maxCorrectAnswers.getConvertedInput(); if (min > numAnswers) minCorrectAnswers.error("Es gibt insgesamt nur " + numAnswers + " Antworten, Minimum muss also kleiner sein!"); if (max > numAnswers) maxCorrectAnswers.error("Es gibt insgesamt nur " + numAnswers + " Antworten, Maximum muss also kleiner sein!"); if (max < min) maxCorrectAnswers.error("Maximum ist kleiner als Minimum."); } @Override public FormComponent<?>[] getDependentFormComponents() { return new FormComponent<?>[] { numanswersInput, minCorrectAnswers, maxCorrectAnswers }; } }; } /* * (non-Javadoc) * * @see org.apache.wicket.markup.html.form.IFormModelUpdateListener#updateModel() */ @Override public void updateModel() { // XXX make the mc a single choice taskdef iff there is just one correct answer McSubTaskDef mc = (McSubTaskDef) getDefaultModelObject(); int correct = 0; for (McSubTaskDefAnswerDefinitionsItem answer : mc.getAnswerDefinitionsItems()) if (answer.getItemCorrect() != null) correct++; if (correct == 1) mc.setCategory(Type.SINGLE_SELECT); else mc.setCategory(Type.MULTIPLE_SELECT); } }