/* * This is part of Geomajas, a GIS framework, http://www.geomajas.org/. * * Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium. * * The program is available in open source according to the GNU Affero * General Public License. All contributions in this program are covered * by the Geomajas Contributors License Agreement. For full licensing * details, see LICENSE.txt in the project root. */ package org.geomajas.gwt.client.controller; import org.geomajas.geometry.Coordinate; import org.geomajas.gwt.client.i18n.I18nProvider; import org.geomajas.gwt.client.util.DistanceFormat; import org.geomajas.gwt.client.util.WidgetLayout; import org.geomajas.gwt.client.widget.MapWidget; import com.google.gwt.i18n.client.NumberFormat; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.layout.VLayout; /** * Default {@link MeasureDistanceHandler} that shows a "crock-eye" panel. * * @author Jan De Moerloose * */ public class MeasureDistancePanel implements MeasureDistanceHandler { protected boolean showArea; protected boolean showCoordinate; protected VLayout panel; protected DistanceLabel distanceLabel; protected AreaLabel areaLabel; protected CoordinateLabel coordinateLabel; private MapWidget mapWidget; public MeasureDistancePanel(MapWidget mapWidget, boolean showArea, boolean showCoordinate) { this.mapWidget = mapWidget; this.showArea = showArea; this.showCoordinate = showCoordinate; } @Override public void onChange(State state, MeasureDistanceContext context) { if (state == State.START) { showPanel(); } if (state == State.STOP) { if (panel != null) { panel.destroy(); } } distanceLabel.setDistance(context.getPreviousDistance(), context.getRadius()); if (state == State.CLICK) { if (showArea) { areaLabel.setArea(DistanceFormat.asMapArea(mapWidget, context.getPreviousArea())); } if (showCoordinate) { coordinateLabel.setCoordinate(context.getPreviousCoordinate(), context.getCurrentCoordinate()); } } } protected void showPanel() { panel = new VLayout(); panel.setParentCanvas(mapWidget); panel.setWidth(120); panel.setLeft(mapWidget.getWidth() - 130); panel.setTop(-80); panel.setStyleName(WidgetLayout.STYLE_MEASURE_DISTANCE_PANEL); panel.setAnimateTime(500); addLabelsToPanel(); panel.animateMove(mapWidget.getWidth() - 130, 10); } protected void addLabelsToPanel() { Label header = new Label("<div class=\"" + WidgetLayout.MEASURE_DISTANCE_PANEL_HEADER + "\" ><b>" + I18nProvider.getMenu().measureDistancePanelHeader() + "</b></div>"); header.setHeight100(); panel.addMember(header); distanceLabel = new DistanceLabel(); panel.addMember(distanceLabel); if (showArea) { areaLabel = new AreaLabel(); panel.addMember(areaLabel); } if (showCoordinate) { coordinateLabel = new CoordinateLabel(); panel.addMember(coordinateLabel); } } /** * The label that shows the distances. * * @author Pieter De Graef * @author Jan Venstermans */ protected abstract class LabelForMeasurePanel extends Label { private String subtitle; private boolean showStaticLabel; private boolean showDynamicLabel; public LabelForMeasurePanel(String subtitle) { this(subtitle, true, false); } public LabelForMeasurePanel(String subtitle, boolean showStaticLabel, boolean showDynamicLabel) { super(); this.subtitle = subtitle; this.showStaticLabel = showStaticLabel; this.showDynamicLabel = showDynamicLabel; setAutoHeight(); setStyleName(WidgetLayout.MEASURE_DISTANCE_PANEL_CONTENT); } public void setStringInDivContents(String... stringContents) { StringBuilder builder = new StringBuilder("<div class=\"" + WidgetLayout.MEASURE_DISTANCE_PANEL_SUBTITLE + "\" ><b>" + subtitle + "</b>:</div>"); for (String content : stringContents) { if (content != null && !content.isEmpty()) { builder.append("<div>" + content + "</div>"); } } setContents(builder.toString()); } public String createLabelSection(String label, String value) { return I18nProvider.getMenu().measureDistancePaneStyleElement(label, value); } /* getters */ public String getSubtitle() { return subtitle; } public boolean isShowStaticLabel() { return showStaticLabel; } public boolean isShowDynamicLabel() { return showDynamicLabel; } /* setters */ public void setShowStaticLabel(boolean showStaticLabel) { this.showStaticLabel = showStaticLabel; } public void setShowDynamicLabel(boolean showDynamicLabel) { this.showDynamicLabel = showDynamicLabel; } } /** * The label that shows the distances. * * @author Jan Venstermans */ protected class DistanceLabel extends LabelForMeasurePanel { public DistanceLabel() { super(I18nProvider.getMenu().measureDistancePanelDistanceSubtitle(), true, true); } public void setDistance(double totalDistance, double radius) { String totalString = null; String rString = null; if (isShowStaticLabel()) { String total = DistanceFormat.asMapLength(mapWidget, totalDistance); totalString = createLabelSection(I18nProvider.getMenu().measureDistancePanelDistanceLastClickLabel(), total); } if (isShowDynamicLabel()) { String r = DistanceFormat.asMapLength(mapWidget, radius); rString = createLabelSection(I18nProvider.getMenu().measureDistancePanelDistanceCurrentLabel(), r); } setStringInDivContents(totalString, rString); } } /** * The label that shows the distances. * * @author Jan Venstermans */ protected class AreaLabel extends LabelForMeasurePanel { public AreaLabel() { super(I18nProvider.getMenu().measureDistancePanelAreaSubtitle()); } public void setArea(String area) { String areaString = null; if (isShowStaticLabel()) { areaString = createLabelSection(I18nProvider.getMenu().measureDistancePanelAreaLastClickLabel(), area); } setStringInDivContents(areaString); } } /** * The label that shows the distances. * * @author Jan Venstermans */ protected class CoordinateLabel extends LabelForMeasurePanel { public CoordinateLabel() { super(I18nProvider.getMenu().measureDistancePanelCoordinateSubtitle()); } public void setCoordinate(Coordinate lastClickedCoordinate, Coordinate currentCoordinate) { String lastClickedCoordinateString = null; if (isShowStaticLabel()) { lastClickedCoordinateString = createLabelSection(I18nProvider.getMenu() .measureDistancePanelCoordinateLastClickLabel(), coordinateToString(lastClickedCoordinate)); } String currentCoordinateString = null; if (isShowDynamicLabel()) { currentCoordinateString = createLabelSection(I18nProvider.getMenu() .measureDistancePanelCoordinateCurrentLabel(), coordinateToString(currentCoordinate)); } setStringInDivContents(lastClickedCoordinateString, currentCoordinateString); } public String coordinateToString(Coordinate coordinate) { return I18nProvider.getMenu().getMeasureCoordinateString( NumberFormat.getFormat(".##").format(coordinate.getX()), NumberFormat.getFormat(".##").format(coordinate.getY())); } } }