/** * * geo-platform * Rich webgis framework * http://geo-platform.org * ==================================================================== * * Copyright (C) 2008-2017 geoSDI Group (CNR IMAA - Potenza - ITALY). * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. This program is distributed in the * hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License * for more details. You should have received a copy of the GNU General * Public License along with this program. If not, see http://www.gnu.org/licenses/ * * ==================================================================== * * Linking this library statically or dynamically with other modules is * making a combined work based on this library. Thus, the terms and * conditions of the GNU General Public License cover the whole combination. * * As a special exception, the copyright holders of this library give you permission * to link this library with independent modules to produce an executable, regardless * of the license terms of these independent modules, and to copy and distribute * the resulting executable under terms of your choice, provided that you also meet, * for each linked independent module, the terms and conditions of the license of * that module. An independent module is a module which is not derived from or * based on this library. If you modify this library, you may extend this exception * to your version of the library, but you are not obligated to do so. If you do not * wish to do so, delete this exception statement from your version. */ package org.geosdi.geoplatform.gui.client.widget.map.store; import com.extjs.gxt.ui.client.Registry; import com.google.gwt.core.client.Scheduler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.History; import java.util.Map.Entry; import java.util.logging.Logger; import org.geosdi.geoplatform.gui.client.widget.map.event.LayerRangeEvent; import org.geosdi.geoplatform.gui.configuration.map.puregwt.MapHandlerManager; import org.geosdi.geoplatform.gui.configuration.users.options.member.UserSessionEnum; import org.geosdi.geoplatform.gui.global.security.IGPAccountDetail; import org.geosdi.geoplatform.gui.impl.map.GeoPlatformMap; import org.geosdi.geoplatform.gui.impl.map.store.GPMapLayersStore; import org.geosdi.geoplatform.gui.model.GPLayerBean; import org.geosdi.geoplatform.gui.model.GPRasterBean; import org.geosdi.geoplatform.gui.model.GPVectorBean; import org.geosdi.geoplatform.gui.model.tree.GPLayerTreeModel; import org.geosdi.geoplatform.gui.puregwt.featureinfo.event.FeatureInfoAddLayer; import org.geosdi.geoplatform.gui.puregwt.featureinfo.event.FeatureInfoRemoveLayer; import org.geosdi.geoplatform.gui.puregwt.layers.LayerHandlerManager; import org.geosdi.geoplatform.gui.puregwt.layers.event.CleanLegendEvent; import org.geosdi.geoplatform.gui.puregwt.layers.event.DisplayLegendEvent; import org.geosdi.geoplatform.gui.puregwt.layers.event.HideLegendEvent; import org.geosdi.geoplatform.gui.puregwt.layers.event.ReloadLegendEvent; import org.geosdi.geoplatform.gui.shared.util.GPSharedUtils; import org.gwtopenmaps.openlayers.client.Projection; import org.gwtopenmaps.openlayers.client.layer.Layer; import org.gwtopenmaps.openlayers.client.layer.WMS; import org.gwtopenmaps.openlayers.client.layer.WMSOptions; import org.gwtopenmaps.openlayers.client.layer.WMSParams; /** * @author Giuseppe La Scaleia - CNR IMAA geoSDI Group * @email giuseppe.lascaleia@geosdi.org * */ public class MapLayersStore extends GPMapLayersStore<GPLayerBean, Layer> { protected final static Logger logger = Logger.getLogger(""); private final MapLayerBuilder layerBuilder; private final DisplayLegendEvent displayLegendEvent = new DisplayLegendEvent(); private final HideLegendEvent hideLegendEvent = new HideLegendEvent(); private final ReloadLegendEvent reloadLegendEvent = new ReloadLegendEvent(); private final CleanLegendEvent cleanLegend = new CleanLegendEvent(); private final FeatureInfoAddLayer featureInfoAddLayer = new FeatureInfoAddLayer(); private final FeatureInfoRemoveLayer featureInfoRemoveLayer = new FeatureInfoRemoveLayer(); public MapLayersStore(GeoPlatformMap theMapWidget) { super(theMapWidget); this.layerBuilder = new MapLayerBuilder(theMapWidget.getMapWidget()); } @Override public boolean containsLayer(GPLayerBean key) { return this.layers.containsKey(key); } @Override public GPLayerBean getLayer(Layer value) { GPLayerBean layerToReturn = null; for (Entry<GPLayerBean, Layer> layer : GPSharedUtils.safeCollection( this.layers.entrySet())) { if (layer.getValue().getId().equals(value.getId())) { layerToReturn = layer.getKey(); break; } } return layerToReturn; } @Override public Layer getLayer(GPLayerBean key) { return this.layers.get(key); } @Override public void onDisplayLayer(GPLayerBean layerBean) { super.displayLayer(layerBean); } @Override public void onHideLayer(GPLayerBean layerBean) { this.hideLayer(layerBean); } @Override public void onRemoveLayer(GPLayerBean layerBean) { this.removeLayer(layerBean); } @Override public void reloadLayer(GPLayerBean layer) { WMS wmsLayer = (WMS) this.layers.get(layer); if (wmsLayer != null) { logger.finest("REDRAW layer: " + layer.getTitle()); wmsLayer.redraw(true); this.reloadLegendEvent.setLayerBean(layer); LayerHandlerManager.fireEvent(this.reloadLegendEvent); } } @Override public void displayVector(GPVectorBean vectorBean) { displayLegendEvent.setLayerBean(vectorBean); LayerHandlerManager.fireEvent(displayLegendEvent); if (containsLayer(vectorBean)) { final WMS layer = (WMS) this.layers.get(vectorBean); if (!layer.isVisible() || Integer.parseInt( layer.getZIndex().toString()) != vectorBean.getzIndex()) { layer.setZIndex(vectorBean.getzIndex()); Scheduler.get().scheduleDeferred(new Command() { @Override public void execute() { layer.setIsVisible(true); layer.redraw(true); } }); } } else { WMS layer = (WMS) this.layerBuilder.buildLayer(vectorBean); this.layers.put(vectorBean, layer); this.mapWidget.getMap().addLayer(layer); layer.setZIndex(vectorBean.getzIndex()); } } @Override public void displayRaster(GPRasterBean rasterBean) { IGPAccountDetail accountDetail = Registry.get( UserSessionEnum.ACCOUNT_DETAIL_IN_SESSION.name()); displayLegendEvent.setLayerBean(rasterBean); LayerHandlerManager.fireEvent(displayLegendEvent); final WMS layer; if (containsLayer(rasterBean)) { layer = (WMS) this.layers.get(rasterBean); if (!layer.isVisible() || Integer.parseInt( layer.getZIndex().toString()) != rasterBean.getzIndex()) { layer.setZIndex(rasterBean.getzIndex()); Scheduler.get().scheduleDeferred(new Command() { @Override public void execute() { layer.setIsVisible(true); layer.redraw(true); } }); History.newItem("#" + accountDetail.getUsername() + "-" + rasterBean.getName() + "-VISIBLE"); } } else { layer = (WMS) this.layerBuilder.buildLayer(rasterBean); this.layers.put(rasterBean, layer); this.mapWidget.getMap().addLayer(layer); layer.setZIndex(rasterBean.getzIndex()); layer.redraw(true); History.newItem("#" + accountDetail.getUsername() + "-" + rasterBean.getName() + "-ADDED"); } featureInfoAddLayer.setLayer(layer); MapHandlerManager.fireEvent(featureInfoAddLayer); } @Override public void hideLayer(GPLayerBean layerBean) { IGPAccountDetail accountDetail = Registry.get( UserSessionEnum.ACCOUNT_DETAIL_IN_SESSION.name()); final Layer layer = getLayer(layerBean); if (layer != null) { Scheduler.get().scheduleDeferred(new Command() { @Override public void execute() { layer.setIsVisible(false); } }); History.newItem("#" + accountDetail.getUsername() + "-" + layerBean.getName() + "-NOT-VISIBLE"); featureInfoRemoveLayer.setLayer(layer); MapHandlerManager.fireEvent(featureInfoRemoveLayer); } this.hideLegendEvent.setLayerBean(layerBean); LayerHandlerManager.fireEvent(this.hideLegendEvent); } /* * (non-Javadoc) * * @see * org.geosdi.geoplatform.gui.impl.map.store.ILayersStore#removeLayer(org * .geosdi.geoplatform.gui.model.GPLayerBean) */ @Override public void removeLayer(GPLayerBean layerBean) { IGPAccountDetail accountDetail = Registry.get( UserSessionEnum.ACCOUNT_DETAIL_IN_SESSION.name()); Layer layer = getLayer(layerBean); if (layer != null) { this.mapWidget.getMap().removeLayer(layer); History.newItem("#" + accountDetail.getUsername() + "-" + layerBean.getName() + "-REMOVED"); featureInfoRemoveLayer.setLayer(layer); MapHandlerManager.fireEvent(featureInfoRemoveLayer); } this.layers.remove(layerBean); this.hideLegendEvent.setLayerBean(layerBean); LayerHandlerManager.fireEvent(this.hideLegendEvent); } @Override public void onChangeStyle(GPRasterBean layerBean, String newStyle) { WMS layer = (WMS) this.layers.get(layerBean); if ((layer != null) && (layer.isVisible())) { WMSParams params = new WMSParams(); params.setStyles(newStyle); layer.mergeNewParams(params); this.reloadLegendEvent.setLayerBean(layerBean); LayerHandlerManager.fireEvent(this.reloadLegendEvent); } } @Override public void onChangeSingleTileRequest(GPRasterBean layerBean, boolean singleTileRequest) { WMS layer = (WMS) this.layers.get(layerBean); if (layer != null && layer.isSingleTile() != singleTileRequest) { boolean isVisible = layer.isVisible(); this.removeLayer(layerBean); layer.destroy(); if (isVisible) { this.displayRaster(layerBean); } } } @Override public void onChangeCqlFilter(GPLayerTreeModel layerBean) { WMS layer = (WMS) this.layers.get(layerBean); if ((layer != null) && (layer.isVisible())) { WMSParams params; if (layerBean.getCqlFilter() == null || layerBean.getCqlFilter().trim().equals( "")) { params = layer.getParams(); params.removeCQLFilter(); } else { params = new WMSParams(); params.setCQLFilter(layerBean.getCqlFilter()); } layer.mergeNewParams(params); } } @Override public void onChangeTimeFilter(GPLayerTreeModel layerBean) { WMS layer = (WMS) this.layers.get(layerBean); if ((layer != null) && (layer.isVisible())) { WMSParams params; if (layerBean.getTimeFilter() == null || layerBean.getTimeFilter().trim().equals( "")) { params = layer.getParams(); params.removeTimeFilter(); } else { params = new WMSParams(); if (layerBean.getVariableTimeFilter() != null) { params.setTimeFilter(layerBean.getVariableTimeFilter()); } else { params.setTimeFilter(layerBean.getTimeFilter()); } } layer.mergeNewParams(params); } } @Override public void changeOpacity(GPRasterBean layerBean) { Layer layer = getLayer(layerBean); if ((layer != null) && (layer.isVisible())) { layer.setOpacity(layerBean.getOpacity()); } } @Override public void changeMaxScale(GPRasterBean layerBean, Float maxScale) { WMS layer = (WMS) this.layers.get(layerBean); if ((layer != null) && (layer.isVisible())) { WMSOptions options = layer.getOptions(); if (maxScale == null) { options.unsetMaxScale(); } else { options.setMaxScale(maxScale); } layer.addOptions(options); layer.calculateInRange(); layer.redraw(true); this.reloadLegendEvent.setLayerBean(layerBean); LayerHandlerManager.fireEvent(this.reloadLegendEvent); this.updateLayerLabel(layerBean, layer.isInRange()); } } private void updateLayerLabel(GPLayerBean layerBean, boolean inRange) { LayerRangeEvent layerRangeEvent = new LayerRangeEvent(layerBean, inRange); LayerHandlerManager.fireEvent(layerRangeEvent); } @Override public void changeMinScale(GPRasterBean layerBean, Float minScale) { WMS layer = (WMS) this.layers.get(layerBean); if ((layer != null) && (layer.isVisible())) { WMSOptions options = layer.getOptions(); if (minScale == null) { options.unsetMinScale(); } else { options.setMinScale(minScale); } layer.addOptions(options); layer.calculateInRange(); layer.redraw(true); this.reloadLegendEvent.setLayerBean(layerBean); LayerHandlerManager.fireEvent(this.reloadLegendEvent); this.updateLayerLabel(layerBean, layer.isInRange()); } } @Override public void resetStore() { for (Layer layer : layers.values()) { this.mapWidget.getMap().removeLayer(layer); } this.layers.clear(); LayerHandlerManager.fireEvent(cleanLegend); } @Override public void onReloadLayer(GPLayerBean layerBean) { this.reloadLayer(layerBean); } @Override public void onChangeBaseLayer(Projection projection) { for (GPLayerBean layer : super.layers.keySet()) { this.layerBuilder.generateBoundsTransformationFromMap(layer); } } }