initialize Timer in Live/Paused mode for LeaderboardPanel when used through LeaderboardEntryPoint. Fixing bug 1888.

This commit is contained in:
Axel Uhl committed 2014-04-10 16:14:14 +02:00
1 parent 05ae1240aa
commit 95cb0bda91
4 files changed
+54 -37

No files matched your search

@@ -1367,7 +1367,8 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS
String leaderboardName, ErrorReporter errorReporter, final StringMessages stringMessages,
final UserAgentDetails userAgent, boolean showRaceDetails) {
this(sailingService, asyncActionsExecutor, settings, preSelectedRace, competitorSelectionProvider, new Timer(
PlayModes.Replay, /* delayBetweenAutoAdvancesInMilliseconds */3000l), leaderboardGroupName,
// perform the first request as "live" but don't by default auto-play
PlayModes.Live, PlayStates.Paused, /* delayBetweenAutoAdvancesInMilliseconds */3000l), leaderboardGroupName,
leaderboardName, errorReporter, stringMessages, userAgent, showRaceDetails,
/* optionalRaceTimesInfoProvider */ null, /* autoExpandLastRaceColumn */ false, /* adjustTimerDelay */ true);
}
@@ -16,6 +16,7 @@ import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
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;
import com.sap.sse.gwt.client.useragent.UserAgentDetails;
/**
@@ -35,7 +36,8 @@ public class LeaderboardViewer extends AbstractLeaderboardViewer {
final UserAgentDetails userAgent, boolean showRaceDetails, boolean hideToolbar, boolean autoExpandLastRaceColumn,
boolean showCharts, DetailType chartDetailType, boolean showOverallLeaderboard) {
super(new CompetitorSelectionModel(/* hasMultiSelection */true), asyncActionsExecutor,
new Timer(PlayModes.Replay, /*delayBetweenAutoAdvancesInMilliseconds*/ 3000l), stringMessages, hideToolbar);
// perform the first request as live request but don't auto-play
new Timer(PlayModes.Live, PlayStates.Paused, /* delayBetweenAutoAdvancesInMilliseconds */ 3000l), stringMessages, hideToolbar);
final FlowPanel mainPanel = createViewerPanel();
setWidget(mainPanel);
@@ -61,7 +63,6 @@ public class LeaderboardViewer extends AbstractLeaderboardViewer {
if(showCharts) {
multiCompetitorChart.timeChanged(timer.getTime(), null);
}
overallLeaderboardPanel = null;
if(showOverallLeaderboard) {
sailingService.getOverallLeaderboardNamesContaining(leaderboardName, new MarkedAsyncCallback<List<String>>(
@@ -13,6 +13,7 @@ import com.sap.sailing.gwt.ui.client.shared.charts.MultiCompetitorLeaderboardCha
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;
import com.sap.sse.gwt.client.useragent.UserAgentDetails;
/**
@@ -32,34 +33,28 @@ public class MetaLeaderboardViewer extends AbstractLeaderboardViewer {
UserAgentDetails userAgent, boolean showRaceDetails, boolean hideToolbar, boolean autoExpandLastRaceColumn,
boolean showCharts, DetailType chartDetailType, boolean showSeriesLeaderboards) {
super(new CompetitorSelectionModel(/* hasMultiSelection */true), asyncActionsExecutor,
new Timer(PlayModes.Replay, /*delayBetweenAutoAdvancesInMilliseconds*/ 3000l), stringMessages, hideToolbar);
// perform the first request as live request but don't auto-play
new Timer(PlayModes.Live, PlayStates.Paused, /*delayBetweenAutoAdvancesInMilliseconds*/ 3000l), stringMessages, hideToolbar);
FlowPanel mainPanel = createViewerPanel();
setWidget(mainPanel);
final Label overallStandingsLabel = new Label(stringMessages.overallStandings());
overallStandingsLabel.setStyleName("leaderboardHeading");
metaLeaderboardPanel = new LeaderboardPanel(sailingService, asyncActionsExecutor,
leaderboardSettings, preselectedRace, competitorSelectionProvider, timer,
leaderboardGroupName, metaLeaderboardName, errorReporter, stringMessages, userAgent,
showRaceDetails, /* raceTimesInfoProvider */null, autoExpandLastRaceColumn, /* adjustTimerDelay */ true);
multiCompetitorChart = new MultiCompetitorLeaderboardChart(sailingService, asyncActionsExecutor, metaLeaderboardName,
chartDetailType, competitorSelectionProvider, timer, stringMessages, errorReporter);
multiCompetitorChart.setVisible(showCharts);
multiCompetitorChart.getElement().getStyle().setMarginTop(10, Unit.PX);
multiCompetitorChart.getElement().getStyle().setMarginBottom(10, Unit.PX);
multiLeaderboardPanel = new MultiLeaderboardPanel(sailingService, metaLeaderboardName, asyncActionsExecutor, timer,
preselectedLeaderboardName, preselectedRace, errorReporter, stringMessages,
userAgent, showRaceDetails, autoExpandLastRaceColumn);
multiLeaderboardPanel.setVisible(showSeriesLeaderboards);
mainPanel.add(metaLeaderboardPanel);
mainPanel.add(multiCompetitorChart);
mainPanel.add(multiLeaderboardPanel);
addComponentToNavigationMenu(metaLeaderboardPanel, false, stringMessages.seriesLeaderboard(), /* hasSettingsWhenComponentIsInvisible*/ true);
addComponentToNavigationMenu(multiCompetitorChart, true, null, /* hasSettingsWhenComponentIsInvisible*/ true);
addComponentToNavigationMenu(multiLeaderboardPanel, true , stringMessages.regattaLeaderboards(), /* hasSettingsWhenComponentIsInvisible*/ false);
@@ -122,7 +122,11 @@ public class Timer {
* updated by a call to {@link #adjustClientServerOffset(long, Date, long)}.
*/
public Timer(PlayModes playMode) {
this(playMode, 1000);
this(playMode, getDefaultPlayStateForPlayMode(playMode));
}
public Timer(PlayModes playMode, PlayStates playState) {
this(playMode, playState, 1000 /* refreshIntervalInMillis */);
}
/**
@@ -131,17 +135,25 @@ public class Timer {
* {@link #refreshInterval delay between automatic updates} should the timer be
* {@link #resume() started}. The {@link #livePlayDelayInMillis} is set to zero seconds.
*/
public Timer(PlayModes playMode, long refreshInterval) {
this.refreshInterval = refreshInterval;
public Timer(PlayModes playMode, long refreshIntervalInMillis) {
this(playMode, getDefaultPlayStateForPlayMode(playMode), refreshIntervalInMillis);
}
public Timer(PlayModes playMode, PlayStates playState, long refreshIntervalInMillis) {
this.refreshInterval = refreshIntervalInMillis;
// Using the client's clock is only a default; the time offset between client and server is adjusted when
// information about the server time is present; see adjustClientServerOffset(...)
time = new Date();
timeListeners = new HashSet<TimeListener>();
playStateListeners = new HashSet<PlayStateListener>();
playState = PlayStates.Paused;
setPlaySpeedFactor(1.0);
livePlayDelayInMillis = 0l;
setPlayMode(playMode);
this.playMode = playMode;
setPlayState(playState, /* updatePlayMode */ false);
}
private static PlayStates getDefaultPlayStateForPlayMode(PlayModes playMode) {
return playMode == PlayModes.Live ? PlayStates.Playing : PlayStates.Paused;
}
public void addTimeListener(TimeListener listener) {
@@ -238,37 +250,45 @@ public class Timer {
for (PlayStateListener playStateListener : playStateListeners) {
playStateListener.playStateChanged(playState, playMode);
}
if (newPlayMode == PlayModes.Live) {
play();
}
}
if (newPlayMode == PlayModes.Live) {
play();
}
}
/**
* @param updatePlayMode
* if <code>true</code>, the play mode will be {@link #setPlayMode(PlayModes) updated} according to the
* desired new play state. In particular, if the new play state is {@link PlayStates#Paused}, the play
* mode will then automatically be set to {@link PlayModes#Replay}.
*/
private void setPlayState(PlayStates newPlayState, boolean updatePlayMode) {
if (this.playState != newPlayState) {
this.playState = newPlayState; // if newPlayState is Paused then this will cause the repeating command to stop executing
if (newPlayState == PlayStates.Playing) {
if (playMode == PlayModes.Live) {
setTime(getLiveTimePointInMillis());
}
startAutoAdvance();
} else if (updatePlayMode) {
setPlayMode(PlayModes.Replay);
}
for (PlayStateListener playStateListener : playStateListeners) {
playStateListener.playStateChanged(playState, playMode);
}
}
}
/**
* Pauses this timer after the next time advance. Registered {@link PlayStateListener}s will be notified. If the
* play mode was {@link PlayModes#Live}, it'll be set to {@link PlayModes#Replay}.
*/
public void pause() {
if (playState == PlayStates.Playing) {
playState = PlayStates.Paused; // this will cause the repeating command to stop executing
for (PlayStateListener playStateListener : playStateListeners) {
playStateListener.playStateChanged(playState, playMode);
}
setPlayMode(PlayModes.Replay);
}
setPlayState(PlayStates.Paused, /* updatePlayMode */ true);
}
public void play() {
if (playState != PlayStates.Playing) {
playState = PlayStates.Playing;
if (playMode == PlayModes.Live) {
setTime(getLiveTimePointInMillis());
}
startAutoAdvance();
for (PlayStateListener playStateListener : playStateListeners) {
playStateListener.playStateChanged(playState, playMode);
}
}
setPlayState(PlayStates.Playing, /* updatePlayMode */ true);
}
private void startAutoAdvance() {
@@ -290,7 +310,7 @@ public class Timer {
scheduleAdvancerCommand(this);
return false; // stop this command; use the newly-scheduled one instead that uses the new frequency
} else {
return playState == PlayStates.Playing ? true: false;
return playState == PlayStates.Playing;
}
}