Package org.geoserver.wms.eo.web

Source Code of org.geoserver.wms.eo.web.EoLayerGroupEntryPanel$PositionPanel

/* (c) 2014 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.wms.eo.web;

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.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.basic.Label;
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.Catalog;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.PublishedInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.web.GeoServerApplication;
import org.geoserver.web.data.layergroup.LayerGroupEntryPanel;
import org.geoserver.web.wicket.GeoServerDataProvider;
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 org.geoserver.web.wicket.SimpleAjaxLink;
import org.geoserver.wms.eo.EoLayerType;

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

    ModalWindow popupWindow;
    LayerGroupEntryProvider entryProvider;
    GeoServerTablePanel<EoLayerGroupEntry> layerTable;
    List<EoLayerGroupEntry> items;
    EoLayerType layerType;
    String layerGroupName;
   
    public EoLayerGroupEntryPanel( String id, LayerGroupInfo layerGroup, ModalWindow popupWindow) {
        super( id );
        this.popupWindow = popupWindow;
       
        Catalog catalog = GeoServerApplication.get().getCatalog();
       
        this.layerGroupName = layerGroup.getName();
        items = new ArrayList<EoLayerGroupEntry>();
        for ( int i = 0; i < layerGroup.getLayers().size(); i++ ) {
            PublishedInfo layer = layerGroup.getLayers().get( i );
            StyleInfo style = layerGroup.getStyles().get( i );
            if(style == null) {
                LayerInfo li = catalog.getLayer(layer.getId());
                if(layer != null) {
                    style = li.getDefaultStyle();
                }
            }
            items.add( new EoLayerGroupEntry( (LayerInfo) layer, style, layerGroup.getName() ) );
        }
       
        // layers
        final EoLayerTypeRenderer eoLayerTypeRenderer = new EoLayerTypeRenderer();
        entryProvider = new LayerGroupEntryProvider( items );
        layerTable = new GeoServerTablePanel<EoLayerGroupEntry>("layers",entryProvider) {

            @Override
            protected Component getComponentForProperty(String id, IModel itemModel,
                    Property<EoLayerGroupEntry> property) {
                if ( property == LayerGroupEntryProvider.LAYER ) {
                    EoLayerGroupEntry entry = (EoLayerGroupEntry) itemModel.getObject();
                    return new Label( id, entry.getLayer().prefixedName());
                }
                if ( property == LayerGroupEntryProvider.TYPE) {
                    EoLayerType type = (EoLayerType) property.getModel(itemModel).getObject();
                    return new Label(id, (String) eoLayerTypeRenderer.getDisplayValue(type));
                }
                if ( property == LayerGroupEntryProvider.STYLE ) {
                    return styleLink( id, itemModel );
                }
                if ( property == LayerGroupEntryProvider.REMOVE ) {
                    return removeLink( id, itemModel );
                }
                if ( property == LayerGroupEntryProvider.POSITION ) {
                    return positionPanel( id, itemModel );
                }
               
                return null;
            }
        };
        layerTable.setFilterable( false );
        layerTable.setSortable(false);
        layerTable.setOutputMarkupId( true );
        layerTable.setItemReuseStrategy(new DefaultItemReuseStrategy());
        add(layerTable);

       

    }
   
    public List<EoLayerGroupEntry> getEntries() {
        return items;
    }
   
    Component styleLink(String id, final IModel itemModel) {
        // decide if the style is the default and the current style name
        EoLayerGroupEntry entry = (EoLayerGroupEntry) 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<String> link = new SimpleAjaxLink<String>( id, new Model(styleName)) {

            @Override
            public void onClick(AjaxRequestTarget target) {
                final EoLayerGroupEntry entry = (EoLayerGroupEntry) itemModel.getObject();
               
                popupWindow.setInitialHeight( 375 );
                popupWindow.setInitialWidth( 525 );
                popupWindow.setTitle(new ParamResourceModel("chooseStyle", this));
                popupWindow.setContent( new EoStyleListPanel( popupWindow.getContentId(), entry.getLayerType()) {
                    @Override
                    protected void handleStyle(StyleInfo style, AjaxRequestTarget target) {
                        entry.setStyle( style );
                       
                        //redraw
                        target.addComponent( layerTable );
                        popupWindow.close( target );
                    }
                });
                popupWindow.show(target);
            }

        };
        link.getLink().setEnabled(!defaultStyle);
        return link;
    }
   
    Component removeLink(String id, IModel itemModel) {
        final EoLayerGroupEntry entry = (EoLayerGroupEntry) itemModel.getObject();
        ImageAjaxLink link = new ImageAjaxLink( id, new ResourceReference( LayerGroupEntryPanel.class, "../../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) {
        return new PositionPanel( id, (EoLayerGroupEntry) itemModel.getObject() );
    }
 
    static class LayerGroupEntryProvider extends GeoServerDataProvider<EoLayerGroupEntry> {

        public static Property<EoLayerGroupEntry> LAYER =
            new PropertyPlaceholder<EoLayerGroupEntry>( "sourceLayer");
       
        public static Property<EoLayerGroupEntry> LAYER_SUBNAME =
                new BeanProperty<EoLayerGroupEntry>( "layer", "layerSubName");

       
        public static Property<EoLayerGroupEntry> STYLE =
            new PropertyPlaceholder<EoLayerGroupEntry>( "style" );
       
        public static Property<EoLayerGroupEntry> TYPE =
                new BeanProperty<EoLayerGroupEntry>( "layerType", "layerType" );

       
        public static Property<EoLayerGroupEntry> REMOVE =
            new PropertyPlaceholder<EoLayerGroupEntry>( "remove" );
       
        public static Property<EoLayerGroupEntry> POSITION =
            new PropertyPlaceholder<EoLayerGroupEntry>( "position" );

        static List PROPERTIES = Arrays.asList( POSITION, LAYER, LAYER_SUBNAME, TYPE, STYLE, REMOVE );
       
        List<EoLayerGroupEntry> items;
       
        public LayerGroupEntryProvider( List<EoLayerGroupEntry> items ) {
            this.items = items;
        }
       
        @Override
        protected List<EoLayerGroupEntry> getItems() {
            return items;
        }

        @Override
        protected List<Property<EoLayerGroupEntry>> getProperties() {
            return PROPERTIES;
        }

    }

    class PositionPanel extends Panel {
       
        EoLayerGroupEntry entry;
        private ImageAjaxLink upLink;
        private ImageAjaxLink downLink;       
       
        public PositionPanel( String id, final EoLayerGroupEntry entry ) {
            super( id );
            this.entry = entry;
            this.setOutputMarkupId(true);
           
            upLink = new ImageAjaxLink( "up", new ResourceReference( LayerGroupEntryPanel.class, "../../img/icons/silk/arrow_up.png") ) {
                @Override
                protected void onClick(AjaxRequestTarget target) {
                    int index = items.indexOf( PositionPanel.this.entry );
                    items.remove( index );
                    items.add(Math.max(0, index - 1), PositionPanel.this.entry);
                    target.addComponent( layerTable );
                    target.addComponent(this);
                    target.addComponent(downLink);  
                    target.addComponent(upLink);                   
                }
               
                @Override
                protected void onComponentTag(ComponentTag tag) {
                    if ( items.indexOf( entry ) == 0 ) {
                        tag.put("style", "visibility:hidden");
                    } else {
                        tag.put("style", "visibility:visible");
                    }
                }
            };
            upLink.getImage().add(new AttributeModifier("alt", true, new ParamResourceModel("up", upLink)));
            upLink.setOutputMarkupId(true);
            add( upLink);           

            downLink = new ImageAjaxLink( "down", new ResourceReference( LayerGroupEntryPanel.class, "../../img/icons/silk/arrow_down.png") ) {
                @Override
                protected void onClick(AjaxRequestTarget target) {
                    int index = items.indexOf( PositionPanel.this.entry );
                    items.remove( index );
                    items.add(Math.min(items.size(), index + 1), PositionPanel.this.entry);
                    target.addComponent( layerTable );
                    target.addComponent(this);                   
                    target.addComponent(downLink);  
                    target.addComponent(upLink);                   
                }
               
                @Override
                protected void onComponentTag(ComponentTag tag) {
                    if ( items.indexOf( entry ) == items.size() - 1) {
                        tag.put("style", "visibility:hidden");
                    } else {
                        tag.put("style", "visibility:visible");
                    }
                }
            };
            downLink.getImage().add(new AttributeModifier("alt", true, new ParamResourceModel("down", downLink)));
            downLink.setOutputMarkupId(true);
            add( downLink);
        }
    }

    public void setLayerGroupName(String layerGroupName) {
        this.layerGroupName = layerGroupName;
    }
}
TOP

Related Classes of org.geoserver.wms.eo.web.EoLayerGroupEntryPanel$PositionPanel

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.