diff --git a/java/com.sap.sailing.gwt.ui/RaceBoard.css b/java/com.sap.sailing.gwt.ui/RaceBoard.css index 9fe44e7c0d1..0646f052bab 100644 --- a/java/com.sap.sailing.gwt.ui/RaceBoard.css +++ b/java/com.sap.sailing.gwt.ui/RaceBoard.css @@ -297,3 +297,10 @@ input.magnifier { .gwt-DialogBox { z-index: 20; } + +.breadcrumbPanel-ActiveBreadcrumb, .breadcrumbPanel-InactiveBreadcrumb, .breadcrumbPanel-NextArrow { + font-size: 20px; + text-transform: uppercase; + color: #a1a1a1; + font-weight: 500; +} \ No newline at end of file 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 effa82e86c7..d2ae900a7ae 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 @@ -34,6 +34,7 @@ import com.sap.sailing.gwt.ui.client.TimePanel; import com.sap.sailing.gwt.ui.client.Timer; import com.sap.sailing.gwt.ui.client.Timer.PlayModes; import com.sap.sailing.gwt.ui.shared.EventDTO; +import com.sap.sailing.gwt.ui.shared.LegTimepointDTO; import com.sap.sailing.gwt.ui.shared.PositionDTO; import com.sap.sailing.gwt.ui.shared.QuickRankDTO; import com.sap.sailing.gwt.ui.shared.RaceDTO; @@ -155,7 +156,19 @@ public class RaceMapPanel extends FormPanel implements EventDisplayer, TimeListe } break; } - timePanel.setLegMarkers(); + + sailingService.getLegTimePositions(selectedRace.getRaceIdentifier(), + new AsyncCallback>() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error obtaining leg timepoints: " + caught.getMessage()); + } + + @Override + public void onSuccess(List legTimepoints) { + timePanel.setLegMarkers(legTimepoints); + } + }); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index 73fd8ec018d..5fcb211fe76 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -21,6 +21,7 @@ import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sailing.gwt.ui.shared.GPSFixDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; +import com.sap.sailing.gwt.ui.shared.LegTimepointDTO; import com.sap.sailing.gwt.ui.shared.ManeuverDTO; import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sailing.gwt.ui.shared.QuickRankDTO; @@ -61,6 +62,8 @@ public interface SailingService extends RemoteService { Map> getBoatPositions(RaceIdentifier raceIdentifier, Map from, Map to, boolean extrapolate) throws NoWindException; + List getLegTimePositions(RaceIdentifier raceIdentifier); + List getMarkPositions(RaceIdentifier raceIdentifier, Date date); List getQuickRanks(RaceIdentifier raceIdentifier, Date date) throws NoWindException; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index d183caa676e..dee53180ae1 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -20,6 +20,7 @@ import com.sap.sailing.gwt.ui.shared.GPSFixDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardEntryDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; +import com.sap.sailing.gwt.ui.shared.LegTimepointDTO; import com.sap.sailing.gwt.ui.shared.ManeuverDTO; import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sailing.gwt.ui.shared.QuickRankDTO; @@ -107,6 +108,8 @@ public interface SailingServiceAsync { Map from, Map to, boolean extrapolate, AsyncCallback>> callback); + void getLegTimePositions(RaceIdentifier raceIdentifier, AsyncCallback> callback); + void getMarkPositions(RaceIdentifier raceIdentifier, Date date, AsyncCallback> asyncCallback); void getQuickRanks(RaceIdentifier raceIdentifier, Date date, AsyncCallback> callback); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java index 2323807be53..b5b0a2c5a29 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java @@ -1,6 +1,7 @@ package com.sap.sailing.gwt.ui.client; import java.util.Date; +import java.util.List; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style; @@ -23,6 +24,7 @@ import com.google.gwt.user.client.ui.RequiresResize; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.ui.client.Timer.PlayModes; +import com.sap.sailing.gwt.ui.shared.LegTimepointDTO; import com.sap.sailing.gwt.ui.shared.components.Component; import com.sap.sailing.gwt.ui.shared.components.SettingsDialog; import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; @@ -220,9 +222,11 @@ public class TimePanel extends FormPanel implements Component case Live: playModeLabel.setText(stringMessages.playModeLive()); timeDelayLabel.setText(((int) timer.getCurrentDelay() / 1000) + " s"); + sliderBar.setEnabled(false); break; case Replay: playModeLabel.setText(stringMessages.playModeReplay()); + sliderBar.setEnabled(true); break; } playModeLabel.setText(timer.getPlayMode().name()); @@ -254,16 +258,21 @@ public class TimePanel extends FormPanel implements Component } } - public void setLegMarkers() { + public void setLegMarkers(List legTimepoints) { if(sliderBar.isMinMaxInitialized()) { sliderBar.clearMarkers(); - Double minValue = sliderBar.getMinValue(); - Double maxValue = sliderBar.getMaxValue(); - int legCount = 5; - double diff = (maxValue - minValue) / (double) legCount; - for(int i = 0; i < legCount; i++) { - sliderBar.addMarker("L" + (i + 1), minValue + i * diff); + + for (LegTimepointDTO legTimepointDTO : legTimepoints) { + sliderBar.addMarker(legTimepointDTO.name, new Double(legTimepointDTO.firstPassingDate.getTime())); + } +// Double minValue = sliderBar.getMinValue(); +// Double maxValue = sliderBar.getMaxValue(); +// int legCount = 5; +// double diff = (maxValue - minValue) / (double) legCount; +// for(int i = 0; i < legCount; i++) { +// sliderBar.addMarker("L" + (i + 1), minValue + i * diff); +// } sliderBar.redraw(); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/Timer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/Timer.java index 1a9398090c2..9dc5fff3a4f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/Timer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/Timer.java @@ -209,5 +209,9 @@ public class Timer { public PlayModes getPlayMode() { return playMode; } + + public void setPlayMode(PlayModes playMode) { + this.playMode = playMode; + } } 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 f31b0b6475f..fe20f814c52 100644 --- 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 @@ -28,6 +28,7 @@ import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; import com.google.gwt.user.cellview.client.ColumnSortList.ColumnSortInfo; import com.google.gwt.user.cellview.client.Header; import com.google.gwt.user.cellview.client.TextHeader; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbstractImagePrototype; import com.google.gwt.user.client.ui.Anchor; @@ -45,6 +46,7 @@ import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.sap.sailing.domain.common.DetailType; import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.gwt.ui.client.Collator; import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; @@ -66,6 +68,7 @@ import com.sap.sailing.gwt.ui.shared.components.Component; import com.sap.sailing.gwt.ui.shared.components.IsEmbeddableComponent; import com.sap.sailing.gwt.ui.shared.components.SettingsDialog; import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; +import com.sap.sailing.gwt.ui.shared.panels.BreadcrumbPanel; /** * A leaderboard essentially consists of a table widget that in its columns displays the entries. @@ -848,6 +851,20 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta getLeaderboardTable().addColumnSortHandler(listHandler); loadCompleteLeaderboard(getLeaderboardDisplayDate()); + // create the breadcrumb navigation +// ArrayList> breadcrumbLinksData = new ArrayList>(); +// String debugParam = Window.Location.getParameter("gwt.codesvr"); +// +// if(leaderboardGroup != null) { +// String link = "/gwt/Spectator.html?leaderboardGroupName=" + leaderboardGroup.name; +// if(debugParam != null && !debugParam.isEmpty()) +// link += "&gwt.codesvr=" + debugParam; +// breadcrumbLinksData.add(new Pair(link, leaderboardGroup.name)); +// } +// breadcrumbPanel = new BreadcrumbPanel(breadcrumbLinksData, selectedRaceIdentifier.getRaceName()); +// mainPanel.add(breadcrumbPanel); + + contentPanel = new VerticalPanel(); headerPanel = new DockPanel(); DockPanel toolbarPanel = new DockPanel(); 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 9d29719322d..51796b4e0fb 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 @@ -10,6 +10,7 @@ import java.util.Map; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FormPanel; @@ -35,6 +36,7 @@ import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel; import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings; import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; +import com.sap.sailing.gwt.ui.shared.LegTimepointDTO; import com.sap.sailing.gwt.ui.shared.RaceDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sailing.gwt.ui.shared.components.ComponentViewer; @@ -83,10 +85,16 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel collapsableViewers = new ArrayList>(); CompetitorSelectionModel competitorSelectionModel = new CompetitorSelectionModel(/* hasMultiSelection */ true); - String debugParam = Window.Location.getParameter("gwt.codesvr"); - String link = "/gwt/Spectator.html" + (debugParam != null && !debugParam.isEmpty() ? "?gwt.codesvr=" + debugParam : ""); + // create the breadcrumb navigation ArrayList> breadcrumbLinksData = new ArrayList>(); - breadcrumbLinksData.add(new Pair(link, stringMessages.home())); + String debugParam = Window.Location.getParameter("gwt.codesvr"); + + if(leaderboardGroup != null) { + String link = "/gwt/Spectator.html?leaderboardGroupName=" + leaderboardGroup.name; + if(debugParam != null && !debugParam.isEmpty()) + link += "&gwt.codesvr=" + debugParam; + breadcrumbLinksData.add(new Pair(link, leaderboardGroup.name)); + } breadcrumbPanel = new BreadcrumbPanel(breadcrumbLinksData, selectedRaceIdentifier.getRaceName()); mainPanel.add(breadcrumbPanel); @@ -214,7 +222,18 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel } break; } - timePanel.setLegMarkers(); + sailingService.getLegTimePositions(selectedRace.getRaceIdentifier(), + new AsyncCallback>() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error obtaining leg timepoints: " + caught.getMessage()); + } + + @Override + public void onSuccess(List legTimepoints) { + timePanel.setLegMarkers(legTimepoints); + } + }); } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index e5570640d42..b6af2105c94 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -89,6 +89,7 @@ import com.sap.sailing.domain.tracking.GPSFixTrack; import com.sap.sailing.domain.tracking.Maneuver; import com.sap.sailing.domain.tracking.MarkPassing; import com.sap.sailing.domain.tracking.RacesHandle; +import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.Wind; @@ -109,6 +110,7 @@ import com.sap.sailing.gwt.ui.shared.LeaderboardEntryDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardRowDTO; import com.sap.sailing.gwt.ui.shared.LegEntryDTO; +import com.sap.sailing.gwt.ui.shared.LegTimepointDTO; import com.sap.sailing.gwt.ui.shared.ManeuverDTO; import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sailing.gwt.ui.shared.PositionDTO; @@ -744,6 +746,27 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS createSpeedWithBearingDTO(speedWithBearing), tack, legType, extrapolated); } + @Override + public List getLegTimePositions(RaceIdentifier raceIdentifier) { + List result = new ArrayList(); + TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier); + if (trackedRace != null) { + Iterable trackedLegs = trackedRace.getTrackedLegs(); + int i = 1; + for (TrackedLeg trackedLeg : trackedLegs) { + Waypoint to = trackedLeg.getLeg().getTo(); + Iterable markPassings = trackedRace.getMarkPassingsInOrder(to); + if(markPassings != null) { + MarkPassing firstPassing = markPassings.iterator().next(); + LegTimepointDTO legTimepointDTO = new LegTimepointDTO("L" + i++); + legTimepointDTO.firstPassingDate = firstPassing.getTimePoint().asDate(); + result.add(legTimepointDTO); + } + } + } + return result; + } + @Override public List getMarkPositions(RaceIdentifier raceIdentifier, Date date) { List result = new ArrayList(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/LegTimepointDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/LegTimepointDTO.java new file mode 100644 index 00000000000..947b43de92a --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/LegTimepointDTO.java @@ -0,0 +1,18 @@ +package com.sap.sailing.gwt.ui.shared; + +import java.util.Date; + +import com.google.gwt.user.client.rpc.IsSerializable; + +public class LegTimepointDTO extends NamedDTO implements IsSerializable { + public Date firstPassingDate; + + public Date lastPassingDate; + + public LegTimepointDTO() {} + + public LegTimepointDTO(String name) { + super(name); + } + +}