view flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapThemePanel.java @ 1421:d50c3262e638

Reorder the map themes at the end of the layer initialization to be in sync with the map theme panel. flys-client/trunk@3358 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Tue, 06 Dec 2011 09:08:48 +0000
parents 6a7cfe9d87fe
children 25be27e33b77
line wrap: on
line source
package de.intevation.flys.client.client.ui.map;

import com.google.gwt.core.client.GWT;

import com.smartgwt.client.types.ImageStyle;
import com.smartgwt.client.types.ListGridFieldType;
import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Img;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.menu.Menu;
import com.smartgwt.client.widgets.menu.MenuItem;
import com.smartgwt.client.widgets.menu.events.ClickHandler;
import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent;

import org.gwtopenmaps.openlayers.client.Map;
import org.gwtopenmaps.openlayers.client.layer.Layer;

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

import de.intevation.flys.client.client.FLYSConstants;
import de.intevation.flys.client.client.ui.ThemePanel;


/**
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class MapThemePanel extends ThemePanel {

    public static final int CELL_HEIGHT      = 75;
    public static final int STYLE_CELL_WIDTH = 125;


    public interface ActivateCallback {
        void activate(Theme theme, boolean activate);
    }


    public interface ThemeMovedCallback {
        void onThemeMoved(Theme theme, int oldIdx, int newIdx);
    }

    public interface LayerZoomCallback {
        void onLayerZoom(Theme theme, String extent);
    }



    private FLYSConstants MSG = GWT.create(FLYSConstants.class);


    protected ActivateCallback   activateCallback;
    protected ThemeMovedCallback themeMovedCallback;
    protected LayerZoomCallback  layerZoomCallback;

    protected ListGridRecord[] oldRecords;


    public static final String GRID_FIELD_ACTIVE = "active";
    public static final String GRID_FIELD_STYLE  = "style";
    public static final String GRID_FIELD_NAME   = "name";


    protected MapOutputTab mapOut;


    public MapThemePanel(
        Collection         collection,
        MapOutputTab       mapOut,
        OutputMode         mode,
        ActivateCallback   activateCallback
    ) {
        this(collection, mode, mapOut, activateCallback, null, null);
    }


    public MapThemePanel(
        Collection         collection,
        OutputMode         mode,
        MapOutputTab       mapOut,
        ActivateCallback   activateCallback,
        ThemeMovedCallback themeMovedCallback,
        LayerZoomCallback  layerZoomCallback
    ) {
        super(collection, mode);

        this.mapOut             = mapOut;
        this.activateCallback   = activateCallback;
        this.themeMovedCallback = themeMovedCallback;
        this.layerZoomCallback  = layerZoomCallback;

        initGrid();
        initLayout();

        updateGrid();
    }


    protected void initLayout() {
        setWidth100();
        setHeight100();

        VLayout layout = new VLayout();
        layout.setWidth100();
        layout.setHeight100();

        layout.addMember(list);
        layout.addMember(navigation);

        addChild(layout);
    }


    protected void initGrid() {
        list.setCanEdit(true);
        list.setCanSort(false);
        list.setShowRecordComponents(false);
        list.setShowRecordComponentsByCell(true);
        list.setShowHeader(true);
        list.setShowHeaderContextMenu(false);
        list.setWidth100();
        list.setHeight100();

        list.setCellHeight(CELL_HEIGHT);
        list.setShowRecordComponents(true);
        list.setShowRecordComponentsByCell(true);
        list.setShowAllRecords(true);

        list.addEditCompleteHandler(this);

        ListGridField active = new ListGridField(GRID_FIELD_ACTIVE, " ", 20);
        active.setType(ListGridFieldType.BOOLEAN);
        active.setCanDragResize(false);

        ListGridField style = new ListGridField(
            GRID_FIELD_STYLE,
            MSG.map_themepanel_header_style(),
            STYLE_CELL_WIDTH);
        style.setCanEdit(false);
        style.setCanDragResize(false);

        ListGridField name = new ListGridField(
            GRID_FIELD_NAME, MSG.chart_themepanel_header_themes());
        name.setType(ListGridFieldType.TEXT);

        list.setFields(active, style, name);
    }


    @Override
    protected ListGrid createNewGrid() {
        ListGrid grid = new ListGrid() {
            @Override
            protected Canvas createRecordComponent(final ListGridRecord record, Integer colNum) {
                String fieldname = getFieldName(colNum);

                if (fieldname.equals(GRID_FIELD_STYLE)) {
                    FacetRecord      r = (FacetRecord) record;
                    AttributedTheme at = (AttributedTheme) r.getTheme();

                    String imgUrl = MapUtils.getLegendGraphicUrl(
                        at.getAttr("url"),
                        at.getAttr("layers"));

                    HLayout layout = new HLayout();
                    layout.setAlign(VerticalAlignment.CENTER);
                    layout.setLayoutAlign(VerticalAlignment.CENTER);

                    Img img = new Img(imgUrl);
                    img.setImageType(ImageStyle.CENTER);

                    layout.addMember(img);

                    return layout;
                }

                return super.createRecordComponent(record, colNum);
            }
        };

        return grid;
    }


    @Override
    protected void clearGrid() {
        oldRecords = list.getRecords();
        super.clearGrid();
    }


    /**
     * This method calls super.updateGrid() at first. Finally, it is used to
     * reorder the layers in the map. The first layer added to the map is the
     * layer which is least visible. So, the order needs to be reflected.
     */
    @Override
    protected void updateGrid() {
        super.updateGrid();

        Map map = mapOut.getMap();
        int num = map.getNumLayers() - 1; // without the vector layer

        Layer[] layers = map.getLayers();

        for (int i = 1; i < num; i++) {
            map.raiseLayer(layers[i], num-i);
        }
    }


    @Override
    protected void addFacetRecord(FacetRecord rec) {
        Theme newTheme = rec.getTheme();
        boolean  isNew = true;

        for (ListGridRecord old: getOldRecords()) {
            FacetRecord fr = (FacetRecord) old;

            if (newTheme.equals(fr.getTheme())) {
                isNew = false;
                break;
            }
        }

        if (isNew && mapOut != null) {
            mapOut.addLayer(mapOut.createWMSLayer(newTheme));
        }

        super.addFacetRecord(rec);
    }


    @Override
    protected Menu getSingleContextMenu(final ListGridRecord[] records) {
        Menu menu = super.getSingleContextMenu(records);

        MenuItem layerZoom = createLayerZoomItem(records);
        if (layerZoom != null) {
            menu.addItem(layerZoom);
        }

        return menu;
    }


    @Override
    protected MenuItem createRemoveItem(final ListGridRecord[] records) {
        MenuItem item = super.createRemoveItem(records);
        item.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(MenuItemClickEvent evt) {
                for (ListGridRecord record: records) {
                    FacetRecord facet = (FacetRecord) record;

                    Theme theme = facet.getTheme();
                    theme.setVisible(0);
                    theme.setActive(0);

                    AttributedTheme at = (AttributedTheme) theme;
                    getMapOutputTab().removeLayer(at.getAttr("layers"));
                }

                updateCollection();
            }
        });

        return item;
    }


    protected MenuItem createLayerZoomItem(final ListGridRecord[] recs) {
        final FacetRecord     fr = (FacetRecord) recs[0];
        final AttributedTheme at = (AttributedTheme) fr.getTheme();

        final String extent = at.getAttr("extent");

        if (extent == null || extent.length() == 0) {
            return null;
        }

        MenuItem zoom = new MenuItem(MSG.zoomToLayer());
        zoom.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(MenuItemClickEvent evt) {
                if (layerZoomCallback != null) {
                    layerZoomCallback.onLayerZoom(at, extent);
                }
            }
        });

        return zoom;
    }


    @Override
    public void activateTheme(Theme theme, boolean active) {
        if (activateCallback != null) {
            activateCallback.activate(theme, active);
        }

        theme.setActive(active ? 1 : 0);
    }


    @Override
    protected void fireThemeMoved(Theme theme, int oldIdx, int newIdx) {
        if (themeMovedCallback != null) {
            themeMovedCallback.onThemeMoved(theme, oldIdx, newIdx);
        }
    }


    protected ListGridRecord[] getOldRecords() {
        return oldRecords != null ? oldRecords : new ListGridRecord[0];
    }


    protected MapOutputTab getMapOutputTab() {
        return mapOut;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org