package sushi.application.components.form; import java.io.Serializable; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import sushi.event.SushiEventType; import sushi.notification.SushiCondition; /** * This Component can be used to let the user define a condition. * It contains an AttributeSelect and a ValueSelect. At the moment only "=" is possible, but this could be extended. * Correspond with this Component by setting the attribute "selectedEventTypes". This will update the attributes and values. */ public class ConditionInputPanel extends Panel { private DropDownChoice<String> conditionAttributeSelect; private DropDownChoice<Serializable> conditionValueSelect; private String selectedConditionAttribute; private List<SushiEventType> selectedEventTypes = new ArrayList<SushiEventType>(); private String selectedConditionValue; private TextField<String> conditionValueTextField; private Label conditionValueLabel; public ConditionInputPanel(String id, boolean isConditionValueTextFieldVisible) { super(id); Form<Void> layoutForm = new Form<Void>("layoutForm"); add(layoutForm); conditionAttributeSelect = new DropDownChoice<String>("conditionAttributeSelect", new PropertyModel<String>(this, "selectedConditionAttribute"), new ArrayList<String>()); conditionAttributeSelect.setOutputMarkupId(true); conditionAttributeSelect.add(new AjaxFormComponentUpdatingBehavior("onChange"){ @Override protected void onUpdate(AjaxRequestTarget target) { //collect all attributes Set<Serializable> attributes = new HashSet<Serializable>(); for (SushiEventType eventType : selectedEventTypes) { attributes.addAll(eventType.findAttributeValues(selectedConditionAttribute)); } ArrayList<Serializable> choices = new ArrayList<Serializable>(); choices.add(null); choices.addAll(attributes); conditionValueSelect.setChoices(choices); target.add(conditionValueSelect); } }); layoutForm.add(conditionAttributeSelect); conditionValueSelect = new DropDownChoice<Serializable>("conditionValueSelect", new PropertyModel<Serializable>(this, "selectedConditionValue"), new ArrayList<Serializable>()); conditionValueSelect.setOutputMarkupId(true); conditionValueSelect.add(new AjaxFormComponentUpdatingBehavior("onChange"){ @Override protected void onUpdate(AjaxRequestTarget target) { target.add(conditionValueSelect); if (selectedConditionValue != null && !selectedConditionValue.isEmpty()) { conditionValueTextField.setEnabled(false); } else { conditionValueTextField.setEnabled(true); } target.add(conditionValueTextField); } }); layoutForm.add(conditionValueSelect); conditionValueLabel = new Label("conditionValueLabel", "or"); conditionValueLabel.setVisible(isConditionValueTextFieldVisible); layoutForm.add(conditionValueLabel); conditionValueTextField = new TextField<String>("conditionValueTextField", new Model<String>()); conditionValueTextField.setOutputMarkupId(true); OnChangeAjaxBehavior onChangeAjaxBehavior = new OnChangeAjaxBehavior() { private static final long serialVersionUID = -5737941362786901904L; @Override protected void onUpdate(AjaxRequestTarget target) { if (conditionValueTextField.getModelObject() != null && !conditionValueTextField.getModelObject().isEmpty()) { conditionValueSelect.setEnabled(false); } else { conditionValueSelect.setEnabled(true); } target.add(conditionValueSelect); } }; conditionValueTextField.add(onChangeAjaxBehavior); conditionValueTextField.setVisible(isConditionValueTextFieldVisible); layoutForm.add(conditionValueTextField); } public DropDownChoice<String> getConditionAttributeSelect() { return conditionAttributeSelect; } public void setConditionAttributeSelect(DropDownChoice<String> conditionAttributeSelect) { this.conditionAttributeSelect = conditionAttributeSelect; } public DropDownChoice<Serializable> getConditionValueSelect() { return conditionValueSelect; } public void setConditionValueSelect(DropDownChoice<Serializable> conditionValueSelect) { this.conditionValueSelect = conditionValueSelect; } public String getSelectedConditionAttribute() { return selectedConditionAttribute; } public void setSelectedConditionAttribute(String selectedConditionAttribute) { this.selectedConditionAttribute = selectedConditionAttribute; } public List<SushiEventType> getSelectedEventTypes() { return selectedEventTypes; } public void setSelectedEventTypes(List<SushiEventType> selectedEventTypes) { this.selectedEventTypes = selectedEventTypes; updateAttributesValues(); } public void addSelectedEventTypes(List<SushiEventType> selectedEventTypes) { this.selectedEventTypes = selectedEventTypes; updateAttributesValues(); } public void addSelectedEventType(SushiEventType selectedEventType) { this.selectedEventTypes.add(selectedEventType); updateAttributesValues(); } public void clearSelectedEventType() { this.selectedEventTypes.clear(); } public String getSelectedConditionValue() { return selectedConditionValue; } public void setSelectedConditionValue(String selectedConditionValue) { this.selectedConditionValue = selectedConditionValue; } public SushiCondition getCondition() { if (conditionValueSelect.isEnabled()) { return new SushiCondition(selectedConditionAttribute, selectedConditionValue); } else if (conditionValueTextField.isEnabled()) { return new SushiCondition(selectedConditionAttribute, conditionValueTextField.getModelObject()); } return new SushiCondition(); } public void updateAttributesValues() { Set<String> attributes = new HashSet(); Set<String> attributeValues = new HashSet(); for (SushiEventType eventType : selectedEventTypes) { List<String> newAttributes = eventType.getAttributeKeysFromMap(); //update attributes attributes.addAll(newAttributes); //update values for (String attribute : newAttributes) { for (Serializable value : eventType.findAttributeValues(attribute)) { attributeValues.add(value.toString()); } } } conditionAttributeSelect.setChoices(new ArrayList(attributes)); conditionValueSelect.setChoices(new ArrayList(attributeValues)); } public void enableAllComponents(AjaxRequestTarget target) { conditionAttributeSelect.setEnabled(true); conditionValueSelect.setEnabled(true); conditionValueTextField.setEnabled(true); updateAllComponents(target); } public void disableAllComponents(AjaxRequestTarget target) { conditionAttributeSelect.setEnabled(false); conditionValueSelect.setEnabled(false); conditionValueTextField.setEnabled(false); updateAllComponents(target); } private void updateAllComponents(AjaxRequestTarget target) { target.add(conditionAttributeSelect); target.add(conditionValueSelect); target.add(conditionValueTextField); } }