package net.sf.egonet.web.panel;
import java.util.List;
import net.sf.egonet.model.Expression;
import net.sf.egonet.persistence.DB;
import net.sf.egonet.persistence.Questions;
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.form.Button;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.validation.validator.PatternValidator;
import com.google.common.collect.Lists;
public class TextExpressionEditorPanel extends Panel {
private Expression expression;
private Form form;
private TextField expressionNameField;
private TextField expressionValueField;
private Model expressionOperatorModel;
private Model expressionUnansweredModel;
private Boolean textual;
private Boolean numerical;
public TextExpressionEditorPanel(String id, Expression expression) {
super(id);
this.expression = expression;
this.textual = expression.getType().equals(Expression.Type.Text);
this.numerical = expression.getType().equals(Expression.Type.Number);
if(! (textual || numerical)) {
throw new RuntimeException(
"Trying to use a text/number expression editor for an expression of type "+
expression.getType());
}
build();
}
private void build() {
form = new Form("form");
form.add(new Label("editorLegend",
"Expression about " +
(numerical ? "numerical" : "textual") + " question: " +
Questions.getQuestion(expression.getQuestionId()).getTitle()));
form.add(new FeedbackPanel("feedback"));
expressionNameField = new TextField("expressionNameField", new Model(expression.getName()));
expressionNameField.setRequired(true);
expressionNameField.add(new FocusOnLoadBehavior());
form.add(expressionNameField);
form.add(new Label("expressionOperatorPreface",
"Expression is true for an answer that"+(numerical ? " is" : "")));
expressionOperatorModel = new Model(expression.getOperator());
DropDownChoice expressionOperatorField = new DropDownChoice(
"expressionOperatorField",
expressionOperatorModel,
expression.allowedOperators());
expressionOperatorField.setRequired(true);
form.add(expressionOperatorField);
expressionValueField = new TextField("expressionValueField", new Model(
textual ?
(String) expression.getValue() :
(expression.getValue() == null ? "" : expression.getValue()+""))
);
if(numerical) {
expressionValueField.setRequired(true);
expressionValueField.add(new PatternValidator("[0-9]+"));
}
form.add(expressionValueField);
expressionUnansweredModel = new Model(expression.getResultForUnanswered());
List<Boolean> expressionUnansweredOptions = Lists.newArrayList(false,true);
DropDownChoice expressionUnansweredField = new DropDownChoice(
"expressionUnansweredField",
expressionUnansweredModel,
expressionUnansweredOptions);
expressionUnansweredField.setRequired(true);
form.add(expressionUnansweredField);
form.add(
new Button("saveExpression")
{
@Override
public void onSubmit()
{
expression.setName(expressionNameField.getText());
expression.setOperator((Expression.Operator) expressionOperatorModel.getObject());
String value = expressionValueField.getText();
expression.setValue(value == null ? "" : value);
expression.setResultForUnanswered((Boolean) expressionUnansweredModel.getObject());
DB.save(expression);
form.setVisible(false);
}
}
);
add(form);
}
}