/* (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.web.data.layer; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior; import org.apache.wicket.markup.html.WebMarkupContainer; 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.Form; import org.apache.wicket.markup.html.form.SubmitLink; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.validation.IValidationError; import org.apache.wicket.validation.ValidationError; import org.geoserver.web.GeoServerSecuredPage; import org.geoserver.web.wicket.CRSPanel; import org.geoserver.web.wicket.ParamResourceModel; import com.vividsolutions.jts.geom.Geometry; @SuppressWarnings("serial") public class AttributeEditPage extends GeoServerSecuredPage { AttributeDescription attribute; NewFeatureTypePage previousPage; WebMarkupContainer crsContainer; WebMarkupContainer sizeContainer; boolean newAttribute; private TextField<String> nameField; String size; private TextField<String> sizeField; private CRSPanel crsField; public AttributeEditPage(final AttributeDescription attribute, final NewFeatureTypePage previousPage) { this(attribute, previousPage, false); } AttributeEditPage(final AttributeDescription attribute, final NewFeatureTypePage previousPage, final boolean newAttribute) { this.previousPage = previousPage; this.newAttribute = newAttribute; this.attribute = attribute; this.size = String.valueOf(attribute.getSize()); final Form<AttributeDescription> form = new Form<>("form", new CompoundPropertyModel<>(attribute)); form.setOutputMarkupId(true); add(form); form.add(nameField = new TextField<>("name")); DropDownChoice<Class<?>> binding = new DropDownChoice<>("binding", AttributeDescription.BINDINGS, new BindingChoiceRenderer()); binding.add(new AjaxFormSubmitBehavior("change") { @Override protected void onError(AjaxRequestTarget target) { updateVisibility(target); } private void updateVisibility(AjaxRequestTarget target) { sizeContainer.setVisible(String.class.equals(attribute.getBinding())); crsContainer.setVisible(attribute.getBinding() != null && Geometry.class.isAssignableFrom(attribute.getBinding())); target.add(getFeedbackPanel()); target.add(form); } @Override protected void onSubmit(AjaxRequestTarget target) { updateVisibility(target); } }); form.add(binding); form.add(new CheckBox("nullable")); sizeContainer = new WebMarkupContainer("sizeContainer"); sizeContainer.setOutputMarkupId(true); form.add(sizeContainer); sizeContainer.add(sizeField = new TextField<>("size", new PropertyModel<>(this, "size"))); sizeContainer.setVisible(String.class.equals(attribute.getBinding())); crsContainer = new WebMarkupContainer("crsContainer"); crsContainer.setOutputMarkupId(true); form.add(crsContainer); crsContainer.add(crsField = new CRSPanel("crs")); crsContainer.setVisible(attribute.getBinding() != null && Geometry.class.isAssignableFrom(attribute.getBinding())); SubmitLink submit = new SubmitLink("save") { @Override public void onSubmit() { if (validate()) { if (newAttribute) { previousPage.attributesProvider.addNewAttribute(attribute); } setResponsePage(previousPage); } } }; form.setDefaultButton(submit); form.add(submit); form.add(new Link<Void>("cancel") { @Override public void onClick() { setResponsePage(previousPage); } }); } /** * We have to resort to manual validation otherwise the ajax tricks performed by the drop down * won't work */ protected boolean validate() { boolean valid = true; if (attribute.getName() == null || attribute.getName().trim().equals("")) { nameField.error((IValidationError) new ValidationError().addKey("Required")); valid = false; } if (String.class.equals(attribute.getBinding())) { try { attribute.setSize(Integer.parseInt(size)); if (attribute.getSize() <= 0) { sizeField.error(new ParamResourceModel("notPositive", this)); valid = false; } } catch (Exception e) { sizeField.error(new ParamResourceModel("notInteger", this, size)); valid = false; } } if (Geometry.class.isAssignableFrom(attribute.getBinding()) && attribute.getCrs() == null) { crsField.error((IValidationError) new ValidationError().addKey("Required")); valid = false; } return valid; } static class BindingChoiceRenderer extends ChoiceRenderer<Class<?>> { public Object getDisplayValue(Class<?> object) { return AttributeDescription.getLocalizedName((Class<?>) object); } public String getIdValue(Class<?> object, int index) { return object.getName(); } } }