view flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java @ 823:407de0f4b66a

Set the map projection and its max extent dynamically - information extracted from facets. flys-client/trunk@2515 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Fri, 19 Aug 2011 15:57:23 +0000
parents 112f95d7b286
children 1b9b7e9ab219
line wrap: on
line source
package de.intevation.flys.client.client.ui.map;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Widget;

import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.events.ResizedEvent;
import com.smartgwt.client.widgets.events.ResizedHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;

import org.gwtopenmaps.openlayers.client.Bounds;
import org.gwtopenmaps.openlayers.client.Map;
import org.gwtopenmaps.openlayers.client.layer.Layer;
import org.gwtopenmaps.openlayers.client.layer.WMS;
import org.gwtopenmaps.openlayers.client.layer.WMSParams;
import org.gwtopenmaps.openlayers.client.layer.WMSOptions;

import de.intevation.flys.client.shared.model.AttributedTheme;
import de.intevation.flys.client.shared.model.Collection;
import de.intevation.flys.client.shared.model.Theme;
import de.intevation.flys.client.shared.model.ThemeList;
import de.intevation.flys.client.shared.model.OutputMode;

import de.intevation.flys.client.client.ui.CollectionView;
import de.intevation.flys.client.client.ui.OutputTab;
import de.intevation.flys.client.client.ui.ThemePanel;


public class MapOutputTab extends OutputTab {

    public static final String DEFAULT_SRID = "4326";


    protected CollectionView parent;

    protected Canvas     controlPanel;
    protected ThemePanel themePanel;
    protected Widget     mapPanel;

    protected FloodMap floodMap;


    public MapOutputTab(
        String         title,
        Collection     collection,
        OutputMode     mode,
        CollectionView collectionView
    ){
        super(title, collection, mode);
        this.parent = collectionView;

        floodMap = new FloodMap(getSrid(), getMaxExtent());

        initLayout();
        initLayers();
    }


    protected void initLayout() {
        VLayout rootLayout = new VLayout();
        rootLayout.setHeight100();
        rootLayout.setWidth100();
        rootLayout.setMembersMargin(2);

        final Canvas  wrapper = new Canvas();
        wrapper.setWidth100();
        wrapper.setHeight100();

        controlPanel = createControlPanel(wrapper);
        mapPanel     = floodMap.getMapWidget();
        Canvas themePanelWrapper = createThemePanel();

        final HorizontalPanel layout = new HorizontalPanel();
        layout.setWidth("99%");
        layout.setHeight("99%");
        layout.add(mapPanel);

        wrapper.addChild(layout);

        HLayout hlayout = new HLayout();
        hlayout.setHeight("*");
        hlayout.setWidth100();
        hlayout.setMembersMargin(2);

        hlayout.addMember(themePanelWrapper);
        hlayout.addMember(wrapper);

        rootLayout.addMember(controlPanel);
        rootLayout.addMember(hlayout);

        wrapper.addResizedHandler(new ResizedHandler() {
            public void onResized(ResizedEvent e) {
                Integer height = wrapper.getHeight();
                Integer width  = wrapper.getWidth();

                height = height * 99 / 100;
                width  = width  * 99 / 100;

                String w = String.valueOf(width) + "px";
                String h = String.valueOf(height) + "px";

                floodMap.setSize(w, h);
            }
        });

        setPane(rootLayout);
    }


    protected void initLayers() {
        ThemeList themeList = themePanel.getThemeList();

        int num = themeList.getThemeCount();

        Map    map    = floodMap.getMap();
        Bounds extent = null;

        for (int i = 1; i <= num; i++) {
            Theme theme = themeList.getThemeAt(i);
            Layer layer = createWMSLayer(theme);

            if (layer == null) {
                continue;
            }

            map.addLayer(layer);

            AttributedTheme at = (AttributedTheme) theme;
            String tmp         = at.getAttr("extent");

            if (theme.getActive() == 1) {
                if (extent == null) {
                    extent = boundsFromString(tmp);
                }
                else {
                    Bounds b = boundsFromString(tmp);

                    if (b != null) {
                        extent.extend(b);
                    }
                }
            }
        }

        GWT.log("Maps initial extent = " + extent);

        map.zoomToExtent(extent  != null
            ? extent
            : new Bounds(-90, -180, 90, 180));
    }


    public ThemeList getThemeList() {
        return collection.getThemeList(mode.getName());
    }


    public String getSrid() {
        ThemeList themeList = getThemeList();

        int num = themeList.getThemeCount();

        for (int i = 1; i <= num; i++) {
            AttributedTheme theme = (AttributedTheme) themeList.getThemeAt(i);
            String srid = theme.getAttr("srid");

            if (srid != null && srid.length() > 0) {
                return srid;
            }
        }

        return DEFAULT_SRID;
    }


    public Bounds getMaxExtent() {
        ThemeList themeList = getThemeList();

        int num = themeList.getThemeCount();

        Bounds extent = null;

        for (int i = 1; i <= num; i++) {
            AttributedTheme theme = (AttributedTheme) themeList.getThemeAt(i);
            String tmp = theme.getAttr("extent");

            if (theme.getActive() == 1) {
                if (extent == null) {
                    extent = boundsFromString(tmp);
                }
                else {
                    Bounds b = boundsFromString(tmp);

                    if (b != null) {
                        extent.extend(b);
                    }
                }
            }
        }

        return extent;
    }


    protected Bounds boundsFromString(String bounds) {
        if (bounds == null || bounds.length() == 0) {
            return null;
        }

        String[] values = bounds.split(" ");

        if (values == null || values.length < 4) {
            return null;
        }

        try {
            return new Bounds(
                Double.valueOf(values[0]),
                Double.valueOf(values[1]),
                Double.valueOf(values[2]),
                Double.valueOf(values[3]));
        }
        catch (NumberFormatException nfe) {}

        return null;
    }


    protected Layer createWMSLayer(Theme theme) {
        if (theme == null) {
            return null;
        }

        AttributedTheme at = (AttributedTheme) theme;

        String type   = at.getAttr("name");
        String desc   = at.getAttr("description");
        String url    = at.getAttr("url");
        String layers = at.getAttr("layers");

        if (url == null || layers == null) {
            return null;
        }

        //boolean baseLayer = type.equals("floodmap.wmsbackground");

        WMSParams params = new WMSParams();
        params.setLayers(layers);
        params.setFormat("image/png");
        params.setIsTransparent(true);

        WMSOptions opts = new WMSOptions();
        opts.setProjection("EPSG:" + getSrid());
        opts.setSingleTile(true);
        opts.setRatio(1);

        WMS wms = new WMS(desc, url, params, opts);
        wms.setIsVisible(at.getActive() == 1);
        wms.setIsBaseLayer(false);

        return wms;
    }


    protected Canvas createControlPanel(Canvas wrapper) {
        return new MapToolbar(floodMap, wrapper);
    }


    protected Canvas createThemePanel() {
        Canvas c = new Canvas();
        c.setWidth(200);
        c.setHeight100();
        c.setBorder("1px solid black");

        themePanel = new MapThemePanel(
            collection, mode, new MapThemePanel.ActivateCallback() {
                public void activate(Theme theme, boolean active) {
                    activateTheme(theme, active);
                }
            });
        c.addChild(themePanel);

        return c;
    }


    protected void activateTheme(Theme theme, boolean active) {
        String name = theme.getDescription();
        Layer layer = floodMap.getMap().getLayerByName(name);

        if (layer != null) {
            layer.setIsVisible(active);
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org