/* (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.wms.web.publish;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.extensions.markup.html.form.palette.Palette;
import org.apache.wicket.extensions.markup.html.form.palette.theme.DefaultTheme;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.image.NonCachingImage;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.validation.validator.RangeValidator;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.LayerInfo.WMSInterpolation;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.web.publish.PublishedConfigurationPanel;
import org.geoserver.web.util.MapModel;
import org.geoserver.web.wicket.LiveCollectionModel;
/**
* Configures {@link LayerInfo} WMS specific attributes
*/
public class WMSLayerConfig extends PublishedConfigurationPanel<LayerInfo> {
private static final long serialVersionUID = -2895136226805357532L;
public WMSLayerConfig(String id, IModel<LayerInfo> layerModel) {
super(id, layerModel);
add(new CheckBox("queryableEnabled", new PropertyModel<Boolean>(layerModel,"queryable")));
add(new CheckBox("opaqueEnabled", new PropertyModel<Boolean>(layerModel,"opaque")));
// styles block container
WebMarkupContainer styleContainer = new WebMarkupContainer("styles");
add(styleContainer);
ResourceInfo resource = layerModel.getObject().getResource();
styleContainer.setVisible(resource instanceof CoverageInfo || resource instanceof FeatureTypeInfo);
// default style chooser. A default style is required
StylesModel styles = new StylesModel();
final PropertyModel<StyleInfo> defaultStyleModel = new PropertyModel<StyleInfo>(layerModel, "defaultStyle");
final DropDownChoice<StyleInfo> defaultStyle = new DropDownChoice<StyleInfo>("defaultStyle", defaultStyleModel,
styles, new StyleChoiceRenderer());
defaultStyle.setRequired(true);
styleContainer.add(defaultStyle);
final Image defStyleImg = new NonCachingImage("defaultStyleLegendGraphic");
defStyleImg.setOutputMarkupId(true);
styleContainer.add(defStyleImg);
// the wms url is build without qualification to allow usage of global styles,
// the style name and layer name will be ws qualified instead
String wmsURL = RequestCycle.get().getUrlRenderer().renderContextRelativeUrl("wms") + "?";
final LegendGraphicAjaxUpdater defaultStyleUpdater;
defaultStyleUpdater = new LegendGraphicAjaxUpdater(wmsURL, defStyleImg, defaultStyleModel);
defaultStyle.add(new OnChangeAjaxBehavior() {
private static final long serialVersionUID = -4098934889965471248L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
defaultStyleUpdater.updateStyleImage(target);
}
});
// build a palette with no reordering allowed, since order doesn't affect anything
LiveCollectionModel stylesModel =
LiveCollectionModel.set(new PropertyModel<Set<StyleInfo>>(layerModel, "styles"));
Palette<StyleInfo> extraStyles = new Palette<StyleInfo>("extraStyles", stylesModel, styles,
new StyleNameRenderer(), 10, false) {
private static final long serialVersionUID = -3494299396410932090L;
/**
* Override otherwise the header is not i18n'ized
*/
@Override
public Component newSelectedHeader(final String componentId) {
return new Label(componentId,
new ResourceModel("ExtraStylesPalette.selectedHeader"));
}
/**
* Override otherwise the header is not i18n'ized
*/
@Override
public Component newAvailableHeader(final String componentId) {
return new Label(componentId, new ResourceModel(
"ExtraStylesPalette.availableHeader"));
}
};
extraStyles.add(new DefaultTheme());
styleContainer.add(extraStyles);
TextField<Integer> renderingBuffer = new TextField<Integer>("renderingBuffer", new MapModel(new PropertyModel(layerModel, "metadata"), LayerInfo.BUFFER), Integer.class);
renderingBuffer.add(RangeValidator.minimum(0));
styleContainer.add(renderingBuffer);
add(new TextField<String>("wmsPath", new PropertyModel<String>(layerModel, "path")));
List<WMSInterpolation> interpolChoices = Arrays.asList(WMSInterpolation.values());
PropertyModel<WMSInterpolation> defaultInterpolModel = new PropertyModel<WMSInterpolation>(
layerModel, "defaultWMSInterpolationMethod");
DropDownChoice<WMSInterpolation> interpolDropDown = new DropDownChoice<WMSInterpolation>(
"defaultInterpolationMethod", defaultInterpolModel, interpolChoices,
new InterpolationRenderer(this));
interpolDropDown.setNullValid(true);
add(interpolDropDown);
}
private class InterpolationRenderer extends ChoiceRenderer<WMSInterpolation> {
private static final long serialVersionUID = 4230274692882585457L;
private Component parent;
public InterpolationRenderer(Component parent) {
this.parent = parent;
}
@Override
public Object getDisplayValue(WMSInterpolation interpolationMethod) {
return new StringResourceModel(interpolationMethod.name(), parent).getString();
}
@Override
public String getIdValue(WMSInterpolation object, int index) {
return object.name();
}
}
}