diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMap.java index f47fb5a99a0..f9357365f9f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMap.java @@ -37,7 +37,7 @@ import com.google.gwt.maps.client.overlay.Polyline; import com.google.gwt.maps.client.overlay.PolylineOptions; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.Panel; +import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.domain.common.ManeuverType; @@ -52,6 +52,7 @@ import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.ParallelExecutionCallback; import com.sap.sailing.gwt.ui.client.ParallelExecutionHolder; import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener; +import com.sap.sailing.gwt.ui.client.RequiresDataInitialization; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.TimeListener; @@ -65,8 +66,8 @@ import com.sap.sailing.gwt.ui.shared.PositionDTO; import com.sap.sailing.gwt.ui.shared.components.Component; import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; -public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, RaceSelectionChangeListener, - Component { +public class RaceMap extends SimplePanel implements TimeListener, CompetitorSelectionChangeListener, RaceSelectionChangeListener, + Component, RequiresDataInitialization { protected MapWidget map; private final SailingServiceAsync sailingService; @@ -161,9 +162,14 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, private final RaceMapSettings settings; private final StringMessages stringMessages; + + private boolean dataInitialized; + + private Date lastTimeChangeBeforeInitialization; public RaceMap(SailingServiceAsync sailingService, ErrorReporter errorReporter, Timer timer, CompetitorSelectionProvider competitorSelection, StringMessages stringMessages) { + this.setSize("100%", "100%"); this.stringMessages = stringMessages; this.sailingService = sailingService; this.errorReporter = errorReporter; @@ -179,6 +185,9 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, this.competitorSelection = competitorSelection; competitorSelection.addCompetitorSelectionChangeListener(this); settings = new RaceMapSettings(); + lastTimeChangeBeforeInitialization = null; + dataInitialized = false; + initializeData(); } public double calculateDistance(double lat1, double lng1, double lat2, double lng2) { @@ -195,7 +204,7 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, return dist; } - public void loadMapsAPI(final Panel parentPanel) { + private void loadMapsAPI() { Maps.loadMapsApi(mapsAPIKey, "2", false, new Runnable() { public void run() { map = new MapWidget(); @@ -206,7 +215,7 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, // Add the map to the HTML host page map.setScrollWheelZoomEnabled(true); map.setContinuousZoom(true); - parentPanel.add(map); + RaceMap.this.add(map); map.setSize("100%", "100%"); map.addMapZoomEndHandler(new MapZoomEndHandler() { @Override @@ -236,6 +245,14 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, lastMousePosition = event.getLatLng(); } }); + + //If there was a time change before the API was loaded, reset the time + if (lastTimeChangeBeforeInitialization != null) { + timeChanged(lastTimeChangeBeforeInitialization); + lastTimeChangeBeforeInitialization = null; + } + //Data has been initialized + RaceMap.this.dataInitialized = true; } }); } @@ -267,42 +284,43 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, new ParallelExecutionHolder(getBoatsCallback, getMarksCallback) { @Override protected void handleSuccess() { - //Do boat specific actions - Map> boatData = getBoatsCallback.getData(); - // process response only if not received out of order - if (startedProcessingRequestID < requestID) { - startedProcessingRequestID = requestID; - Date from = new Date(date.getTime() - settings.getTailLengthInMilliseconds()); - updateFixes(boatData, fromAndToAndOverlap.getC()); - showBoatsOnMap(from, date, getCompetitorsToShow()); - if (douglasMarkers != null) { - removeAllMarkDouglasPeuckerpoints(); + if (map != null) { + //Do boat specific actions + Map> boatData = getBoatsCallback.getData(); + // process response only if not received out of order + if (startedProcessingRequestID < requestID) { + startedProcessingRequestID = requestID; + Date from = new Date(date.getTime() - settings.getTailLengthInMilliseconds()); + updateFixes(boatData, fromAndToAndOverlap.getC()); + showBoatsOnMap(from, date, getCompetitorsToShow()); + if (douglasMarkers != null) { + removeAllMarkDouglasPeuckerpoints(); + } + if (maneuverMarkers != null) { + removeAllManeuverMarkers(); + } } - if (maneuverMarkers != null) { - removeAllManeuverMarkers(); + //Do mark specific actions + List markData = getMarksCallback.getData(); + showMarksOnMap(markData); + //Rezoom the map + if (!getSettings().getZoomSettings().contains(ZoomTypes.NONE)) { //Auto zoom if setting is not manual + zoomMapToNewBounds(getSettings().getZoomSettings().getNewBounds(RaceMap.this)); + mapFirstZoomDone = true; + } else if (!mapZoomedOrPannedSinceLastRaceSelectionChange) { //Zoom once to the boats + zoomMapToNewBounds(new BoatsBoundsCalculater().calculateNewBounds(RaceMap.this)); + mapFirstZoomDone = true; + } else if (!mapZoomedOrPannedSinceLastRaceSelectionChange && !mapFirstZoomDone) { //Zoom once to the buoys + zoomMapToNewBounds(new BuoysBoundsCalculater().calculateNewBounds(RaceMap.this)); + mapFirstZoomDone = true; + /* Reset the mapZoomedOrPannedSinceLastRaceSelection: In spite of the fact that the map was just zoomed + * to the bounds of the buoys, it was not a zoom or pan triggered by the user. As a consequence the + * mapZoomedOrPannedSinceLastRaceSelection option has to reset again. + */ + mapZoomedOrPannedSinceLastRaceSelectionChange = false; } - } - - //Do mark specific actions - List markData = getMarksCallback.getData(); - showMarksOnMap(markData); - - //Rezoom the map - if (!getSettings().getZoomSettings().contains(ZoomTypes.NONE)) { //Auto zoom if setting is not manual - zoomMapToNewBounds(getSettings().getZoomSettings().getNewBounds(RaceMap.this)); - mapFirstZoomDone = true; - } else if (!mapZoomedOrPannedSinceLastRaceSelectionChange) { //Zoom once to the boats - zoomMapToNewBounds(new BoatsBoundsCalculater().calculateNewBounds(RaceMap.this)); - mapFirstZoomDone = true; - } else if (!mapZoomedOrPannedSinceLastRaceSelectionChange && !mapFirstZoomDone) { //Zoom once to the buoys - zoomMapToNewBounds(new BuoysBoundsCalculater().calculateNewBounds(RaceMap.this)); - mapFirstZoomDone = true; - /* - * Reset the mapZoomedOrPannedSinceLastRaceSelection: In spite of the fact that the map was just zoomed - * to the bounds of the buoys, it was not a zoom or pan triggered by the user. As a consequence the - * mapZoomedOrPannedSinceLastRaceSelection option has to reset again. - */ - mapZoomedOrPannedSinceLastRaceSelectionChange = false; + } else { + lastTimeChangeBeforeInitialization = date; } } @@ -1191,4 +1209,14 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, } } + + @Override + public void initializeData() { + loadMapsAPI(); + } + + @Override + public boolean isDataInitialized() { + return dataInitialized; + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMapPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMapPanel.java index 01cd4efb93a..97e9d644a40 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMapPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMapPanel.java @@ -71,7 +71,7 @@ public class RaceMapPanel extends FormPanel implements EventDisplayer, TimeListe mapPanel.setSize("100%", "100%"); grid.setWidget(2, 1, mapPanel); raceMap = new RaceMap(sailingService, errorReporter, timer, competitorSelectionProvider, stringMessages); - raceMap.loadMapsAPI(mapPanel); + mapPanel.add(raceMap); raceSelectionModel = new RaceSelectionModel(); raceListBox = new RacesListBoxPanel(eventRefresher, raceSelectionModel, stringMessages); raceSelectionModel.addRaceSelectionChangeListener(this); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RequiresDataInitialization.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RequiresDataInitialization.java new file mode 100644 index 00000000000..29f25034849 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RequiresDataInitialization.java @@ -0,0 +1,13 @@ +package com.sap.sailing.gwt.ui.client; + +/** + * This is used by UI-Components, which require asynchronous data initialization (for example RaceMap, Charts or the Leaderboard) + * @author Lennart Hensler (D054527) + * + */ +public interface RequiresDataInitialization { + + public void initializeData(); + public boolean isDataInitialized(); + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java index 52a50e24af2..d9eeeaf725d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java @@ -141,7 +141,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel CollapsableComponentViewer raceMapViewer = new CollapsableComponentViewer( raceMap, "auto", "500px", stringMessages); - raceMap.loadMapsAPI((Panel) raceMapViewer.getViewerWidget().getContent()); + ((Panel) raceMapViewer.getViewerWidget().getContent()).add(raceMap); raceMap.onRaceSelectionChange(Collections.singletonList(selectedRaceIdentifier)); collapsableViewers.add(raceMapViewer); }