added a general leaderboard detail column for the tracking quality of a race

This commit is contained in:
fmittag committed 2013-07-19 11:35:17 +02:00
1 parent e627d3219c
commit 89430241cb
5 files changed
+123 -5

No files matched your search

@@ -32,7 +32,8 @@ public enum DetailType implements Serializable {
MAXIMUM_SPEED_OVER_GROUND_IN_KNOTS(1, DESCENDING),
TOTAL_DISTANCE_TRAVELED(0, ASCENDING), TOTAL_AVERAGE_SPEED_OVER_GROUND(2, DESCENDING),
TOTAL_TIME_SAILED_IN_SECONDS(1, ASCENDING), RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS(2, DESCENDING),
RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS(1 , ASCENDING);
RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS(1 , ASCENDING),
RACE_TRACKING_QUALITY(0 , ASCENDING);
private int precision;
+31
View File
@@ -336,6 +336,37 @@ img.openColumn {
padding: 15px 0px;
}
.trackingQuality-circle {
width: 8px;
height: 8px;
-moz-border-radius-topleft: 50%;
-webkit-border-top-left-radius: 50%;
border-top-left-radius: 50%;
-moz-border-radius-topright: 50%;
-webkit-border-top-right-radius: 50%;
border-top-right-radius: 50%;
-moz-border-radius-bottomleft: 50%;
-webkit-border-bottom-left-radius: 50%;
border-bottom-left-radius: 50%;
-moz-border-radius-bottomright: 50%;
-webkit-border-bottom-right-radius: 50%;
border-bottom-right-radius: 50%;
float: left;
}
.circleYellow {
background: #fbba00;
}
.circleGreen {
background: #8ab54e;
}
.circleRed {
background: #f01010;
}
/*******************************************************************************
* Begin CSS for WindowBox component:
******************************************************************************/
@@ -99,6 +99,8 @@ public class DetailTypeFormatter {
return stringMessages.averageJibeLossInMeters();
case RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS:
return stringMessages.timeSinceLastPositionFix();
case RACE_TRACKING_QUALITY:
return "TQ";
}
return null;
}
@@ -166,12 +168,13 @@ public class DetailTypeFormatter {
case NUMBER_OF_MANEUVERS:
case DISPLAY_LEGS:
case SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED:
case RACE_TRACKING_QUALITY:
return "";
default:
// Throwing an exception to get notificated if an implementation of
// an detail type is missing.
throw new UnsupportedOperationException("Theres currently no support for the enum value '" + detailType
// Throwing an exception to get notified if an implementation of
// a detail type is missing.
throw new UnsupportedOperationException("There is currently no support for the enum value '" + detailType
+ "' in this method.");
}
}
@@ -271,6 +274,8 @@ public class DetailTypeFormatter {
return stringMessages.windwardDistanceToGoInMetersTooltip();
case RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS:
return stringMessages.timeSinceLastPositionFixTooltip();
case RACE_TRACKING_QUALITY:
return "Tracking Quality";
}
return "";
@@ -800,7 +800,8 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
DetailType.SPEED_OVER_GROUND_WHEN_PASSING_START,
DetailType.DISTANCE_TO_STARBOARD_END_OF_STARTLINE_WHEN_PASSING_START_IN_METERS,
DetailType.START_TACK,
DetailType.RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS };
DetailType.RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS,
DetailType.RACE_TRACKING_QUALITY };
}
public static DetailType[] getAvailableOverallDetailColumnTypes() {
@@ -866,6 +867,8 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
result.put(DetailType.RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS,
new FormattedDoubleDetailTypeColumn(DetailType.RACE_TIME_SINCE_LAST_POSITION_FIX_IN_SECONDS,
new RaceTimeSinceLastPositionFixInSeconds(), LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE));
result.put(DetailType.RACE_TRACKING_QUALITY, new TrackingQualityColumn(stringMessages.rankGain(), new RaceTrackingQuality(), LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE));
result.put(DetailType.RACE_DISTANCE_TRAVELED,
new FormattedDoubleDetailTypeColumn(DetailType.RACE_DISTANCE_TRAVELED, new RaceDistanceTraveledInMeters(),
LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE));
@@ -954,6 +957,18 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
return result;
}
private class RaceTrackingQuality implements LegDetailField<Double> {
@Override
public Double get(LeaderboardRowDTO row) {
Double result = null;
LeaderboardEntryDTO fieldsForRace = row.fieldsByRaceColumnName.get(getRaceColumnName());
if (fieldsForRace != null) {
result = fieldsForRace.timeSinceLastPositionFixInSeconds;
}
return result;
}
}
private class RaceTimeSinceLastPositionFixInSeconds implements LegDetailField<Double> {
@Override
public Double get(LeaderboardRowDTO row) {
@@ -0,0 +1,66 @@
package com.sap.sailing.gwt.ui.leaderboard;
import com.google.gwt.cell.client.AbstractSafeHtmlCell;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.text.shared.SafeHtmlRenderer;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.dto.LeaderboardRowDTO;
public class TrackingQualityColumn extends DetailTypeColumn<Double, Double> {
public TrackingQualityColumn(String title, LegDetailField<Double> field, String headerStyle, String columnStyle) {
super(DetailType.RACE_TRACKING_QUALITY, field, new TrackingQualityCell(), headerStyle, columnStyle);
}
@Override
public Double getValue(LeaderboardRowDTO row) {
return getField().get(row);
}
private static class TrackingQualityCell extends AbstractSafeHtmlCell<Double> {
private static final String STYLE_TRACKING_QUALITY_CIRCLE = "trackingQuality-circle";
private static final String STYLE_TRACKING_QUALITY_CIRCLE_RED = "circleRed";
private static final String STYLE_TRACKING_QUALITY_CIRCLE_YELLOW = "circleYellow";
private static final String STYLE_TRACKING_QUALITY_CIRCLE_GREEN = "circleGreen";
public TrackingQualityCell() {
super(new SafeHtmlRenderer<Double>() {
@Override
public SafeHtml render(Double rank) {
SafeHtmlBuilder builder = new SafeHtmlBuilder();
render(rank, builder);
return builder.toSafeHtml();
}
@Override
public void render(Double timeSinceLastPositionFixInSeconds, SafeHtmlBuilder builder) {
if (timeSinceLastPositionFixInSeconds != null) {
builder.append(SafeHtmlUtils.fromTrustedString("<div class=\"" + STYLE_TRACKING_QUALITY_CIRCLE + " "));
// builder.append(SafeHtmlUtils.fromTrustedString(diffInSeconds + "s"));
if(timeSinceLastPositionFixInSeconds < 5.0) {
builder.append(SafeHtmlUtils.fromTrustedString(STYLE_TRACKING_QUALITY_CIRCLE_GREEN));
} else if(timeSinceLastPositionFixInSeconds < 10) {
builder.append(SafeHtmlUtils.fromTrustedString(STYLE_TRACKING_QUALITY_CIRCLE_YELLOW));
} else {
builder.append(SafeHtmlUtils.fromTrustedString(STYLE_TRACKING_QUALITY_CIRCLE_RED));
}
builder.append(SafeHtmlUtils.fromTrustedString("\"></div>"));
} else {
builder.append(SafeHtmlUtils.fromTrustedString(STYLE_TRACKING_QUALITY_CIRCLE_GREEN));
}
}
});
}
@Override
protected void render(com.google.gwt.cell.client.Cell.Context context, SafeHtml data, SafeHtmlBuilder sb) {
if (data != null) {
sb.append(data);
}
}
}
}