Merge branch '60_inch' of ssh://sapsailing.com/home/trac/git into 60_inch

# Conflicts:
#	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/nodes/IdleRaceLeaderboard.java
#	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/utils/AutoplayHelper.java
This commit is contained in:
Papick Garcia Taboada committed 2017-06-13 13:50:53 +02:00
commit e20a3ae07e
30 files changed
+392 -366

No files matched your search

@@ -29,8 +29,8 @@ import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.compet
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.competitors.PreRaceCompetitorsImagePlace;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.competitors.PreRaceCompetitorsPresenterImpl;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.competitors.PreRaceCompetitorsViewImpl;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLeaderBoardWithImagePresenterImpl;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLeaderBoardWithImageViewImpl;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLiveRaceLeaderBoardWithImagePresenterImpl;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLiveRaceLeaderBoardWithImageViewImpl;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreRaceLeaderBoardWithCompetitorPlace;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreRaceLeaderBoardWithFlagPlace;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.racemap.PreRaceRacemapPlace;
@@ -59,12 +59,12 @@ public class AutoPlayActivityMapperImpl implements ActivityMapper {
return new LeaderboardPresenterImpl((LeaderboardPlace) place, clientFactory, new LeaderboardViewImpl());
}
if (place instanceof PreRaceLeaderBoardWithCompetitorPlace) {
return new PreLeaderBoardWithImagePresenterImpl((PreRaceLeaderBoardWithCompetitorPlace) place,
clientFactory, new PreLeaderBoardWithImageViewImpl(new CompetitorImageProvider()));
return new PreLiveRaceLeaderBoardWithImagePresenterImpl((PreRaceLeaderBoardWithCompetitorPlace) place,
clientFactory, new PreLiveRaceLeaderBoardWithImageViewImpl(new CompetitorImageProvider()));
}
if (place instanceof PreRaceLeaderBoardWithFlagPlace) {
return new PreLeaderBoardWithImagePresenterImpl((PreRaceLeaderBoardWithFlagPlace) place, clientFactory,
new PreLeaderBoardWithImageViewImpl(new FlagImageProvider()));
return new PreLiveRaceLeaderBoardWithImagePresenterImpl((PreRaceLeaderBoardWithFlagPlace) place, clientFactory,
new PreLiveRaceLeaderBoardWithImageViewImpl(new FlagImageProvider()));
}
if (place instanceof IdleUpNextPlace) {
return new IdleUpNextPresenterImpl((IdleUpNextPlace) place, clientFactory, new IdleNextUpViewImpl());
@@ -16,11 +16,13 @@ import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardEntryPoint;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
import com.sap.sse.gwt.client.player.Timer.PlayStates;
public class IdleOverallLeaderBoardNode extends FiresPlaceNode {
private final AutoPlayClientFactory cf;
private Timer timer;
public IdleOverallLeaderBoardNode(AutoPlayClientFactory cf) {
super(IdleOverallLeaderBoardNode.class.getName());
@@ -41,7 +43,7 @@ public class IdleOverallLeaderBoardNode extends FiresPlaceNode {
RaceColumnSelectionStrategies.EXPLICIT, /* showAddedScores */ true,
/* showOverallRacesCompleted */ false, true, false, false, true);
com.sap.sse.gwt.client.player.Timer timer = new com.sap.sse.gwt.client.player.Timer(
timer = new com.sap.sse.gwt.client.player.Timer(
// perform the first request as "live" but don't by default auto-play
PlayModes.Live, PlayStates.Playing,
/* delayBetweenAutoAdvancesInMilliseconds */ LeaderboardEntryPoint.DEFAULT_REFRESH_INTERVAL_MILLIS);
@@ -58,4 +60,12 @@ public class IdleOverallLeaderBoardNode extends FiresPlaceNode {
getBus().fireEvent(new AutoPlayHeaderEvent(cf.getAutoPlayCtx().getEvent().getName(),
cf.getAutoPlayCtx().getContextDefinition().getLeaderboardName()));
};
@Override
public void onStop() {
if(timer != null){
timer.pause();
}
super.onStop();
}
}
@@ -42,7 +42,9 @@ public class IdleRaceLeaderboard extends FiresPlaceNode {
boolean withFullscreenButton = settings.getPerspectiveOwnSettings().isFullscreen();
PerspectiveCompositeSettings<LeaderboardWithHeaderPerspectiveSettings> leaderboardSettings = settings
.findSettingsByComponentId(autoplayLifecycle.getLeaderboardLifecycle().getComponentId());
StringMessages stringMessages = StringMessages.INSTANCE;
LeaderboardWithHeaderPerspective leaderboardPerspective = new LeaderboardWithHeaderPerspective(null, null,
autoplayLifecycle.getLeaderboardLifecycle(), leaderboardSettings, cf.getSailingService(),
cf.getUserService(), AutoplayHelper.asyncActionsExecutor,
@@ -6,7 +6,6 @@ import java.util.Comparator;
import java.util.Date;
import java.util.Map;
import com.google.gwt.core.client.GWT;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.dto.AbstractLeaderboardDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
@@ -104,7 +103,6 @@ public class IdleUpNextNode extends FiresPlaceNode {
public static void checkForRaceStarts(AbstractLeaderboardDTO currentLeaderboard, Date serverTimeDuringRequest,
RaceTimesInfoProvider raceTimesInfoProvider,
ArrayList<Pair<RegattaAndRaceIdentifier, Date>> raceToStartOfRace) {
GWT.log("Checking race starts");
Map<RegattaAndRaceIdentifier, RaceTimesInfoDTO> raceTimesInfos = raceTimesInfoProvider.getRaceTimesInfos();
for (RaceColumnDTO race : currentLeaderboard.getRaceList()) {
for (FleetDTO fleet : race.getFleets()) {
@@ -5,8 +5,8 @@ import com.sap.sailing.gwt.autoplay.client.app.AutoPlayClientFactory;
import com.sap.sailing.gwt.autoplay.client.events.AutoPlayHeaderEvent;
import com.sap.sailing.gwt.autoplay.client.nodes.base.FiresPlaceNode;
import com.sap.sailing.gwt.autoplay.client.places.screens.liveraceloop.racemapwithleaderboard.LiveRaceWithRacemapAndLeaderBoardPlace;
import com.sap.sailing.gwt.autoplay.client.utils.RaceMapHelper;
import com.sap.sailing.gwt.autoplay.client.utils.RaceMapHelper.RVWrapper;
import com.sap.sailing.gwt.autoplay.client.utils.AutoplayHelper;
import com.sap.sailing.gwt.autoplay.client.utils.AutoplayHelper.RVWrapper;
public class LiveRaceWithRacemapNode extends FiresPlaceNode {
private final AutoPlayClientFactory cf;
@@ -18,7 +18,7 @@ public class LiveRaceWithRacemapNode extends FiresPlaceNode {
}
public void onStart() {
RaceMapHelper.create(cf.getSailingService(), cf.getErrorReporter(),
AutoplayHelper.create(cf.getSailingService(), cf.getErrorReporter(),
cf.getAutoPlayCtx().getContextDefinition().getLeaderboardName(), cf.getAutoPlayCtx().getContextDefinition().getEventId(),
cf.getAutoPlayCtx().getEvent(), cf.getEventBus(), cf.getDispatch(), cf.getAutoPlayCtx().getLiveRace(),
new AsyncCallback<RVWrapper>() {
@@ -6,8 +6,8 @@ import com.sap.sailing.gwt.autoplay.client.events.AutoPlayHeaderEvent;
import com.sap.sailing.gwt.autoplay.client.nodes.base.FiresPlaceNode;
import com.sap.sailing.gwt.autoplay.client.places.screens.liveraceloop.racemapwithleaderboard.LiveRaceWithRacemapAndLeaderBoardPlace;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.racemap.PreRaceRacemapPlace;
import com.sap.sailing.gwt.autoplay.client.utils.RaceMapHelper;
import com.sap.sailing.gwt.autoplay.client.utils.RaceMapHelper.RVWrapper;
import com.sap.sailing.gwt.autoplay.client.utils.AutoplayHelper;
import com.sap.sailing.gwt.autoplay.client.utils.AutoplayHelper.RVWrapper;
import com.sap.sailing.gwt.home.communication.event.minileaderboard.GetMiniLeaderboardDTO;
import com.sap.sailing.gwt.home.communication.event.minileaderboard.GetMiniLeaderbordAction;
import com.sap.sse.gwt.dispatch.shared.commands.ResultWithTTL;
@@ -23,7 +23,7 @@ public class PreLiveRaceWithRacemapNode extends FiresPlaceNode {
public void onStart() {
RaceMapHelper.create(cf.getSailingService(), cf.getErrorReporter(),
AutoplayHelper.create(cf.getSailingService(), cf.getErrorReporter(),
cf.getAutoPlayCtx().getContextDefinition().getLeaderboardName(), cf.getAutoPlayCtx().getContextDefinition().getEventId(),
cf.getAutoPlayCtx().getEvent(), cf.getEventBus(), cf.getDispatch(),
cf.getAutoPlayCtx().getPreLiveRace(), new AsyncCallback<RVWrapper>() {
@@ -2,7 +2,6 @@ package com.sap.sailing.gwt.autoplay.client.places.screens.afterliveraceloop.boa
import java.util.List;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Label;
import com.sap.sailing.domain.common.Distance;
@@ -25,6 +24,7 @@ import com.sap.sailing.gwt.ui.leaderboard.LeaderboardEntryPoint;
import com.sap.sse.common.Duration;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
import com.sap.sse.gwt.client.player.Timer.PlayStates;
@@ -34,6 +34,7 @@ public class RaceEndWithBoatsPresenterImpl extends AutoPlayPresenterConfigured<A
private RaceEndWithBoatsView view;
private SixtyInchLeaderBoard leaderboardPanel;
private CompetitorSelectionModel competitorSelectionProvider;
private Timer timer;
public RaceEndWithBoatsPresenterImpl(AbstractRaceEndWithImagesTop3Place place, AutoPlayClientFactory clientFactory,
RaceEndWithBoatsView slide1ViewImpl) {
@@ -63,7 +64,7 @@ public class RaceEndWithBoatsPresenterImpl extends AutoPlayPresenterConfigured<A
competitorSelectionProvider = new CompetitorSelectionModel(/* hasMultiSelection */ false);
com.sap.sse.gwt.client.player.Timer timer = new com.sap.sse.gwt.client.player.Timer(PlayModes.Live,
timer = new com.sap.sse.gwt.client.player.Timer(PlayModes.Live,
PlayStates.Paused,
/* delayBetweenAutoAdvancesInMilliseconds */ LeaderboardEntryPoint.DEFAULT_REFRESH_INTERVAL_MILLIS);
leaderboardPanel = new SixtyInchLeaderBoard(sailingService, new AsyncActionsExecutor(), leaderboardSettings,
@@ -100,7 +101,6 @@ public class RaceEndWithBoatsPresenterImpl extends AutoPlayPresenterConfigured<A
.getCompetitorsFromBestToWorst(preselectedRaceColumn);
if (sortedCompetitors.size() >= 3) {
GWT.log("First is " + sortedCompetitors.get(0));
view.setFirst(sortedCompetitors.get(0));
view.setSecond(sortedCompetitors.get(1));
view.setThird(sortedCompetitors.get(2));
@@ -109,6 +109,8 @@ public class RaceEndWithBoatsPresenterImpl extends AutoPlayPresenterConfigured<A
@Override
public void onStop() {
view.onStop();
if(timer!= null){
timer.pause();
}
}
}
@@ -13,8 +13,6 @@ public interface RaceEndWithBoatsView {
void setLeaderBoard(SixtyInchLeaderBoard leaderboardPanel);
void onStop();
void setFirst(CompetitorDTO c);
void setSecond(CompetitorDTO c);
@@ -12,7 +12,7 @@ import com.google.gwt.user.client.ui.ResizeComposite;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLeaderBoardWithImageViewImpl.ImageProvider;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLiveRaceLeaderBoardWithImageViewImpl.ImageProvider;
import com.sap.sailing.gwt.autoplay.client.shared.SixtyInchLeaderBoard;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Duration;
@@ -74,10 +74,6 @@ public class RaceEndWithBoatsViewImpl extends ResizeComposite implements RaceEnd
leaderBoardHolder.add(leaderboardPanel);
}
@Override
public void onStop() {
}
@Override
public void setFirst(CompetitorDTO c) {
subline1.setText("1. " + c.getName());
@@ -79,7 +79,7 @@
width: 60%;
right: 0px;
bottom: 0px;
height: 7%;
height: 80px;
font-size: 1rem;
display: flex;
-webkit-align-items: center;
@@ -21,7 +21,7 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util.Pair;
public class IdleNextUpViewImpl extends Composite implements IdleUpNextView {
private static final int MAX_RACES_IN_LIST = 10;
private static final int MAX_RACES_IN_LIST = 8;
private static IdleNextUpViewImplUiBinder uiBinder = GWT.create(IdleNextUpViewImplUiBinder.class);
@UiField
SimplePanel mainPanelUi;
@@ -52,14 +52,17 @@ public class IdleNextUpViewImpl extends Composite implements IdleUpNextView {
@Override
public void setData(ArrayList<Pair<RegattaAndRaceIdentifier, Date>> data) {
dataPanel.clear();
if (data.isEmpty()) {
if(data == null){
dataPanel.add(new Label(StringMessages.INSTANCE.noData()));
}
else if ( data.isEmpty()) {
dataPanel.add(new Label(StringMessages.INSTANCE.nothingUpcoming()));
} else {
dataPanel.add(new Label(StringMessages.INSTANCE.upcoming()));
int index = 0;
int index = 1;
for (Pair<RegattaAndRaceIdentifier, Date> race : data) {
index++;
if (index > MAX_RACES_IN_LIST) {
GWT.log("Count of races" + index);
return;
}
String formatedDate;
@@ -67,6 +70,7 @@ public class IdleNextUpViewImpl extends Composite implements IdleUpNextView {
Date now = new Date();
boolean past = race.getB().before(now);
if (today && !past) {
index++;
DateTimeFormat simpleFormat = DateTimeFormat.getFormat("HH:mm");
formatedDate = simpleFormat.format(race.getB());
String raceName = race.getA().getRaceName();
@@ -59,6 +59,7 @@ public class IdleUpNextPresenterImpl extends AutoPlayPresenterConfigured<IdleUpN
protected void updateData() {
ArrayList<Pair<RegattaAndRaceIdentifier, Date>> data = getPlace().getRaceToStartOfRace();
if (data == null) {
view.setData(null);
return;
}
ArrayList<Pair<RegattaAndRaceIdentifier, Date>> filteredData = new ArrayList<>();
@@ -29,6 +29,7 @@ public class LiveRaceWithRacemapAndLeaderBoardPresenterImpl extends AutoPlayPres
private SixtyInchLeaderBoard leaderboardPanel;
private int selected = -1;
ArrayList<CompetitorDTO> compList = new ArrayList<>();
private com.sap.sse.gwt.client.player.Timer timer;
public LiveRaceWithRacemapAndLeaderBoardPresenterImpl(LiveRaceWithRacemapAndLeaderBoardPlace place,
AutoPlayClientFactory clientFactory,
@@ -115,7 +116,7 @@ public class LiveRaceWithRacemapAndLeaderBoardPresenterImpl extends AutoPlayPres
false, true, true);
com.sap.sse.gwt.client.player.Timer timer = new com.sap.sse.gwt.client.player.Timer(
timer = new com.sap.sse.gwt.client.player.Timer(
// perform the first request as "live" but don't by default auto-play
PlayModes.Live, PlayStates.Playing,
/* delayBetweenAutoAdvancesInMilliseconds */ LeaderboardEntryPoint.DEFAULT_REFRESH_INTERVAL_MILLIS);
@@ -127,9 +128,13 @@ public class LiveRaceWithRacemapAndLeaderBoardPresenterImpl extends AutoPlayPres
view.startingWith(this, panel, getPlace().getRaceMap(), leaderboardPanel);
selectionTimer.schedule(SWITCH_COMPETITOR_DELAY);
}
@Override
public void onStop() {
if(timer != null){
timer.pause();
}
selectionTimer.cancel();
view.onStop();
}
@@ -8,7 +8,7 @@ import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ResizeComposite;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLeaderBoardWithImageViewImpl.ImageProvider;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLiveRaceLeaderBoardWithImageViewImpl.ImageProvider;
public class CompetitorViewImpl extends ResizeComposite {
private static CompetitorViewImplUiBinder uiBinder = GWT.create(CompetitorViewImplUiBinder.class);
@@ -12,7 +12,7 @@ import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ResizeComposite;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLeaderBoardWithImageViewImpl.ImageProvider;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLiveRaceLeaderBoardWithImageViewImpl.ImageProvider;
public class PreRaceCompetitorsViewImpl extends ResizeComposite implements PreRaceCompetitorsView {
private static PreRaceCompetitorsViewImplUiBinder uiBinder = GWT.create(PreRaceCompetitorsViewImplUiBinder.class);
@@ -1,58 +0,0 @@
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:rf="urn:import:com.sap.sse.gwt.client.panels">
<ui:with field="res"
type="com.sap.sailing.gwt.autoplay.client.resources.SixtyInchBundle" />
<ui:style>
.left {
position: absolute;
display: inline-block;
width: 50%;
height: 100%;
overflow-y:auto;
}
.right {
position: absolute;
display: inline-block;
right: 0px;
height: 100%;
width: 50%;
}
.image{
top: 5%;
display: block;
margin: auto;
min-width: 50%;
height: 85%;
width: auto;
padding-bottom: 2em;
}
.subline1{
font-size:20px;
font-weight:bold;
text-align: center;
}
.subline2{
font-size:20px;
text-align: center;
}
.subline3{
font-size:20px;
text-align: center;
}
</ui:style>
<rf:ResizableFlowPanel styleName="{res.style.slideBackground}">
<rf:ResizableFlowPanel ui:field="leaderBoardHolder"
styleName="{style.left}" />
<rf:ResizableFlowPanel ui:field="infoHolder"
styleName="{style.right}">
<g:Image ui:field="image" styleName="{style.image}" />
<g:Label ui:field="subline1" styleName="{style.subline1}"/>
<g:Label ui:field="subline2" styleName="{style.subline2}"/>
<g:Label ui:field="subline3" styleName="{style.subline3}"/>
</rf:ResizableFlowPanel>
</rf:ResizableFlowPanel>
</ui:UiBinder>
@@ -1,6 +1,7 @@
package com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.autoplay.client.shared.SixtyInchLeaderBoard;
@@ -16,4 +17,6 @@ public interface PreLeaderboardWithImageView {
void scrollLeaderBoardToTop();
void onStop();
void nextRace(RegattaAndRaceIdentifier race);
}
@@ -25,7 +25,7 @@ import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
import com.sap.sse.gwt.client.player.Timer.PlayStates;
public class PreLeaderBoardWithImagePresenterImpl
public class PreLiveRaceLeaderBoardWithImagePresenterImpl
extends AutoPlayPresenterConfigured<AbstractPreRaceLeaderBoardWithImagePlace>
implements PreLeaderboardWithImageView.Slide1Presenter {
protected static final int SWITCH_COMPETITOR_DELAY = 2000;
@@ -35,8 +35,9 @@ public class PreLeaderBoardWithImagePresenterImpl
private Timer selectionTimer;
private CompetitorSelectionModel competitorSelectionProvider;
ArrayList<CompetitorDTO> compList = new ArrayList<>();
private com.sap.sse.gwt.client.player.Timer timer;
public PreLeaderBoardWithImagePresenterImpl(AbstractPreRaceLeaderBoardWithImagePlace place,
public PreLiveRaceLeaderBoardWithImagePresenterImpl(AbstractPreRaceLeaderBoardWithImagePlace place,
AutoPlayClientFactory clientFactory, PreLeaderboardWithImageView slide1ViewImpl) {
super(place, clientFactory);
this.view = slide1ViewImpl;
@@ -88,40 +89,41 @@ public class PreLeaderBoardWithImagePresenterImpl
SailingServiceAsync sailingService = getClientFactory().getSailingService();
ErrorReporter errorReporter = getClientFactory().getErrorReporter();
view.startingWith(this, panel);
view.nextRace(getSlideCtx().getPreLiveRace());
RegattaAndRaceIdentifier lifeRace = getSlideCtx().getLiveRace();
RegattaAndRaceIdentifier liveRace = getSlideCtx().getPreLiveRace();
ArrayList<String> racesToShow = null;
if (lifeRace != null) {
if (liveRace != null) {
racesToShow = new ArrayList<>();
// racesToShow.add(lifeRace.getRaceName());
// racesToShow.add(lifeRace.getRaceName());
} else {
return;
}
final LeaderboardSettings leaderboardSettings = new LeaderboardSettings(null, null, null, null, null,
racesToShow, null, false, null, lifeRace.getRaceName(), /* ascending */ true,
racesToShow, null, false, null, liveRace.getRaceName(), /* ascending */ true,
/* updateUponPlayStateChange */ true, RaceColumnSelectionStrategies.EXPLICIT,
/* showAddedScores */ false, /* showOverallRacesCompleted */ false, true, false, false, true);
GWT.log("event " + getSlideCtx().getEvent());
competitorSelectionProvider = new CompetitorSelectionModel(/* hasMultiSelection */ false);
com.sap.sse.gwt.client.player.Timer timer = new com.sap.sse.gwt.client.player.Timer(
timer = new com.sap.sse.gwt.client.player.Timer(
// perform the first request as "live" but don't by default auto-play
PlayModes.Live, PlayStates.Playing,
/* delayBetweenAutoAdvancesInMilliseconds */ LeaderboardEntryPoint.DEFAULT_REFRESH_INTERVAL_MILLIS);
leaderboardPanel = new NoRaceColumnsSixtyInchLeaderboard(sailingService, new AsyncActionsExecutor(), leaderboardSettings,
true, lifeRace, competitorSelectionProvider, timer, null,
leaderboardPanel = new NoRaceColumnsSixtyInchLeaderboard(sailingService, new AsyncActionsExecutor(),
leaderboardSettings, true, liveRace, competitorSelectionProvider, timer, null,
getSlideCtx().getContextDefinition().getLeaderboardName(), errorReporter, StringMessages.INSTANCE, null,
false, null, false, null, false, true, false, false, false);
view.setLeaderBoard(leaderboardPanel);
selectionTimer.schedule(AnimationPanel.DELAY + AnimationPanel.ANIMATION_DURATION);
}
@Override
public void onStop() {
timer.pause();
selectionTimer.cancel();
view.onStop();
}
@@ -8,14 +8,17 @@ import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ResizeComposite;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.autoplay.client.shared.SixtyInchLeaderBoard;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.panels.ResizableFlowPanel;
public class PreLeaderBoardWithImageViewImpl extends ResizeComposite implements PreLeaderboardWithImageView {
private static IdleLeaderBoardWithFlagsViewImplUiBinder uiBinder = GWT.create(IdleLeaderBoardWithFlagsViewImplUiBinder.class);
public class PreLiveRaceLeaderBoardWithImageViewImpl extends ResizeComposite implements PreLeaderboardWithImageView {
private static IdleLeaderBoardWithFlagsViewImplUiBinder uiBinder = GWT
.create(IdleLeaderBoardWithFlagsViewImplUiBinder.class);
interface IdleLeaderBoardWithFlagsViewImplUiBinder extends UiBinder<Widget, PreLeaderBoardWithImageViewImpl> {
interface IdleLeaderBoardWithFlagsViewImplUiBinder extends UiBinder<Widget, PreLiveRaceLeaderBoardWithImageViewImpl> {
}
@UiField
@@ -24,6 +27,9 @@ public class PreLeaderBoardWithImageViewImpl extends ResizeComposite implements
@UiField
ResizableFlowPanel infoHolder;
@UiField
Label bottomInfoPanel;
@UiField
Image image;
@UiField
@@ -41,7 +47,7 @@ public class PreLeaderBoardWithImageViewImpl extends ResizeComposite implements
}
public PreLeaderBoardWithImageViewImpl(ImageProvider provider) {
public PreLiveRaceLeaderBoardWithImageViewImpl(ImageProvider provider) {
initWidget(uiBinder.createAndBindUi(this));
this.provider = provider;
}
@@ -83,4 +89,10 @@ public class PreLeaderBoardWithImageViewImpl extends ResizeComposite implements
public void onStop() {
}
@Override
public void nextRace(RegattaAndRaceIdentifier race) {
bottomInfoPanel
.setText(StringMessages.INSTANCE.next() + " " + race.getRegattaName() + " " + race.getRaceName());
}
}
@@ -0,0 +1,76 @@
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:rf="urn:import:com.sap.sse.gwt.client.panels">
<ui:with field="res"
type="com.sap.sailing.gwt.autoplay.client.resources.SixtyInchBundle" />
<ui:style>
.left {
position: absolute;
display: inline-block;
width: 50%;
top: 0px;
bottom: 0px;
overflow-y: auto;
}
.right {
position: absolute;
display: inline-block;
right: 0px;
height: 100%;
width: 50%;
}
.bottom {
width: 100%;
height: 80px;
font-size: 50px;
text-align: center;
position: absolute;
bottom: 0px;
background-color: #008fcc;
color: white;
}
.image {
top: 5%;
display: block;
margin: auto;
min-width: 50%;
height: 85%;
width: auto;
padding-bottom: 2em;
}
.subline1 {
font-size: 20px;
font-weight: bold;
text-align: center;
}
.subline2 {
font-size: 20px;
text-align: center;
}
.subline3 {
font-size: 20px;
text-align: center;
}
</ui:style>
<rf:ResizableFlowPanel styleName="{res.style.slideBackground}">
<rf:ResizableFlowPanel ui:field="leaderBoardHolder"
styleName="{style.left}" />
<rf:ResizableFlowPanel ui:field="infoHolder"
styleName="{style.right}">
<g:Image ui:field="image" styleName="{style.image}" />
<g:Label ui:field="subline1" styleName="{style.subline1}" />
<g:Label ui:field="subline2" styleName="{style.subline2}" />
<g:Label ui:field="subline3" styleName="{style.subline3}" />
</rf:ResizableFlowPanel>
<rf:ResizableFlowPanel ui:field="nextRace"
styleName="{style.bottom}">
<g:Label ui:field="bottomInfoPanel" />
</rf:ResizableFlowPanel>
</rf:ResizableFlowPanel>
</ui:UiBinder>
@@ -43,7 +43,7 @@ public class PreRaceRacemapPresenterImpl extends AutoPlayPresenterConfigured<Pre
view.showErrorNoLive(this, panel, getPlace().getError());
return;
}
view.nextRace(getSlideCtx().getLiveRace());
view.nextRace(getSlideCtx().getPreLiveRace());
reloadStatistics();
reloadStatistics = new Timer() {
@Override
@@ -38,7 +38,7 @@
.bottom {
width: 100%;
height: 60px;
height: 80px;
font-size: 50px;
text-align: center;
position: absolute;
@@ -3,16 +3,32 @@ package com.sap.sailing.gwt.autoplay.client.utils;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.web.bindery.event.shared.EventBus;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.dto.AbstractLeaderboardDTO;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.gwt.home.communication.SailingDispatchSystem;
import com.sap.sailing.gwt.ui.client.CompetitorColorProvider;
import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProviderListener;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMap;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapHelpLinesSettings;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapLifecycle;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapResources;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapSettings;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapZoomSettings;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapZoomSettings.ZoomTypes;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
@@ -24,14 +40,14 @@ import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
public class AutoplayHelper {
private static final long WAIT_TIME_AFTER_END_OF_RACE_MIILIS = 60 * 1000; // 1 min
private static final long WAIT_TIME_AFTER_END_OF_RACE_MIILIS = 60 * 1000; // 1 min
private static final RaceMapResources raceMapResources = GWT.create(RaceMapResources.class);
private static RaceTimesInfoProvider raceTimesInfoProvider;
private static Timer raceboardTimer = new Timer(PlayModes.Live, /* delayBetweenAutoAdvancesInMilliseconds */1000l);
public static final AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor();
public static void getLiveRace(SailingServiceAsync sailingService,
ErrorReporter errorReporter, EventDTO event, String leaderBoardName, SailingDispatchSystem dispatch,
public static void getLiveRace(SailingServiceAsync sailingService, ErrorReporter errorReporter, EventDTO event,
String leaderBoardName, SailingDispatchSystem dispatch,
AsyncCallback<Pair<Long, RegattaAndRaceIdentifier>> callback) {
raceboardTimer.reset();
raceboardTimer.setLivePlayDelayInMillis(1000);
@@ -72,8 +88,7 @@ public class AutoplayHelper {
raceboardTimer.adjustClientServerOffset(clientTimeWhenRequestWasSent, serverTimeDuringRequest,
clientTimeWhenResponseWasReceived);
Pair<Long, RegattaAndRaceIdentifier> timeToStartAndRaceIdentifier = checkForLiveRace(
selectedLeaderboard, serverTimeDuringRequest,
raceTimesInfoProvider);
selectedLeaderboard, serverTimeDuringRequest, raceTimesInfoProvider);
callback.onSuccess(timeToStartAndRaceIdentifier);
}
});
@@ -106,7 +121,8 @@ public class AutoplayHelper {
if (raceIdentifier != null) {
RaceTimesInfoDTO raceTimes = raceTimesInfos.get(raceIdentifier);
if (raceTimes != null && raceTimes.startOfTracking != null && raceTimes.getStartOfRace() != null
&& (raceTimes.endOfRace == null || serverTimeDuringRequest.getTime() < raceTimes.endOfRace.getTime()+WAIT_TIME_AFTER_END_OF_RACE_MIILIS)) {
&& (raceTimes.endOfRace == null || serverTimeDuringRequest
.getTime() < raceTimes.endOfRace.getTime() + WAIT_TIME_AFTER_END_OF_RACE_MIILIS)) {
long startTimeInMs = raceTimes.getStartOfRace().getTime();
long delayToLiveInMs = raceTimes.delayToLiveInMs;
return new Pair<Long, RegattaAndRaceIdentifier>(
@@ -117,4 +133,144 @@ public class AutoplayHelper {
}
return null;
}
public static class RVWrapper {
public RVWrapper(RaceMap raceboardPerspective2, CompetitorSelectionModel competitorSelectionProvider) {
this.raceboardPerspective = raceboardPerspective2;
this.csel = competitorSelectionProvider;
}
public RaceMap raceboardPerspective;
public CompetitorSelectionModel csel;
}
public static void create(SailingServiceAsync sailingService, ErrorReporter errorReporter, String leaderBoardName,
UUID eventId, EventDTO event, EventBus eventBus, SailingDispatchSystem sailingDispatchSystem,
RegattaAndRaceIdentifier regattaAndRaceIdentifier, AsyncCallback<RVWrapper> callback) {
GWT.log("Creating map for " + regattaAndRaceIdentifier);
raceboardTimer.reset();
raceboardTimer.setLivePlayDelayInMillis(1000);
raceboardTimer.setRefreshInterval(1000);
if (raceTimesInfoProvider == null) {
raceTimesInfoProvider = new RaceTimesInfoProvider(sailingService, AutoplayHelper.asyncActionsExecutor,
errorReporter, new ArrayList<RegattaAndRaceIdentifier>(), 10000l);
}
raceTimesInfoProvider.reset();
StrippedLeaderboardDTO selectedLeaderboard = AutoplayHelper.getSelectedLeaderboard(event, leaderBoardName);
sailingService.getCompetitorsOfLeaderboard(leaderBoardName, new AsyncCallback<Iterable<CompetitorDTO>>() {
@Override
public void onSuccess(Iterable<CompetitorDTO> competitors) {
loadRaceTimes(selectedLeaderboard, new RaceTimesInfoProviderListener() {
@Override
public void raceTimesInfosReceived(Map<RegattaAndRaceIdentifier, RaceTimesInfoDTO> raceTimesInfo,
long clientTimeWhenRequestWasSent, Date serverTimeDuringRequest,
long clientTimeWhenResponseWasReceived) {
raceboardTimer.adjustClientServerOffset(clientTimeWhenRequestWasSent, serverTimeDuringRequest,
clientTimeWhenResponseWasReceived);
raceboardTimer.play();
if (regattaAndRaceIdentifier != null) {
sailingService.getCompetitorBoats(regattaAndRaceIdentifier,
new AsyncCallback<Map<CompetitorDTO, BoatDTO>>() {
@Override
public void onSuccess(Map<CompetitorDTO, BoatDTO> result) {
createRaceMapIfNotExist(regattaAndRaceIdentifier, selectedLeaderboard,
result, competitors, sailingService,
AutoplayHelper.asyncActionsExecutor, errorReporter, raceboardTimer,
callback, clientTimeWhenResponseWasReceived,
serverTimeDuringRequest, clientTimeWhenRequestWasSent,
raceTimesInfo);
}
@Override
public void onFailure(Throwable caught) {
callback.onFailure(
new IllegalStateException("Error getting Competitor Boats"));
}
});
} else {
callback.onFailure(new IllegalStateException("No Life Race Found"));
}
}
}, raceTimesInfoProvider);
}
@Override
public void onFailure(Throwable caught) {
callback.onFailure(new IllegalStateException("Error getting Competitors"));
}
});
}
protected static void loadRaceTimes(AbstractLeaderboardDTO selectedLeaderboard,
RaceTimesInfoProviderListener callback, RaceTimesInfoProvider raceTimesInfoProvider) {
for (RaceColumnDTO race : selectedLeaderboard.getRaceList()) {
for (FleetDTO fleet : race.getFleets()) {
RegattaAndRaceIdentifier raceIdentifier = race.getRaceIdentifier(fleet);
if (raceIdentifier != null && !raceTimesInfoProvider.containsRaceIdentifier(raceIdentifier)) {
raceTimesInfoProvider.addRaceIdentifier(raceIdentifier, false);
}
}
}
raceTimesInfoProvider.forceTimesInfosUpdate();
raceTimesInfoProvider.addRaceTimesInfoProviderListener(new RaceTimesInfoProviderListener() {
private boolean alreadyfired;
@Override
public void raceTimesInfosReceived(Map<RegattaAndRaceIdentifier, RaceTimesInfoDTO> raceTimesInfo,
long clientTimeWhenRequestWasSent, Date serverTimeDuringRequest,
long clientTimeWhenResponseWasReceived) {
if (alreadyfired) {
return;
}
alreadyfired = true;
callback.raceTimesInfosReceived(raceTimesInfo, clientTimeWhenRequestWasSent, serverTimeDuringRequest,
clientTimeWhenResponseWasReceived);
raceTimesInfoProvider.removeRaceTimesInfoProviderListener(this);
}
});
}
private static void createRaceMapIfNotExist(RegattaAndRaceIdentifier currentLiveRace,
StrippedLeaderboardDTO selectedLeaderboard, Map<CompetitorDTO, BoatDTO> result,
Iterable<CompetitorDTO> competitors, SailingServiceAsync sailingService,
AsyncActionsExecutor asyncActionsExecutor, ErrorReporter errorReporter, Timer raceboardTimer,
AsyncCallback<RVWrapper> callback, long clientTimeWhenResponseWasReceived, Date serverTimeDuringRequest,
long clientTimeWhenRequestWasSent, Map<RegattaAndRaceIdentifier, RaceTimesInfoDTO> raceTimesInfos) {
ArrayList<ZoomTypes> typesToConsiderOnZoom = new ArrayList<>();
// Other zoom types such as BOATS, TAILS or WINDSENSORS are not currently used as default zoom types.
typesToConsiderOnZoom.add(ZoomTypes.BUOYS);
typesToConsiderOnZoom.add(ZoomTypes.BOATS);
RaceMapZoomSettings autoFollowRace = new RaceMapZoomSettings(typesToConsiderOnZoom, true);
RaceMapSettings settings = new RaceMapSettings(autoFollowRace, new RaceMapHelpLinesSettings(), false, 15,
100000l, false, RaceMapSettings.DEFAULT_BUOY_ZONE_RADIUS, false, true, false, false, false, false,
RaceMapSettings.getDefaultManeuvers(), false);
RaceMapLifecycle raceMapLifecycle = new RaceMapLifecycle(StringMessages.INSTANCE);
final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(currentLiveRace, result);
CompetitorSelectionModel competitorSelectionProvider = new CompetitorSelectionModel(
/* hasMultiSelection */ true, colorProvider);
competitorSelectionProvider.setCompetitors(competitors);
RaceMap raceboardPerspective = new RaceMap(null, null, raceMapLifecycle, settings, sailingService,
asyncActionsExecutor, errorReporter, raceboardTimer, competitorSelectionProvider,
StringMessages.INSTANCE, currentLiveRace, raceMapResources, false);
raceboardPerspective.raceTimesInfosReceived(raceTimesInfos, clientTimeWhenRequestWasSent,
serverTimeDuringRequest, clientTimeWhenResponseWasReceived);
// raceTimesInfoProvider.addRaceTimesInfoProviderListener(raceboardPerspective);
raceboardTimer.setPlayMode(PlayModes.Live);
// wait for one update
raceboardPerspective.onResize();
callback.onSuccess(new RVWrapper(raceboardPerspective, competitorSelectionProvider));
}
}
@@ -1,7 +1,7 @@
package com.sap.sailing.gwt.autoplay.client.utils;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLeaderBoardWithImageViewImpl.ImageProvider;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLiveRaceLeaderBoardWithImageViewImpl.ImageProvider;
public class CompetitorImageProvider implements ImageProvider {
@@ -1,7 +1,7 @@
package com.sap.sailing.gwt.autoplay.client.utils;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLeaderBoardWithImageViewImpl.ImageProvider;
import com.sap.sailing.gwt.autoplay.client.places.screens.preliveraceloop.leaderboard.PreLiveRaceLeaderBoardWithImageViewImpl.ImageProvider;
public class FlagImageProvider implements ImageProvider {
@@ -1,185 +0,0 @@
package com.sap.sailing.gwt.autoplay.client.utils;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.web.bindery.event.shared.EventBus;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.dto.AbstractLeaderboardDTO;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.gwt.home.communication.SailingDispatchSystem;
import com.sap.sailing.gwt.ui.client.CompetitorColorProvider;
import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProviderListener;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMap;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapHelpLinesSettings;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapLifecycle;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapResources;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapSettings;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapZoomSettings;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapZoomSettings.ZoomTypes;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
public class RaceMapHelper {
private static final RaceMapResources raceMapResources = GWT.create(RaceMapResources.class);
private static Timer raceboardTimer = new Timer(PlayModes.Live, /* delayBetweenAutoAdvancesInMilliseconds */1000l);
private static RaceTimesInfoProvider raceTimesInfoProvider;
private static RaceMap raceboardPerspective;
public static class RVWrapper {
public RVWrapper(RaceMap raceboardPerspective2, CompetitorSelectionModel competitorSelectionProvider) {
this.raceboardPerspective = raceboardPerspective2;
this.csel = competitorSelectionProvider;
}
public RaceMap raceboardPerspective;
public CompetitorSelectionModel csel;
}
public static void create(SailingServiceAsync sailingService, ErrorReporter errorReporter, String leaderBoardName,
UUID eventId, EventDTO event, EventBus eventBus, SailingDispatchSystem sailingDispatchSystem,
RegattaAndRaceIdentifier regattaAndRaceIdentifier, AsyncCallback<RVWrapper> callback) {
GWT.log("Creating map for " + regattaAndRaceIdentifier);
raceboardTimer.reset();
raceboardTimer.setLivePlayDelayInMillis(1000);
raceboardTimer.setRefreshInterval(1000);
if (raceTimesInfoProvider == null) {
raceTimesInfoProvider = new RaceTimesInfoProvider(sailingService, AutoplayHelper.asyncActionsExecutor,
errorReporter, new ArrayList<RegattaAndRaceIdentifier>(), 10000l);
}
raceTimesInfoProvider.reset();
StrippedLeaderboardDTO selectedLeaderboard = AutoplayHelper.getSelectedLeaderboard(event, leaderBoardName);
sailingService.getCompetitorsOfLeaderboard(leaderBoardName, new AsyncCallback<Iterable<CompetitorDTO>>() {
@Override
public void onSuccess(Iterable<CompetitorDTO> competitors) {
loadRaceTimes(selectedLeaderboard, new RaceTimesInfoProviderListener() {
@Override
public void raceTimesInfosReceived(Map<RegattaAndRaceIdentifier, RaceTimesInfoDTO> raceTimesInfo,
long clientTimeWhenRequestWasSent, Date serverTimeDuringRequest,
long clientTimeWhenResponseWasReceived) {
raceboardTimer.adjustClientServerOffset(clientTimeWhenRequestWasSent, serverTimeDuringRequest,
clientTimeWhenResponseWasReceived);
raceboardTimer.play();
if (regattaAndRaceIdentifier != null) {
sailingService.getCompetitorBoats(regattaAndRaceIdentifier,
new AsyncCallback<Map<CompetitorDTO, BoatDTO>>() {
@Override
public void onSuccess(Map<CompetitorDTO, BoatDTO> result) {
createRaceMapIfNotExist(regattaAndRaceIdentifier, selectedLeaderboard,
result, competitors,
sailingService, AutoplayHelper.asyncActionsExecutor, errorReporter,
raceboardTimer, callback, clientTimeWhenResponseWasReceived,
serverTimeDuringRequest, clientTimeWhenRequestWasSent,
raceTimesInfo);
}
@Override
public void onFailure(Throwable caught) {
callback.onFailure(
new IllegalStateException("Error getting Competitor Boats"));
}
});
} else {
callback.onFailure(new IllegalStateException("No Life Race Found"));
}
}
}, raceTimesInfoProvider);
}
@Override
public void onFailure(Throwable caught) {
callback.onFailure(new IllegalStateException("Error getting Competitors"));
}
});
}
protected static void loadRaceTimes(AbstractLeaderboardDTO selectedLeaderboard,
RaceTimesInfoProviderListener callback, RaceTimesInfoProvider raceTimesInfoProvider) {
for (RaceColumnDTO race : selectedLeaderboard.getRaceList()) {
for (FleetDTO fleet : race.getFleets()) {
RegattaAndRaceIdentifier raceIdentifier = race.getRaceIdentifier(fleet);
if (raceIdentifier != null && !raceTimesInfoProvider.containsRaceIdentifier(raceIdentifier)) {
raceTimesInfoProvider.addRaceIdentifier(raceIdentifier, false);
}
}
}
raceTimesInfoProvider.forceTimesInfosUpdate();
raceTimesInfoProvider.addRaceTimesInfoProviderListener(new RaceTimesInfoProviderListener() {
private boolean alreadyfired;
@Override
public void raceTimesInfosReceived(Map<RegattaAndRaceIdentifier, RaceTimesInfoDTO> raceTimesInfo,
long clientTimeWhenRequestWasSent, Date serverTimeDuringRequest,
long clientTimeWhenResponseWasReceived) {
if (alreadyfired) {
return;
}
alreadyfired = true;
callback.raceTimesInfosReceived(raceTimesInfo, clientTimeWhenRequestWasSent, serverTimeDuringRequest,
clientTimeWhenResponseWasReceived);
raceTimesInfoProvider.removeRaceTimesInfoProviderListener(this);
}
});
}
private static void createRaceMapIfNotExist(RegattaAndRaceIdentifier currentLiveRace,
StrippedLeaderboardDTO selectedLeaderboard, Map<CompetitorDTO, BoatDTO> result,
Iterable<CompetitorDTO> competitors, SailingServiceAsync sailingService,
AsyncActionsExecutor asyncActionsExecutor, ErrorReporter errorReporter, Timer raceboardTimer,
AsyncCallback<RVWrapper> callback, long clientTimeWhenResponseWasReceived, Date serverTimeDuringRequest,
long clientTimeWhenRequestWasSent, Map<RegattaAndRaceIdentifier, RaceTimesInfoDTO> raceTimesInfos) {
ArrayList<ZoomTypes> typesToConsiderOnZoom = new ArrayList<>();
// Other zoom types such as BOATS, TAILS or WINDSENSORS are not currently used as default zoom types.
typesToConsiderOnZoom.add(ZoomTypes.BUOYS);
typesToConsiderOnZoom.add(ZoomTypes.BOATS);
RaceMapZoomSettings autoFollowRace = new RaceMapZoomSettings(typesToConsiderOnZoom, true);
RaceMapSettings settings = new RaceMapSettings(autoFollowRace, new RaceMapHelpLinesSettings(), false, 15,
100000l, false, RaceMapSettings.DEFAULT_BUOY_ZONE_RADIUS, false, true, false, false, false, false,
RaceMapSettings.getDefaultManeuvers(), false);
RaceMapLifecycle raceMapLifecycle = new RaceMapLifecycle(StringMessages.INSTANCE);
final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(currentLiveRace, result);
CompetitorSelectionModel competitorSelectionProvider = new CompetitorSelectionModel(
/* hasMultiSelection */ true, colorProvider);
competitorSelectionProvider.setCompetitors(competitors);
raceboardPerspective = new RaceMap(null, null, raceMapLifecycle, settings, sailingService, asyncActionsExecutor,
errorReporter, raceboardTimer, competitorSelectionProvider, StringMessages.INSTANCE, currentLiveRace,
raceMapResources, false);
raceboardPerspective.raceTimesInfosReceived(raceTimesInfos, clientTimeWhenRequestWasSent,
serverTimeDuringRequest, clientTimeWhenResponseWasReceived);
// raceTimesInfoProvider.addRaceTimesInfoProviderListener(raceboardPerspective);
raceboardTimer.setPlayMode(PlayModes.Live);
// wait for one update
raceboardPerspective.onResize();
callback.onSuccess(new RVWrapper(raceboardPerspective, competitorSelectionProvider));
}
}
@@ -1818,4 +1818,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String unknownLeaderboardType(String name);
String selectCompetitorsToEliminate();
String trackedRaceAlreadyLinked();
String noData();
}
@@ -1796,3 +1796,4 @@ showRacePlaceColumn=Show race place
estimatedDistance=Estimated Distance
estimatedTime=Estimated Time
nothingUpcoming=There are currently no further planned races
noData=No data is available
@@ -1420,72 +1420,75 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
double bearingOfCombinedWindInDeg = windFix.trueWindBearingDeg;
double rotatedBearingDeg1 = 0.0;
double rotatedBearingDeg2 = 0.0;
switch (lastBoatFix.legType) {
case UPWIND:
case DOWNWIND: {
rotatedBearingDeg1 = bearingOfCombinedWindInDeg + 90.0;
if (rotatedBearingDeg1 >= 360.0) {
rotatedBearingDeg1 -= 360.0;
}
rotatedBearingDeg2 = bearingOfCombinedWindInDeg - 90.0;
if (rotatedBearingDeg2 < 0.0) {
rotatedBearingDeg2 += 360.0;
}
}
break;
case REACHING: {
rotatedBearingDeg1 = legInfoDTO.legBearingInDegrees + 90.0;
if (rotatedBearingDeg1 >= 360.0) {
rotatedBearingDeg1 -= 360.0;
}
rotatedBearingDeg2 = legInfoDTO.legBearingInDegrees - 90.0;
if (rotatedBearingDeg2 < 0.0) {
rotatedBearingDeg2 += 360.0;
}
}
break;
}
MVCArray<LatLng> nextPath = MVCArray.newInstance();
LatLng advantageLinePos1 = calculatePositionAlongRhumbline(posAheadOfFirstBoat,
coordinateSystem.mapDegreeBearing(rotatedBearingDeg1), advantageLineLength.scale(0.5));
LatLng advantageLinePos2 = calculatePositionAlongRhumbline(posAheadOfFirstBoat,
coordinateSystem.mapDegreeBearing(rotatedBearingDeg2), advantageLineLength.scale(0.5));
if (advantageLine == null) {
PolylineOptions options = PolylineOptions.newInstance();
options.setClickable(true);
options.setGeodesic(true);
options.setStrokeColor("#000000");
options.setStrokeWeight(1);
options.setStrokeOpacity(0.5);
advantageLine = Polyline.newInstance(options);
advantageTimer = new AdvantageLineAnimator(advantageLine);
MVCArray<LatLng> pointsAsArray = MVCArray.newInstance();
pointsAsArray.insertAt(0, advantageLinePos1);
pointsAsArray.insertAt(1, advantageLinePos2);
advantageLine.setPath(pointsAsArray);
advantageLine.setMap(map);
Hoverline advantageHoverline = new Hoverline(advantageLine, options, this);
advantageLineMouseOverHandler = new AdvantageLineMouseOverMapHandler(
bearingOfCombinedWindInDeg, new Date(windFix.measureTimepoint));
advantageLine.addMouseOverHandler(advantageLineMouseOverHandler);
advantageHoverline.addMouseOutMoveHandler(new MouseOutMapHandler() {
@Override
public void onEvent(MouseOutMapEvent event) {
map.setTitle("");
if(lastBoatFix.legType != null){
switch (lastBoatFix.legType) {
case UPWIND:
case DOWNWIND: {
rotatedBearingDeg1 = bearingOfCombinedWindInDeg + 90.0;
if (rotatedBearingDeg1 >= 360.0) {
rotatedBearingDeg1 -= 360.0;
}
rotatedBearingDeg2 = bearingOfCombinedWindInDeg - 90.0;
if (rotatedBearingDeg2 < 0.0) {
rotatedBearingDeg2 += 360.0;
}
});
} else {
nextPath.push(advantageLinePos1);
nextPath.push(advantageLinePos2);
advantageTimer.setNextPositionAndTransitionMillis(nextPath, timeForPositionTransitionMillis);
if (advantageLineMouseOverHandler != null) {
advantageLineMouseOverHandler.setTrueWindBearing(bearingOfCombinedWindInDeg);
advantageLineMouseOverHandler.setDate(new Date(windFix.measureTimepoint));
}
break;
case REACHING: {
rotatedBearingDeg1 = legInfoDTO.legBearingInDegrees + 90.0;
if (rotatedBearingDeg1 >= 360.0) {
rotatedBearingDeg1 -= 360.0;
}
rotatedBearingDeg2 = legInfoDTO.legBearingInDegrees - 90.0;
if (rotatedBearingDeg2 < 0.0) {
rotatedBearingDeg2 += 360.0;
}
}
break;
}
MVCArray<LatLng> nextPath = MVCArray.newInstance();
LatLng advantageLinePos1 = calculatePositionAlongRhumbline(posAheadOfFirstBoat,
coordinateSystem.mapDegreeBearing(rotatedBearingDeg1), advantageLineLength.scale(0.5));
LatLng advantageLinePos2 = calculatePositionAlongRhumbline(posAheadOfFirstBoat,
coordinateSystem.mapDegreeBearing(rotatedBearingDeg2), advantageLineLength.scale(0.5));
if (advantageLine == null) {
PolylineOptions options = PolylineOptions.newInstance();
options.setClickable(true);
options.setGeodesic(true);
options.setStrokeColor("#000000");
options.setStrokeWeight(1);
options.setStrokeOpacity(0.5);
advantageLine = Polyline.newInstance(options);
advantageTimer = new AdvantageLineAnimator(advantageLine);
MVCArray<LatLng> pointsAsArray = MVCArray.newInstance();
pointsAsArray.insertAt(0, advantageLinePos1);
pointsAsArray.insertAt(1, advantageLinePos2);
advantageLine.setPath(pointsAsArray);
advantageLine.setMap(map);
Hoverline advantageHoverline = new Hoverline(advantageLine, options, this);
advantageLineMouseOverHandler = new AdvantageLineMouseOverMapHandler(
bearingOfCombinedWindInDeg, new Date(windFix.measureTimepoint));
advantageLine.addMouseOverHandler(advantageLineMouseOverHandler);
advantageHoverline.addMouseOutMoveHandler(new MouseOutMapHandler() {
@Override
public void onEvent(MouseOutMapEvent event) {
map.setTitle("");
}
});
} else {
nextPath.push(advantageLinePos1);
nextPath.push(advantageLinePos2);
advantageTimer.setNextPositionAndTransitionMillis(nextPath, timeForPositionTransitionMillis);
if (advantageLineMouseOverHandler != null) {
advantageLineMouseOverHandler.setTrueWindBearing(bearingOfCombinedWindInDeg);
advantageLineMouseOverHandler.setDate(new Date(windFix.measureTimepoint));
}
}
drawAdvantageLine = true;
}
drawAdvantageLine = true;
}
}
if (!drawAdvantageLine) {
@@ -579,7 +579,6 @@ public abstract class LeaderboardPanel extends AbstractCompositeComponent<Leader
}
protected Widget createToolbarPanel() {
GWT.log("createToolbarPanel()");
informationPanel = new FlowPanel();
informationPanel.setStyleName(STYLE_LEADERBOARD_INFO);
scoreCorrectionLastUpdateTimeLabel = new Label("");