/* (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.ShortAdminRule; import org.geoserver.web.GeoServerSecuredPage; import org.geoserver.web.wicket.GeoServerDataProvider.Property; import org.geoserver.web.wicket.GeoServerTablePanel; import org.geoserver.web.wicket.ImageAjaxLink; import org.geoserver.web.wicket.ParamResourceModel; import wicketdnd.*; import wicketdnd.theme.WebTheme; public class GeofenceServerAdminPage extends GeoServerSecuredPage { private static final long serialVersionUID = -4321944040817919546L; private GeofenceAdminRulesModel rulesModel; private GeoServerTablePanel<ShortAdminRule> rulesPanel; private AjaxLink<Object> remove; public GeofenceServerAdminPage() { add(new AjaxLink<Object>("addNew") { private static final long serialVersionUID = -4136656891019857299L; @Override public void onClick(AjaxRequestTarget target) { setResponsePage(new GeofenceAdminRulePage(rulesModel.newRule(), rulesModel)); } }); add(remove = new AjaxLink<Object>("removeSelected") { private static final long serialVersionUID = 2421854498051377608L; @Override public void onClick(AjaxRequestTarget target) { rulesModel.remove(rulesPanel.getSelection()); target.add(rulesPanel); } }); remove.setOutputMarkupId(true); remove.setEnabled(false); add(rulesPanel = new GeoServerTablePanel<ShortAdminRule>("rulesPanel", rulesModel = new GeofenceAdminRulesModel(), true) { private static final long serialVersionUID = -9041215145551707243L; @Override protected Component getComponentForProperty(String id, IModel<ShortAdminRule> itemModel, Property<ShortAdminRule> property) { if (property == GeofenceAdminRulesModel.BUTTONS) { return new ButtonPanel(id, (ShortAdminRule) 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 = -2153630274380471165L; public void onDrop(AjaxRequestTarget target, Transfer transfer, Location location) { if (location == null || !(location.getComponent().getDefaultModel().getObject() instanceof ShortAdminRule)) { return; } ShortAdminRule movedRule = transfer.getData(); ShortAdminRule targetRule = (ShortAdminRule) 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(GeofenceServerAdminPage.class); } }.dropCenter("tr")); rulesPanel.setOutputMarkupId(true); } private class ButtonPanel extends Panel { private static final long serialVersionUID = -3702358364804495550L; private ImageAjaxLink<Object> upLink; private ImageAjaxLink<Object> downLink; public ButtonPanel(String id, final ShortAdminRule 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("GeofenceServerAdminPage.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("GeofenceServerAdminPage.down", downLink))); downLink.setOutputMarkupId(true); add(downLink); ImageAjaxLink<Object> 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 GeofenceAdminRulePage(rule, rulesModel)); } }; editLink.getImage().add(new AttributeModifier("alt", new ParamResourceModel("GeofenceServerAdminPage.edit", editLink))); editLink.setOutputMarkupId(true); add(editLink); } } }