/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.gwc.web.layer; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.wicket.Component; import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.geoserver.gwc.layer.StyleParameterFilter; /** * Subform that displays basic information about a ParameterFilter * @author Kevin Smith, OpenGeo * */ public class StyleParameterFilterSubform extends AbstractParameterFilterSubform<StyleParameterFilter> { /** * Model Set<String> as a List<String> and optionally add a dummy element at the beginning. */ static class SetAsListModel implements IModel<List<String>> { /** serialVersionUID */ private static final long serialVersionUID = 1L; final private IModel<Set<String>> realModel; final private List<String> fakeObject; final protected String extra; public SetAsListModel(IModel<Set<String>> realModel, String extra) { super(); this.realModel = realModel; this.extra = extra; Set<String> realObj = realModel.getObject(); int size; if(realObj==null) { size = 0; } else { size = realObj.size(); } if(extra!=null){ size++; } fakeObject = new ArrayList<String>(size); } @Override public void detach() { realModel.detach(); } @Override public List<String> getObject() { Set<String> realObj = realModel.getObject(); fakeObject.clear(); if(extra!=null) fakeObject.add(extra); if(realObj != null) fakeObject.addAll(realObj); return fakeObject; } @Override public void setObject(List<String> object) { if(object == null){ realModel.setObject(null); } else { Set<String> newObj = new HashSet<String>(object); newObj.remove(extra); realModel.setObject(new HashSet<String>(object)); } } } static class LabelledEmptyStringModel implements IModel<String> { private static final long serialVersionUID = 7591957769540603345L; final private IModel<String> realModel; final String label; public LabelledEmptyStringModel(IModel<String> realModel, String label) { super(); this.realModel = realModel; this.label = label; } @Override public void detach() { realModel.detach(); } @Override public String getObject() { String s = realModel.getObject(); if (s==null || s.isEmpty()){ return label; } else { return s; } } @Override public void setObject(String object) { if (label.equals(object)) { realModel.setObject(""); } else { realModel.setObject(object); } } } /** * Model Set<String> as a List<String> and add an option to represent the set being * {@literal null} */ static class NullableSetAsListModel implements IModel<List<String>> { /** serialVersionUID */ private static final long serialVersionUID = 1L; final private IModel<Set<String>> realModel; final private List<String> fakeObject; final protected String nullify; public NullableSetAsListModel(IModel<Set<String>> realModel, String nullify) { super(); this.realModel = realModel; this.nullify = nullify; Set<String> realObj = realModel.getObject(); int size; if(realObj==null) { size = 1; } else { size = realObj.size(); } fakeObject = new ArrayList<String>(size); } @Override public void detach() { realModel.detach(); } @Override public List<String> getObject() { Set<String> realObj = realModel.getObject(); fakeObject.clear(); if(realObj!=null) { fakeObject.addAll(realObj); } else { fakeObject.add(nullify); } return fakeObject; } @Override public void setObject(List<String> object) { if(object == null || object.contains(nullify)){ realModel.setObject(null); } else { Set<String> newObj = new HashSet<String>(object); newObj.remove(nullify); realModel.setObject(new HashSet<String>(object)); } } } /** serialVersionUID */ private static final long serialVersionUID = 1L; public StyleParameterFilterSubform(String id, IModel<StyleParameterFilter> model) { super(id, model); } @Override public void onInitialize() { super.onInitialize(); final Component defaultValue; final String allStyles = getLocalizer().getString("allStyles", this); final String layerDefault = getLocalizer().getString("layerDefault", this); final IModel<List<String>> availableStylesModelDefault = new SetAsListModel(new PropertyModel<Set<String>>(getModel(), "layerStyles"), layerDefault); final IModel<List<String>> availableStylesModelAllowed = new SetAsListModel(new PropertyModel<Set<String>>(getModel(), "layerStyles"), allStyles); final IModel<List<String>> selectedStylesModel = new NullableSetAsListModel(new PropertyModel<Set<String>>(getModel(), "styles"), allStyles); final IModel<String> selectedDefaultModel = new LabelledEmptyStringModel(new PropertyModel<String>(getModel(), "realDefault"), layerDefault); defaultValue = new DropDownChoice<String>("defaultValue", selectedDefaultModel, availableStylesModelDefault); add(defaultValue); final CheckBoxMultipleChoice<String> styles = new CheckBoxMultipleChoice<String>("styles", selectedStylesModel, availableStylesModelAllowed); styles.setPrefix("<li>");styles.setSuffix("</li>"); add(styles); } }