/* (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.security.web;
import java.util.List;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.AttributeAppender;
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.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.geoserver.security.config.SecurityNamedServiceConfig;
/**
* Panel that lists out all secuirty services, providing a toggle to collapse/expand each one
* showing/hiding its contents.
*
* @author Justin Deoliveira, OpenGeo
*/
public abstract class SecurityNamedServicesTogglePanel<T extends SecurityNamedServiceConfig>
extends Panel {
public SecurityNamedServicesTogglePanel(String id, IModel<List<T>> model) {
super(id);
Form form = new Form("form");
add(form);
form.add(new ListView<T>("services", model) {
@Override
protected void populateItem(final ListItem<T> item) {
IModel<T> model = item.getModel();
AjaxLink toggle = new AjaxLink<T>("toggle", model) {
@Override
public void onClick(AjaxRequestTarget target) {
if (item.get("panel") instanceof ContentPanel) {
//toggle off
item.addOrReplace(new WebMarkupContainer("panel"));
item.get("toggle")
.add(new AttributeModifier("class", new Model("collapsed")));
}
else {
//toggle on
item.addOrReplace(createPanel("panel", item.getModel()));
item.get("toggle")
.add(new AttributeModifier("class", new Model("expanded")));
}
target.add(item);
}
};
toggle.add(new Label("name", new PropertyModel(model, "name")));
boolean first = item.getIndex() == 0;
toggle.add(
new AttributeAppender("class", new Model(first?"expanded":"collapsed"), " "));
item.add(toggle);
item.add(first ?
createPanel("panel", model) : new WebMarkupContainer("panel"));
item.setOutputMarkupId(true);
}
});
}
protected abstract ContentPanel createPanel(String id, IModel<T> config);
protected static class ContentPanel<T> extends Panel {
public ContentPanel(String id, final IModel<T> model) {
super(id);
add(new Link("edit") {
@Override
public void onClick() {
SecurityNamedServiceEditPage editPage = new SecurityNamedServiceEditPage(model);
editPage.setReturnPage(getPage());
setResponsePage(editPage);
}
});
}
}
}