/* (c) 2015 - 2016 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.geofence.web; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.request.resource.PackageResourceReference; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; import org.geoserver.geofence.services.dto.ShortRule; import org.geoserver.web.GeoServerSecuredPage; import org.geoserver.web.wicket.GeoServerTablePanel; import org.geoserver.web.wicket.ImageAjaxLink; import org.geoserver.web.wicket.ParamResourceModel; import org.geoserver.web.wicket.GeoServerDataProvider.Property; import wicketdnd.*; import wicketdnd.theme.WebTheme; /** * GeoFence Server wicket administration UI for GeoServer. * * @author Niels Charlier * */ public class GeofenceServerPage extends GeoServerSecuredPage { private static final long serialVersionUID = -8258166751239553791L; private GeofenceRulesModel rulesModel; private GeoServerTablePanel<ShortRule> rulesPanel; private AjaxLink<Object> remove; public GeofenceServerPage() { // the add button add(new AjaxLink<Object>("addNew") { private static final long serialVersionUID = 8443763075141885559L; @Override public void onClick(AjaxRequestTarget target) { setResponsePage(new GeofenceRulePage(rulesModel.newRule(), rulesModel)); } }); // the removal button add(remove = new AjaxLink<Object>("removeSelected") { private static final long serialVersionUID = 3581476968062788921L; @Override public void onClick(AjaxRequestTarget target) { rulesModel.remove(rulesPanel.getSelection()); target.add(rulesPanel); } }); remove.setOutputMarkupId(true); remove.setEnabled(false); //the panel add(rulesPanel = new GeoServerTablePanel<ShortRule>("rulesPanel", rulesModel = new GeofenceRulesModel(), true) { private static final long serialVersionUID = -8943273843044917552L; @Override protected Component getComponentForProperty(String id, IModel<ShortRule> itemModel, Property<ShortRule> property) { if (property == GeofenceRulesModel.BUTTONS) { return new ButtonPanel(id, (ShortRule) itemModel.getObject()); } return null; } @Override protected void onSelectionUpdate(AjaxRequestTarget target) { remove.setEnabled(rulesPanel.getSelection().size() > 0); target.add(remove); } }); rulesPanel.add(new WebTheme()); rulesPanel.add(new DragSource(Operation.MOVE).drag("tr")); rulesPanel.add(new DropTarget(Operation.MOVE) { private static final long serialVersionUID = 543875667418965337L; public void onDrop(AjaxRequestTarget target, Transfer transfer, Location location) { if (location == null || !(location.getComponent().getDefaultModel().getObject() instanceof ShortRule)) { return; } ShortRule movedRule = transfer.getData(); ShortRule targetRule = (ShortRule) location.getComponent().getDefaultModel().getObject(); if (movedRule.getId().equals(targetRule.getId())) { return; } if (movedRule.getPriority() < targetRule.getPriority()) { movedRule.setPriority(targetRule.getPriority() + 1); } else { movedRule.setPriority(targetRule.getPriority()); } rulesModel.save(movedRule); doReturn(GeofenceServerPage.class); } }.dropCenter("tr")); rulesPanel.setOutputMarkupId(true); } /** * * Panel with buttons up, down and edit * */ private class ButtonPanel extends Panel { private static final long serialVersionUID = 833648465957566970L; private ImageAjaxLink<?> upLink; private ImageAjaxLink<?> downLink; public ButtonPanel( String id, final ShortRule rule ) { super( id ); this.setOutputMarkupId(true); upLink = new ImageAjaxLink<Object>( "up", new PackageResourceReference( getClass(), "img/arrow_up.png") ) { private static final long serialVersionUID = -8179503447106596760L; @Override protected void onClick(AjaxRequestTarget target) { rulesModel.moveUp(rule); target.add(rulesPanel); } @Override protected void onComponentTag(ComponentTag tag) { if (rulesModel.canUp(rule)) { tag.put("style", "visibility:visible"); } else { tag.put("style", "visibility:hidden"); } } }; upLink.getImage().add(new AttributeModifier("alt", new ParamResourceModel("GeofenceServerPage.up", upLink))); upLink.setOutputMarkupId(true); add(upLink); downLink = new ImageAjaxLink<Object>( "down", new PackageResourceReference( getClass(), "img/arrow_down.png") ) { private static final long serialVersionUID = 4640187752303674221L; @Override protected void onClick(AjaxRequestTarget target) { rulesModel.moveDown(rule); target.add(rulesPanel); } @Override protected void onComponentTag(ComponentTag tag) { if (rulesModel.canDown(rule)) { tag.put("style", "visibility:visible"); } else { tag.put("style", "visibility:hidden"); } } }; downLink.getImage().add(new AttributeModifier("alt", new ParamResourceModel("GeofenceServerPage.down", downLink))); downLink.setOutputMarkupId(true); add(downLink); ImageAjaxLink<?> editLink = new ImageAjaxLink<Object>( "edit", new PackageResourceReference( getClass(), "img/edit.png") ) { private static final long serialVersionUID = 4640187752303674221L; @Override protected void onClick(AjaxRequestTarget target) { setResponsePage(new GeofenceRulePage(rule, rulesModel)); } }; editLink.getImage().add(new AttributeModifier("alt", new ParamResourceModel("GeofenceServerPage.edit", editLink))); editLink.setOutputMarkupId(true); add(editLink); } } }