From e961348a413bd018c38b6f1a9b467f9d337a797d Mon Sep 17 00:00:00 2001 From: Lennart Hensler Date: Tue, 14 Feb 2012 12:10:39 +0100 Subject: [PATCH 1/4] Added Interface for classes, which load their data asynchrone --- .../gwt/ui/client/RequiresDataInitialization.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RequiresDataInitialization.java 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(); + +} From 76fd55eed17750ee90e8f5239e95587fa98ca0a8 Mon Sep 17 00:00:00 2001 From: Lennart Hensler Date: Tue, 14 Feb 2012 12:14:20 +0100 Subject: [PATCH 2/4] Added RequiresDataInitialization to the RaceMap --- .../sailing/gwt/ui/adminconsole/RaceMap.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) 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..cd69172c52c 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 @@ -36,8 +36,10 @@ import com.google.gwt.maps.client.overlay.MarkerOptions; 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.FlowPanel; 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 +54,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; @@ -66,7 +69,7 @@ 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 { + Component, RequiresDataInitialization { protected MapWidget map; private final SailingServiceAsync sailingService; @@ -161,6 +164,10 @@ 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) { @@ -297,8 +304,7 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, } 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 + /* 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. */ @@ -1191,4 +1197,15 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, } } + + @Override + public void initializeData() { + // TODO Auto-generated method stub + + } + + @Override + public boolean isDataInitialized() { + return dataInitialized; + } } From 0a2cc4950e2c873fefe5e07109640da847563a03 Mon Sep 17 00:00:00 2001 From: Lennart Hensler Date: Tue, 14 Feb 2012 12:33:32 +0100 Subject: [PATCH 3/4] Fix of Bug 284 (Sometimes map doesn't initially zoom) --- .../sailing/gwt/ui/adminconsole/RaceMap.java | 77 ++++++++++--------- 1 file changed, 42 insertions(+), 35 deletions(-) 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 cd69172c52c..9884cdb8f14 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 @@ -36,10 +36,8 @@ import com.google.gwt.maps.client.overlay.MarkerOptions; 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.FlowPanel; 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; @@ -186,6 +184,7 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, this.competitorSelection = competitorSelection; competitorSelection.addCompetitorSelectionChangeListener(this); settings = new RaceMapSettings(); + lastTimeChangeBeforeInitialization = null; } public double calculateDistance(double lat1, double lng1, double lat2, double lng2) { @@ -243,6 +242,12 @@ 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; + } } }); } @@ -274,41 +279,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; } } From d123b97a4b059f6ef1981a7222c4b8f326d99e35 Mon Sep 17 00:00:00 2001 From: Lennart Hensler Date: Tue, 14 Feb 2012 13:29:57 +0100 Subject: [PATCH 4/4] Refactored the RaceMap to a SimplePanel and implemented the RequiresDataInitialization methods --- .../sap/sailing/gwt/ui/adminconsole/RaceMap.java | 16 ++++++++++------ .../gwt/ui/adminconsole/RaceMapPanel.java | 2 +- .../sailing/gwt/ui/raceboard/RaceBoardPanel.java | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) 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 9884cdb8f14..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; @@ -66,7 +66,7 @@ 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, +public class RaceMap extends SimplePanel implements TimeListener, CompetitorSelectionChangeListener, RaceSelectionChangeListener, Component, RequiresDataInitialization { protected MapWidget map; @@ -169,6 +169,7 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, 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; @@ -185,6 +186,8 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, competitorSelection.addCompetitorSelectionChangeListener(this); settings = new RaceMapSettings(); lastTimeChangeBeforeInitialization = null; + dataInitialized = false; + initializeData(); } public double calculateDistance(double lat1, double lng1, double lat2, double lng2) { @@ -201,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(); @@ -212,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 @@ -248,6 +251,8 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, timeChanged(lastTimeChangeBeforeInitialization); lastTimeChangeBeforeInitialization = null; } + //Data has been initialized + RaceMap.this.dataInitialized = true; } }); } @@ -1207,8 +1212,7 @@ public class RaceMap implements TimeListener, CompetitorSelectionChangeListener, @Override public void initializeData() { - // TODO Auto-generated method stub - + loadMapsAPI(); } @Override 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/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); }