diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceFetcher.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceFetcher.java
index 5ff5712cb4a..7c68382fc95 100755
--- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceFetcher.java
+++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/RaceFetcher.java
@@ -11,5 +11,5 @@ public interface RaceFetcher {
*/
Object getTrackedRace(RegattaAndRaceIdentifier regattaNameAndRaceName);
- Object getExistingTrackedRace(RaceIdentifier regattaNameAndRaceName);
+ Object getExistingTrackedRace(RegattaAndRaceIdentifier regattaNameAndRaceName);
}
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java
index e998db6c74e..f926691547f 100755
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java
@@ -676,4 +676,16 @@ public class MockedTrackedRace implements DynamicTrackedRace {
// TODO Auto-generated method stub
return null;
}
+
+ @Override
+ public boolean hasWindData() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean hasGPSData() {
+ // TODO Auto-generated method stub
+ return false;
+ }
}
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java
index d723273c464..372da05efba 100755
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRaceWithStartTimeAndRanks.java
@@ -440,4 +440,16 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace {
// TODO Auto-generated method stub
return null;
}
+
+ @Override
+ public boolean hasWindData() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean hasGPSData() {
+ // TODO Auto-generated method stub
+ return false;
+ }
}
diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java
index 933697c2f4d..21155035e17 100755
--- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java
+++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/TrackedRace.java
@@ -355,7 +355,20 @@ public interface TrackedRace extends Serializable {
* time as the direction the wind comes from.
*/
boolean raceIsKnownToStartUpwind();
-
+
+ /**
+ * Many calculations require valid wind data. In order to prevent NoWindException's to be handled by those calculation
+ * this method can be used to check whether the tracked race has sufficient wind information available.
+ * @return true if {@link #getWind(Position, TimePoint)} delivers a (not null) wind fix.
+ */
+ boolean hasWindData();
+
+ /**
+ *
+ * @return true if at least one GPS fix for one of the competitors is available for this race.
+ */
+ boolean hasGPSData();
+
/**
* Adds a race change listener to the set of listeners that will be notified about changes to this race.
* The listener won't be serialized together with this object.
diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java
index e105651c73a..8df3f814ba8 100755
--- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java
+++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java
@@ -31,6 +31,7 @@ import com.sap.sailing.domain.base.BearingWithConfidence;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Buoy;
import com.sap.sailing.domain.base.Competitor;
+import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.CourseChange;
import com.sap.sailing.domain.base.CourseListener;
import com.sap.sailing.domain.base.Leg;
@@ -1051,6 +1052,38 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
return result;
}
+ @Override
+ public boolean hasWindData() {
+ boolean result = false;
+ Course course = getRace().getCourse();
+ Waypoint firstWaypoint = course.getFirstWaypoint();
+ TimePoint timepoint = startTime != null ? startTime : startOfTrackingReceived;
+ if(firstWaypoint != null && timepoint != null) {
+ Position position = getApproximatePosition(firstWaypoint, timepoint);
+ if(position != null) {
+ Wind wind = getWind(position, timepoint);
+ if(wind != null) {
+ result = true;
+ }
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public boolean hasGPSData() {
+ boolean result = false;
+ if(!tracks.values().isEmpty()) {
+ for(GPSFixTrack gpsTrack: tracks.values()) {
+ if(gpsTrack.getFirstRawFix() != null) {
+ result = true;
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
@Override
public Wind getWind(Position p, TimePoint at) {
return getWind(p, at, getWindSourcesToExclude());
diff --git a/java/com.sap.sailing.gwt.ui/Spectator.css b/java/com.sap.sailing.gwt.ui/Spectator.css
index 46c007f4ebb..45df3bafdc6 100644
--- a/java/com.sap.sailing.gwt.ui/Spectator.css
+++ b/java/com.sap.sailing.gwt.ui/Spectator.css
@@ -228,6 +228,21 @@ input.magnifier {
font-family: 'UbuntuBold', Arial, Verdana, sans-serif;
}
+.leaderboardGroupPanel-LiveRace {
+ padding: 5px 8px;
+ display: block;
+ float: left;
+ margin: 5px 5px 5px 0;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ background: url("images/btn-cta-blue.png") repeat-x -10px 0 #e7e7e7;
+ text-decoration: none;
+ color: #fff;
+ /*border: 1px solid #a6a6a6;*/
+ font-family: 'UbuntuBold', Arial, Verdana, sans-serif;
+}
+
.leaderboardGroupPanel-ActiveLeaderboard {
padding: 5px 8px;
display: block;
@@ -255,17 +270,24 @@ input.magnifier {
display: inline-block;
}
-.leaderboardGroupPanel-ActiveRace:visited, .leaderboardGroupPanel-ActiveLeaderboard:visited, .leaderboardGroupPanel-ActiveButton:visited {
+.leaderboardGroupPanel-ActiveRace:visited, .leaderboardGroupPanel-LiveRace:visited, .leaderboardGroupPanel-ActiveLeaderboard:visited, .leaderboardGroupPanel-ActiveButton:visited {
color: #fff;
}
.leaderboardGroupPanel-ActiveRace:hover, .leaderboardGroupPanel-ActiveLeaderboard:hover, .leaderboardGroupPanel-ActiveButton:hover {
text-decoration: none;
color: #fff;
- background: url("images/btn-cta-orangeleft.png") repeat-x -10px -30px #e7e7e7;
+ background: url("images/btn-cta-orangeleft.png") repeat-x -10px -30px #e7e7e7;
/*border: 1px solid #f1af10;*/
}
+.leaderboardGroupPanel-LiveRace:hover {
+ text-decoration: none;
+ color: #fff;
+ background: url("images/btn-cta-blue.png") repeat-x -10px -30px #e7e7e7;
+ /*border: 1px solid #f1af10;*/
+}
+
.welcomeWidget-WelcomePanel{
float: left;
max-width: 1000px;
diff --git a/java/com.sap.sailing.gwt.ui/images/btn-cta-blue.png b/java/com.sap.sailing.gwt.ui/images/btn-cta-blue.png
new file mode 100644
index 00000000000..6a89b2b3e62
Binary files /dev/null and b/java/com.sap.sailing.gwt.ui/images/btn-cta-blue.png differ
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetBoatPositionsAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetBoatPositionsAction.java
index 36a5ea6d421..98479a587a3 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetBoatPositionsAction.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetBoatPositionsAction.java
@@ -5,7 +5,7 @@ import java.util.List;
import java.util.Map;
import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.sap.sailing.domain.common.RaceIdentifier;
+import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.shared.CompetitorDTO;
import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
@@ -13,13 +13,13 @@ import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
public class GetBoatPositionsAction extends DefaultAsyncAction