diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java index 664598457e2..c013ed010f4 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java @@ -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; diff --git a/java/com.sap.sailing.gwt.ui/RaceBoard.css b/java/com.sap.sailing.gwt.ui/RaceBoard.css index cdae1bb075b..077019b1f6c 100644 --- a/java/com.sap.sailing.gwt.ui/RaceBoard.css +++ b/java/com.sap.sailing.gwt.ui/RaceBoard.css @@ -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: ******************************************************************************/ diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DetailTypeFormatter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DetailTypeFormatter.java index 2dbdd183f10..3f061833cbf 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DetailTypeFormatter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DetailTypeFormatter.java @@ -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 ""; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardPanel.java index a558b64a78a..0d10a887c47 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardPanel.java @@ -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 { + @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 { @Override public Double get(LeaderboardRowDTO row) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/TrackingQualityColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/TrackingQualityColumn.java new file mode 100644 index 00000000000..5a8fbfd05e9 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/TrackingQualityColumn.java @@ -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 { + public TrackingQualityColumn(String title, LegDetailField 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 { + 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() { + @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("
")); + } 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); + } + } + } +}