package org.geoserver.community.css.web; import java.util.Arrays; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; import org.geoserver.catalog.LayerInfo; import org.geoserver.catalog.StyleInfo; import org.geoserver.web.wicket.GeoServerDataProvider; import static org.geoserver.web.wicket.GeoServerDataProvider.AbstractProperty; import static org.geoserver.web.wicket.GeoServerDataProvider.Property; import org.geoserver.web.wicket.GeoServerTablePanel; import org.geoserver.web.wicket.ParamResourceModel; public class MultipleLayerChooser extends Panel { private class LayerProvider extends GeoServerDataProvider<LayerInfo> { private final CssDemoPage demo; public LayerProvider(CssDemoPage demo) { this.demo = demo; } @Override public List<LayerInfo> getItems() { return demo.catalog().getLayers(); } Property<LayerInfo> workspace = new AbstractProperty<LayerInfo>("Workspace") { @Override public Object getPropertyValue(LayerInfo x) { return x.getResource().getStore().getWorkspace().getName(); } }; Property<LayerInfo> layer = new AbstractProperty<LayerInfo>("Layer") { @Override public Object getPropertyValue(LayerInfo x) { return x.getName(); } }; Property<LayerInfo> associated = new AbstractProperty<LayerInfo>("Associated") { @Override public Object getPropertyValue(LayerInfo x) { return usesEditedStyle(x); } }; @Override public List<Property<LayerInfo>> getProperties() { return Arrays.asList(workspace, layer, associated); } } protected Boolean usesEditedStyle(LayerInfo l) { for (StyleInfo s : l.getStyles()) { if (s.getName().equals(demo.getStyleInfo().getName())) return true; } return l.getDefaultStyle().getName().equals(demo.getStyleInfo().getName()); } private CssDemoPage demo; public MultipleLayerChooser(String id, final CssDemoPage demo) { super(id); this.demo = demo; final LayerProvider layerProvider = new LayerProvider(demo); GeoServerTablePanel layerTable = new GeoServerTablePanel<LayerInfo>("layer.table", layerProvider) { @Override public Component getComponentForProperty( String id, IModel value, Property<LayerInfo> property ) { final LayerInfo layer = (LayerInfo)value.getObject(); String text = property.getPropertyValue(layer).toString(); if (property == layerProvider.associated) { IModel<Boolean> model = new IModel<java.lang.Boolean>() { public Boolean getObject() { return usesEditedStyle(layer); } public void setObject(java.lang.Boolean b) { if (b) { layer.getStyles().add(demo.getStyleInfo()); } else { if (layer.getDefaultStyle().getName() == demo.getStyleInfo().getName()) { if (layer.getStyles().size() == 0) { layer.setDefaultStyle(demo.catalog().getStyleByName("point")); } else { StyleInfo s = layer.getStyles().iterator().next(); layer.setDefaultStyle(s); layer.getStyles().remove(s); } } else { StyleInfo s = null; for (StyleInfo candidate : layer.getStyles()) { if (candidate.getName().equals(demo.getStyleInfo().getName())) { s = candidate; break; } } if (s != null) layer.getStyles().remove(s); } } demo.catalog().save(layer); } public void detach() {} }; Fragment fragment = new Fragment( id, "layer.association.checkbox", MultipleLayerChooser.this); fragment.add(new AjaxCheckBox("selected", model) { public void onUpdate(AjaxRequestTarget target) {} }); return fragment; } else { return new Label(id, text); } }; }; add(layerTable); } }