/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.kml.decorator;
import java.util.List;
import org.geoserver.kml.KmlEncodingContext;
import org.geoserver.wms.GetMapRequest;
import org.geoserver.wms.WMSInfo;
import org.geoserver.wms.WMSRequests;
import org.geotools.map.Layer;
import de.micromata.opengis.kml.v_2_2_0.Document;
import de.micromata.opengis.kml.v_2_2_0.Feature;
import de.micromata.opengis.kml.v_2_2_0.Icon;
import de.micromata.opengis.kml.v_2_2_0.ScreenOverlay;
import de.micromata.opengis.kml.v_2_2_0.Units;
import de.micromata.opengis.kml.v_2_2_0.Vec2;
/**
* Encodes previous/next network links when paging is used
*
* @author Andrea Aime - GeoSolutions
*/
public class LegendDecoratorFactory implements KmlDecoratorFactory {
@Override
public KmlDecorator getDecorator(Class<? extends Feature> featureClass,
KmlEncodingContext context) {
// this decorator makes sense only for WMS
if(!(context.getService() instanceof WMSInfo)) {
return null;
}
// see if we have to encode a legend
GetMapRequest request = context.getRequest();
Boolean legend = (Boolean) request.getFormatOptions().get("legend");
if (legend != null && legend && Document.class.isAssignableFrom(featureClass)) {
return new LegendDecorator();
} else {
return null;
}
}
static class LegendDecorator implements KmlDecorator {
@Override
public Feature decorate(Feature feature, KmlEncodingContext context) {
Document doc = (Document) feature;
// create the screen overlay
ScreenOverlay go = doc.createAndAddScreenOverlay();
go.setName("Legend");
go.setOverlayXY(createPixelsVec(0, 0));
go.setScreenXY(createPixelsVec(10, 20));
// build the href
Icon icon = go.createAndSetIcon();
String legendOptions = (String) context.getRequest().getRawKvp().get("LEGEND_OPTIONS");
String[] kvpArray = null;
if (legendOptions != null) {
kvpArray = new String[] { "LEGEND_OPTIONS", legendOptions };
}
List<Layer> layerList = context.getMapContent().layers();
Layer[] layers = (Layer[]) layerList.toArray(new Layer[layerList.size()]);
icon.setHref(WMSRequests.getGetLegendGraphicUrl(context.getRequest(),
layers, kvpArray));
return feature;
}
private Vec2 createPixelsVec(int x, int y) {
Vec2 vec = new Vec2();
vec.setX(x);
vec.setY(y);
vec.setXunits(Units.PIXELS);
vec.setYunits(Units.PIXELS);
return vec;
}
}
}