teichmann@5861: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5861: * Software engineering by Intevation GmbH teichmann@5861: * teichmann@5993: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5861: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5993: * documentation coming with Dive4Elements River for details. teichmann@5861: */ teichmann@5861: teichmann@5835: package org.dive4elements.river.client.client.ui.map; ingo@796: gernotbelger@9483: import java.util.HashMap; gernotbelger@9483: import java.util.List; ingo@796: teichmann@5835: import org.dive4elements.river.client.client.Config; teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.client.event.OutputParameterChangeEvent; teichmann@5835: import org.dive4elements.river.client.client.event.OutputParameterChangeHandler; teichmann@5835: import org.dive4elements.river.client.client.event.RedrawRequestEvent; teichmann@5835: import org.dive4elements.river.client.client.event.RedrawRequestHandler; teichmann@5835: import org.dive4elements.river.client.client.services.LoadArtifactService; teichmann@5835: import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.services.MapOutputService; teichmann@5835: import org.dive4elements.river.client.client.services.MapOutputServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.services.StepForwardService; teichmann@5835: import org.dive4elements.river.client.client.services.StepForwardServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.ui.CollectionView; teichmann@5835: import org.dive4elements.river.client.client.ui.OutputTab; teichmann@5835: import org.dive4elements.river.client.client.ui.ThemePanel; teichmann@5835: import org.dive4elements.river.client.shared.model.Artifact; teichmann@5835: import org.dive4elements.river.client.shared.model.ArtifactDescription; teichmann@5835: import org.dive4elements.river.client.shared.model.AttributedTheme; teichmann@5835: import org.dive4elements.river.client.shared.model.Collection; teichmann@5835: import org.dive4elements.river.client.shared.model.Data; teichmann@5835: import org.dive4elements.river.client.shared.model.DataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.DataList; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultData; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultDataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.MapConfig; teichmann@5835: import org.dive4elements.river.client.shared.model.OutputMode; teichmann@5835: import org.dive4elements.river.client.shared.model.Recommendation; teichmann@5835: import org.dive4elements.river.client.shared.model.Theme; teichmann@5835: import org.dive4elements.river.client.shared.model.ThemeList; teichmann@5835: import org.dive4elements.river.client.shared.model.WMSLayer; christian@2983: import org.gwtopenmaps.openlayers.client.Bounds; christian@2983: import org.gwtopenmaps.openlayers.client.Map; christian@4402: import org.gwtopenmaps.openlayers.client.MapWidget; christian@2983: import org.gwtopenmaps.openlayers.client.event.VectorFeatureAddedListener; christian@2983: import org.gwtopenmaps.openlayers.client.event.VectorFeatureRemovedListener; christian@2983: import org.gwtopenmaps.openlayers.client.feature.VectorFeature; christian@2983: import org.gwtopenmaps.openlayers.client.format.GeoJSON; christian@2983: import org.gwtopenmaps.openlayers.client.layer.Layer; christian@5612: import org.gwtopenmaps.openlayers.client.layer.TransitionEffect; christian@2983: import org.gwtopenmaps.openlayers.client.layer.Vector; christian@2983: import org.gwtopenmaps.openlayers.client.layer.WMS; christian@2983: import org.gwtopenmaps.openlayers.client.layer.WMSOptions; christian@2983: import org.gwtopenmaps.openlayers.client.layer.WMSParams; ingo@796: gernotbelger@9483: import com.google.gwt.core.client.GWT; gernotbelger@9483: import com.google.gwt.user.client.rpc.AsyncCallback; gernotbelger@9483: import com.google.gwt.user.client.ui.AbsolutePanel; gernotbelger@9483: import com.smartgwt.client.util.SC; gernotbelger@9483: import com.smartgwt.client.widgets.Canvas; gernotbelger@9483: import com.smartgwt.client.widgets.events.ParentMovedEvent; gernotbelger@9483: import com.smartgwt.client.widgets.events.ParentMovedHandler; gernotbelger@9483: import com.smartgwt.client.widgets.events.ResizedEvent; gernotbelger@9483: import com.smartgwt.client.widgets.events.ResizedHandler; gernotbelger@9483: import com.smartgwt.client.widgets.layout.HLayout; gernotbelger@9483: import com.smartgwt.client.widgets.layout.VLayout; gernotbelger@9483: import com.smartgwt.client.widgets.tab.events.TabSelectedEvent; gernotbelger@9483: import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; ingo@796: gernotbelger@9483: public class MapOutputTab extends OutputTab implements RedrawRequestHandler, ExternalWMSWindow.LayerLoader, TabSelectedHandler, OutputParameterChangeHandler { ingo@796: ingo@823: public static final String DEFAULT_SRID = "4326"; ingo@823: ingo@825: public static final String BARRIERS_PARAMETER_KEY = "uesk.barriers"; ingo@825: ingo@1269: public static final String WSPLGEN_FACET = "floodmap.wsplgen"; ingo@1269: ingo@1414: public static final String EXTERNAL_WMS_FACTORY = "externalwmsfactory"; ingo@1414: gernotbelger@9483: protected StepForwardServiceAsync feedService = GWT.create(StepForwardService.class); ingo@825: gernotbelger@9483: protected MapOutputServiceAsync mapService = GWT.create(MapOutputService.class); ingo@1365: ingo@1414: /** Service handle to clone and add artifacts to collection. */ gernotbelger@9483: protected LoadArtifactServiceAsync loadArtifactService = GWT.create(LoadArtifactService.class); ingo@1414: ingo@1415: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@1415: ingo@825: protected MapToolbar controlPanel; ingo@806: protected ThemePanel themePanel; gernotbelger@9483: protected Canvas themePanelCanvas; gernotbelger@9483: protected MapWidget mapPanel; christian@3347: protected Canvas mapPanelCanvas; christian@4402: protected VLayout rootLayout = new VLayout(); christian@4402: protected AbsolutePanel absPan = new AbsolutePanel(); ingo@797: protected FloodMap floodMap; ingo@796: gernotbelger@9561: private boolean cancel = false; gernotbelger@9561: gernotbelger@9483: private final java.util.Map wmsUrls = new HashMap(); gernotbelger@9483: gernotbelger@9483: public MapOutputTab(final String title, final Collection collection, final OutputMode mode, final CollectionView collectionView) { ingo@1364: super(title, collection, collectionView, mode); ingo@796: raimund@1542: collectionView.registerTabHandler(this); raimund@1542: gernotbelger@9483: this.mapService.doOut(collection, new AsyncCallback() { gernotbelger@9483: @Override gernotbelger@9483: public void onFailure(final Throwable caught) { gernotbelger@9483: GWT.log("MAP ERROR: " + caught.getMessage()); gernotbelger@9483: } gernotbelger@9483: gernotbelger@9483: @Override gernotbelger@9483: public void onSuccess(final MapConfig c) { gernotbelger@9483: GWT.log("MAP SUCCESS!"); gernotbelger@9483: gernotbelger@9561: if (!MapOutputTab.this.cancel) { gernotbelger@9561: final Bounds max = boundsFromString(c.getMaxExtent()); gernotbelger@9561: Bounds initial = boundsFromString(c.getInitialExtent()); ingo@1365: gernotbelger@9561: if (initial == null) { gernotbelger@9561: GWT.log("Warning: No initial extent set."); gernotbelger@9561: initial = max; gernotbelger@9561: } ingo@1376: gernotbelger@9561: setFloodmap(new FloodMap(c.getSrid(), max, 640, 480)); ingo@1376: gernotbelger@9561: initLayout(); gernotbelger@9561: gernotbelger@9561: initBarriers(); gernotbelger@9561: gernotbelger@9561: GWT.log("MAX EXTENT: " + max); gernotbelger@9561: GWT.log("ZOOM TO: " + initial); gernotbelger@9561: getMap().zoomToExtent(initial); gernotbelger@9561: } ingo@1365: } gernotbelger@9483: }); ingo@796: } ingo@796: gernotbelger@9561: public void cancelMapService() { gernotbelger@9561: gernotbelger@9561: this.cancel = true; gernotbelger@9561: gernotbelger@9561: // if (this.floodMap != null) gernotbelger@9561: // this.floodMap.destroy(); gernotbelger@9561: } gernotbelger@9561: ingo@796: protected void initLayout() { gernotbelger@9483: this.rootLayout.setHeight100(); gernotbelger@9483: this.rootLayout.setWidth100(); gernotbelger@9483: this.rootLayout.setMembersMargin(2); ingo@797: gernotbelger@9483: final HLayout hlayout = new HLayout(); christian@4402: hlayout.setMembersMargin(0); ingo@798: christian@2983: this.themePanelCanvas = createThemePanel(); raimund@1386: gernotbelger@9483: this.controlPanel = createControlPanel(); gernotbelger@9483: this.mapPanel = this.floodMap.getMapWidget(); ingo@798: gernotbelger@9483: this.rootLayout.addMember(this.controlPanel); gernotbelger@9483: this.rootLayout.addMember(this.absPan); gernotbelger@9483: this.absPan.setWidth("100%"); gernotbelger@9483: this.absPan.setHeight("100%"); gernotbelger@9483: this.absPan.add(this.themePanelCanvas); gernotbelger@9483: this.absPan.add(this.mapPanel); ingo@798: gernotbelger@9483: this.rootLayout.addResizedHandler(new ResizedHandler() { christian@2983: @Override gernotbelger@9483: public void onResized(final ResizedEvent e) { christian@4402: doLayout(); ingo@798: } ingo@798: }); ingo@798: gernotbelger@9483: this.rootLayout.addParentMovedHandler(new ParentMovedHandler() { christian@4570: @Override gernotbelger@9483: public void onParentMoved(final ParentMovedEvent event) { gernotbelger@9483: MapOutputTab.this.mapPanel.getMap().updateSize(); christian@4570: } christian@4570: }); christian@4570: gernotbelger@9483: setPane(this.rootLayout); ingo@797: } ingo@797: christian@4402: protected void doLayout() { gernotbelger@9483: if (!this.rootLayout.isVisible()) { christian@4402: return; christian@4402: } christian@4402: tom@8856: // Manually set the height of the AbsolutePanel, tom@8856: // somehow this is necessary gernotbelger@9483: this.absPan.setHeight(String.valueOf(this.rootLayout.getHeight() - this.controlPanel.getHeight() - 2) + "px"); christian@4402: christian@4402: // Calculate bounds of Map gernotbelger@9483: final int height = this.rootLayout.getHeight() - this.controlPanel.getHeight() - 6; gernotbelger@9483: final int width = this.controlPanel.getWidth() - (this.themePanelCanvas.isVisible() ? this.themePanelCanvas.getWidth() + 4 : 2); christian@4402: christian@4402: // Set size and position of Map gernotbelger@9483: final String w = String.valueOf(width) + "px"; gernotbelger@9483: final String h = String.valueOf(height) + "px"; christian@4402: GWT.log("width=" + w); christian@4402: gernotbelger@9483: this.mapPanel.setSize(w, h); gernotbelger@9483: this.mapPanel.getMap().updateSize(); gernotbelger@9483: if (this.themePanelCanvas.isVisible()) { gernotbelger@9483: this.absPan.setWidgetPosition(this.mapPanel, this.themePanelCanvas.getWidth() + 2, 0); gernotbelger@9483: } else { gernotbelger@9483: this.absPan.setWidgetPosition(this.mapPanel, 0, 0); christian@4402: } christian@4402: christian@4402: // Set bounds of ThemePanelCanvas gernotbelger@9483: this.themePanelCanvas.setSize(this.themePanelCanvas.getWidthAsString(), String.valueOf(height + 2) + "px"); christian@4402: } christian@4402: ingo@825: protected void initBarriers() { gernotbelger@9483: final Vector vector = this.floodMap.getBarrierLayer(); gernotbelger@9483: vector.addVectorFeatureAddedListener(new VectorFeatureAddedListener() { gernotbelger@9483: @Override gernotbelger@9483: public void onFeatureAdded(final FeatureAddedEvent e) { gernotbelger@9483: saveBarriers(); ingo@825: } gernotbelger@9483: }); ingo@825: gernotbelger@9483: vector.addVectorFeatureRemovedListener(new VectorFeatureRemovedListener() { gernotbelger@9483: @Override gernotbelger@9483: public void onFeatureRemoved(final FeatureRemovedEvent e) { gernotbelger@9483: saveBarriers(); ingo@825: } gernotbelger@9483: }); ingo@825: gernotbelger@9483: final Artifact artifact = getArtifact(); ingo@825: ingo@825: if (artifact == null) { ingo@825: return; ingo@825: } ingo@825: gernotbelger@9483: final ArtifactDescription desc = artifact.getArtifactDescription(); ingo@825: ingo@825: String geojson = getGeoJSONFromStatic(desc); tom@8856: geojson = geojson != null ? geojson : getGeoJSONFromDynamic(desc); ingo@825: ingo@825: if (geojson == null || geojson.length() == 0) { ingo@825: GWT.log("No geojson string found -> no barriers existing."); ingo@825: return; ingo@825: } ingo@825: gernotbelger@9483: final GeoJSON reader = new GeoJSON(); gernotbelger@9483: final VectorFeature[] features = reader.read(geojson); ingo@825: ingo@825: vector.addFeatures(features); ingo@825: } ingo@825: gernotbelger@9483: public void addLayer(final Theme newTheme) { ingo@825: gernotbelger@9483: final Layer layer = createWMSLayer(newTheme); gernotbelger@9483: gernotbelger@9483: final FloodMap map = getFloodmap(); ingo@1382: ingo@1382: if (map != null) { ingo@1382: GWT.log("Add new layer '" + layer.getName() + "' to map."); ingo@1382: map.addLayer(layer); aheinecke@5793: if (layer instanceof WMS) { gernotbelger@9483: this.wmsUrls.put(layer.getName(), ((WMS) layer).getFullRequestString(new WMSParams(), null)); aheinecke@5793: } ingo@1382: } ingo@1382: } ingo@1382: gernotbelger@9483: public void removeLayer(final Theme theme) { ingo@1382: gernotbelger@9483: final String layerId = getLayerId(theme); ingo@1382: gernotbelger@9483: final Map map = getMap(); gernotbelger@9483: gernotbelger@9483: final Layer[] layers = map.getLayers(); gernotbelger@9483: gernotbelger@9483: for (final Layer layer : layers) { gernotbelger@9483: if (layerId.equals(layer.getName())) { ingo@1382: map.removeLayer(layer); ingo@1382: } ingo@1382: } ingo@1382: } ingo@1382: ingo@1364: @Override gernotbelger@9483: public void onRedrawRequest(final RedrawRequestEvent event) { gernotbelger@9483: this.mapService.doOut(this.collection, new AsyncCallback() { christian@2983: @Override gernotbelger@9483: public void onFailure(final Throwable caught) { ingo@1382: GWT.log("MAP ERROR: " + caught.getMessage()); ingo@1382: } ingo@1382: christian@2983: @Override gernotbelger@9483: public void onSuccess(final MapConfig c) { ingo@1397: GWT.log("We want to refresh the map now!"); gernotbelger@9483: MapOutputTab.this.themePanel.updateCollection(); ingo@1397: getFloodmap().update(); ingo@1382: } ingo@1382: }); ingo@1364: } ingo@1364: ingo@1412: @Override gernotbelger@9483: public void load(final List toLoad) { ingo@1412: GWT.log("The user wants to add " + toLoad.size() + " new WMS layers."); ingo@1414: gernotbelger@9483: final int len = toLoad.size(); ingo@1414: gernotbelger@9483: final Recommendation[] recom = new Recommendation[len]; ingo@1414: ingo@1414: for (int i = 0; i < len; i++) { gernotbelger@9483: final WMSLayer w = toLoad.get(i); ingo@1414: gernotbelger@9483: final String ids = w.getServer() + ";" + w.getName() + ";" + w.getTitle(); ingo@1414: recom[i] = new Recommendation(EXTERNAL_WMS_FACTORY, ids); ingo@1414: } ingo@1414: gernotbelger@9483: final Collection c = getCollection(); ingo@1414: gernotbelger@9483: final Config config = Config.getInstance(); gernotbelger@9483: final String locale = config.getLocale(); ingo@1414: gernotbelger@9483: this.loadArtifactService.loadMany(c, recom, EXTERNAL_WMS_FACTORY, locale, new AsyncCallback() { gernotbelger@9483: gernotbelger@9483: @Override gernotbelger@9483: public void onFailure(final Throwable throwable) { gernotbelger@9483: SC.warn(MapOutputTab.this.MSG.getString(throwable.getMessage())); ingo@1414: } gernotbelger@9483: gernotbelger@9483: @Override gernotbelger@9483: public void onSuccess(final Artifact[] newArtifacts) { gernotbelger@9483: getThemePanel().updateCollection(); gernotbelger@9483: } gernotbelger@9483: }); ingo@1412: } ingo@1412: gernotbelger@9483: protected void setFloodmap(final FloodMap floodMap) { ingo@1376: this.floodMap = floodMap; ingo@1376: } ingo@1376: ingo@1397: protected FloodMap getFloodmap() { gernotbelger@9483: return this.floodMap; ingo@1397: } ingo@1397: ingo@1306: protected Map getMap() { gernotbelger@9483: return this.floodMap.getMap(); ingo@1306: } ingo@1306: ingo@1382: protected ThemePanel getThemePanel() { gernotbelger@9483: return this.themePanel; ingo@1382: } ingo@1382: gernotbelger@9483: protected String getGeoJSONFromDynamic(final ArtifactDescription desc) { gernotbelger@9483: final DataList list = desc.getCurrentData(); ingo@825: ingo@835: if (list == null) { ingo@835: return null; ingo@835: } ingo@835: gernotbelger@9483: final List datas = list.getAll(); gernotbelger@9483: for (final Data data : datas) { gernotbelger@9483: final String key = data.getLabel(); ingo@825: ingo@825: if (key != null && key.equals(BARRIERS_PARAMETER_KEY)) { gernotbelger@9483: final DataItem def = data.getDefault(); ingo@825: ingo@825: if (def != null) { ingo@825: return def.getStringValue(); ingo@825: } ingo@825: } ingo@825: } ingo@825: ingo@825: return null; ingo@825: } ingo@825: gernotbelger@9483: protected String getGeoJSONFromStatic(final ArtifactDescription desc) { ingo@825: // TODO Implement this method, if there are reachable states right after ingo@825: // the floodmap state - which is currently not the case. ingo@825: return null; ingo@825: } ingo@825: ingo@823: public ThemeList getThemeList() { gernotbelger@9483: return this.collection.getThemeList(this.mode.getName()); ingo@823: } ingo@823: ingo@823: public String getSrid() { gernotbelger@9483: final ThemeList themeList = getThemeList(); ingo@823: gernotbelger@9483: final int num = themeList.getThemeCount(); ingo@823: ingo@823: for (int i = 1; i <= num; i++) { gernotbelger@9483: final AttributedTheme theme = (AttributedTheme) themeList.getThemeAt(i); ingo@835: ingo@835: if (theme == null) { ingo@835: continue; ingo@835: } ingo@835: gernotbelger@9483: final String srid = theme.getAttr("srid"); ingo@823: ingo@823: if (srid != null && srid.length() > 0) { ingo@823: return srid; ingo@823: } ingo@823: } ingo@823: ingo@823: return DEFAULT_SRID; ingo@823: } ingo@823: gernotbelger@9483: protected Bounds boundsFromString(final String bounds) { ingo@1376: GWT.log("Create Bounds from String: '" + bounds + "'"); ingo@806: if (bounds == null || bounds.length() == 0) { ingo@806: return null; ingo@806: } ingo@806: gernotbelger@9483: final String[] values = bounds.split(" "); ingo@806: ingo@806: if (values == null || values.length < 4) { ingo@806: return null; ingo@806: } ingo@806: ingo@806: try { gernotbelger@9483: return new Bounds(Double.valueOf(values[0]), Double.valueOf(values[1]), Double.valueOf(values[2]), Double.valueOf(values[3])); ingo@806: } gernotbelger@9483: catch (final NumberFormatException nfe) { gernotbelger@9483: } ingo@806: ingo@806: return null; ingo@806: } ingo@806: gernotbelger@9483: private Layer createWMSLayer(final Theme theme) { teichmann@4752: if (!(theme instanceof AttributedTheme)) { ingo@806: return null; ingo@806: } ingo@806: gernotbelger@9483: final AttributedTheme at = (AttributedTheme) theme; ingo@806: gernotbelger@9483: // final String desc = at.getAttr("description"); gernotbelger@9483: final String url = at.getAttr("url"); gernotbelger@9483: final String layers = at.getAttr("layers"); gernotbelger@9483: gernotbelger@9483: final String layerId = getLayerId(theme); ingo@806: ingo@806: if (url == null || layers == null) { ingo@806: return null; ingo@806: } ingo@797: gernotbelger@9483: final WMSParams params = new WMSParams(); ingo@797: params.setLayers(layers); ingo@797: params.setFormat("image/png"); ingo@806: params.setIsTransparent(true); ingo@797: gernotbelger@9483: final WMSOptions opts = new WMSOptions(); gernotbelger@9483: ingo@823: opts.setProjection("EPSG:" + getSrid()); ingo@823: opts.setSingleTile(true); ingo@823: opts.setRatio(1); rrenkert@5032: if (layers.equals("OSM-WMS-Dienst")) { gernotbelger@9483: opts.setAttribution(this.MSG.attribution()); christian@5612: opts.setSingleTile(true); christian@5612: opts.setTransitionEffect(TransitionEffect.RESIZE); rrenkert@5032: } gernotbelger@9483: final WMS wms = new WMS(layerId, url, params, opts); ingo@806: wms.setIsVisible(at.getActive() == 1); ingo@806: wms.setIsBaseLayer(false); aheinecke@5793: // We can't set the full_url attribute here because map is not set aheinecke@5793: // at.addAttr("full_url", wms.getFullRequestString(params, null)); ingo@806: return wms; ingo@797: } ingo@797: gernotbelger@9483: private String getLayerId(final Theme theme) { ingo@797: gernotbelger@9483: final AttributedTheme at = (AttributedTheme) theme; gernotbelger@9483: gernotbelger@9483: final String name = at.getAttr("name"); gernotbelger@9483: final String layers = at.getAttr("layers"); gernotbelger@9483: gernotbelger@9483: return name + "_" + layers; christian@4739: } christian@4739: raimund@1386: protected MapToolbar createControlPanel() { gernotbelger@9483: return new MapToolbar(this, this.floodMap, false); ingo@796: } ingo@796: ingo@796: protected Canvas createThemePanel() { gernotbelger@9483: final Canvas c = new Canvas(); ingo@1327: c.setMinWidth(300); ingo@4330: c.setWidth(200); ingo@796: c.setHeight100(); ingo@1327: c.setCanDragResize(true); ingo@797: c.setBorder("1px solid black"); ingo@796: gernotbelger@9483: this.themePanel = new MapThemePanel(this.getCollectionView(), this.mode, this, new MapThemePanel.ActivateCallback() { gernotbelger@9483: @Override gernotbelger@9483: public void activate(final Theme theme, final boolean active) { gernotbelger@9483: fireActivateTheme(theme, active); gernotbelger@9483: } gernotbelger@9483: }, new MapThemePanel.ThemeMovedCallback() { gernotbelger@9483: @Override gernotbelger@9483: public void onThemeMoved(final Theme theme, final int oldIdx, final int newIdx) { gernotbelger@9483: // this code synchronizes the ThemePanel and the OpenLayers gernotbelger@9483: // internal order of layers. gernotbelger@9483: final AttributedTheme at = (AttributedTheme) theme; ingo@1306: gernotbelger@9483: final String layerId = getLayerId(theme); ingo@1306: gernotbelger@9483: final Map map = getMap(); gernotbelger@9483: final Layer[] layers = map.getLayersByName(layerId); gernotbelger@9483: gernotbelger@9483: if (layers == null || layers.length == 0) { gernotbelger@9483: GWT.log("Error: Cannot find layer '" + layerId + "'"); gernotbelger@9483: return; ingo@1306: } ingo@1377: gernotbelger@9483: map.raiseLayer(layers[0], (newIdx - oldIdx) * -1); gernotbelger@9483: map.zoomTo(map.getZoom() - 1); gernotbelger@9483: map.zoomTo(map.getZoom() + 1); gernotbelger@9483: } gernotbelger@9483: }, new MapThemePanel.LayerZoomCallback() { gernotbelger@9483: @Override gernotbelger@9483: public void onLayerZoom(final Theme theme, final String extent) { gernotbelger@9483: final Bounds zoomTo = boundsFromString(extent); ingo@1377: gernotbelger@9483: if (zoomTo == null) { gernotbelger@9483: GWT.log("WARNING: No valid bounds for zooming found!"); gernotbelger@9483: return; ingo@1377: } gernotbelger@9483: gernotbelger@9483: getMap().zoomToExtent(zoomTo); ingo@1306: } gernotbelger@9483: }); gernotbelger@9483: this.themePanel.addRedrawRequestHandler(this); gernotbelger@9483: this.themePanel.addOutputParameterChangeHandler(this); gernotbelger@9483: c.addChild(this.themePanel); ingo@796: ingo@796: return c; ingo@796: } ingo@806: gernotbelger@9483: private void fireActivateTheme(final Theme theme, final boolean active) { ingo@4329: activateTheme(theme, active); ingo@4329: } ingo@4329: gernotbelger@9483: protected void activateTheme(final Theme theme, final boolean active) { ingo@1403: gernotbelger@9483: final String layerId = getLayerId(theme); ingo@806: gernotbelger@9483: final Layer layer = this.floodMap.getMap().getLayerByName(layerId); gernotbelger@9483: gernotbelger@9483: GWT.log("Set visibility of '" + layerId + "': " + active); ingo@1382: ingo@806: if (layer != null) { ingo@806: layer.setIsVisible(active); ingo@806: } ingo@806: } ingo@825: ingo@825: protected void saveBarriers() { gernotbelger@9483: final Vector layer = this.floodMap.getBarrierLayer(); ingo@825: gernotbelger@9483: final GeoJSON format = new GeoJSON(); gernotbelger@9483: final String features = format.write(layer.getFeatures()); ingo@825: gernotbelger@9483: final DataItem item = new DefaultDataItem(BARRIERS_PARAMETER_KEY, BARRIERS_PARAMETER_KEY, features); ingo@825: gernotbelger@9483: final Data data = new DefaultData(BARRIERS_PARAMETER_KEY, BARRIERS_PARAMETER_KEY, "String", new DataItem[] { item }); gernotbelger@9483: gernotbelger@9483: final Config config = Config.getInstance(); gernotbelger@9483: final String locale = config.getLocale(); gernotbelger@9483: gernotbelger@9483: this.feedService.go(locale, getArtifact(), new Data[] { data }, new AsyncCallback() { gernotbelger@9483: @Override gernotbelger@9483: public void onFailure(final Throwable caught) { gernotbelger@9483: GWT.log("Could not save barrier geometries: " + caught.getMessage()); ingo@825: } gernotbelger@9483: gernotbelger@9483: @Override gernotbelger@9483: public void onSuccess(final Artifact artifact) { gernotbelger@9483: GWT.log("Successfully saved barrier geometries."); gernotbelger@9483: } gernotbelger@9483: }); ingo@825: } raimund@1542: christian@2983: @Override gernotbelger@9483: public void onTabSelected(final TabSelectedEvent tse) { gernotbelger@9483: if (this.floodMap == null) { raimund@1542: return; raimund@1542: } gernotbelger@9483: if (this.equals(tse.getTab())) { gernotbelger@9483: this.floodMap.activateScaleLine(true); gernotbelger@9483: } else { gernotbelger@9483: this.controlPanel.activateMeasureControl(false); gernotbelger@9483: this.floodMap.activateScaleLine(false); raimund@1542: } raimund@1542: } christian@2983: christian@2983: public void toogleThemePanel() { gernotbelger@9483: this.themePanelCanvas.setVisible(!this.themePanelCanvas.isVisible()); christian@4402: christian@4402: // Trigger resize event handler christian@4402: doLayout(); christian@2983: } ingo@4329: ingo@4329: @Override gernotbelger@9483: public void onOutputParameterChanged(final OutputParameterChangeEvent evt) { ingo@4329: GWT.log("OutputParameterChanged"); gernotbelger@9483: this.controlPanel.updateThemes(getThemePanel().getThemeList()); ingo@4329: } gernotbelger@9483: gernotbelger@9483: public String getWMSUrl(final Theme theme) { gernotbelger@9483: final String layerId = getLayerId(theme); gernotbelger@9483: return this.wmsUrls.get(layerId); gernotbelger@9483: } gernotbelger@9483: }