Using MapMouseMoveHandler instead of the canvas to enable showing tool tip across overlays.

This commit is contained in:
Nidhi Sawhney committed 2012-05-16 15:27:35 +02:00
1 parent 4aba5b1bbe
commit 2c5d82a2ae
4 files changed
+119 -15

No files matched your search

@@ -98,14 +98,14 @@ public class PathCanvasOverlay extends WindFieldCanvasOverlay {
LatLng positionLatLng = LatLng.newInstance(position.latDeg, position.lngDeg);
Point canvasPositionInPx = getMap().convertLatLngToDivPixel(positionLatLng);
int x1 = canvasPositionInPx.getX() - this.widgetPosLeft;
int y1 = canvasPositionInPx.getY() - this.widgetPosTop;
int x1 = canvasPositionInPx.getX() - this.getWidgetPosLeft();
int y1 = canvasPositionInPx.getY() - this.getWidgetPosTop();
position = p2.position;
positionLatLng = LatLng.newInstance(position.latDeg, position.lngDeg);
canvasPositionInPx = getMap().convertLatLngToDivPixel(positionLatLng);
int x2 = canvasPositionInPx.getX() - this.widgetPosLeft;
int y2 = canvasPositionInPx.getY() - this.widgetPosTop;
int x2 = canvasPositionInPx.getX() - this.getWidgetPosLeft();
int y2 = canvasPositionInPx.getY() - this.getWidgetPosTop();
this.pointColor = pathColor;
drawPoint(x1, y1);
@@ -85,7 +85,7 @@ public class RaceCourseCanvasOverlay extends FullCanvasOverlay {
}
if (startPoint != null) {
Point point = getMap().convertLatLngToDivPixel(startPoint);
drawPointWithText(point.getX() - widgetPosLeft, point.getY() - widgetPosTop, "Start");
drawPointWithText(point.getX() - getWidgetPosLeft(), point.getY() - getWidgetPosTop(), "Start");
startMarker = new Marker(startPoint);
map.addOverlay(startMarker);
@@ -99,7 +99,7 @@ public class RaceCourseCanvasOverlay extends FullCanvasOverlay {
}
if (endPoint != null) {
Point point = getMap().convertLatLngToDivPixel(endPoint);
drawPointWithText(point.getX() - widgetPosLeft, point.getY() - widgetPosTop, "End");
drawPointWithText(point.getX() - getWidgetPosLeft(), point.getY() - getWidgetPosTop(), "End");
endMarker = new Marker(endPoint);
map.addOverlay(endMarker);
@@ -175,8 +175,8 @@ public class RaceCourseCanvasOverlay extends FullCanvasOverlay {
if (startPoint != null) {
Point s = map.convertLatLngToDivPixel(startPoint);
Point e = map.convertLatLngToDivPixel(currentPoint);
drawLine(s.getX() - widgetPosLeft, s.getY() - widgetPosTop, e.getX() - widgetPosLeft, e.getY()
- widgetPosTop, 1, color);
drawLine(s.getX() - getWidgetPosLeft(), s.getY() - getWidgetPosTop(), e.getX() - getWidgetPosLeft(), e.getY()
- getWidgetPosTop(), 1, color);
double distanceInNmi = startPoint.distanceFrom(currentPoint)/Mile.METERS_PER_NAUTICAL_MILE;
canvas.setTitle("Distance (nmi) " + NumberFormat.getFormat("0.00").format(distanceInNmi));
}
@@ -6,6 +6,7 @@ import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.geom.LatLng;
import com.google.gwt.maps.client.geom.Point;
import com.google.gwt.maps.client.overlay.Overlay;
@@ -15,7 +16,7 @@ import com.sap.sailing.gwt.ui.shared.WindDTO;
import com.sap.sailing.gwt.ui.shared.WindFieldDTO;
import com.sap.sailing.gwt.ui.shared.racemap.FullCanvasOverlay;
import com.sap.sailing.gwt.ui.simulator.util.ToolTip;
import com.sap.sailing.gwt.ui.simulator.util.WindFieldMouseMoveHandler;
import com.sap.sailing.gwt.ui.simulator.util.WindFieldMapMouseMoveHandler;
/**
* A google map overlay based on a HTML5 canvas for drawing a wind field. The overlay covers the whole map and displays
@@ -33,7 +34,7 @@ public class WindFieldCanvasOverlay extends FullCanvasOverlay {
protected Map<ToolTip, WindDTO> windFieldPoints;
protected String arrowColor = "Blue";
protected String arrowHeadColor = "Blue";
protected WindFieldMouseMoveHandler mmHandler;
protected WindFieldMapMouseMoveHandler mmHandler;
private static Logger logger = Logger.getLogger("com.sap.sailing");
@@ -41,10 +42,11 @@ public class WindFieldCanvasOverlay extends FullCanvasOverlay {
super();
windFieldPoints = new HashMap<ToolTip, WindDTO>();
mmHandler = new WindFieldMouseMoveHandler(getCanvas());
mmHandler = new WindFieldMapMouseMoveHandler(this);
mmHandler.setWindFieldPoints(windFieldPoints);
getCanvas().addMouseMoveHandler(mmHandler);
// getCanvas().addMouseMoveHandler(mmHandler);
//getMap().addMapMouseMoveHandler(mmHandler);
}
public void setWindField(WindFieldDTO wl) {
@@ -56,7 +58,18 @@ public class WindFieldCanvasOverlay extends FullCanvasOverlay {
this.arrowHeadColor = arrowHeadColor;
}
@Override
protected void initialize(MapWidget map) {
super.initialize(map);
map.addMapMouseMoveHandler(mmHandler);
}
@Override
protected void remove() {
getMap().removeMapMouseMoveHandler(mmHandler);
super.remove();
}
@Override
protected Overlay copy() {
return new WindFieldCanvasOverlay();
@@ -75,7 +88,7 @@ public class WindFieldCanvasOverlay extends FullCanvasOverlay {
}
private void clear() {
canvas.getContext2d().clearRect(widgetPosLeft, widgetPosTop, canvas.getCoordinateSpaceWidth(),
canvas.getContext2d().clearRect(getWidgetPosLeft(), getWidgetPosTop(), canvas.getCoordinateSpaceWidth(),
canvas.getCoordinateSpaceHeight());
windFieldPoints.clear();
mmHandler.clear();
@@ -111,8 +124,8 @@ public class WindFieldCanvasOverlay extends FullCanvasOverlay {
LatLng positionLatLng = LatLng.newInstance(position.latDeg, position.lngDeg);
Point canvasPositionInPx = getMap().convertLatLngToDivPixel(positionLatLng);
int x = canvasPositionInPx.getX() - this.widgetPosLeft;
int y = canvasPositionInPx.getY() - this.widgetPosTop;
int x = canvasPositionInPx.getX() - this.getWidgetPosLeft();
int y = canvasPositionInPx.getY() - this.getWidgetPosTop();
windFieldPoints.put(new ToolTip(x, y), windDTO);
@@ -0,0 +1,91 @@
/**
*
*/
package com.sap.sailing.gwt.ui.simulator.util;
import java.util.Map;
import java.util.logging.Logger;
import com.google.gwt.canvas.client.Canvas;
import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.canvas.dom.client.ImageData;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseMoveHandler;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.maps.client.event.MapMouseMoveHandler;
import com.google.gwt.maps.client.geom.LatLng;
import com.google.gwt.maps.client.geom.Point;
import com.sap.sailing.gwt.ui.shared.WindDTO;
import com.sap.sailing.gwt.ui.shared.racemap.FullCanvasOverlay;
/**
* To handle MouseMoveEvent to display tool tips around WindDTO objects in a wind field
*
* @author Nidhi Sawhney(D054070)
*
*/
public class WindFieldMapMouseMoveHandler implements MapMouseMoveHandler {
private FullCanvasOverlay canvasOverlay;
private Map<ToolTip, WindDTO> windFieldPoints = null;
private ImageData lastImageData = null;
private double lastToolx;
private double lastTooly;
private static Logger logger = Logger.getLogger("com.sap.sailing");
public WindFieldMapMouseMoveHandler(FullCanvasOverlay canvasOverlay) {
super();
this.canvasOverlay = canvasOverlay;
}
public void clear() {
lastImageData = null;
}
public void setWindFieldPoints(Map<ToolTip, WindDTO> windFieldPoints) {
this.windFieldPoints = windFieldPoints;
}
@Override
public void onMouseMove(MapMouseMoveEvent event) {
//logger.info("In MouseMove");
if (windFieldPoints == null) {
return;
}
LatLng latLng = event.getLatLng();
Point pointP = event.getSender().convertLatLngToDivPixel(latLng);
double x = pointP.getX() - canvasOverlay.getWidgetPosLeft();
double y = pointP.getY() - canvasOverlay.getWidgetPosTop();
ToolTip point = new ToolTip(x, y);
Context2d context2d = canvasOverlay.getCanvas().getContext2d();
if (lastImageData != null) {
context2d.putImageData(lastImageData, lastToolx, lastTooly);
}
if (windFieldPoints.containsKey(point)) {
//logger.info("Found Point");
lastToolx = x;
lastTooly = y;
lastImageData = context2d.getImageData(x, y, ToolTip.toolRectW, ToolTip.toolRectH);
WindDTO windDTO = windFieldPoints.get(point);
context2d.setFillStyle("#4f4f4f");
context2d.fillRect(x, y, ToolTip.toolRectW, ToolTip.toolRectH);
context2d.setFillStyle("#FFFFFF");
context2d.fillRect(x + 3, y + 3, ToolTip.toolRectW - 6, ToolTip.toolRectH - 6);
context2d.setFillStyle("Blue");
String speedStr = NumberFormat.getFormat("#.00").format(windDTO.trueWindSpeedInKnots);
String bearingStr = NumberFormat.getFormat("#.00").format(windDTO.trueWindFromDeg);
String ttMsg = speedStr + " kn " + bearingStr + "°";
context2d.fillText(ttMsg, x+10,y+15,60);
}
}
}