teichmann@5861: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5861: * Software engineering by Intevation GmbH teichmann@5861: * teichmann@5861: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5861: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5861: * documentation coming with Dive4Elements River for details. teichmann@5861: */ teichmann@5861: teichmann@5835: package org.dive4elements.river.client.client.ui.map; ingo@802: ingo@802: import com.google.gwt.core.client.GWT; ingo@1297: import com.google.gwt.i18n.client.NumberFormat; ingo@802: ingo@802: import com.smartgwt.client.types.SelectionType; ingo@802: import com.smartgwt.client.widgets.ImgButton; ingo@802: import com.smartgwt.client.widgets.Label; ingo@802: import com.smartgwt.client.widgets.events.ClickEvent; ingo@802: import com.smartgwt.client.widgets.events.ClickHandler; ingo@802: import com.smartgwt.client.widgets.layout.HLayout; ingo@802: ingo@802: import org.gwtopenmaps.openlayers.client.control.Measure; ingo@802: import org.gwtopenmaps.openlayers.client.event.MeasureEvent; ingo@802: import org.gwtopenmaps.openlayers.client.event.MeasureListener; ingo@802: import org.gwtopenmaps.openlayers.client.event.MeasurePartialListener; ingo@802: import org.gwtopenmaps.openlayers.client.handler.PathHandler; ingo@802: import org.gwtopenmaps.openlayers.client.handler.PolygonHandler; ingo@802: teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.client.utils.EnableDisableCmd; ingo@802: ingo@802: ingo@802: public class MeasureControl extends HLayout { ingo@802: ingo@1297: public static final String NUMBER_FORMAT_PATTERN = "#.##"; ingo@1297: ingo@1300: public static final String AREA_UNIT = "ha"; ingo@1300: public static final int AREA_FACTOR_M = 10000; ingo@1300: public static final int AREA_FACTOR_KM = 100; ingo@1300: ingo@802: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@802: ingo@802: protected FloodMap floodMap; ingo@802: ingo@802: protected Measure measureLine; ingo@802: protected Measure measurePolygon; ingo@802: ingo@802: protected ImgButton measureLineButton; ingo@802: protected ImgButton measurePolyButton; ingo@802: protected Label label; ingo@802: ingo@1297: protected NumberFormat formatter; ingo@1297: ingo@802: ingo@802: public MeasureControl(FloodMap floodMap, EnableDisableCmd cmd) { ingo@802: this.floodMap = floodMap; ingo@802: ingo@802: measureLineButton = createMeasureLineControl(cmd); ingo@802: measurePolyButton = createMeasurePolyControl(cmd); ingo@802: ingo@1297: formatter = NumberFormat.getFormat(NUMBER_FORMAT_PATTERN); ingo@1297: ingo@802: label = new Label(); ingo@802: ingo@802: initLayout(); ingo@802: } ingo@802: ingo@802: ingo@802: protected void initLayout() { ingo@1433: setWidth(100); ingo@802: setMembersMargin(2); ingo@1433: ingo@1433: label.setWidth(75); ingo@1433: ingo@802: addMember(measureLineButton); ingo@802: addMember(measurePolyButton); ingo@802: addMember(label); ingo@802: } ingo@802: ingo@802: ingo@802: protected ImgButton createMeasureLineControl(final EnableDisableCmd cmd) { ingo@802: measureLine = new Measure(new PathHandler()); ingo@802: measureLine.setPersist(true); ingo@802: measureLine.addMeasureListener(new MeasureListener() { ingo@802: public void onMeasure(MeasureEvent e) { ingo@802: updateMeasure(e.getMeasure(), e.getUnits()); ingo@802: } ingo@802: }); ingo@802: measureLine.addMeasurePartialListener(new MeasurePartialListener() { ingo@802: public void onMeasurePartial(MeasureEvent e) { ingo@802: updateMeasure(e.getMeasure(), e.getUnits()); ingo@802: } ingo@802: }); ingo@802: ingo@802: floodMap.getMap().addControl(measureLine); ingo@802: ingo@802: final ImgButton btn = new ImgButton(); ingo@802: String baseUrl = GWT.getHostPageBaseURL(); ingo@802: btn.setSrc(baseUrl + MSG.measureLine()); ingo@802: btn.setActionType(SelectionType.CHECKBOX); ingo@802: btn.setSize(20); ingo@802: btn.setShowRollOver(false); ingo@2471: btn.setShowRollOverIcon(false); ingo@802: btn.setSelected(false); ingo@880: btn.setTooltip(MSG.measureDistance()); ingo@802: btn.addClickHandler(new ClickHandler() { ingo@802: public void onClick(ClickEvent e) { ingo@802: if (btn.isSelected()) { ingo@802: cmd.enable(); ingo@802: activateMeasurePolygon(false); ingo@802: activateMeasureLine(true); ingo@802: } ingo@802: else { ingo@802: cmd.disable(); ingo@802: activateMeasureLine(false); ingo@802: } ingo@802: } ingo@802: }); ingo@802: ingo@802: return btn; ingo@802: } ingo@802: ingo@802: ingo@802: protected ImgButton createMeasurePolyControl(final EnableDisableCmd cmd) { ingo@802: measurePolygon = new Measure(new PolygonHandler()); ingo@802: measurePolygon.setPersist(true); ingo@802: measurePolygon.addMeasureListener(new MeasureListener() { ingo@802: public void onMeasure(MeasureEvent e) { ingo@1300: updateMeasureArea(e.getMeasure(), e.getUnits()); ingo@802: } ingo@802: }); ingo@802: measurePolygon.addMeasurePartialListener(new MeasurePartialListener() { ingo@802: public void onMeasurePartial(MeasureEvent e) { ingo@1300: updateMeasureArea(e.getMeasure(), e.getUnits()); ingo@802: } ingo@802: }); ingo@802: ingo@802: floodMap.getMap().addControl(measurePolygon); ingo@802: ingo@802: final ImgButton btn = new ImgButton(); ingo@802: String baseUrl = GWT.getHostPageBaseURL(); ingo@802: btn.setSrc(baseUrl + MSG.measurePolygon()); ingo@802: btn.setActionType(SelectionType.CHECKBOX); ingo@802: btn.setSize(20); ingo@802: btn.setShowRollOver(false); ingo@2471: btn.setShowRollOverIcon(false); ingo@802: btn.setSelected(false); ingo@880: btn.setTooltip(MSG.measureArea()); ingo@802: btn.addClickHandler(new ClickHandler() { ingo@802: public void onClick(ClickEvent e) { ingo@802: if (btn.isSelected()) { ingo@802: cmd.enable(); ingo@802: activateMeasureLine(false); ingo@802: activateMeasurePolygon(true); ingo@802: } ingo@802: else { ingo@802: cmd.disable(); ingo@802: activateMeasurePolygon(false); ingo@802: } ingo@802: } ingo@802: }); ingo@802: ingo@802: return btn; ingo@802: } ingo@802: ingo@802: ingo@802: protected void clearMeasure() { ingo@802: label.setContents(""); ingo@802: } ingo@802: ingo@802: ingo@802: protected void updateMeasure(float value, String unit) { ingo@1297: label.setContents(formatter.format(value) + " " + unit); ingo@802: } ingo@802: ingo@802: ingo@1300: protected void updateMeasureArea(float value, String unit) { ingo@1300: float ha = value; ingo@1300: String ha_unit = unit; ingo@1300: ingo@1300: if (unit.equals("m")) { ingo@1300: ha = (float) value / AREA_FACTOR_M; ingo@1300: ha_unit = AREA_UNIT; ingo@1300: } ingo@1300: else if (unit.equals("km")) { ingo@1300: ha = (float) value * AREA_FACTOR_KM; ingo@1300: ha_unit = AREA_UNIT; ingo@1300: } ingo@1300: ingo@1300: label.setContents(formatter.format(ha) + " " + ha_unit); ingo@1300: } ingo@1300: ingo@1300: ingo@802: public void activate(boolean activate) { ingo@802: if (!activate) { ingo@802: clearMeasure(); ingo@802: activateMeasureLine(activate); ingo@802: activateMeasurePolygon(activate); ingo@802: } ingo@802: } ingo@802: ingo@802: ingo@802: protected void activateMeasureLine(boolean activate) { ingo@802: if (activate) { ingo@802: clearMeasure(); ingo@802: measureLineButton.select(); ingo@802: measureLine.activate(); ingo@802: } ingo@802: else { ingo@802: measureLineButton.deselect(); ingo@802: measureLine.deactivate(); ingo@802: } ingo@802: } ingo@802: ingo@802: ingo@802: protected void activateMeasurePolygon(boolean activate) { ingo@802: if (activate) { ingo@802: clearMeasure(); ingo@802: measurePolyButton.select(); ingo@802: measurePolygon.activate(); ingo@802: } ingo@802: else { ingo@802: measurePolyButton.deselect(); ingo@802: measurePolygon.deactivate(); ingo@802: } ingo@802: } ingo@802: } ingo@802: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :