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.Expressions;
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 com.google.common.base.Function;
import com.google.common.collect.Lists;
public class CompoundExpressionEditorPanel extends Panel {
private Expression expression;
private Form form;
private TextField expressionNameField;
private CheckboxesPanel<Expression> expressionValueField;
private Model expressionOperatorModel;
public CompoundExpressionEditorPanel(String id, Expression expression) {
super(id);
this.expression = expression;
if(! expression.getType().equals(Expression.Type.Compound)) {
throw new RuntimeException(
"Trying to use a compound expression editor for an expression of type "+
expression.getType());
}
build();
}
@SuppressWarnings("unchecked")
private void build() {
form = new Form("form");
form.add(new Label("editorLegend", "Compound expression"));
form.add(new FeedbackPanel("feedback"));
expressionNameField = new TextField("expressionNameField", new Model(expression.getName()));
expressionNameField.setRequired(true);
expressionNameField.add(new FocusOnLoadBehavior());
form.add(expressionNameField);
expressionOperatorModel = new Model(expression.getOperator());
DropDownChoice expressionOperatorField = new DropDownChoice(
"expressionOperatorField",
expressionOperatorModel,
expression.allowedOperators());
expressionOperatorField.setRequired(true);
form.add(expressionOperatorField);
List<Expression> allExpressions = Expressions.forStudy(expression.getStudyId());
List<Expression> selectedExpressions = Lists.newArrayList();
for(Expression expression : allExpressions) {
for(Long expressionId : (List<Long>) this.expression.getValue()) {
if(expression.getId().equals(expressionId)) {
selectedExpressions.add(expression);
}
}
}
expressionValueField = new CheckboxesPanel<Expression>(
"expressionValueField", allExpressions, selectedExpressions) {
protected String showItem(Expression expression) {
return expression.getName();
}
};
form.add(expressionValueField);
form.add(
new Button("saveExpression")
{
@Override
public void onSubmit()
{
expression.setName(expressionNameField.getText());
expression.setOperator((Expression.Operator) expressionOperatorModel.getObject());
List<Expression> selectedOptions = expressionValueField.getSelected();
List<Long> selectedIds = Lists.transform(selectedOptions,
new Function<Expression,Long>() {
public Long apply(Expression expression) {
return expression.getId();
}
});
expression.setValue(selectedIds);
DB.save(expression);
form.setVisible(false);
}
}
);
add(form);
}
}