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; ingo@833: ingo@833: import com.google.gwt.core.client.GWT; ingo@833: import com.google.gwt.user.client.rpc.AsyncCallback; christian@4062: import com.smartgwt.client.types.VerticalAlignment; ingo@833: import com.smartgwt.client.util.SC; christian@4062: import com.smartgwt.client.widgets.Canvas; raimund@2494: import com.smartgwt.client.widgets.Label; christian@5538: import com.smartgwt.client.widgets.events.ParentMovedEvent; christian@5538: import com.smartgwt.client.widgets.events.ParentMovedHandler; christian@5538: import com.smartgwt.client.widgets.events.ResizedEvent; christian@5538: import com.smartgwt.client.widgets.events.ResizedHandler; christian@4062: import com.smartgwt.client.widgets.events.VisibilityChangedEvent; raimund@1389: import com.smartgwt.client.widgets.events.VisibilityChangedHandler; christian@4062: import com.smartgwt.client.widgets.layout.VLayout; christian@4062: import com.smartgwt.client.widgets.tab.events.TabSelectedEvent; christian@4062: import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; ingo@833: teichmann@5835: import org.dive4elements.river.client.client.Config; teichmann@5835: import org.dive4elements.river.client.client.FLYS; teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.client.services.MapInfoService; teichmann@5835: import org.dive4elements.river.client.client.services.MapInfoServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.ui.map.FloodMap; teichmann@5835: import org.dive4elements.river.client.client.ui.map.MapPanel; 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.MapInfo; ingo@833: christian@5538: import java.util.List; christian@5538: christian@5538: import org.gwtopenmaps.openlayers.client.Map; christian@5538: import org.gwtopenmaps.openlayers.client.control.Attribution; christian@5612: import org.gwtopenmaps.openlayers.client.layer.TransitionEffect; christian@5538: import org.gwtopenmaps.openlayers.client.layer.WMS; christian@5538: import org.gwtopenmaps.openlayers.client.layer.WMSOptions; christian@5538: import org.gwtopenmaps.openlayers.client.layer.WMSParams; christian@5538: ingo@833: raimund@915: public class DigitizePanel raimund@915: extends SelectProvider raimund@1389: implements TabSelectedHandler, VisibilityChangedHandler { ingo@833: christian@4131: private static final long serialVersionUID = 3529775660871273314L; christian@4131: ingo@833: protected MapInfoServiceAsync mapInfo = GWT.create(MapInfoService.class); ingo@833: ingo@833: protected FloodMap floodMap; ingo@833: raimund@1389: protected MapPanel mapPanel; ingo@833: ingo@833: public static final String UESK_BARRIERS = "uesk.barriers"; ingo@833: christian@4801: /** The message class that provides i18n strings. */ christian@4801: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@833: ingo@833: public DigitizePanel() { ingo@833: } ingo@833: ingo@833: ingo@833: @Override ingo@833: public Canvas create(DataList list) { raimund@1389: helperContainer.addVisibilityChangedHandler(this); raimund@1389: ingo@872: DataList clone = (DataList) list.clone(); ingo@872: List all = clone.getAll(); ingo@872: all.remove(UESK_BARRIERS); ingo@872: rrenkert@5312: Canvas widget = createWidget(list); ingo@833: ingo@833: final Config cfg = Config.getInstance(); ingo@833: final String locale = cfg.getLocale(); ingo@833: ingo@873: String river = getDataValue("state.winfo.river", "river"); raimund@1425: mapInfo.getMapInfo(locale, river, new AsyncCallback() { christian@4062: @Override ingo@833: public void onFailure(Throwable caught) { ingo@833: String msg = caught.getMessage(); ingo@833: ingo@833: GWT.log("Error while fetching MapInfo: " + msg); christian@4801: SC.warn(FLYS.getExceptionString(MSG, caught)); ingo@833: } ingo@833: christian@4062: @Override ingo@833: public void onSuccess(MapInfo info) { rrenkert@5312: createMapWidget(info); ingo@833: } ingo@833: }); ingo@833: rrenkert@5312: return widget; ingo@833: } ingo@833: ingo@833: raimund@2494: /** raimund@2494: * This method creates the content of the widget. raimund@2494: * raimund@2494: * @param data The {@link DataList} object. raimund@2494: * raimund@2494: * @return a combobox. raimund@2494: */ christian@4062: @Override raimund@2494: protected Canvas createWidget(DataList data) { raimund@2494: GWT.log("DigitizePanel - createWidget()"); raimund@2494: christian@5612: VLayout layout = new VLayout(); raimund@2494: layout.setAlign(VerticalAlignment.TOP); raimund@2494: layout.setHeight(25); raimund@2494: raimund@2494: int size = data.size(); raimund@2494: raimund@2494: for (int i = 0; i < size; i++) { raimund@2494: Data d = data.get(i); raimund@2494: raimund@2494: Label label = new Label(d.getDescription()); raimund@2494: label.setValign(VerticalAlignment.TOP); raimund@2494: label.setHeight(20); raimund@2494: label.setWidth(400); raimund@2494: raimund@2494: layout.addMember(label); christian@4574: layout.addMember(getNextButton()); raimund@2494: } raimund@2494: raimund@2494: layout.setAlign(VerticalAlignment.TOP); raimund@2494: raimund@2494: return layout; raimund@2494: } raimund@2494: raimund@2494: ingo@833: @Override ingo@833: protected Data[] getData() { christian@5612: final Data[] total = new Data[1]; ingo@833: christian@4062: if (floodMap != null) { christian@4062: DataItem item = new DefaultDataItem( christian@4062: UESK_BARRIERS, UESK_BARRIERS, floodMap.getFeaturesAsGeoJSON()); rrenkert@5312: total[0] = new DefaultData( christian@4062: UESK_BARRIERS, null, null, new DataItem[] { item }); christian@4062: } christian@4062: else { christian@4062: // Happens when OpenLayers is missing christian@4062: GWT.log("floodMap is null -> OpenLayers missing?"); christian@4062: } ingo@833: ingo@833: return total; ingo@833: } ingo@833: ingo@833: rrenkert@5312: public void createMapWidget(MapInfo mapInfo) { raimund@1389: mapPanel = new MapPanel(mapInfo, true); ingo@833: ingo@833: floodMap = mapPanel.getFloodMap(); ingo@833: Map map = floodMap.getMap(); ingo@833: christian@5538: helperContainer.addResizedHandler(new ResizedHandler() { christian@5538: @Override christian@5538: public void onResized(ResizedEvent event) { tom@8856: mapPanel.doLayout( tom@8856: helperContainer.getWidth(), helperContainer.getHeight()); christian@5538: } christian@5538: }); christian@5538: helperContainer.addParentMovedHandler(new ParentMovedHandler() { christian@5538: @Override christian@5538: public void onParentMoved(ParentMovedEvent event) { christian@5612: mapPanel.getFloodMap().updateSize(); christian@5612: } christian@5612: }); tom@8856: helperContainer.addVisibilityChangedHandler( tom@8856: new VisibilityChangedHandler() { christian@5612: @Override christian@5612: public void onVisibilityChanged(VisibilityChangedEvent event) { tom@8856: mapPanel.doLayout( tom@8856: helperContainer.getWidth(), helperContainer.getHeight()); christian@5538: } christian@5538: }); ingo@833: helperContainer.addMember(mapPanel); ingo@833: raimund@915: parameterList.registerCollectionViewTabHandler(this); raimund@915: ingo@833: WMS axis = getLayer( christian@4632: mapInfo.getWmsUrl(), mapInfo.getWmsLayers(), christian@5612: mapInfo.getProjection(), false, true); ingo@833: WMS back = getLayer( ingo@833: mapInfo.getBackgroundWmsUrl(), mapInfo.getBackgroundWmsLayers(), christian@5612: mapInfo.getProjection(), false, false); ingo@833: christian@4553: map.addLayer(back); ingo@833: map.addLayer(axis); ingo@833: rrenkert@5312: String hws = getDataValue("state.winfo.uesk.dc-hws", "uesk.hws"); rrenkert@5312: if (hws != null && hws.length() > 0) { rrenkert@5312: WMS hwsLayer = getLayer( rrenkert@5312: //TODO: Use Mapinfo to get hws layer infos. rrenkert@5312: mapInfo.getWmsUrl().replace("river", "user"), rrenkert@5312: "ms_layer-hws-lines" + artifact.getUuid(), rrenkert@5312: mapInfo.getProjection(), christian@5612: false, true); rrenkert@5312: map.addLayer(hwsLayer); rrenkert@5312: } tom@8856: String userRgd = getDataValue( tom@8856: "state.winfo.uesk.user-rgd", "uesk.user-rgd"); rrenkert@5312: if (userRgd != null && userRgd.length() > 0) { rrenkert@5312: WMS userLayer = getLayer( rrenkert@5312: //TODO: Use Mapinfo to get hws layer infos. rrenkert@5312: mapInfo.getWmsUrl().replace("river", "user"), rrenkert@5312: "ms_layer-user-rgd" + artifact.getUuid(), rrenkert@5312: mapInfo.getProjection(), christian@5612: false, true); rrenkert@5312: map.addLayer(userLayer); ingo@833: } rrenkert@5032: map.addControl(new Attribution()); ingo@833: map.zoomToMaxExtent(); christian@5612: tom@8856: mapPanel.doLayout( tom@8856: helperContainer.getWidth(), helperContainer.getHeight()); ingo@833: } ingo@833: ingo@833: tom@8856: protected WMS getLayer( tom@8856: String url, tom@8856: String layers, tom@8856: String proj, tom@8856: boolean isBaseLayer, tom@8856: boolean singleTiled tom@8856: ) { christian@5612: final WMSParams params = new WMSParams(); ingo@833: params.setLayers(layers); ingo@833: params.setFormat("image/png"); christian@5612: params.setIsTransparent(!isBaseLayer); ingo@833: christian@5612: final WMSOptions opts = new WMSOptions(); ingo@833: opts.setProjection(proj); christian@5612: opts.setSingleTile(false); // FIXME: Make working... christian@5612: opts.setTransitionEffect(TransitionEffect.RESIZE); ingo@833: opts.setRatio(1); ingo@1302: opts.setBuffer(0); rrenkert@5032: if (layers.equals("OSM-WMS-Dienst")) { rrenkert@5032: opts.setAttribution(MSG.attribution()); rrenkert@5032: } christian@5612: final WMS wms = new WMS(layers, url, params, opts); ingo@833: wms.setIsVisible(true); christian@5612: wms.setIsBaseLayer(isBaseLayer); ingo@833: ingo@833: return wms; ingo@833: } raimund@915: raimund@915: christian@4062: @Override raimund@915: public void onTabSelected(TabSelectedEvent tse) { raimund@915: if (tse.getTabNum () != 0) { raimund@915: floodMap.hideBarrierLayer(); raimund@915: } raimund@915: else { raimund@915: floodMap.showBarrierLayer(); raimund@915: } raimund@915: } raimund@1389: christian@4062: @Override raimund@1389: public void onVisibilityChanged(VisibilityChangedEvent vce) { raimund@1389: if (!vce.getIsVisible()) { raimund@1389: floodMap.hideBarrierLayer(); raimund@1389: mapPanel.getMapToolbar().activateDrawFeature(false); raimund@1389: } raimund@1389: else { raimund@1389: floodMap.showBarrierLayer(); raimund@1389: } raimund@1389: } ingo@833: } ingo@833: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :