/* (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.wps.web;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.PropertyModel;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.web.GeoServerApplication;
import org.geoserver.wps.web.InputParameterValues.ParameterType;
import org.geotools.geometry.jts.ReferencedEnvelope;
/**
* Allows the user to edit a bounding box parameter
*
* @author Andrea Aime - OpenGeo
*/
@SuppressWarnings("serial")
public class BoundingBoxInputPanel extends Panel {
private DropDownChoice typeChoice;
PropertyModel valueModel;
List<String> mimeTypes;
public BoundingBoxInputPanel(String id, InputParameterValues pv, int valueIndex) {
super(id);
setOutputMarkupId(true);
setDefaultModel(new PropertyModel(pv, "values[" + valueIndex + "]"));
valueModel = new PropertyModel(getDefaultModel(), "value");
mimeTypes = pv.getSupportedMime();
typeChoice = new DropDownChoice("type", new PropertyModel(getDefaultModelObject(), "type"),
Arrays.asList(ParameterType.values()));
add(typeChoice);
updateEditor();
typeChoice.add(new AjaxFormComponentUpdatingBehavior("change") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
updateEditor();
target.add(BoundingBoxInputPanel.this);
}
});
}
void updateEditor() {
// remove the old editor
if (get("editor") != null) {
remove("editor");
}
// reset the previous value
valueModel.setObject(null);
ParameterType pt = (ParameterType) typeChoice.getModelObject();
if (pt == ParameterType.TEXT) {
// data as plain text
Fragment f = new Fragment("editor", "text", this);
DropDownChoice mimeChoice = new DropDownChoice("mime", new PropertyModel(
getDefaultModel(), "mime"), mimeTypes);
f.add(mimeChoice);
f.add(new TextArea("textarea", valueModel));
add(f);
} else if (pt == ParameterType.VECTOR_LAYER) {
// an internal vector layer
valueModel.setObject(new VectorLayerConfiguration());
Fragment f = new Fragment("editor", "vectorLayer", this);
DropDownChoice layer = new DropDownChoice("layer", new PropertyModel(valueModel,
"layerName"), getVectorLayerNames());
f.add(layer);
add(f);
} else if (pt == ParameterType.RASTER_LAYER) {
// an internal raster layer
valueModel.setObject(new RasterLayerConfiguration());
Fragment f = new Fragment("editor", "rasterLayer", this);
final DropDownChoice layer = new DropDownChoice("layer", new PropertyModel(valueModel,
"layerName"), getRasterLayerNames());
f.add(layer);
add(f);
// we need to update the raster own bounding box as wcs requests
// mandate a spatial extent (why oh why???)
layer.add(new AjaxFormComponentUpdatingBehavior("change") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
String name = layer.getDefaultModelObjectAsString();
LayerInfo li = GeoServerApplication.get().getCatalog().getLayerByName(name);
ReferencedEnvelope spatialDomain = li.getResource().getNativeBoundingBox();
((RasterLayerConfiguration) valueModel.getObject())
.setSpatialDomain(spatialDomain);
}
});
} else {
error("Unsupported parameter type");
}
}
List<String> getVectorLayerNames() {
Catalog catalog = GeoServerApplication.get().getCatalog();
List<String> result = new ArrayList<String>();
for (LayerInfo li : catalog.getLayers()) {
if (li.getResource() instanceof FeatureTypeInfo) {
result.add(li.getResource().getPrefixedName());
}
}
return result;
}
List<String> getRasterLayerNames() {
Catalog catalog = GeoServerApplication.get().getCatalog();
List<String> result = new ArrayList<String>();
for (LayerInfo li : catalog.getLayers()) {
if (li.getResource() instanceof CoverageInfo) {
result.add(li.getResource().getPrefixedName());
}
}
return result;
}
}