Package org.geoserver.web.data.layergroup

Source Code of org.geoserver.web.data.layergroup.LayerGroupEntryPanel

/* (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);
    }

}
TOP

Related Classes of org.geoserver.web.data.layergroup.LayerGroupEntryPanel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.