org.geoserver.web.data.layergroup.LayerGroupEntryPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.geoserver.web.data.layergroup.LayerGroupEntryPanel.java

Source

/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
 * (c) 2001 - 2014 OpenPlans
 * This code is licensed under the GPL 2.0 license, available at the root
 * application directory.
 */
package org.geoserver.web.data.layergroup;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.DefaultItemReuseStrategy;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.PublishedInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.web.wicket.GeoServerDataProvider.Property;
import org.geoserver.web.wicket.GeoServerDataProvider.PropertyPlaceholder;
import org.geoserver.web.wicket.GeoServerDialog;
import org.geoserver.web.wicket.GeoServerTablePanel;
import org.geoserver.web.wicket.HelpLink;
import org.geoserver.web.wicket.ImageAjaxLink;
import org.geoserver.web.wicket.ParamResourceModel;
import org.geoserver.web.wicket.ReorderableTablePanel;
import org.geoserver.web.wicket.SimpleAjaxLink;
import org.geoserver.web.wicket.UpDownPanel;

/**
 * Allows to edit the list of layers contained in a layer group
 */
@SuppressWarnings("serial")
public class LayerGroupEntryPanel extends Panel {

    public static Property<LayerGroupEntry> LAYER = new PropertyPlaceholder<LayerGroupEntry>("layer");

    public static Property<LayerGroupEntry> DEFAULT_STYLE = new PropertyPlaceholder<LayerGroupEntry>(
            "defaultStyle");

    public static Property<LayerGroupEntry> STYLE = new PropertyPlaceholder<LayerGroupEntry>("style");

    public static Property<LayerGroupEntry> REMOVE = new PropertyPlaceholder<LayerGroupEntry>("remove");

    static List PROPERTIES = Arrays.asList(LAYER, DEFAULT_STYLE, STYLE, REMOVE);

    ModalWindow popupWindow;
    GeoServerTablePanel<LayerGroupEntry> layerTable;
    List<LayerGroupEntry> items;
    GeoServerDialog dialog;

    public LayerGroupEntryPanel(String id, LayerGroupInfo layerGroup) {
        super(id);

        items = new ArrayList<LayerGroupEntry>();
        for (int i = 0; i < layerGroup.getLayers().size(); i++) {
            PublishedInfo layer = layerGroup.getLayers().get(i);
            StyleInfo style = layerGroup.getStyles().get(i);
            items.add(new LayerGroupEntry(layer, style));
        }

        add(popupWindow = new ModalWindow("popup"));
        add(dialog = new GeoServerDialog("dialog"));
        add(new HelpLink("layersHelp").setDialog(dialog));

        //layers
        add(layerTable = new ReorderableTablePanel<LayerGroupEntry>("layers", items, PROPERTIES) {

            @Override
            protected Component getComponentForProperty(String id, IModel itemModel,
                    Property<LayerGroupEntry> property) {
                if (property == LAYER) {
                    return layerLink(id, itemModel);
                }
                if (property == DEFAULT_STYLE) {
                    return defaultStyleCheckbox(id, itemModel);
                }
                if (property == STYLE) {
                    return styleLink(id, itemModel);
                }
                if (property == REMOVE) {
                    return removeLink(id, itemModel);
                }

                return null;
            }

        }.setFilterable(false));
        layerTable.setItemReuseStrategy(new DefaultItemReuseStrategy());
        layerTable.setOutputMarkupId(true);

        add(new AjaxLink("addLayer") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                popupWindow.setInitialHeight(375);
                popupWindow.setInitialWidth(525);
                popupWindow.setTitle(new ParamResourceModel("chooseLayer", this));
                popupWindow.setContent(new LayerListPanel(popupWindow.getContentId()) {
                    @Override
                    protected void handleLayer(LayerInfo layer, AjaxRequestTarget target) {
                        popupWindow.close(target);

                        items.add(new LayerGroupEntry(layer, layer.getDefaultStyle()));

                        //getCatalog().save( lg );
                        target.addComponent(layerTable);
                    }
                });

                popupWindow.show(target);
            }
        });

        add(new AjaxLink("addLayerGroup") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                popupWindow.setInitialHeight(375);
                popupWindow.setInitialWidth(525);
                popupWindow.setTitle(new ParamResourceModel("chooseLayerGroup", this));
                popupWindow.setContent(new LayerGroupListPanel(popupWindow.getContentId()) {
                    @Override
                    protected void handleLayerGroup(LayerGroupInfo layerGroup, AjaxRequestTarget target) {
                        popupWindow.close(target);

                        items.add(new LayerGroupEntry(layerGroup, null));

                        target.addComponent(layerTable);
                    }
                });

                popupWindow.show(target);
            }
        });
    }

    public List<LayerGroupEntry> getEntries() {
        return items;
    }

    Component layerLink(String id, IModel itemModel) {
        LayerGroupEntry entry = (LayerGroupEntry) itemModel.getObject();
        return new Label(id, entry.getLayer().prefixedName());
    }

    Component defaultStyleCheckbox(String id, IModel itemModel) {
        final LayerGroupEntry entry = (LayerGroupEntry) itemModel.getObject();
        Fragment f = new Fragment(id, "defaultStyle", this);
        CheckBox ds = new CheckBox("checkbox", new Model(entry.isDefaultStyle()));
        ds.add(new OnChangeAjaxBehavior() {

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                Boolean useDefault = (Boolean) getComponent().getDefaultModelObject();
                entry.setDefaultStyle(useDefault);
                target.addComponent(layerTable);

            }
        });
        f.add(ds);
        return f;
    }

    Component styleLink(String id, final IModel itemModel) {
        // decide if the style is the default and the current style name
        LayerGroupEntry entry = (LayerGroupEntry) itemModel.getObject();
        String styleName = null;
        boolean defaultStyle = true;
        if (entry.getStyle() != null) {
            styleName = entry.getStyle().getName();
            defaultStyle = false;
        } else if (entry.getLayer() instanceof LayerInfo) {
            LayerInfo layer = (LayerInfo) entry.getLayer();
            if (layer.getDefaultStyle() != null) {
                styleName = layer.getDefaultStyle().getName();
            }
        }

        // build and returns the link, but disable it if the style is the default
        SimpleAjaxLink link = new SimpleAjaxLink(id, new Model(styleName)) {

            @Override
            public void onClick(AjaxRequestTarget target) {
                popupWindow.setInitialHeight(375);
                popupWindow.setInitialWidth(525);
                popupWindow.setTitle(new ParamResourceModel("chooseStyle", this));
                popupWindow.setContent(new StyleListPanel(popupWindow.getContentId()) {
                    @Override
                    protected void handleStyle(StyleInfo style, AjaxRequestTarget target) {
                        popupWindow.close(target);

                        LayerGroupEntry entry = (LayerGroupEntry) itemModel.getObject();
                        entry.setStyle(style);

                        //redraw
                        target.addComponent(layerTable);
                    }
                });
                popupWindow.show(target);
            }

        };
        link.getLink().setEnabled(!defaultStyle);
        return link;
    }

    Component removeLink(String id, IModel itemModel) {
        final LayerGroupEntry entry = (LayerGroupEntry) itemModel.getObject();
        ImageAjaxLink link = new ImageAjaxLink(id,
                new ResourceReference(getClass(), "../../img/icons/silk/delete.png")) {
            @Override
            protected void onClick(AjaxRequestTarget target) {

                items.remove(entry);
                target.addComponent(layerTable);
            }
        };
        link.getImage().add(new AttributeModifier("alt", true,
                new ParamResourceModel("AbstractLayerGroupPage.th.remove", link)));
        return link;
    }

    Component positionPanel(String id, IModel itemModel) {
        ParamResourceModel upTitle = new ParamResourceModel("moveToBottom", this);
        ParamResourceModel downTitle = new ParamResourceModel("moveToBottom", this);
        return new UpDownPanel<LayerGroupEntry>(id, (LayerGroupEntry) itemModel.getObject(), items, layerTable,
                upTitle, downTitle);
    }

}