Merge branch 'origin/master'

This commit is contained in:
Christopher Ronnewinkel (D036654) committed 2014-04-07 21:56:26 +02:00
commit ca4e98c3d6
65 files changed
+249 -482

No files matched your search

+3 -4
View File
@@ -1,14 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="com.google.gwt.eclipse.core.GWT_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src/main/resources"/>
<classpathentry excluding="com/sap/sailing/gwt/ui/jre/" kind="src" path="src/main/java"/>
<classpathentry kind="lib" path="WEB-INF/lib/gwt-servlet.jar" sourcepath="/com.google.gwt.osgi/lib/gwt-user.jar"/>
<classpathentry exported="true" kind="lib" path="WEB-INF/lib/gwt-maps-api-3.9.0-build-17.jar"/>
<classpathentry exported="true" kind="lib" path="WEB-INF/lib/gwt-ajaxloader.jar"/>
<classpathentry exported="true" kind="lib" path="WEB-INF/lib/gwt-bootstrap-2.3.2.0.jar"/>
<classpathentry exported="true" kind="lib" path="WEB-INF/classes/"/>
<classpathentry kind="output" path="bin"/>
<classpathentry exported="true" kind="lib" path="WEB-INF/classes/"/>
<classpathentry kind="con" path="com.google.gwt.eclipse.core.GWT_CONTAINER"/>
<classpathentry kind="output" path="bin"/>
</classpath>
@@ -40,13 +40,13 @@ Import-Package: javax.jms;version="1.1.0",
javax.servlet;version="2.6.0",
javax.servlet.descriptor;version="2.6.0",
javax.servlet.http;version="2.6.0",
org.apache.http.client;version="4.2.5",
org.json.simple,
org.json.simple.parser,
org.osgi.framework,
org.osgi.util.tracker
Web-ContextPath: /gwt
Bundle-ClassPath: WEB-INF/classes/,
WEB-INF/lib/gwt-servlet.jar,
WEB-INF/lib/gwt-maps-api-3.9.0-build-17.jar,
WEB-INF/lib/gwt-ajaxloader.jar,
WEB-INF/lib/gwt-bootstrap-2.3.2.0.jar
@@ -2,7 +2,6 @@ source.WEB-INF/classes/ = src/main/java,\
src/main/resources
output.WEB-INF/classes/ = bin
bin.includes = META-INF/,\
WEB-INF/lib/gwt-servlet.jar,\
WEB-INF/classes/,\
WEB-INF/web.xml,\
AdminConsole.css,\
@@ -9,8 +9,8 @@ import com.sap.sailing.domain.common.dto.LeaderboardDTO;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sse.gwt.client.async.AsyncAction;
import com.sap.sse.gwt.client.player.Timer;
/**
* Performs a result adaptation from {@link IncrementalOrFullLeaderboardDTO} and {@link LeaderboardDTO}, encapsulating
@@ -1,16 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.Timer.PlayStates;
public interface PlayStateListener {
/**
* Called by a timer where this listener is registered when a timer's play state has changed.
*
* @param isPlaying
* <code>true</code> if the timer is now automatically updating its time
*/
void playStateChanged(PlayStates playState, PlayModes playMode);
void playSpeedFactorChanged(double newPlaySpeedFactor);
}
@@ -7,11 +7,13 @@ import java.util.Map;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.adminconsole.DateAndTimeFormatterUtil;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.Timer.PlayStates;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
import com.sap.sailing.gwt.ui.shared.MarkPassingTimesDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sse.gwt.client.player.TimeRangeWithZoomProvider;
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 RaceTimePanel extends TimePanel<RaceTimePanelSettings> implements RaceSelectionChangeListener, RaceTimesInfoProviderListener {
private final RaceTimesInfoProvider raceTimesInfoProvider;
@@ -4,6 +4,7 @@ import java.util.Date;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sse.gwt.client.player.Timer;
public class RaceTimesCalculationUtil {
@@ -17,6 +17,7 @@ import com.sap.sailing.domain.common.dto.PositionDTO;
import com.sap.sailing.gwt.ui.shared.WindDTO;
import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO;
import com.sap.sailing.gwt.ui.shared.WindTrackInfoDTO;
import com.sap.sse.gwt.client.player.TimeListener;
/**
* Displays a bit of wind history around the time notified to this time listener.
@@ -1,7 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import java.util.Date;
public interface TimeListener {
void timeChanged(Date newTime, Date oldTime);
}
@@ -21,13 +21,19 @@ import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.Timer.PlayStates;
import com.sap.sailing.gwt.ui.client.shared.components.Component;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialog;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
import com.sap.sse.gwt.client.controls.slider.SliderBar;
import com.sap.sse.gwt.client.controls.slider.TimeSlider;
import com.sap.sse.gwt.client.player.PlayStateListener;
import com.sap.sse.gwt.client.player.TimeListener;
import com.sap.sse.gwt.client.player.TimeRangeChangeListener;
import com.sap.sse.gwt.client.player.TimeRangeWithZoomProvider;
import com.sap.sse.gwt.client.player.TimeZoomChangeListener;
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 TimePanel<T extends TimePanelSettings> extends SimplePanel implements Component<T>, TimeListener, TimeZoomChangeListener,
TimeRangeChangeListener, PlayStateListener, RequiresResize {
@@ -1,7 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import java.util.Date;
public interface TimeRangeChangeListener {
void onTimeRangeChanged(Date fromTime, Date toTime);
}
@@ -1,65 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import com.sap.sailing.domain.common.impl.Util.Pair;
public class TimeRangeModel implements TimeRangeProvider {
/**
* The 'from' time of the time interval. May be <code>null</code> if not yet initialized.
*/
protected Date fromTime;
/**
* The 'to' time of the time interval. May be <code>null</code> if not yet initialized.
*/
protected Date toTime;
protected final Set<TimeRangeChangeListener> listeners;
public TimeRangeModel() {
listeners = new HashSet<TimeRangeChangeListener>();
}
@Override
public void addTimeRangeChangeListener(TimeRangeChangeListener listener) {
listeners.add(listener);
}
@Override
public void removeTimeRangeChangeListener(TimeRangeChangeListener listener) {
listeners.remove(listener);
}
public void setTimeRange(final Date fromTime, final Date toTime, TimeRangeChangeListener... listenersNotToNotify) {
this.fromTime = fromTime != null ? new Date(fromTime.getTime()) : null;
this.toTime = toTime != null ? new Date(toTime.getTime()) : null;
for (TimeRangeChangeListener listener : listeners) {
if (listenersNotToNotify == null || !Arrays.asList(listenersNotToNotify).contains(listener)) {
listener.onTimeRangeChanged(fromTime, toTime);
}
}
}
public Pair<Date, Date> getTimeRange() {
return new Pair<Date, Date>(fromTime, toTime);
}
public Date getFromTime() {
return fromTime;
}
public Date getToTime() {
return toTime;
}
@Override
public String toString() {
return "TimeRangeModel [fromTime=" + fromTime + ", toTime=" + toTime + "]";
}
}
@@ -1,20 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import java.util.Date;
import com.sap.sailing.domain.common.impl.Util.Pair;
public interface TimeRangeProvider {
public void addTimeRangeChangeListener(TimeRangeChangeListener listener);
public void removeTimeRangeChangeListener(TimeRangeChangeListener listener);
public void setTimeRange(Date fromTime, Date toTime, TimeRangeChangeListener... listenersNotToNotify);
public Date getFromTime();
public Date getToTime();
public Pair<Date, Date> getTimeRange();
}
@@ -1,67 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import com.sap.sailing.domain.common.impl.Util.Pair;
public class TimeRangeWithZoomModel extends TimeRangeModel implements TimeRangeWithZoomProvider {
private Date zoomStartTimepoint;
private Date zoomEndTimepoint;
private boolean isTimeZoomed;
private final Set<TimeZoomChangeListener> listeners;
public TimeRangeWithZoomModel() {
isTimeZoomed = false;
listeners = new HashSet<TimeZoomChangeListener>();
}
@Override
public void addTimeZoomChangeListener(TimeZoomChangeListener listener) {
listeners.add(listener);
}
@Override
public void removeTimeZoomChangeListener(TimeZoomChangeListener listener) {
listeners.remove(listener);
}
public void setTimeZoom(Date zoomStartTimepoint, Date zoomEndTimepoint, TimeZoomChangeListener... listenersNotToNotify) {
this.zoomStartTimepoint = zoomStartTimepoint;
this.zoomEndTimepoint = zoomEndTimepoint;
this.isTimeZoomed = true;
for (TimeZoomChangeListener listener : listeners) {
if (listenersNotToNotify == null || !Arrays.asList(listenersNotToNotify).contains(listener)) {
listener.onTimeZoomChanged(zoomStartTimepoint, zoomEndTimepoint);
}
}
}
public void resetTimeZoom(TimeZoomChangeListener... listenersNotToNotify) {
isTimeZoomed = false;
this.zoomStartTimepoint = null;
this.zoomEndTimepoint = null;
for (TimeZoomChangeListener listener : listeners) {
if (listenersNotToNotify == null || !Arrays.asList(listenersNotToNotify).contains(listener)) {
listener.onTimeZoomReset();
}
}
}
public Pair<Date, Date> getTimeZoom() {
return new Pair<Date, Date>(zoomStartTimepoint, zoomEndTimepoint);
}
public boolean isZoomed() {
return isTimeZoomed;
}
@Override
public String toString() {
return "TimeRangeWithZoomModel [fromTime=" + fromTime + ", toTime=" + toTime + ", zoomStartTimepoint=" + zoomStartTimepoint + ", zoomEndTimepoint="
+ zoomEndTimepoint + ", isTimeZoomed=" + isTimeZoomed + "]";
}
}
@@ -1,20 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import java.util.Date;
import com.sap.sailing.domain.common.impl.Util.Pair;
public interface TimeRangeWithZoomProvider extends TimeRangeProvider {
public void addTimeZoomChangeListener(TimeZoomChangeListener listener);
public void removeTimeZoomChangeListener(TimeZoomChangeListener listener);
public void setTimeZoom(Date zoomStartTimepoint, Date zoomEndTimepoint, TimeZoomChangeListener... listenersNotToNotify);
public void resetTimeZoom(TimeZoomChangeListener... listenersNotToNotify);
public Pair<Date, Date> getTimeZoom();
public boolean isZoomed();
}
@@ -1,10 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import java.util.Date;
public interface TimeZoomChangeListener {
void onTimeZoomChanged(Date zoomStartTimepoint, Date zoomEndTimepoint);
void onTimeZoomReset();
}
@@ -1,358 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.RepeatingCommand;
/**
* Manages a timer and can auto-advance it at a given acceleration/deceleration rate, with a given delay compared to
* real time. It can be {@link #pause() paused} and {@link #resume() resumed}. It can be in one of two play modes:
* {@link PlayModes#Live} and {@link PlayModes#Replay}. In live play mode the timer is always in state {@link PlayStates#Playing}
* and adjusts the time to now-{@link #livePlayDelayInMillis}. As soon as it's paused or stopped it enters
* {@link PlayModes#Replay}. By entering {@link PlayModes#Live} with {@link #setPlayMode(PlayModes)}, the timer starts
* playing right away.
*
* @author Axel Uhl (d043530)
*
*/
public class Timer {
/**
* Used by {@link #quantizeTimeStamp(long)}; currently set to 1s (1000ms)
*/
private static final long LIVE_CLOCK_QUANTUM = 1000;
/**
* The time point represented by this timer
*/
private Date time;
/**
* The time delay to the current point in time in milliseconds which will only be used in {@link PlayModes#Live}
* play mode in order to infer an approximate, server-based time point to display on the client that is independent
* of the client clock. Not set explicitly by the user but controlled by responses coming from the server.
*/
private long livePlayDelayInMillis;
/**
* Listeners interested in changes of {@link #time}
*/
private final Set<TimeListener> timeListeners;
/**
* Listeners interested in changes of {@link #playing}
*/
private final Set<PlayStateListener> playStateListeners;
/**
* If <code>Playing</code>, an auto-refreshing command is running with {@link #refreshInterval}
* as its refresh interval.
*/
private PlayStates playState;
/**
* The current play mode of the timer: live or replay. In live mode the timer will adjust to now-delay each time it
* refreshes. In replay mode it will advance time by the refresh interval times the play speed factor.
*/
private PlayModes playMode;
/**
* The refresh interval in milliseconds for auto-updating this timer
*/
private long refreshInterval;
/**
* Set to <code>true</code> if the refreshInterval changed while {@link #playing}. This forces the auto-refreshing command
* to re-schedule itself with the new interval, then terminate.
*/
private boolean refreshIntervalChanged;
/**
* Factor by which the timer runs faster than real time. 1.0 means real-time, 2.0 means twice as fast as real time, and so on.
* Applies only if the timer is in replay mode.
*/
private double playSpeedFactor;
/**
* Set to <code>true</code> to enable the timer to advance the max time automatically if the current time gets greater than the max time
*/
private boolean autoAdvance;
/**
* The clocks of a client cannot be expected to be synchronized to the same time source as the server clock.
* Therefore, there is a good chance for a significant time difference between client and server. While this does
* not matter in replay mode where the client requests data for some arbitrary point in time, in live mode the
* client at least should display the server time reasonably correct. Times in requests to the server in live mode
* shall always be encoded as <code>null</code> to tell the server to use its server time. This will also help
* improve the chances for cache hits.<p>
*
* The time difference is maintained by applying an exponential moving average across the time differences announced through
* {@link #setMillisecondsClientIsCurrentlyBehindServer}. The field starts out with 0 as default value, implying the client
* clock has exactly the same time as the server clock.
*/
private long millisecondsClientIsBehindServer;
private boolean clientServerOffsetHasAtLeastBeenSetOnce;
/**
* The timer can run in two different modes: Live and Replay
* 'Live' means the timer is used for a real time event
* 'Replay' means the timer is used for an already finished event in the past
*/
public enum PlayModes { Live, Replay };
public enum PlayStates { Stopped, Playing, Paused };
/**
* The timer is created in stopped state unless created with <code>playMode==PlayModes.Live</code>, using the
* client's "now" as its current time, 1.0 as its {@link #playSpeedFactor play speed factor} and 1 second (1000ms)
* as the {@link #refreshInterval delay between automatic updates} should the timer be {@link #resume() started}.
* The {@link #millisecondsClientIsBehindServer offset} to the server time is initially left at 0ms until
* updated by a call to {@link #adjustClientServerOffset(long, Date, long)}.
*/
public Timer(PlayModes playMode) {
this(playMode, 1000);
}
/**
* The timer is created in stopped state, using "now" as its current time, 1.0 as its {@link #playSpeedFactor
* acceleration factor} and <code>delayBetweenAutoAdvancesInMilliseconds</code> as the
* {@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;
// 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.Stopped;
setPlaySpeedFactor(1.0);
livePlayDelayInMillis = 0l;
autoAdvance = true;
setPlayMode(playMode);
}
public void addTimeListener(TimeListener listener) {
timeListeners.add(listener);
}
public void removeTimeListener(TimeListener listener) {
timeListeners.remove(listener);
}
public void addPlayStateListener(PlayStateListener listener) {
playStateListeners.add(listener);
}
public void removePlayStateListener(PlayStateListener listener) {
playStateListeners.remove(listener);
}
/**
* Assumes that a service request was sent to the server at <code>timePointWhenRequestWasSent</code> for which the
* response was received at <code>timePointWhenResponseWasReceived</code> and where the response tells
* <code>currentServerTime</code> as the server time during processing the request. Based on this, calculates the
* difference between the client's <code>System.currentTimeMillis()</code> and the current server time and, removing
* half the time between send and receive time point to approximate the network latency. This gives a good
* indication for how far client and server clock differ.
*
* @param serverTimeDuringRequest may be <code>null</code> in which case no adjustment is performed
*/
public void adjustClientServerOffset(long clientTimeWhenRequestWasSent, Date serverTimeDuringRequest, long clientTimeWhenResponseWasReceived) {
if (serverTimeDuringRequest != null) {
// Let's assume the calculation of the RaceTimesInfoDTO objects during the request takes almost no time compared
// to network latency. Then the difference between the client's current time and the time when the request was sent
// can be considered network latency. If we furthermore assume that the network latency is roughly symmetrical for
// request and response, dividing the total latency by two will approximately tell us the time that passed between
// when the server set the RaceTimesInfoDTO.currentServerTime field and the current time.
long responseNetworkLatencyInMillis = (clientTimeWhenResponseWasReceived-clientTimeWhenRequestWasSent)/2l;
long offset = serverTimeDuringRequest.getTime() + responseNetworkLatencyInMillis - clientTimeWhenResponseWasReceived;
if (clientServerOffsetHasAtLeastBeenSetOnce) {
final double exponentialMovingAverageFactor = 0.5;
millisecondsClientIsBehindServer = (long) (millisecondsClientIsBehindServer
* exponentialMovingAverageFactor + (1. - exponentialMovingAverageFactor) * offset);
} else {
millisecondsClientIsBehindServer = offset;
clientServerOffsetHasAtLeastBeenSetOnce = true;
}
}
}
public void setTime(long timePointAsMillis) {
Date oldTime = time;
time = new Date(timePointAsMillis);
if ((oldTime == null) != (time == null) || (oldTime != null && !oldTime.equals(time))) {
for (TimeListener listener : timeListeners) {
listener.timeChanged(time, oldTime);
}
}
}
public void setPlaySpeedFactor(double playSpeedFactor) {
this.playSpeedFactor = playSpeedFactor;
for (PlayStateListener playStateListener : playStateListeners) {
playStateListener.playSpeedFactorChanged(this.playSpeedFactor);
}
}
public double getPlaySpeedFactor() {
return playSpeedFactor;
}
public void setRefreshInterval(long refreshIntervalInMillis) {
this.refreshInterval = refreshIntervalInMillis;
if (playState == PlayStates.Playing) {
refreshIntervalChanged = true;
}
}
/**
* @return the refresh interval in milliseconds
*/
public long getRefreshInterval() {
return refreshInterval;
}
public Date getTime() {
return time;
}
/**
* When setting the play mode to live, the timer will automatically be put into play state playing.
*/
public void setPlayMode(PlayModes newPlayMode) {
if (this.playMode != newPlayMode) {
this.playMode = newPlayMode;
for (PlayStateListener playStateListener : playStateListeners) {
playStateListener.playStateChanged(playState, playMode);
}
if (newPlayMode == PlayModes.Live) {
play();
}
}
}
/**
* Pauses this timer after the next time advance. {@link #playing} is set to <code>false</code> if not already
* paused, and registered {@link PlayStateListener}s will be notified. If the play mode was live, it'll be set to
* 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);
}
}
/**
* Puts the timer into the stopped state. If it was in live mode, puts it into replay mode.
*/
public void stop() {
if (playState == PlayStates.Playing) {
playState = PlayStates.Stopped;
for (PlayStateListener playStateListener : playStateListeners) {
playStateListener.playStateChanged(playState, playMode);
}
setPlayMode(PlayModes.Replay);
}
}
public void play() {
if (playState != PlayStates.Playing) {
playState = PlayStates.Playing;
if (playMode == PlayModes.Live) {
setTime(getLiveTimePointInMillis());
}
if (autoAdvance) {
startAutoAdvance();
}
for (PlayStateListener playStateListener : playStateListeners) {
playStateListener.playStateChanged(playState, playMode);
}
}
}
private void startAutoAdvance() {
RepeatingCommand command = new RepeatingCommand() {
@Override
public boolean execute() {
if (time != null && playState == PlayStates.Playing) {
long newTime = time.getTime();
if (playMode == PlayModes.Replay) {
newTime += (long) playSpeedFactor * refreshInterval;
} else {
// play mode is Live; quantize to make cache hits more likely
newTime = quantizeTimeStamp(getLiveTimePointInMillis());
}
setTime(newTime);
}
if (refreshIntervalChanged) {
refreshIntervalChanged = false;
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;
}
}
};
scheduleAdvancerCommand(command);
}
/**
* In {@link PlayModes#Live live mode}, time stamps are quantized to make it more likely for the back-end to achieve
* a cache hit. Quantization is controlled by the {@link #LIVE_CLOCK_QUANTUM} constant.
*/
private long quantizeTimeStamp(long millis) {
return millis - (millis % LIVE_CLOCK_QUANTUM);
}
private void scheduleAdvancerCommand(RepeatingCommand command) {
Scheduler.get().scheduleFixedPeriod(command, (int) refreshInterval);
}
public void setLivePlayDelayInMillis(long delayInMilliseconds) {
if (this.livePlayDelayInMillis != delayInMilliseconds) {
this.livePlayDelayInMillis = delayInMilliseconds;
if (getPlayMode() == PlayModes.Live) {
setTime(getLiveTimePointInMillis());
}
}
}
public long getLivePlayDelayInMillis() {
return livePlayDelayInMillis;
}
public PlayStates getPlayState() {
return playState;
}
public PlayModes getPlayMode() {
return playMode;
}
public boolean isAutoAdvance() {
return autoAdvance;
}
public void setAutoAdvance(boolean autoAdvance) {
this.autoAdvance = autoAdvance;
}
public long getLiveTimePointInMillis() {
return System.currentTimeMillis() - getLivePlayDelayInMillis() + millisecondsClientIsBehindServer;
}
public Date getLiveTimePointAsDate() {
return new Date(getLiveTimePointInMillis());
}
}
@@ -30,13 +30,8 @@ import com.sap.sailing.domain.common.media.MediaTrack.MediaType;
import com.sap.sailing.domain.common.media.MediaTrack.Status;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.MediaServiceAsync;
import com.sap.sailing.gwt.ui.client.PlayStateListener;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimeListener;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.Timer.PlayStates;
import com.sap.sailing.gwt.ui.client.media.MediaSelectionDialog.MediaSelectionListener;
import com.sap.sailing.gwt.ui.client.media.popup.PopupWindowPlayer;
import com.sap.sailing.gwt.ui.client.media.popup.VideoWindowPlayer;
@@ -46,6 +41,11 @@ import com.sap.sailing.gwt.ui.client.media.shared.VideoPlayer;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sailing.gwt.ui.shared.UserDTO;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
import com.sap.sse.gwt.client.player.PlayStateListener;
import com.sap.sse.gwt.client.player.TimeListener;
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 MediaSelector implements PlayStateListener, TimeListener,
AsyncCallback<Collection<MediaTrack>>, MediaSelectionListener, CloseHandler<Window>, ClosingHandler {
@@ -11,10 +11,10 @@ import com.google.gwt.user.client.ui.PopupPanel;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.MediaServiceAsync;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.media.popup.PopupWindowPlayer.PopupCloseListener;
import com.sap.sailing.gwt.ui.client.media.shared.VideoPlayer;
import com.sap.sse.gwt.client.dialog.WindowBox;
import com.sap.sse.gwt.client.player.Timer;
public class VideoEmbeddedPlayer extends AbstractEmbeddedMediaPlayer implements VideoPlayer, CloseHandler<PopupPanel>, MediaSynchAdapter {
@@ -11,11 +11,11 @@ import com.google.gwt.user.client.ui.SimplePanel;
import com.sap.sailing.domain.common.media.MediaTrack;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.MediaServiceAsync;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.media.popup.PopupWindowPlayer.PopupCloseListener;
import com.sap.sailing.gwt.ui.client.media.shared.AbstractMediaPlayer;
import com.sap.sailing.gwt.ui.client.media.shared.VideoPlayer;
import com.sap.sse.gwt.client.dialog.WindowBox;
import com.sap.sse.gwt.client.player.Timer;
public class YoutubeEmbeddedPlayer extends AbstractMediaPlayer implements VideoPlayer, CloseHandler<PopupPanel>, MediaSynchAdapter {
@@ -41,12 +41,12 @@ import com.sap.sailing.gwt.ui.client.DetailTypeFormatter;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimeListener;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.shared.components.AbstractLazyComponent;
import com.sap.sailing.gwt.ui.client.shared.components.Component;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.TimeListener;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
/**
* A base class for a leaderboard chart showing competitor data for all race columns of a leaderboard.
@@ -50,13 +50,13 @@ import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimeRangeWithZoomProvider;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.shared.components.Component;
import com.sap.sailing.gwt.ui.shared.CompetitorRaceDataDTO;
import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.TimeRangeWithZoomProvider;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
/**
* AbstractCompetitorChart is a chart that can show one sort of competitor data (e.g. current speed over ground, windward
@@ -491,7 +491,7 @@ public abstract class AbstractCompetitorRaceChart<SettingsType extends ChartSett
if (oldReversedYAxis != hasReversedYAxis(selectedDetailType)) {
chart = createChart();
if (isZoomed) {
Pair<Date, Date> zoomRange = timeRangeWithZoomProvider.getTimeZoom();
com.sap.sse.common.Pair<Date, Date> zoomRange = timeRangeWithZoomProvider.getTimeZoom();
onTimeZoomChanged(zoomRange.getA(), zoomRange.getB());
} else {
resetMinMaxAndExtremesInterval(/* redraw */ true);
@@ -13,18 +13,17 @@ import org.moxieapps.gwt.highcharts.client.events.ChartSelectionEvent;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.ui.SimplePanel;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimeListener;
import com.sap.sailing.gwt.ui.client.TimeRangeChangeListener;
import com.sap.sailing.gwt.ui.client.TimeRangeWithZoomProvider;
import com.sap.sailing.gwt.ui.client.TimeZoomChangeListener;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.TimeListener;
import com.sap.sse.gwt.client.player.TimeRangeChangeListener;
import com.sap.sse.gwt.client.player.TimeRangeWithZoomProvider;
import com.sap.sse.gwt.client.player.TimeZoomChangeListener;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
public abstract class AbstractRaceChart extends SimplePanel implements RaceSelectionChangeListener,
TimeListener, TimeZoomChangeListener, TimeRangeChangeListener {
@@ -137,7 +136,7 @@ public abstract class AbstractRaceChart extends SimplePanel implements RaceSelec
protected void setSeriesPoints(Series series, Point[] points) {
if (timeRangeWithZoomProvider.isZoomed()) {
Pair<Date, Date> timeZoom = timeRangeWithZoomProvider.getTimeZoom();
com.sap.sse.common.Pair<Date, Date> timeZoom = timeRangeWithZoomProvider.getTimeZoom();
resetMinMaxAndExtremesInterval(/* redraw */ false);
series.setPoints(points, false);
changeMinMaxAndExtremesInterval(timeZoom.getA(), timeZoom.getB(), /* redraw */ false);
@@ -5,9 +5,9 @@ import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.Timer;
public class MultiCompetitorLeaderboardChart extends AbstractCompetitorLeaderboardChart<MultiCompetitorLeaderboardChartSettings> {
private MultiCompetitorLeaderboardChartSettings settings;
@@ -7,12 +7,12 @@ import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimeRangeWithZoomProvider;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.shared.components.Component;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.TimeRangeWithZoomProvider;
import com.sap.sse.gwt.client.player.Timer;
/**
* MultiCompetitorRaceChart is a GWT panel that can show competitor data (e.g. current speed over ground, windward distance to
@@ -48,9 +48,6 @@ import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimeRangeWithZoomProvider;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.shared.components.Component;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
import com.sap.sailing.gwt.ui.client.WindSourceTypeFormatter;
@@ -58,6 +55,9 @@ import com.sap.sailing.gwt.ui.shared.WindDTO;
import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO;
import com.sap.sailing.gwt.ui.shared.WindTrackInfoDTO;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.TimeRangeWithZoomProvider;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
public class WindChart extends AbstractRaceChart implements Component<WindChartSettings>, RequiresResize {
public static final String LODA_WIND_CHART_DATA_CATEGORY = "loadWindChartData";
@@ -81,9 +81,6 @@ import com.sap.sailing.gwt.ui.client.RaceTimesInfoProviderListener;
import com.sap.sailing.gwt.ui.client.RequiresDataInitialization;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimeListener;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayStates;
import com.sap.sailing.gwt.ui.client.WindSourceTypeFormatter;
import com.sap.sailing.gwt.ui.client.shared.components.Component;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
@@ -105,6 +102,9 @@ import com.sap.sailing.gwt.ui.shared.WindTrackInfoDTO;
import com.sap.sailing.gwt.ui.shared.racemap.GoogleMapAPIKey;
import com.sap.sailing.gwt.ui.shared.racemap.GoogleMapStyleHelper;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.TimeListener;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayStates;
public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSelectionChangeListener, RaceSelectionChangeListener,
RaceTimesInfoProviderListener, TailFactory, Component<RaceMapSettings>, RequiresDataInitialization, RequiresResize {
@@ -12,11 +12,11 @@ import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimeListener;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.shared.components.Component;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialog;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.TimeListener;
import com.sap.sse.gwt.client.player.Timer;
/**
* A base class for a leaderboard viewer.
@@ -30,12 +30,12 @@ import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
import com.sap.sailing.gwt.ui.client.SailingService;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.URLEncoder;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings.RaceColumnSelectionStrategies;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
import com.sap.sse.gwt.server.GwtHttpRequestUtils;
@@ -74,15 +74,10 @@ import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.FlagImageResolver;
import com.sap.sailing.gwt.ui.client.PlayStateListener;
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.TimeListener;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.Timer.PlayStates;
import com.sap.sailing.gwt.ui.client.shared.components.Component;
import com.sap.sailing.gwt.ui.client.shared.components.IsEmbeddableComponent;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
@@ -93,6 +88,11 @@ import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.controls.busyindicator.BusyIndicator;
import com.sap.sse.gwt.client.controls.busyindicator.SimpleBusyIndicator;
import com.sap.sse.gwt.client.player.PlayStateListener;
import com.sap.sse.gwt.client.player.TimeListener;
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;
/**
@@ -1666,7 +1666,7 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS
/**
* The time point for which the leaderboard currently shows results. In {@link PlayModes#Replay replay mode} this is
* the {@link #timer}'s time point. In {@link PlayModes#Live live mode} the {@link #timer}'s time is quantizes to
* the {@link #timer}'s time point. In {@link PlayModes#Live live mode} the {@link #timer}'s time is quantized to
* the closest full second to increase the likelihood of cache hits in the back end.
*/
protected Date getLeaderboardDisplayDate() {
@@ -5,8 +5,8 @@ import java.util.Collections;
import java.util.List;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings.RaceColumnSelectionStrategies;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
/**
* A factory class creating leaderboard settings for different contexts (user role, live or replay mode, etc.
@@ -11,10 +11,10 @@ import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.shared.charts.MultiCompetitorLeaderboardChart;
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.useragent.UserAgentDetails;
/**
@@ -9,10 +9,10 @@ import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.shared.charts.MultiCompetitorLeaderboardChart;
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.useragent.UserAgentDetails;
/**
@@ -22,11 +22,11 @@ import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimeListener;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.shared.components.AbstractLazyComponent;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.TimeListener;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.useragent.UserAgentDetails;
/**
@@ -27,14 +27,14 @@ import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
import com.sap.sailing.gwt.ui.client.SailingService;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.UserManagementService;
import com.sap.sailing.gwt.ui.client.UserManagementServiceAsync;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sailing.gwt.ui.shared.UserDTO;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
import com.sap.sse.gwt.client.useragent.UserAgentChecker;
import com.sap.sse.gwt.server.GwtHttpRequestUtils;
@@ -39,9 +39,6 @@ import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.RegattaDisplayer;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimeListener;
import com.sap.sailing.gwt.ui.client.TimeRangeWithZoomModel;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.shared.charts.MultiCompetitorRaceChart;
import com.sap.sailing.gwt.ui.client.shared.charts.WindChart;
import com.sap.sailing.gwt.ui.client.shared.charts.WindChartSettings;
@@ -71,6 +68,9 @@ import com.sap.sse.common.filter.Filter;
import com.sap.sse.common.filter.FilterSet;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
import com.sap.sse.gwt.client.player.TimeListener;
import com.sap.sse.gwt.client.player.TimeRangeWithZoomModel;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.useragent.UserAgentDetails;
/**
@@ -27,10 +27,6 @@ import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimeListener;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.Timer.PlayStates;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialog;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings;
@@ -41,6 +37,10 @@ import com.sap.sailing.gwt.ui.shared.RaceGroupDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
import com.sap.sse.gwt.client.player.TimeListener;
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;
public class RegattaOverviewPanel extends SimplePanel {
@@ -51,7 +51,6 @@ import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.GwtJsonDeSerializer;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.shared.components.Component;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
import com.sap.sailing.gwt.ui.shared.ClickableSafeHtmlCell;
@@ -64,6 +63,7 @@ import com.sap.sailing.gwt.ui.shared.RaceInfoDTO;
import com.sap.sailing.gwt.ui.shared.RegattaOverviewEntryDTO;
import com.sap.sailing.gwt.ui.shared.WaypointDTO;
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
import com.sap.sse.gwt.client.player.Timer;
/**
* This component shows a table displaying the current state of races for a given event.
@@ -13,7 +13,7 @@ import com.sap.sailing.domain.common.dto.NamedDTO;
import com.sap.sailing.domain.common.dto.PlacemarkDTO;
import com.sap.sailing.domain.common.dto.PlacemarkOrderDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sse.gwt.client.player.Timer;
public class LeaderboardGroupDTO extends NamedDTO {
private static final long serialVersionUID = -2923229069598593687L;
@@ -6,7 +6,7 @@ import java.util.List;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sse.gwt.client.player.Timer;
public class RaceTimesInfoDTO implements IsSerializable {
private RegattaAndRaceIdentifier raceIdentifier;
@@ -16,9 +16,9 @@ import com.sap.sailing.domain.common.Mile;
import com.sap.sailing.domain.common.Named;
import com.sap.sailing.domain.common.dto.PositionDTO;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.shared.SimulatorWindDTO;
import com.sap.sailing.gwt.ui.shared.WindFieldGenParamsDTO;
import com.sap.sse.gwt.client.player.Timer;
/**
* This class implements the layer which displays the optimal path on the path. Currently there is a single path to be
@@ -6,9 +6,9 @@ import java.util.List;
import java.util.logging.Logger;
import com.google.gwt.maps.client.MapWidget;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.shared.SimulatorWindDTO;
import com.sap.sailing.gwt.ui.shared.WindFieldGenParamsDTO;
import com.sap.sse.gwt.client.player.Timer;
public class ReplayPathCanvasOverlay extends PathCanvasOverlay {
@@ -48,10 +48,6 @@ import com.sap.sailing.gwt.ui.client.SimulatorServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimePanel;
import com.sap.sailing.gwt.ui.client.TimePanelSettings;
import com.sap.sailing.gwt.ui.client.TimeRangeWithZoomModel;
import com.sap.sailing.gwt.ui.client.TimeRangeWithZoomProvider;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.shared.BoatClassDTOsAndNotificationMessage;
import com.sap.sailing.gwt.ui.shared.PolarDiagramDTOAndNotificationMessage;
import com.sap.sailing.gwt.ui.shared.SimulatorUISelectionDTO;
@@ -62,6 +58,10 @@ import com.sap.sailing.gwt.ui.simulator.windpattern.WindPatternSetting;
import com.sap.sailing.simulator.util.SailingSimulatorConstants;
import com.sap.sse.gwt.client.controls.busyindicator.SimpleBusyIndicator;
import com.sap.sse.gwt.client.controls.slider.SliderBar;
import com.sap.sse.gwt.client.player.TimeRangeWithZoomModel;
import com.sap.sse.gwt.client.player.TimeRangeWithZoomProvider;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
public class SimulatorMainPanel extends SimplePanel {
@@ -40,7 +40,6 @@ import com.sap.sailing.gwt.ui.client.SimulatorServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.TimePanel;
import com.sap.sailing.gwt.ui.client.TimePanelSettings;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.shared.PathDTO;
import com.sap.sailing.gwt.ui.shared.SimulatorResultsDTO;
import com.sap.sailing.gwt.ui.shared.SimulatorUISelectionDTO;
@@ -54,6 +53,7 @@ import com.sap.sailing.gwt.ui.simulator.util.SimulatorResources;
import com.sap.sailing.gwt.ui.simulator.windpattern.WindPatternDisplay;
import com.sap.sailing.simulator.util.SailingSimulatorConstants;
import com.sap.sse.gwt.client.controls.busyindicator.SimpleBusyIndicator;
import com.sap.sse.gwt.client.player.Timer;
/**
* This class implements simulation visualization using overlays on top of a Google maps widget
@@ -3,7 +3,7 @@
*/
package com.sap.sailing.gwt.ui.simulator;
import com.sap.sailing.gwt.ui.client.TimeListener;
import com.sap.sse.gwt.client.player.TimeListener;
/**
* A time listener that can be asked whether the timer shall be stopped.
@@ -15,12 +15,12 @@ import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.maps.client.MapWidget;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.shared.SimulatorWindDTO;
import com.sap.sailing.gwt.ui.shared.WindFieldDTO;
import com.sap.sailing.gwt.ui.shared.WindFieldGenParamsDTO;
import com.sap.sailing.gwt.ui.simulator.racemap.FullCanvasOverlay;
import com.sap.sailing.gwt.ui.simulator.util.ToolTip;
import com.sap.sse.gwt.client.player.Timer;
/**
* A google map overlay based on a HTML5 canvas for drawing a wind field. The overlay covers the whole map and displays
@@ -20,11 +20,11 @@ import com.google.gwt.maps.client.base.LatLng;
import com.google.gwt.maps.client.base.Point;
import com.sap.sailing.domain.common.dto.PositionDTO;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.shared.SimulatorWindDTO;
import com.sap.sailing.gwt.ui.shared.WindFieldDTO;
import com.sap.sailing.gwt.ui.simulator.racemap.FullCanvasOverlay;
import com.sap.sailing.gwt.ui.simulator.util.WindGridColorPalette;
import com.sap.sse.gwt.client.player.Timer;
/**
* A google map overlay based on a HTML5 canvas for representing a wind field as a heat map. The overlay covers the
@@ -17,10 +17,10 @@ import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.base.LatLng;
import com.google.gwt.maps.client.base.Point;
import com.sap.sailing.domain.common.dto.PositionDTO;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.shared.WindLinesDTO;
import com.sap.sailing.gwt.ui.simulator.racemap.FullCanvasOverlay;
import com.sap.sailing.gwt.ui.simulator.util.LineSegment;
import com.sap.sse.gwt.client.player.Timer;
public class WindLineCanvasOverlay extends FullCanvasOverlay implements TimeListenerWithStoppingCriteria {
@@ -17,11 +17,11 @@ import com.google.gwt.maps.client.base.LatLng;
import com.google.gwt.maps.client.base.Point;
import com.sap.sailing.domain.common.dto.PositionDTO;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.shared.SimulatorWindDTO;
import com.sap.sailing.gwt.ui.shared.WindFieldDTO;
import com.sap.sailing.gwt.ui.simulator.racemap.FullCanvasOverlay;
import com.sap.sailing.gwt.ui.simulator.util.ToolTip;
import com.sap.sse.gwt.client.player.Timer;
/**
* A google map overlay based on a HTML5 canvas for drawing a wind field. The overlay covers the whole map and displays
@@ -10,11 +10,11 @@ import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.maps.client.base.LatLng;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.shared.SimulatorWindDTO;
import com.sap.sailing.gwt.ui.shared.WindFieldDTO;
import com.sap.sailing.gwt.ui.shared.WindFieldGenParamsDTO;
import com.sap.sailing.gwt.ui.simulator.racemap.FullCanvasOverlay;
import com.sap.sse.gwt.client.player.Timer;
/**
* A google map overlay based on a HTML5 canvas for drawing a wind field. The overlay covers the whole map and displays
@@ -46,11 +46,11 @@ import com.sap.sailing.gwt.ui.adminconsole.LeaderboardConfigPanel.AnchorCell;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.URLEncoder;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
/**
* An overview panel for sailing events
@@ -44,12 +44,12 @@ import com.sap.sailing.gwt.ui.adminconsole.LeaderboardConfigPanel.AnchorCell;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.URLEncoder;
import com.sap.sailing.gwt.ui.client.shared.components.CollapsablePanel;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
/**
*
@@ -39,14 +39,14 @@ import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.HasWelcomeWidget;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.client.shared.panels.WelcomeWidget;
import com.sap.sailing.gwt.ui.raceboard.RaceBoardViewConfiguration;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.SeriesDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
public class LeaderboardGroupPanel extends SimplePanel implements HasWelcomeWidget {
@@ -24,8 +24,6 @@ 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.Timer;
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettingsFactory;
@@ -33,6 +31,8 @@ import com.sap.sailing.gwt.ui.raceboard.RaceBoardPanel;
import com.sap.sailing.gwt.ui.raceboard.RaceBoardViewConfiguration;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
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.useragent.UserAgentDetails;
public class TVViewController implements RaceTimesInfoProviderListener {