From 2b7998c7d4ecc0d0aae7e7ce0fa8a1755de00abf Mon Sep 17 00:00:00 2001 From: fmittag Date: Fri, 9 Mar 2012 19:31:35 +0100 Subject: [PATCH] Initial version of displaying the wind on the map (just a rotating wind marker based on the combined wind so far) --- .../sailing/gwt/ui/adminconsole/RaceMap.java | 96 +++++++++++++++---- .../gwt/ui/adminconsole/RaceMapResources.java | 10 ++ .../raceboard/SideBySideComponentViewer.java | 2 - 3 files changed, 87 insertions(+), 21 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 39477dc6ec3..19b46acf54b 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 @@ -47,6 +47,8 @@ import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.domain.common.ManeuverType; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.Tack; +import com.sap.sailing.domain.common.WindSource; +import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.impl.Util; import com.sap.sailing.domain.common.impl.Util.Triple; import com.sap.sailing.gwt.ui.adminconsole.RaceMapZoomSettings.ZoomTypes; @@ -69,7 +71,9 @@ import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sailing.gwt.ui.shared.PositionDTO; import com.sap.sailing.gwt.ui.shared.QuickRankDTO; import com.sap.sailing.gwt.ui.shared.SpeedWithBearingDTO; +import com.sap.sailing.gwt.ui.shared.WindDTO; import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO; +import com.sap.sailing.gwt.ui.shared.WindTrackInfoDTO; import com.sap.sailing.gwt.ui.shared.components.Component; import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; @@ -111,6 +115,10 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele private final Map buoyMarkers; + private Marker combinedWindMarker; + + private int combinedWindMarkerPosX; + private int combinedWindMarkerPosY; /** * markers displayed in response to * {@link SailingServiceAsync#getDouglasPoints(String, String, Map, Map, double, AsyncCallback)} @@ -197,6 +205,8 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele fixes = new HashMap>(); this.competitorSelection = competitorSelection; competitorSelection.addCompetitorSelectionChangeListener(this); + combinedWindMarkerPosX = 30; + combinedWindMarkerPosY = 30; settings = new RaceMapSettings(); lastTimeChangeBeforeInitialization = null; dataInitialized = false; @@ -296,8 +306,6 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele final ParallelExecutionCallback>> getBoatsCallback = new ParallelExecutionCallback>>(); final ParallelExecutionCallback> getMarksCallback = new ParallelExecutionCallback>(); final ParallelExecutionCallback> getQuickRanksCallback = new ParallelExecutionCallback>(); -// final ParallelExecutionCallback getWindCallback = new ParallelExecutionCallback(); -// new ParallelExecutionHolder(getBoatsCallback, getMarksCallback, getQuickRanksCallback, getWindCallback) { new ParallelExecutionHolder(getBoatsCallback, getMarksCallback, getQuickRanksCallback) { @Override protected void handleSuccess() { @@ -339,7 +347,6 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele mapZoomedOrPannedSinceLastRaceSelectionChange = false; } } -// showWindOnMap(getWindCallback.getData()); } else { lastTimeChangeBeforeInitialization = date; } @@ -353,7 +360,23 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele sailingService.getBoatPositions(race, fromAndToAndOverlap.getA(), fromAndToAndOverlap.getB(), true, getBoatsCallback); sailingService.getMarkPositions(race, date, getMarksCallback); sailingService.getQuickRanks(race, date, getQuickRanksCallback); -// sailingService.getWindInfo(race, date, 0, 0, 0, null, getWindCallback); + + // draw the wind into the map, get the combined wind + List windSourceTypeNames = new ArrayList(); + windSourceTypeNames.add(WindSourceType.COMBINED.name()); + windSourceTypeNames.add(WindSourceType.EXPEDITION.name()); + sailingService.getWindInfo(race, date, 1000L, 1, 0.0, 0.0, null, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error obtaining wind: " + caught.getMessage()); + } + + @Override + public void onSuccess(WindInfoForRaceDTO windInfoForRaceDTO) { + showWindOnMap(windInfoForRaceDTO); + } + }); } } } @@ -450,22 +473,57 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele } protected void showWindOnMap(WindInfoForRaceDTO windInfo) { - // DON'T DELETE... THIS WILL BE IMPLEMENTED SOON -// System.out.println("Windsources: " + windInfo.windTrackInfoByWindSource.size()); -// for(WindSource windSource: windInfo.windTrackInfoByWindSource.keySet()) { -// switch (windSource) { -// case COURSE_BASED: -// case EXPEDITION: -// case TRACK_BASED_ESTIMATION: -// case WEB: -// WindTrackInfoDTO windTrackInfoDTO = windInfo.windTrackInfoByWindSource.get(windSource); -// for(WindDTO windDTO: windTrackInfoDTO.windFixes) { -// Long timepoint = windDTO.timepoint; -// } -// } -// } + for(WindSource windSource: windInfo.windTrackInfoByWindSource.keySet()) { + WindTrackInfoDTO windTrackInfoDTO = windInfo.windTrackInfoByWindSource.get(windSource); + switch (windSource.getType()) { + case COMBINED: + { + if(windTrackInfoDTO.windFixes.size() > 0) { + WindDTO windDTO = windTrackInfoDTO.windFixes.get(0); + // double speedInKnots = windDTO.dampenedTrueWindSpeedInKnots; + double windFromDeg = windDTO.dampenedTrueWindFromDeg; + + if(combinedWindMarker == null) + createCombinedWindMarker(); + + if(map != null && combinedWindMarker != null) { + LatLng windMarkerPositionLatLng = map.convertDivPixelToLatLng(Point.newInstance(combinedWindMarkerPosX, combinedWindMarkerPosY)); + combinedWindMarker.setLatLng(windMarkerPositionLatLng); + + ImageTransformer transformer = imageResources.getCombinedWindIconTransformer(); + String transformedImageURL = transformer.getTransformedImageURL(windFromDeg, 1.0); + combinedWindMarker.setImage(transformedImageURL); + } + } + } + break; + case EXPEDITION: + { + } + break; + } + } } - + + protected Marker createCombinedWindMarker() { + if(map != null && combinedWindMarker == null) { + LatLng windMarkerPositionLatLng = map.convertDivPixelToLatLng(Point.newInstance(combinedWindMarkerPosX, combinedWindMarkerPosY)); + Icon icon = Icon.newInstance(); + icon.setImageURL(null); + icon.setShadowURL(null); + MarkerOptions options = MarkerOptions.newInstance(icon); + combinedWindMarker = new Marker(windMarkerPositionLatLng, options); + combinedWindMarker.addMarkerClickHandler(new MarkerClickHandler() { + @Override + public void onClick(MarkerClickEvent event) { + } + }); + + map.addOverlay(combinedWindMarker); + } + return combinedWindMarker; + } + protected void showMarksOnMap(List result) { if (map != null) { Set toRemove = new HashSet(buoyMarkers.keySet()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMapResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMapResources.java index e9428d6d224..3b5f1246283 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMapResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMapResources.java @@ -57,6 +57,11 @@ public class RaceMapResources { */ protected ImageTransformer boatIconHighlightedStarboardTransformer; + /** + * An arrow showing the combined wind depending on the wind direction + */ + protected ImageTransformer combinedWindIconTransformer; + protected Icon buoyIcon; protected Map, Icon> maneuverIconsForTypeAndTargetTack; @@ -76,6 +81,7 @@ public class RaceMapResources { boatIconHighlightedPortTransformer = new ImageTransformer(resources.highlightedBoatIcon_Port()); boatIconStarboardTransformer = new ImageTransformer(resources.lowlightedBoatIcon_Starboard()); boatIconHighlightedStarboardTransformer = new ImageTransformer(resources.highlightedBoatIcon_Starboard()); + combinedWindIconTransformer = new ImageTransformer(resources.windDirectionIcon()); } /** @@ -174,6 +180,10 @@ public class RaceMapResources { } } + public ImageTransformer getCombinedWindIconTransformer() { + return combinedWindIconTransformer; + } + public String getBoatImageURL(GPSFixDTO boatFix, boolean highlighted) { return getBoatImageURL(getBoatImageTransformer(boatFix, highlighted), boatFix); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SideBySideComponentViewer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SideBySideComponentViewer.java index e255c93a627..127b27682ae 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SideBySideComponentViewer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SideBySideComponentViewer.java @@ -34,9 +34,7 @@ public class SideBySideComponentViewer implements ComponentViewer { mainPanel = new LayoutPanel(); mainPanel.setSize("100%", "100%"); splitLayoutPanel = new SplitLayoutPanel(); - mainPanel.add(splitLayoutPanel); -// splitLayoutPanel.setSize(defaultWidth, defaultHeight); for(Component component: components) { if(component.isVisible())