/* (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.ArrayList; import java.util.List; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.AttributeModifier; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponentPanel; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.form.validation.FormComponentFeedbackBorder; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.validation.validator.UrlValidator; import org.geoserver.catalog.AuthorityURLInfo; import org.geoserver.catalog.LayerGroupInfo; import org.geoserver.catalog.LayerInfo; import org.geoserver.catalog.impl.AuthorityURL; import org.geoserver.wms.WMSInfo; import org.springframework.util.Assert; /** * Shows and allows editing of the {@link AuthorityURLInfo} attached to a {@link WMSInfo}, a * {@link LayerInfo}, or a {@link LayerGroupInfo}. * * @author groldan * */ public class AuthorityURLListEditor extends FormComponentPanel<List<AuthorityURLInfo>> { private static final long serialVersionUID = 5098470663723800345L; private ListView<AuthorityURLInfo> authorityURLs; private Label noMetadata; private WebMarkupContainer table; /** * @param id * @param model * the model over the appropriate cataloginfo's list of {@link AuthorityURLInfo} * @see WMSInfo#getAuthorityURLs() * @see LayerInfo#getAuthorityURLs() * @see LayerGroupInfo#getAuthorityURLs() */ public AuthorityURLListEditor(final String id, final IModel<List<AuthorityURLInfo>> list) { super(id, list); Assert.notNull(list.getObject()); // container for ajax updates final WebMarkupContainer container = new WebMarkupContainer("container"); container.setOutputMarkupId(true); add(container); // the link list table = new WebMarkupContainer("table"); table.setOutputMarkupId(true); container.add(table); authorityURLs = new ListView<AuthorityURLInfo>("authorities", new ArrayList<AuthorityURLInfo>(list.getObject())) { private static final long serialVersionUID = 1L; @Override protected void populateItem(final ListItem<AuthorityURLInfo> item) { // odd/even style item.add(AttributeModifier.replace("class", item.getIndex() % 2 == 0 ? "even" : "odd")); // Authority name TextField<String> authName; authName = new TextField<String>("authName", new PropertyModel<String>( item.getModel(), "name")); authName.setRequired(true); FormComponentFeedbackBorder authNameBorder = new FormComponentFeedbackBorder("authNameBorder"); item.add(authNameBorder); authNameBorder.add(authName); // Authority URL TextField<String> authURL; authURL = new TextField<String>("authorityURL", new PropertyModel<String>( item.getModel(), "href")); authURL.setRequired(true); authURL.add(new UrlValidator()); FormComponentFeedbackBorder urlBorder = new FormComponentFeedbackBorder("urlBorder"); item.add(urlBorder); urlBorder.add(authURL); // remove link AjaxLink<Integer> link = new AjaxLink<Integer>("removeLink", new Model<Integer>( item.getIndex())) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { List<AuthorityURLInfo> list = new ArrayList<AuthorityURLInfo>( authorityURLs.getModelObject()); int index = getModelObject(); list.remove(index); authorityURLs.setModelObject(list); updateLinksVisibility(); target.add(container); } }; item.add(link); } }; // this is necessary to avoid loosing item contents on edit/validation checks authorityURLs.setReuseItems(true); table.add(authorityURLs); // the no metadata links label noMetadata = new Label("noURLs", new ResourceModel("noAuthorityURLsSoFar")); container.add(noMetadata); updateLinksVisibility(); // add new link button AjaxButton button = new AjaxButton("addURL") { private static final long serialVersionUID = 1L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { List<AuthorityURLInfo> list = authorityURLs.getModelObject(); AuthorityURLInfo authorityURL = new AuthorityURL(); list.add(authorityURL); authorityURLs.setModelObject(list); AuthorityURLListEditor.this.convertInput(); updateLinksVisibility(); target.add(container); } }; add(button); } private void updateLinksVisibility() { List<AuthorityURLInfo> list = authorityURLs.getModelObject(); boolean anyLink = list.size() > 0; table.setVisible(anyLink); noMetadata.setVisible(!anyLink); } @Override public void convertInput() { List<AuthorityURLInfo> info = authorityURLs.getModelObject(); if (info == null || info.size() == 0) { setConvertedInput(new ArrayList<AuthorityURLInfo>(2)); return; } setConvertedInput(info); } /** */ @Override protected void onBeforeRender() { super.onBeforeRender(); } }