Merge branch 'origin/simulator_maps_v3'

This commit is contained in:
Christopher Ronnewinkel (D036654)
2013-11-04 17:35:11 +01:00
parent 826096dec9
commit b6f3a43384
13 changed files with 352 additions and 247 deletions
@@ -58,6 +58,10 @@ public class CourseAreaDescriptor {
return radius;
}
public double getRadiusInMeters() {
return (radius*1852.0);
}
public LatLng getCenterPos() {
return centerPos;
}
@@ -0,0 +1,89 @@
package com.sap.sailing.gwt.ui.simulator;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.base.Point;
import com.google.gwt.maps.client.events.center.CenterChangeMapEvent;
import com.google.gwt.maps.client.events.center.CenterChangeMapHandler;
import com.google.gwt.resources.client.ImageResource;
import com.sap.sailing.gwt.ui.client.shared.racemap.ImageTransformer;
import com.sap.sailing.gwt.ui.shared.racemap.CanvasOverlayV3;
public class ImageCanvasOverlay extends CanvasOverlayV3 {
private int canvasWidth;
private int canvasHeight;
private int oLeft;
private int oTop;
private double bearing = 0.0;
private ImageTransformer imgTrafo;
public ImageCanvasOverlay(MapWidget map, int zIndex, ImageResource img) {
super(map, zIndex);
canvasWidth = 100;
canvasHeight = 100;
if(getCanvas() != null) {
//setCanvasPosition(map.getAbsoluteLeft(), map.getAbsoluteTop());
getCanvas().setWidth(String.valueOf(canvasWidth));
getCanvas().setHeight(String.valueOf(canvasHeight));
getCanvas().setCoordinateSpaceWidth(canvasWidth);
getCanvas().setCoordinateSpaceHeight(canvasHeight);
}
imgTrafo = new ImageTransformer(img);
getMap().addCenterChangeHandler(new CenterChangeMapHandler() {
@Override
public void onEvent(CenterChangeMapEvent event) {
// TODO Auto-generated method stub
setPosition();
};
});
}
public void addToMap() {
super.addToMap();
}
public void setPosition() {
if (mapProjection != null) {
Point sw = mapProjection.fromLatLngToDivPixel(getMap().getBounds().getSouthWest());
Point ne = mapProjection.fromLatLngToDivPixel(getMap().getBounds().getNorthEast());
double pLeft = Math.min(sw.getX(), ne.getX()) - 25 + oLeft;
double pTop = Math.min(sw.getY(), ne.getY()) - 25 + oTop;
setCanvasPosition(pLeft, pTop);
}
}
public void setOffset(int offsetLeft, int offsetTop) {
this.oLeft = offsetLeft;
this.oTop = offsetTop;
}
@Override
protected void draw() {
if(mapProjection != null) {
setPosition();
imgTrafo.drawToCanvas(getCanvas(), bearing, 1.0);
}
}
public void setBearing(double bearing) {
this.bearing = bearing;
}
}
@@ -18,6 +18,7 @@ import com.google.gwt.maps.client.geometrylib.SphericalUtils;
import com.google.gwt.maps.client.overlays.Marker;
import com.sap.sailing.domain.common.Mile;
import com.sap.sailing.gwt.ui.simulator.racemap.FullCanvasOverlay;
import com.sap.sailing.simulator.util.SailingSimulatorConstants;
/**
* This class implements the layer to display the race course on the map. Currently the course only consists of the
@@ -30,6 +31,7 @@ public class RaceCourseCanvasOverlay extends FullCanvasOverlay {
private String racecourseColor = "White";
private double racecourseBuoySize = 5;
private char mode;
// TODO: make private!!!
public char raceCourseDirection;
@@ -55,9 +57,10 @@ public class RaceCourseCanvasOverlay extends FullCanvasOverlay {
}
}
public RaceCourseCanvasOverlay(MapWidget map, int zIndex) {
public RaceCourseCanvasOverlay(MapWidget map, int zIndex, char mode) {
super(map, zIndex);
this.mode = mode;
startPoint = null;
endPoint = null;
startMarker = null;
@@ -65,37 +68,41 @@ public class RaceCourseCanvasOverlay extends FullCanvasOverlay {
getCanvas().getElement().setClassName("raceCourse");
map.addClickHandler(new ClickMapHandler() {
@Override
public void onEvent(ClickMapEvent event) {
if (startPoint == null) {
startPoint = event.getMouseEvent().getLatLng();
logger.fine("Clicked startPoint here " + startPoint);
if (startPoint != null) {
if (this.mode == SailingSimulatorConstants.ModeFreestyle) {
setCanvasSettings();
// drawCanvas();
setStartPoint(startPoint);
registeredRaceCourseMouseMoveHandler = getMap().addMouseMoveHandler(new RaceCourseMapMouseMoveHandler());
}
}
}
});
map.addClickHandler(new ClickMapHandler() {
@Override
public void onEvent(ClickMapEvent event) {
if (startPoint == null) {
startPoint = event.getMouseEvent().getLatLng();
logger.fine("Clicked startPoint here " + startPoint);
if (startPoint != null) {
setCanvasSettings();
// drawCanvas();
setStartPoint(startPoint);
registeredRaceCourseMouseMoveHandler = getMap().addMouseMoveHandler(new RaceCourseMapMouseMoveHandler());
}
}
}
});
map.addDblClickHandler(new DblClickMapHandler() {
@Override
public void onEvent(DblClickMapEvent event) {
if (isSelected) {
endPoint = event.getMouseEvent().getLatLng();
logger.info("Clicked endPoint " + "here " + endPoint);
if (endPoint != null) {
setEndPoint(endPoint);
center();
registeredRaceCourseMouseMoveHandler.removeHandler();
}
}
}
});
}
map.addDblClickHandler(new DblClickMapHandler() {
@Override
public void onEvent(DblClickMapEvent event) {
if (isSelected) {
endPoint = event.getMouseEvent().getLatLng();
logger.info("Clicked endPoint " + "here " + endPoint);
if (endPoint != null) {
setEndPoint(endPoint);
center();
registeredRaceCourseMouseMoveHandler.removeHandler();
}
}
}
});
}
public void reset() {
@@ -121,66 +128,15 @@ public class RaceCourseCanvasOverlay extends FullCanvasOverlay {
int zoomLevel = map.getZoom();
racecourseBuoySize = 1.0 + (5.0 - 1.0)*(zoomLevel - 10.0)/(14.0 - 10.0);
setStartPoint(startPoint);
setEndPoint(endPoint);
setEndPoint(endPoint);
}
private void setStartPoint(LatLng startPoint) {
this.startPoint = startPoint;
if (startPoint != null) {
Point point = mapProjection.fromLatLngToDivPixel(startPoint);
drawCircleWithText(point.getX() - getWidgetPosLeft(), point.getY() - getWidgetPosTop(), racecourseBuoySize,
racecourseColor, "Start");
if (startMarker != null) {
startMarker.setPosition(startPoint);
} else {
// default markers are too large cluttering race display
/*
* startMarker = new Marker(startPoint); map.addOverlay(startMarker); /*
* startMarker.addMarkerMouseOverHandler(new MarkerMouseOverHandler () {
*
* @Override public void onMouseOver(MarkerMouseOverEvent event) { InfoWindowContent content = new
* InfoWindowContent("Start"); map.getInfoWindow().open(startMarker, content); }
*
* });
*
* startMarker.addMarkerMouseOutHandler(new MarkerMouseOutHandler () {
*
* @Override public void onMouseOut(MarkerMouseOutEvent event) { map.getInfoWindow().close(); }
*
* });
*/
}
}
}
private void setEndPoint(LatLng endPoint) {
this.endPoint = endPoint;
if (endPoint != null) {
Point point = mapProjection.fromLatLngToDivPixel(endPoint);
drawCircleWithText(point.getX() - getWidgetPosLeft(), point.getY() - getWidgetPosTop(), racecourseBuoySize,
racecourseColor, "End");
if (endMarker != null) {
endMarker.setPosition(endPoint);
} else {
// default markers are too large cluttering race display
/*
* endMarker = new Marker(endPoint); map.addOverlay(endMarker);
*
* endMarker.addMarkerMouseOverHandler(new RaceCourseMarkerMouseOverHandler());
*
* endMarker.addMarkerMouseOutHandler(new MarkerMouseOutHandler() {
*
* @Override public void onMouseOut(MarkerMouseOutEvent event) { map.getInfoWindow().close(); }
*
* });
*/
}
}
}
@Override
@@ -188,6 +144,59 @@ public class RaceCourseCanvasOverlay extends FullCanvasOverlay {
if(mapProjection != null && startPoint != null && endPoint != null) {
setCanvasSettings();
setStartEndPoint(startPoint, endPoint);
if (startPoint != null) {
Point point = mapProjection.fromLatLngToDivPixel(startPoint);
drawCircleWithText(point.getX() - getWidgetPosLeft(), point.getY() - getWidgetPosTop(), racecourseBuoySize,
racecourseColor, "Start");
if (startMarker != null) {
startMarker.setPosition(startPoint);
} else {
// default markers are too large cluttering race display
/*
* startMarker = new Marker(startPoint); map.addOverlay(startMarker); /*
* startMarker.addMarkerMouseOverHandler(new MarkerMouseOverHandler () {
*
* @Override public void onMouseOver(MarkerMouseOverEvent event) { InfoWindowContent content = new
* InfoWindowContent("Start"); map.getInfoWindow().open(startMarker, content); }
*
* });
*
* startMarker.addMarkerMouseOutHandler(new MarkerMouseOutHandler () {
*
* @Override public void onMouseOut(MarkerMouseOutEvent event) { map.getInfoWindow().close(); }
*
* });
*/
}
}
if (endPoint != null) {
Point point = mapProjection.fromLatLngToDivPixel(endPoint);
drawCircleWithText(point.getX() - getWidgetPosLeft(), point.getY() - getWidgetPosTop(), racecourseBuoySize,
racecourseColor, "End");
if (endMarker != null) {
endMarker.setPosition(endPoint);
} else {
// default markers are too large cluttering race display
/*
* endMarker = new Marker(endPoint); map.addOverlay(endMarker);
*
* endMarker.addMarkerMouseOverHandler(new RaceCourseMarkerMouseOverHandler());
*
* endMarker.addMarkerMouseOutHandler(new MarkerMouseOutHandler() {
*
* @Override public void onMouseOut(MarkerMouseOutEvent event) { map.getInfoWindow().close(); }
*
* });
*/
}
}
drawLine(endPoint, racecourseColor);
}
}
@@ -2,74 +2,119 @@ package com.sap.sailing.gwt.ui.simulator;
import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.canvas.dom.client.Context2d.TextAlign;
import com.google.gwt.core.client.GWT;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.base.LatLng;
import com.google.gwt.maps.client.base.Point;
import com.google.gwt.maps.client.events.click.ClickMapEvent;
import com.google.gwt.maps.client.events.click.ClickMapHandler;
import com.google.gwt.maps.client.events.mouseout.MouseOutMapEvent;
import com.google.gwt.maps.client.events.mouseout.MouseOutMapHandler;
import com.google.gwt.maps.client.events.idle.IdleMapEvent;
import com.google.gwt.maps.client.events.idle.IdleMapHandler;
import com.google.gwt.maps.client.overlays.Circle;
import com.google.gwt.maps.client.overlays.CircleOptions;
import com.sap.sailing.gwt.ui.client.shared.racemap.ImageTransformer;
import com.sap.sailing.gwt.ui.simulator.racemap.FullCanvasOverlay;
import com.sap.sailing.gwt.ui.simulator.util.SimulatorResources;
import com.sap.sailing.simulator.util.SailingSimulatorConstants;
public class RegattaAreaCanvasOverlay extends FullCanvasOverlay {
private static SimulatorResources resources = GWT.create(SimulatorResources.class);
private SimulatorMap simulatorMap;
private RaceCourseCanvasOverlay raceCourseCanvasOverlay;
private VenueDescriptor venue;
private CourseAreaDescriptor currentCourseArea = null;
private boolean pan;
private boolean initial;
private boolean mapPan = false;
private double raceBearing = 0.0;
private double diffBearing = 0.0;
private ImageTransformer windRoseBackground;
private ImageTransformer windRoseNeedle;
public RegattaAreaCanvasOverlay(MapWidget map, int zIndex, char event) {
super(map, zIndex);
public RegattaAreaCanvasOverlay(MapWidget map, int zIndex, char event, final SimulatorMap simulatorMap) {
super(map, zIndex);
this.simulatorMap = simulatorMap;
this.venue = VenueDescriptorFactory.createVenue(event);
this.currentCourseArea = this.venue.getDefaultCourseArea();
/*getMap().addZoomChangeHandler(new ZoomChangeMapHandler() {
@Override
public void onEvent(ZoomChangeMapEvent event) {
// TODO Auto-generated method stub
simulatorMap.windRoseCanvasOverlay.removeFromMap();
simulatorMap.windNeedleCanvasOverlay.removeFromMap();
mapPan = true;
}
});
getMap().addDragStartHandler(new DragStartMapHandler() {
@Override
public void onEvent(DragStartMapEvent event) {
// TODO Auto-generated method stub
simulatorMap.windRoseCanvasOverlay.removeFromMap();
simulatorMap.windNeedleCanvasOverlay.removeFromMap();
}
});
getMap().addDragEndHandler(new DragEndMapHandler() {
@Override
public void onEvent(DragEndMapEvent event) {
// TODO Auto-generated method stub
simulatorMap.windRoseCanvasOverlay.addToMap();
simulatorMap.windNeedleCanvasOverlay.addToMap();
}
});*/
getMap().addIdleHandler(new IdleMapHandler() {
@Override
public void onEvent(IdleMapEvent event) {
// TODO Auto-generated method stub
if (mapPan) {
//System.out.println("Map Idle Event Handler.");
simulatorMap.getWindRoseCanvasOverlay().addToMap();
simulatorMap.getWindNeedleCanvasOverlay().addToMap();
mapPan = false;
}
}
});
windRoseBackground = new ImageTransformer(resources.windRoseBackground());
windRoseNeedle = new ImageTransformer(resources.windRoseNeedle());
}
@Override
public void addToMap() {
super.addToMap();
// TODO MigrationV3:
// getPane().add(windRoseBackground.getCanvas(), getWidgetPosLeft() + windBackgroundOffset, getWidgetPosTop());
// getPane().add(windRoseNeedle.getCanvas(), getWidgetPosLeft() + windBackgroundOffset + windNeedleOffset,
// getWidgetPosTop() + windNeedleOffset);
int counter = 1;
int counter = 0;
for (CourseAreaDescriptor courseArea : venue.getCourseAreas()) {
drawCircleFromRadius(counter++, courseArea);
}
map.panTo(venue.getCenterPos());
this.initial = true;
}
@Override
protected void draw() {
super.draw();
if(mapProjection != null) {
// TODO MigrationV3:
// getPane().setWidgetPosition(windRoseBackground.getCanvas(), getWidgetPosLeft() + windBackgroundOffset,
// getWidgetPosTop());
// getPane().setWidgetPosition(windRoseNeedle.getCanvas(),
// getWidgetPosLeft() + windBackgroundOffset + windNeedleOffset, getWidgetPosTop() + windNeedleOffset);
clearCanvas();
drawRegattaAreas();
if (this.initial) {
updateRaceCourse(0, 0);
this.initial = false;
}
}
}
@@ -79,8 +124,6 @@ public class RegattaAreaCanvasOverlay extends FullCanvasOverlay {
}
protected void drawRegattaAreas() {
windRoseBackground.drawTransformedImage(0.0, 1.0);
windRoseNeedle.drawTransformedImage(raceBearing + 180.0, 1.0);
LatLng cPos = LatLng.newInstance(54.4344, 10.19659167);
Point centerPoint = mapProjection.fromLatLngToDivPixel(cPos);
@@ -101,6 +144,7 @@ public class RegattaAreaCanvasOverlay extends FullCanvasOverlay {
// TODO MigrationV3: This is not the right place to create Circles being not drawn to the canvas -> move to SimulatorMap
public void drawCircleFromRadius(int regIdx, CourseAreaDescriptor courseArea) {
CircleOptions circleOptions = CircleOptions.newInstance();
circleOptions.setStrokeColor("white");
circleOptions.setStrokeWeight(1);
@@ -109,51 +153,47 @@ public class RegattaAreaCanvasOverlay extends FullCanvasOverlay {
circleOptions.setFillOpacity(0.0);
circleOptions.setCenter(courseArea.getCenterPos());
Circle circle = Circle.newInstance(circleOptions);
circle.setRadius(courseArea.getRadius());
circle.setRadius(courseArea.getRadiusInMeters());
final int regIdxFinal = regIdx;
circle.addClickHandler(new ClickMapHandler() {
public void onEvent(ClickMapEvent e) {
// System.out.println("Click: "+currentRegArea.name);
//System.out.println("Click: "+currentCourseArea.getName());
CourseAreaDescriptor newRegArea = venue.getCourseAreas().get(regIdxFinal);
if (newRegArea != currentCourseArea) {
currentCourseArea = newRegArea;
// simulatorMap.clearOverlays();
simulatorMap.clearOverlays();
simulatorMap.getWindRoseCanvasOverlay().removeFromMap();
simulatorMap.getWindNeedleCanvasOverlay().removeFromMap();
updateRaceCourse(0, 0);
raceCourseCanvasOverlay.draw();
}
pan = true;
map.panTo(currentCourseArea.getCenterPos());
mapPan = true;
if (map.getZoom() < 14) {
map.setZoom(14);
}
}
});
circle.setMap(getMap());
getMap().addMouseOutMoveHandler(new MouseOutMapHandler() {
public void onEvent(MouseOutMapEvent event) {
if (pan) {
pan = false;
if (map.getZoom() < 14) {
map.setZoom(14);
}
}
};
});
}
protected void updateRaceCourse(int type, double bearing) {
if (type == 1) {
raceBearing = bearing;
windRoseNeedle.drawTransformedImage(raceBearing + 180.0, 1.0);
simulatorMap.getWindNeedleCanvasOverlay().setBearing(raceBearing + 180.0);
} else if (type == 2) {
diffBearing = bearing;
}
if (currentCourseArea != null) {
// simulatorMap.getMainPanel().setUpdateButtonEnabled(true);
simulatorMap.getMainPanel().setUpdateButtonEnabled(true);
LatLng startPoint;
LatLng endPoint;
if (raceCourseCanvasOverlay.raceCourseDirection == SailingSimulatorConstants.LegTypeDownwind) {
@@ -165,7 +205,7 @@ public class RegattaAreaCanvasOverlay extends FullCanvasOverlay {
}
raceCourseCanvasOverlay.setStartEndPoint(startPoint, endPoint);
} else {
// simulatorMap.getMainPanel().setUpdateButtonEnabled(false);
simulatorMap.getMainPanel().setUpdateButtonEnabled(false);
}
}
@@ -147,14 +147,16 @@ public class SimulatorMainPanel extends SimplePanel {
if (setting.getDisplayName().equals("Base Bearing (Degrees)")) {
simulatorMap.clearOverlays();
//System.out.println("Wind Base Bearing: "+setting.getValue());
simulatorMap.regattaAreaCanvasOverlay.updateRaceCourse(1, (Double) setting.getValue());
simulatorMap.raceCourseCanvasOverlay.draw();
simulatorMap.getRegattaAreaCanvasOverlay().updateRaceCourse(1, (Double) setting.getValue());
simulatorMap.getRaceCourseCanvasOverlay().draw();
simulatorMap.getWindNeedleCanvasOverlay().draw();
}
if (setting.getDisplayName().equals("Race Course Diff (Degrees)")) {
simulatorMap.clearOverlays();
//System.out.println("Wind Base Bearing: "+setting.getValue());
simulatorMap.regattaAreaCanvasOverlay.updateRaceCourse(2, (Double) setting.getValue());
simulatorMap.raceCourseCanvasOverlay.draw();
simulatorMap.getRegattaAreaCanvasOverlay().updateRaceCourse(2, (Double) setting.getValue());
simulatorMap.getRaceCourseCanvasOverlay().draw();
simulatorMap.getWindNeedleCanvasOverlay().draw();
}
if (autoUpdate) {
update();
@@ -834,7 +836,7 @@ public class SimulatorMainPanel extends SimplePanel {
simulatorMap.refreshView(SimulatorMap.ViewName.WINDDISPLAY, currentWPDisplay, selection, true);
} else if (summaryButton.getValue()) {
showTimePanel(false);
simulatorMap.regattaAreaCanvasOverlay.draw();
simulatorMap.getRegattaAreaCanvasOverlay().draw();
simulatorMap.refreshView(SimulatorMap.ViewName.SUMMARY, currentWPDisplay, selection, true);
} else if (replayButton.getValue()) {
showTimePanel(true);
@@ -6,6 +6,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.maps.client.LoadApi;
@@ -42,6 +43,7 @@ import com.sap.sailing.gwt.ui.shared.racemap.GoogleMapAPIKey;
import com.sap.sailing.gwt.ui.shared.racemap.GoogleMapStyleHelper;
import com.sap.sailing.gwt.ui.simulator.util.ColorPalette;
import com.sap.sailing.gwt.ui.simulator.util.ColorPaletteGenerator;
import com.sap.sailing.gwt.ui.simulator.util.SimulatorResources;
import com.sap.sailing.gwt.ui.simulator.windpattern.WindPatternDisplay;
import com.sap.sailing.simulator.util.SailingSimulatorConstants;
@@ -52,6 +54,9 @@ import com.sap.sailing.simulator.util.SailingSimulatorConstants;
*
*/
public class SimulatorMap extends AbsolutePanel implements RequiresDataInitialization, TimeListenerWithStoppingCriteria {
private static SimulatorResources resources = GWT.create(SimulatorResources.class);
private MapWidget map;
private boolean dataInitialized;
private boolean overlaysInitialized;
@@ -62,11 +67,13 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ
private WindFieldCanvasOverlay windFieldCanvasOverlay;
private WindGridCanvasOverlay windGridCanvasOverlay;
private WindLineCanvasOverlay windLineCanvasOverlay;
// TODO MigrationV3: should not be public
public RegattaAreaCanvasOverlay regattaAreaCanvasOverlay;
private RegattaAreaCanvasOverlay regattaAreaCanvasOverlay;
private ImageCanvasOverlay windRoseCanvasOverlay;
private ImageCanvasOverlay windNeedleCanvasOverlay;
private List<PathCanvasOverlay> replayPathCanvasOverlays;
// TODO MigrationV3: should not be public
public RaceCourseCanvasOverlay raceCourseCanvasOverlay;
private RaceCourseCanvasOverlay raceCourseCanvasOverlay;
private PathLegendCanvasOverlay legendCanvasOverlay;
private List<TimeListenerWithStoppingCriteria> timeListeners;
@@ -216,6 +223,7 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ
refreshWindFieldOverlay(windFieldDTO);
timeListeners.clear();
if (windParams.isShowArrows()) {
timeListeners.add(windFieldCanvasOverlay);
}
@@ -381,22 +389,31 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ
}
};
LoadApi.go(onLoad, loadLibraries, sensor, "key="+GoogleMapAPIKey.V2_APIKey);
LoadApi.go(onLoad, loadLibraries, sensor, "key="+GoogleMapAPIKey.V2_APIKey);
}
private void initializeOverlays() {
if (mode == SailingSimulatorConstants.ModeEvent) {
if (regattaAreaCanvasOverlay == null) {
regattaAreaCanvasOverlay = new RegattaAreaCanvasOverlay(map, SimulatorMapOverlaysZIndexes.REGATTA_AREA_ZINDEX, getMainPanel().getEvent());
regattaAreaCanvasOverlay = new RegattaAreaCanvasOverlay(map, SimulatorMapOverlaysZIndexes.REGATTA_AREA_ZINDEX, getMainPanel().getEvent(), this);
regattaAreaCanvasOverlay.addToMap();
int offsetLeft = 50;
int offsetTop = 25;
windRoseCanvasOverlay = new ImageCanvasOverlay(map, SimulatorMapOverlaysZIndexes.WIND_ROSE_ZINDEX, resources.windRoseBackground());
windRoseCanvasOverlay.setOffset(offsetLeft, offsetTop);
windRoseCanvasOverlay.addToMap();
windNeedleCanvasOverlay = new ImageCanvasOverlay(map, SimulatorMapOverlaysZIndexes.WIND_ROSE_ZINDEX, resources.windRoseNeedle());
windNeedleCanvasOverlay.setOffset(offsetLeft, offsetTop);
windNeedleCanvasOverlay.setBearing(180.0);
windNeedleCanvasOverlay.addToMap();
}
}
raceCourseCanvasOverlay = new RaceCourseCanvasOverlay(map, SimulatorMapOverlaysZIndexes.RACE_COURSE_ZINDEX);
raceCourseCanvasOverlay = new RaceCourseCanvasOverlay(map, SimulatorMapOverlaysZIndexes.RACE_COURSE_ZINDEX, mode);
if (mode == SailingSimulatorConstants.ModeEvent) {
regattaAreaCanvasOverlay.setRaceCourseCanvas(raceCourseCanvasOverlay);
regattaAreaCanvasOverlay.updateRaceCourse(0, 0);
}
if (windParams.isShowArrows()) {
@@ -460,6 +477,8 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ
windParams.setxRes(xRes);
windParams.setyRes(yRes);
busyIndicator.setBusy(true);
timer.setTime(windParams.getStartTime().getTime());
simulatorService.getWindField(windParams, windPatternDisplay, new AsyncCallback<WindFieldDTO>() {
@Override
public void onFailure(Throwable message) {
@@ -526,7 +545,6 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ
}
}
this.timer.setTime(this.windParams.getStartTime().getTime());
if (this.windParams.isShowArrows()) {
this.windFieldCanvasOverlay.draw();
}
@@ -563,6 +581,7 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ
windParams.setyRes(yRes);
busyIndicator.setBusy(true);
timer.setTime(windParams.getStartTime().getTime());
simulatorService.getSimulatorResults(mode, raceCourseDirection, windParams, windPatternDisplay, true, selection, new ResultManager(summaryView));
@@ -848,9 +867,27 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ
raceCourseCanvasOverlay.raceCourseDirection = raceCourseDirection;
regattaAreaCanvasOverlay.updateRaceCourse(0, 0);
raceCourseCanvasOverlay.draw();
windNeedleCanvasOverlay.draw();
}
public WindFieldGenParamsDTO getWindParams() {
return windParams;
}
public RegattaAreaCanvasOverlay getRegattaAreaCanvasOverlay() {
return regattaAreaCanvasOverlay;
}
public ImageCanvasOverlay getWindRoseCanvasOverlay() {
return windRoseCanvasOverlay;
}
public ImageCanvasOverlay getWindNeedleCanvasOverlay() {
return windNeedleCanvasOverlay;
}
public RaceCourseCanvasOverlay getRaceCourseCanvasOverlay() {
return raceCourseCanvasOverlay;
}
}
@@ -11,12 +11,13 @@ public interface SimulatorMapOverlaysZIndexes {
public static int REGATTA_AREA_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 1;
public static int RACE_COURSE_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 2;
public static int WINDFIELD_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 3;
public static int WINDSTREAMLETS_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 4;
public static int WINDGRID_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 5;
public static int WINDGRID_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 3;
public static int WINDFIELD_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 4;
public static int WINDSTREAMLETS_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 5;
public static int WINDLINE_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 6;
public static int PATH_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 7;
public static int PATHLEGEND_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 8;
public static int WIND_ROSE_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 8;
public static int PATHLEGEND_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 9;
/** the z-index of the info window should always be higher than the rest */
public static int INFO_WINDOW_ZINDEX = BASE_CANVAS_OVERLAY_ZINDEX + 50;
@@ -21,7 +21,6 @@ import com.sap.sailing.gwt.ui.shared.WindFieldDTO;
import com.sap.sailing.gwt.ui.shared.WindFieldGenParamsDTO;
import com.sap.sailing.gwt.ui.simulator.racemap.FullCanvasOverlay;
import com.sap.sailing.gwt.ui.simulator.util.ToolTip;
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
@@ -44,8 +43,6 @@ public class WindFieldCanvasOverlay extends FullCanvasOverlay implements TimeLis
protected Map<ToolTip, SimulatorWindDTO> windFieldPoints;
protected String arrowColor = "Blue";
protected String arrowHeadColor = "Blue";
protected WindFieldMapMouseMoveHandler mmHandler;
protected double arrowLength = 15;
protected WindFieldGenParamsDTO windParams = null;
@@ -93,11 +90,7 @@ public class WindFieldCanvasOverlay extends FullCanvasOverlay implements TimeLis
@Override
public void addToMap() {
super.addToMap();
if(mmHandler == null) {
mmHandler = new WindFieldMapMouseMoveHandler(this);
}
mmHandler.setWindFieldPoints(windFieldPoints);
mouseMoveHandlerRegistration = addMouseMoveHandler(mmHandler);
if (timer != null) {
timer.addTimeListener(this);
}
@@ -127,7 +120,6 @@ public class WindFieldCanvasOverlay extends FullCanvasOverlay implements TimeLis
canvas.getContext2d().clearRect(0.0 /*canvas.getAbsoluteLeft()*/, 0.0/*canvas.getAbsoluteTop()*/,
canvas.getCoordinateSpaceWidth(), canvas.getCoordinateSpaceHeight());
windFieldPoints.clear();
mmHandler.clear();
}
protected void drawWindField() {
@@ -12,7 +12,6 @@ import java.util.TreeMap;
import java.util.logging.Logger;
import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.base.LatLng;
import com.google.gwt.maps.client.base.Point;
@@ -23,7 +22,6 @@ import com.sap.sailing.gwt.ui.shared.SimulatorWindDTO;
import com.sap.sailing.gwt.ui.shared.WindFieldDTO;
import com.sap.sailing.gwt.ui.simulator.racemap.FullCanvasOverlay;
import com.sap.sailing.gwt.ui.simulator.util.ToolTip;
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 +31,7 @@ import com.sap.sailing.gwt.ui.simulator.util.WindFieldMapMouseMoveHandler;
*
*/
public class WindStreamletsCanvasOverlay extends FullCanvasOverlay implements TimeListenerWithStoppingCriteria {
/** The wind field that is to be displayed in the overlay */
private WindFieldDTO windFieldDTO;
@@ -46,8 +44,6 @@ public class WindStreamletsCanvasOverlay extends FullCanvasOverlay implements Ti
private Map<ToolTip, SimulatorWindDTO> windFieldPoints;
private String arrowColor = "Black";
private String arrowHeadColor = "Blue";
private HandlerRegistration mouseMoveHandlerRegistration;
private WindFieldMapMouseMoveHandler windFieldMapMouseMoveHandler;
private int xRes;
private Timer timer;
@@ -59,10 +55,9 @@ public class WindStreamletsCanvasOverlay extends FullCanvasOverlay implements Ti
this.timer = timer;
this.xRes = xRes;
windFieldDTO = null;
windFieldPoints = new HashMap<ToolTip, SimulatorWindDTO>();
windFieldMapMouseMoveHandler = new WindFieldMapMouseMoveHandler(this);
timePointWindDTOMap = new TreeMap<Long, List<SimulatorWindDTO>>();
}
@@ -75,9 +70,6 @@ public class WindStreamletsCanvasOverlay extends FullCanvasOverlay implements Ti
public void addToMap() {
super.addToMap();
windFieldMapMouseMoveHandler.setWindFieldPoints(windFieldPoints);
mouseMoveHandlerRegistration = map.addMouseMoveHandler(windFieldMapMouseMoveHandler);
if (timer != null) {
timer.addTimeListener(this);
}
@@ -87,8 +79,6 @@ public class WindStreamletsCanvasOverlay extends FullCanvasOverlay implements Ti
public void removeFromMap() {
super.removeFromMap();
mouseMoveHandlerRegistration.removeHandler();
if (timer != null) {
timer.removeTimeListener(this);
}
@@ -126,7 +116,6 @@ public class WindStreamletsCanvasOverlay extends FullCanvasOverlay implements Ti
canvas.getContext2d().clearRect(0.0 /*canvas.getAbsoluteLeft()*/, 0.0/*canvas.getAbsoluteTop()*/,
canvas.getCoordinateSpaceWidth(), canvas.getCoordinateSpaceHeight());
windFieldPoints.clear();
windFieldMapMouseMoveHandler.clear();
}
protected void drawWindField() {
@@ -7,6 +7,8 @@ import com.google.gwt.core.client.Scheduler;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.base.LatLng;
import com.google.gwt.maps.client.base.Point;
import com.google.gwt.maps.client.events.center.CenterChangeMapEvent;
import com.google.gwt.maps.client.events.center.CenterChangeMapHandler;
import com.google.gwt.user.client.ui.RequiresResize;
import com.sap.sailing.domain.common.dto.PositionDTO;
import com.sap.sailing.gwt.ui.shared.SimulatorWindDTO;
@@ -35,6 +37,23 @@ public abstract class FullCanvasOverlay extends CanvasOverlayV3 implements Requi
public FullCanvasOverlay(MapWidget map, int zIndex) {
super(map, zIndex);
/*getMap().addDragEndHandler( new DragEndMapHandler() {
@Override
public void onEvent(DragEndMapEvent event) {
// TODO Auto-generated method stub
draw();
};
});*/
getMap().addCenterChangeHandler(new CenterChangeMapHandler() {
@Override
public void onEvent(CenterChangeMapEvent event) {
// TODO Auto-generated method stub
draw();
};
});
}
/**
@@ -1,79 +0,0 @@
/**
*
*/
package com.sap.sailing.gwt.ui.simulator.util;
import java.util.Map;
import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.canvas.dom.client.ImageData;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.maps.client.base.LatLng;
import com.google.gwt.maps.client.base.Point;
import com.google.gwt.maps.client.events.mousemove.MouseMoveMapEvent;
import com.google.gwt.maps.client.events.mousemove.MouseMoveMapHandler;
import com.sap.sailing.gwt.ui.shared.SimulatorWindDTO;
import com.sap.sailing.gwt.ui.simulator.racemap.FullCanvasOverlay;
/**
* To handle MouseMoveEvent to display tool tips around SimulatorWindDTO objects in a wind field
*
* @author Nidhi Sawhney(D054070)
*
*/
public class WindFieldMapMouseMoveHandler implements MouseMoveMapHandler {
private final FullCanvasOverlay canvasOverlay;
private Map<ToolTip, SimulatorWindDTO> windFieldPoints = null;
private ImageData lastImageData = null;
private double lastToolx;
private double lastTooly;
public WindFieldMapMouseMoveHandler(final FullCanvasOverlay canvasOverlay) {
super();
this.canvasOverlay = canvasOverlay;
}
public void clear() {
lastImageData = null;
}
public void setWindFieldPoints(final Map<ToolTip, SimulatorWindDTO> windFieldPoints) {
this.windFieldPoints = windFieldPoints;
}
@Override
public void onEvent(final MouseMoveMapEvent event) {
if (windFieldPoints != null) {
final LatLng latLng = event.getMouseEvent().getLatLng();
final Point pointP = canvasOverlay.getMapProjection().fromLatLngToDivPixel(latLng);
final double x = pointP.getX() - canvasOverlay.getWidgetPosLeft();
final double y = pointP.getY() - canvasOverlay.getWidgetPosTop();
final ToolTip point = new ToolTip(x, y);
final Context2d context2d = canvasOverlay.getCanvas().getContext2d();
if (lastImageData != null) {
context2d.putImageData(lastImageData, lastToolx, lastTooly);
}
if (windFieldPoints.containsKey(point)) {
lastToolx = x;
lastTooly = y;
lastImageData = context2d.getImageData(x, y, ToolTip.toolRectW, ToolTip.toolRectH);
final SimulatorWindDTO 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");
final String speedStr = NumberFormat.getFormat("#.00").format(windDTO.trueWindSpeedInKnots);
final String bearingStr = NumberFormat.getFormat("#.00").format(windDTO.trueWindBearingDeg);
final String ttMsg = speedStr + " kn " + bearingStr + "";
context2d.fillText(ttMsg, x+10,y+15,60);
}
}
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

@@ -9,7 +9,9 @@ public interface SailingSimulatorConstants {
public static final char LegTypeUpwind = 'u'; // leg type: 'u'pwind
public static final char LegTypeDownwind = 'd'; // leg type: 'd'ownwind
public static final char EventDummy = '0'; // used in cases where race course is defined as URL parameter
public static final char EventKielerWoche = 'k'; // event: 'k'ieler woche
public static final char EventTravemuenderWoche = 't'; // event: 't'ravemünder woche
public static final char EventX40Cardiff = 'c'; // event: 'c'ardiff extreme sailing series
}