From 06e9ae5c42afb02b239eb2ee561cbdc10fcbb57f Mon Sep 17 00:00:00 2001 From: "Christopher Ronnewinkel (D036654)" Date: Wed, 6 Nov 2013 17:28:36 +0100 Subject: [PATCH] move course area circles to simulator map; --- .../gwt/ui/simulator/PathPolyline.java | 22 +++- .../simulator/RegattaAreaCanvasOverlay.java | 116 +++--------------- .../gwt/ui/simulator/SimulatorMap.java | 99 ++++++++++++++- 3 files changed, 127 insertions(+), 110 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/PathPolyline.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/PathPolyline.java index 224bb74fdc0..f224ab26776 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/PathPolyline.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/PathPolyline.java @@ -9,10 +9,14 @@ 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.mvc.MVCArray; +import com.google.gwt.maps.client.overlays.MapCanvasProjection; import com.google.gwt.maps.client.overlays.Marker; import com.google.gwt.maps.client.overlays.MarkerOptions; +import com.google.gwt.maps.client.overlays.OverlayView; import com.google.gwt.maps.client.overlays.Polyline; import com.google.gwt.maps.client.overlays.PolylineOptions; +import com.google.gwt.maps.client.overlays.overlayhandlers.OverlayViewMethods; +import com.google.gwt.maps.client.overlays.overlayhandlers.OverlayViewOnDrawHandler; import com.google.gwt.user.client.rpc.AsyncCallback; import com.sap.sailing.domain.common.Bearing; import com.sap.sailing.domain.common.Position; @@ -66,6 +70,8 @@ public class PathPolyline { private List allPoints = null; private SimulatorServiceAsync simulatorService = null; private MapWidget map = null; + protected OverlayView mapView; + protected MapCanvasProjection mapProjection; private ErrorReporter errorReporter = null; private boolean warningAlreadyShown = false; private SimulatorMap simulatorMap = null; @@ -114,6 +120,12 @@ public class PathPolyline { this.allPoints = pathPoints; this.simulatorService = simulatorService; this.map = map; + this.mapView = OverlayView.newInstance(map, new OverlayViewOnDrawHandler() { + @Override + public void onDraw(OverlayViewMethods methods) { + mapProjection = methods.getProjection(); + } + }, null, null); this.selectedBoatClassIndex = selection.boatClassIndex; this.selectedRaceIndex = selection.raceIndex; this.selectedCompetitorIndex = selection.competitorIndex; @@ -234,7 +246,7 @@ public class PathPolyline { simulatorMap.setPolyline(polyline); polyline.setEditable(true); // old call: polyline.setEditingEnabled(PolyEditingOptions.newInstance(turnPoints.length - 1)); - + getTotalTime(); } @@ -1037,7 +1049,7 @@ public class PathPolyline { /** * Converts a LatLng object to a TwoD object. Considering that a LatLng represent a point on a sphere, and that the - * TwoDPoint represent one on a plane, it will use the MapWidget aproximation to a container pixel in order to do + * TwoDPoint represent one on a plane, it will use the MapWidget approximation to a container pixel in order to do * so. * * @param latLng @@ -1045,8 +1057,7 @@ public class PathPolyline { * @returns a TwoDPoint object. */ private TwoDPoint toTwoDPoint(LatLng latLng) { - // TODO MigrationV3: Point point = map.convertLatLngToContainerPixel(latLng); - Point point = Point.newInstance(latLng.getLatitude(), latLng.getLongitude()); + Point point = this.mapProjection.fromLatLngToContainerPixel(latLng); return new TwoDPoint(point.getX(), point.getY()); } @@ -1065,8 +1076,7 @@ public class PathPolyline { * @returns a LatLng object. */ private LatLng toLatLng(TwoDPoint point) { - return LatLng.newInstance((int) point.getX(), (int) point.getY()); - // TODO MigrationV3: return this.map.convertContainerPixelToLatLng(Point.newInstance((int) point.getX(), (int) point.getY())); + return this.mapProjection.fromContainerPixelToLatLng(Point.newInstance((int) point.getX(), (int) point.getY())); } /** diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/RegattaAreaCanvasOverlay.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/RegattaAreaCanvasOverlay.java index dc4b3873ff7..bdc83494ad4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/RegattaAreaCanvasOverlay.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/RegattaAreaCanvasOverlay.java @@ -5,12 +5,6 @@ import com.google.gwt.canvas.dom.client.Context2d.TextAlign; 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.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.simulator.racemap.FullCanvasOverlay; import com.sap.sailing.simulator.util.SailingSimulatorConstants; @@ -22,7 +16,6 @@ public class RegattaAreaCanvasOverlay extends FullCanvasOverlay { private CourseAreaDescriptor currentCourseArea = null; private boolean initial; - private boolean mapPan = false; private double raceBearing = 0.0; private double diffBearing = 0.0; @@ -32,58 +25,7 @@ public class RegattaAreaCanvasOverlay extends FullCanvasOverlay { 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; - } - } - - }); + this.currentCourseArea = this.venue.getDefaultCourseArea(); } @@ -93,7 +35,7 @@ public class RegattaAreaCanvasOverlay extends FullCanvasOverlay { int counter = 0; for (CourseAreaDescriptor courseArea : venue.getCourseAreas()) { - drawCircleFromRadius(counter++, courseArea); + simulatorMap.drawCircleFromRadius(counter++, courseArea); } map.panTo(venue.getCenterPos()); @@ -142,48 +84,6 @@ 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); - circleOptions.setStrokeOpacity(0.0); - circleOptions.setFillColor("green"); - circleOptions.setFillOpacity(0.0); - circleOptions.setCenter(courseArea.getCenterPos()); - Circle circle = Circle.newInstance(circleOptions); - circle.setRadius(courseArea.getRadiusInMeters()); - - final int regIdxFinal = regIdx; - - circle.addClickHandler(new ClickMapHandler() { - public void onEvent(ClickMapEvent e) { - //System.out.println("Click: "+currentCourseArea.getName()); - CourseAreaDescriptor newRegArea = venue.getCourseAreas().get(regIdxFinal); - - if (newRegArea != currentCourseArea) { - currentCourseArea = newRegArea; - simulatorMap.clearOverlays(); - simulatorMap.getWindRoseCanvasOverlay().removeFromMap(); - simulatorMap.getWindNeedleCanvasOverlay().removeFromMap(); - updateRaceCourse(0, 0); - raceCourseCanvasOverlay.draw(); - } - - map.panTo(currentCourseArea.getCenterPos()); - mapPan = true; - if (map.getZoom() < 14) { - map.setZoom(14); - } - - } - }); - - circle.setMap(getMap()); - - } - protected void updateRaceCourse(int type, double bearing) { if (type == 1) { @@ -209,6 +109,14 @@ public class RegattaAreaCanvasOverlay extends FullCanvasOverlay { } } + public CourseAreaDescriptor getCurrentCourseArea() { + return this.currentCourseArea; + } + + public void setCurrentCourseArea(CourseAreaDescriptor courseArea) { + this.currentCourseArea = courseArea; + } + protected void drawCourseArea(String name, Context2d context2d, Point centerPoint, Point borderPoint, String color, String colorText, double pxStroke) { @@ -282,4 +190,8 @@ public class RegattaAreaCanvasOverlay extends FullCanvasOverlay { this.raceCourseCanvasOverlay = rcCanvas; } + public VenueDescriptor getVenue() { + return this.venue; + } + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorMap.java index d4352cab718..4bca632f589 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorMap.java @@ -19,7 +19,13 @@ import com.google.gwt.maps.client.controls.MapTypeStyle; import com.google.gwt.maps.client.controls.PanControlOptions; import com.google.gwt.maps.client.controls.ScaleControlOptions; import com.google.gwt.maps.client.controls.ZoomControlOptions; +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.idle.IdleMapEvent; +import com.google.gwt.maps.client.events.idle.IdleMapHandler; import com.google.gwt.maps.client.maptypes.MapTypeStyleFeatureType; +import com.google.gwt.maps.client.overlays.Circle; +import com.google.gwt.maps.client.overlays.CircleOptions; import com.google.gwt.maps.client.overlays.Polyline; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -58,6 +64,7 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ private static SimulatorResources resources = GWT.create(SimulatorResources.class); private MapWidget map; + private boolean mapPan = false; private boolean dataInitialized; private boolean overlaysInitialized; private WindFieldGenParamsDTO windParams; @@ -376,7 +383,56 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ add(map, 0, 0); map.setSize("100%", "100%"); - + + /*map.addZoomChangeHandler(new ZoomChangeMapHandler() { + + @Override + public void onEvent(ZoomChangeMapEvent event) { + // TODO Auto-generated method stub + windRoseCanvasOverlay.removeFromMap(); + windNeedleCanvasOverlay.removeFromMap(); + mapPan = true; + } + + }); + + map.addDragStartHandler(new DragStartMapHandler() { + + @Override + public void onEvent(DragStartMapEvent event) { + // TODO Auto-generated method stub + windRoseCanvasOverlay.removeFromMap(); + windNeedleCanvasOverlay.removeFromMap(); + } + + }); + + map.addDragEndHandler(new DragEndMapHandler() { + + @Override + public void onEvent(DragEndMapEvent event) { + // TODO Auto-generated method stub + windRoseCanvasOverlay.addToMap(); + windNeedleCanvasOverlay.addToMap(); + } + + });*/ + + map.addIdleHandler(new IdleMapHandler() { + + @Override + public void onEvent(IdleMapEvent event) { + // TODO Auto-generated method stub + if (mapPan) { + //System.out.println("Map Idle Event Handler."); + getWindRoseCanvasOverlay().addToMap(); + getWindNeedleCanvasOverlay().addToMap(); + mapPan = false; + } + } + + }); + initializeOverlays(); dataInitialized = true; @@ -889,5 +945,44 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ public RaceCourseCanvasOverlay getRaceCourseCanvasOverlay() { return raceCourseCanvasOverlay; } - + + public void drawCircleFromRadius(int regIdx, CourseAreaDescriptor courseArea) { + + CircleOptions circleOptions = CircleOptions.newInstance(); + circleOptions.setStrokeColor("white"); + circleOptions.setStrokeWeight(1); + circleOptions.setStrokeOpacity(0.0); + circleOptions.setFillColor("green"); + circleOptions.setFillOpacity(0.0); + circleOptions.setCenter(courseArea.getCenterPos()); + Circle circle = Circle.newInstance(circleOptions); + circle.setRadius(courseArea.getRadiusInMeters()); + + final int regIdxFinal = regIdx; + + circle.addClickHandler(new ClickMapHandler() { + public void onEvent(ClickMapEvent e) { + //System.out.println("Click: "+currentCourseArea.getName()); + CourseAreaDescriptor newRegArea = regattaAreaCanvasOverlay.getVenue().getCourseAreas().get(regIdxFinal); + + if (newRegArea != regattaAreaCanvasOverlay.getCurrentCourseArea()) { + regattaAreaCanvasOverlay.setCurrentCourseArea(newRegArea); + clearOverlays(); + getWindRoseCanvasOverlay().removeFromMap(); + getWindNeedleCanvasOverlay().removeFromMap(); + regattaAreaCanvasOverlay.updateRaceCourse(0, 0); + raceCourseCanvasOverlay.draw(); + } + + map.panTo(regattaAreaCanvasOverlay.getCurrentCourseArea().getCenterPos()); + mapPan = true; + if (map.getZoom() < 14) { + map.setZoom(14); + } + + } + }); + + circle.setMap(getMap()); + } }