package net.sf.egonet.web.page; import java.util.List; import net.sf.egonet.web.component.FocusOnLoadBehavior; import net.sf.egonet.web.component.TextField; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.basic.MultiLineLabel; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.validation.IValidatable; import org.apache.wicket.validation.validator.AbstractValidator; import net.sf.egonet.model.Alter; import net.sf.egonet.model.Interview; import net.sf.egonet.model.Study; import net.sf.egonet.persistence.Alters; import net.sf.egonet.persistence.DB; import net.sf.egonet.persistence.Interviews; import net.sf.egonet.persistence.Studies; public class InterviewingAlterPromptPage extends InterviewingPage { private Interview interview; private TextField addAlterField; public InterviewingAlterPromptPage(Long interviewId) { super(interviewId); this.interview = Interviews.getInterview(interviewId); build(); setQuestionId(""); } public String toString() { return "Alter Prompt ("+getAlters().size()+")"; } public List<Alter> getAlters() { return Alters.getForInterview(interview.getId()); } public Integer getCurrentAlters() { return getAlters().size(); } public Study getStudy() { return Studies.getStudy(interview.getStudyId()); } private void build() { final Study study = getStudy(); add(new MultiLineLabel("alterPrompt",study.getAlterPrompt()).setEscapeModelStrings(false)); add(new FeedbackPanel("feedback")); Form form = new Form("form") { public void onSubmit() { Integer currentAlters = getCurrentAlters(); if(study.getMaxAlters() == null || currentAlters < study.getMaxAlters()) { DB.save(new Alter(interview,addAlterField.getText(),currentAlters)); addAlterField.setModelObject(""); } } }; addAlterField = new TextField("addAlterField", new Model("")); addAlterField.add(new AlterUniquenessValidator()); addAlterField.setRequired(true); addAlterField.add(new FocusOnLoadBehavior()); form.add(addAlterField); add(form); add(new Label("currentAlters", new PropertyModel(this,"currentAlters"))); final Integer minAlters = study.getMinAlters(); add(new Label("minAlters", minAlters == null ? "-" : minAlters+"")); Integer maxAlters = study.getMaxAlters(); add(new Label("maxAlters", maxAlters == null ? "-" : maxAlters+"")); Form nextQuestionForm = new Form("nextQuestionForm"); nextQuestionForm.add(new Button("nextQuestionButton") { public void onSubmit() { if(minAlters == null || ! (getCurrentAlters() < minAlters)) { setResponsePage( askNextUnanswered(interview.getId(), new InterviewingAlterPromptPage(interview.getId()))); } } }); add(nextQuestionForm); ListView alters = new ListView("alters", new PropertyModel(this,"alters")) { protected void populateItem(ListItem item) { final Alter alter = (Alter) item.getModelObject(); item.add(new Label("alterName", alter.getName())); item.add(new Label("alterPosition", Integer.toString(item.getIndex()+1))); Link deleteLink = new Link("alterDelete") { public void onClick() { Alters.delete(alter); } }; item.add(deleteLink); } }; add(alters); add(new Link("backwardLink") { public void onClick() { EgonetPage page = InterviewingEgoPage.askPrevious(interview.getId(),null, new InterviewingAlterPromptPage(interview.getId())); if(page != null) { setResponsePage(page); } } }); add(new Link("forwardLink") { public void onClick() { EgonetPage page = InterviewingAlterPage.askNext(interview.getId(),null,false, new InterviewingAlterPromptPage(interview.getId())); if(page != null) { setResponsePage(page); } } }); } public static EgonetPage askNextUnanswered(Long interviewId, EgonetPage comeFrom) { Study study = Studies.getStudyForInterview(interviewId); Integer alters = Alters.getForInterview(interviewId).size(); Boolean altersMeetRequirements = (study.getMinAlters() == null || ! (alters < study.getMinAlters())) && (study.getMaxAlters() == null || ! (alters > study.getMaxAlters())); if(! altersMeetRequirements) { return new InterviewingAlterPromptPage(interviewId); } if(alters < 1 && (study.getMaxAlters() == null || study.getMaxAlters() > 0)) { return new InterviewingAlterPromptPage(interviewId); } return InterviewingAlterPage.askNext(interviewId,null,true,comeFrom); // return InterviewingAlterPage.askNextNEW(interviewId,null,true,comeFrom); } private class AlterUniquenessValidator extends AbstractValidator { @Override protected void onValidate(IValidatable validatable) { String alterName = (String) validatable.getValue(); for(Alter alter : getAlters()) { if(alter.getName().equalsIgnoreCase(alterName)) { error(validatable); } } } @Override protected String resourceKey() { return "AlterUniquenessValidator"; } } }