mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-30 09:26:44 +00:00
Merge remote-tracking branch 'origin/timeMinMaxModel'
This commit is contained in:
+5
-5
@@ -18,8 +18,8 @@ public class RaceTimePanel extends TimePanel<RaceTimePanelSettings> implements R
|
||||
private boolean autoAdjustPlayMode;
|
||||
private RaceTimesInfoDTO lastRaceTimesInfo;
|
||||
|
||||
public RaceTimePanel(Timer timer, StringMessages stringMessages, RaceTimesInfoProvider raceTimesInfoProvider) {
|
||||
super(timer, stringMessages);
|
||||
public RaceTimePanel(Timer timer, TimeRangeProvider timeRangeProvider, StringMessages stringMessages, RaceTimesInfoProvider raceTimesInfoProvider) {
|
||||
super(timer, timeRangeProvider, stringMessages);
|
||||
this.raceTimesInfoProvider = raceTimesInfoProvider;
|
||||
selectedRace = null;
|
||||
autoAdjustPlayMode = true;
|
||||
@@ -66,7 +66,7 @@ public class RaceTimePanel extends TimePanel<RaceTimePanelSettings> implements R
|
||||
timer.setPlayMode(PlayModes.Live);
|
||||
}
|
||||
|
||||
boolean timerAlreadyInitialized = getMin() != null && getMax() != null && timeSlider.getCurrentValue() != null;
|
||||
boolean timerAlreadyInitialized = getFromTime() != null && getToTime() != null && timeSlider.getCurrentValue() != null;
|
||||
if (!isTimeZoomed) {
|
||||
updateMinMax(raceTimesInfo);
|
||||
if (!timerAlreadyInitialized) {
|
||||
@@ -83,7 +83,7 @@ public class RaceTimePanel extends TimePanel<RaceTimePanelSettings> implements R
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimeZoom(Date zoomStartTimepoint, Date zoomEndTimepoint) {
|
||||
public void onTimeZoomChanged(Date zoomStartTimepoint, Date zoomEndTimepoint) {
|
||||
isTimeZoomed = true;
|
||||
timeSlider.setZoomed(true);
|
||||
timer.setAutoAdvance(false);
|
||||
@@ -151,7 +151,7 @@ public class RaceTimePanel extends TimePanel<RaceTimePanelSettings> implements R
|
||||
Date max = raceMinMax.getB();
|
||||
|
||||
// never reduce max if it was already set
|
||||
if (min != null && max != null && (getMax() == null || getMax().before(max))) {
|
||||
if (min != null && max != null && (getToTime() == null || getToTime().before(max))) {
|
||||
setMinMax(min, max, /* fireEvent */ false); // no event because we guarantee time to be between min and max
|
||||
}
|
||||
}
|
||||
|
||||
+36
-37
@@ -31,23 +31,10 @@ import com.sap.sailing.gwt.ui.shared.controls.slider.SliderBar;
|
||||
import com.sap.sailing.gwt.ui.shared.controls.slider.TimeSlider;
|
||||
|
||||
public class TimePanel<T extends TimePanelSettings> extends FormPanel implements Component<T>, TimeListener, TimeZoomChangeListener,
|
||||
PlayStateListener, RequiresResize {
|
||||
TimeRangeChangeListener, PlayStateListener, RequiresResize {
|
||||
protected final Timer timer;
|
||||
protected boolean isTimeZoomed;
|
||||
|
||||
/**
|
||||
* The start time point of the time interval visualized by this time panel. May be <code>null</code> if not yet initialized.
|
||||
*
|
||||
* @see #setMinMax(Date, Date, boolean)
|
||||
*/
|
||||
private Date min;
|
||||
|
||||
/**
|
||||
* The end time point of the time interval visualized by this time panel. May be <code>null</code> if not yet initialized.
|
||||
*
|
||||
* @see #setMinMax(Date, Date, boolean)
|
||||
*/
|
||||
private Date max;
|
||||
protected final TimeRangeProvider timeRangeProvider;
|
||||
|
||||
private final IntegerBox playSpeedBox;
|
||||
private final Label timeDelayLabel;
|
||||
@@ -67,7 +54,7 @@ public class TimePanel<T extends TimePanelSettings> extends FormPanel implements
|
||||
private final Image playModeImage;
|
||||
protected Date lastReceivedDataTimepoint;
|
||||
private final Button slowDownButton;
|
||||
private final Button speedUpButton;
|
||||
private final Button speedUpButton;
|
||||
|
||||
/**
|
||||
* The live delay may be adjusted automatically if the server decides so. However, if the user explicitly sets a live delay,
|
||||
@@ -96,12 +83,14 @@ public class TimePanel<T extends TimePanelSettings> extends FormPanel implements
|
||||
}
|
||||
}
|
||||
|
||||
public TimePanel(Timer timer, StringMessages stringMessages) {
|
||||
public TimePanel(Timer timer, TimeRangeProvider timeRangeProvider, StringMessages stringMessages) {
|
||||
this.timer = timer;
|
||||
this.timeRangeProvider = timeRangeProvider;
|
||||
this.stringMessages = stringMessages;
|
||||
isTimeZoomed = false;
|
||||
timer.addTimeListener(this);
|
||||
timer.addPlayStateListener(this);
|
||||
timer.addPlayStateListener(this);
|
||||
timeRangeProvider.addTimeRangeChangeListener(this);
|
||||
userExplicitlyChangedLivePlayDelay = false;
|
||||
FlowPanel timePanelInnerWrapper = new FlowPanel();
|
||||
timePanelInnerWrapper.setStyleName("timePanelInnerWrapper");
|
||||
@@ -296,16 +285,21 @@ public class TimePanel<T extends TimePanelSettings> extends FormPanel implements
|
||||
|
||||
@Override
|
||||
public void timeChanged(Date time) {
|
||||
if (getMin() != null && getMax() != null) {
|
||||
// Handle also the case where time advances beyond slider's end.
|
||||
// Handle it equally for replay and live mode for robustness reasons. This at least allows a user
|
||||
// to watch on even if the time panel was off in its assumptions about race end and end of tracking.
|
||||
if (time.after(getMax())) {
|
||||
Date newMaxTime = new Date(time.getTime());
|
||||
if (newMaxTime.getTime() - getMax().getTime() < MINIMUM_AUTO_ADVANCE_TIME_IN_MS) {
|
||||
newMaxTime.setTime(getMax().getTime() + MINIMUM_AUTO_ADVANCE_TIME_IN_MS);
|
||||
if (getFromTime() != null && getToTime() != null) {
|
||||
// handle the case where time advances beyond slider's end.
|
||||
if (time.after(getToTime())) {
|
||||
switch (timer.getPlayMode()) {
|
||||
case Live:
|
||||
Date newMaxTime = new Date(time.getTime());
|
||||
if (newMaxTime.getTime() - getToTime().getTime() < MINIMUM_AUTO_ADVANCE_TIME_IN_MS) {
|
||||
newMaxTime.setTime(getToTime().getTime() + MINIMUM_AUTO_ADVANCE_TIME_IN_MS);
|
||||
}
|
||||
setMinMax(getFromTime(), newMaxTime, /* fireEvent */ false); // no event because we guarantee that time is between min/max
|
||||
break;
|
||||
case Replay:
|
||||
timer.stop();
|
||||
break;
|
||||
}
|
||||
setMinMax(getMin(), newMaxTime, /* fireEvent */ false); // no event because we guarantee that time is between min/max
|
||||
}
|
||||
long t = time.getTime();
|
||||
timeSlider.setCurrentValue(new Double(t), false);
|
||||
@@ -318,12 +312,12 @@ public class TimePanel<T extends TimePanelSettings> extends FormPanel implements
|
||||
}
|
||||
}
|
||||
|
||||
protected Date getMin() {
|
||||
return min;
|
||||
protected Date getFromTime() {
|
||||
return timeRangeProvider.getFromTime();
|
||||
}
|
||||
|
||||
protected Date getMax() {
|
||||
return max;
|
||||
protected Date getToTime() {
|
||||
return timeRangeProvider.getToTime();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -334,20 +328,20 @@ public class TimePanel<T extends TimePanelSettings> extends FormPanel implements
|
||||
assert min != null && max != null;
|
||||
|
||||
boolean changed = false;
|
||||
if (!max.equals(this.max)) {
|
||||
if (!max.equals(timeRangeProvider.getToTime())) {
|
||||
changed = true;
|
||||
this.max = max;
|
||||
timeSlider.setMaxValue(new Double(max.getTime()), fireEvent);
|
||||
}
|
||||
if (!min.equals(this.min)) {
|
||||
if (!min.equals(timeRangeProvider.getFromTime())) {
|
||||
changed = true;
|
||||
this.min = min;
|
||||
timeSlider.setMinValue(new Double(min.getTime()), fireEvent);
|
||||
if (timeSlider.getCurrentValue() == null) {
|
||||
timeSlider.setCurrentValue(new Double(min.getTime()), fireEvent);
|
||||
}
|
||||
}
|
||||
if (changed) {
|
||||
timeRangeProvider.setTimeRange(min, max, this);
|
||||
|
||||
int numSteps = timeSlider.getElement().getClientWidth();
|
||||
if (numSteps > 0) {
|
||||
timeSlider.setStepSize(numSteps, fireEvent);
|
||||
@@ -379,6 +373,7 @@ public class TimePanel<T extends TimePanelSettings> extends FormPanel implements
|
||||
case Paused:
|
||||
playPauseButton.getElement().removeClassName("playPauseButtonPause");
|
||||
case Stopped:
|
||||
playPauseButton.getElement().removeClassName("playPauseButtonPause");
|
||||
playModeImage.setResource(playModeInactiveImg);
|
||||
break;
|
||||
}
|
||||
@@ -406,13 +401,17 @@ public class TimePanel<T extends TimePanelSettings> extends FormPanel implements
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimeZoom(Date zoomStartTimepoint, Date zoomEndTimepoint) {
|
||||
public void onTimeZoomChanged(Date zoomStartTimepoint, Date zoomEndTimepoint) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimeZoomReset() {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onTimeRangeChanged(Date fromTime, Date toTime) {
|
||||
}
|
||||
|
||||
protected boolean isLiveModeToBeMadePossible() {
|
||||
return false;
|
||||
}
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
package com.sap.sailing.gwt.ui.client;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
public interface TimeRangeChangeListener {
|
||||
void onTimeRangeChanged(Date fromTime, Date toTime);
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
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();
|
||||
}
|
||||
+3
-3
@@ -7,14 +7,14 @@ import java.util.Set;
|
||||
|
||||
import com.sap.sailing.domain.common.impl.Util.Pair;
|
||||
|
||||
public class TimeZoomModel implements TimeZoomProvider {
|
||||
public class TimeRangeWithZoomModel extends TimeRangeModel implements TimeRangeWithZoomProvider {
|
||||
private Date zoomStartTimepoint;
|
||||
private Date zoomEndTimepoint;
|
||||
private boolean isTimeZoomed;
|
||||
|
||||
private final Set<TimeZoomChangeListener> listeners;
|
||||
|
||||
public TimeZoomModel() {
|
||||
public TimeRangeWithZoomModel() {
|
||||
isTimeZoomed = false;
|
||||
listeners = new HashSet<TimeZoomChangeListener>();
|
||||
}
|
||||
@@ -35,7 +35,7 @@ public class TimeZoomModel implements TimeZoomProvider {
|
||||
this.isTimeZoomed = true;
|
||||
for (TimeZoomChangeListener listener : listeners) {
|
||||
if (listenersNotToNotify == null || !Arrays.asList(listenersNotToNotify).contains(listener)) {
|
||||
listener.onTimeZoom(zoomStartTimepoint, zoomEndTimepoint);
|
||||
listener.onTimeZoomChanged(zoomStartTimepoint, zoomEndTimepoint);
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -4,7 +4,7 @@ import java.util.Date;
|
||||
|
||||
import com.sap.sailing.domain.common.impl.Util.Pair;
|
||||
|
||||
public interface TimeZoomProvider {
|
||||
public interface TimeRangeWithZoomProvider extends TimeRangeProvider {
|
||||
|
||||
public void addTimeZoomChangeListener(TimeZoomChangeListener listener);
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ import java.util.Date;
|
||||
|
||||
public interface TimeZoomChangeListener {
|
||||
|
||||
void onTimeZoom(Date zoomStartTimepoint, Date zoomEndTimepoint);
|
||||
void onTimeZoomChanged(Date zoomStartTimepoint, Date zoomEndTimepoint);
|
||||
|
||||
void onTimeZoomReset();
|
||||
}
|
||||
|
||||
+2
-8
@@ -18,10 +18,9 @@ import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
|
||||
import com.sap.sailing.gwt.ui.client.ErrorReporter;
|
||||
import com.sap.sailing.gwt.ui.client.RaceSelectionModel;
|
||||
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
|
||||
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
|
||||
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.client.TimeZoomModel;
|
||||
import com.sap.sailing.gwt.ui.client.TimeRangeWithZoomModel;
|
||||
import com.sap.sailing.gwt.ui.client.Timer;
|
||||
import com.sap.sailing.gwt.ui.shared.charts.MultiChartPanel;
|
||||
import com.sap.sailing.gwt.ui.shared.charts.MultiChartSettings;
|
||||
@@ -37,8 +36,6 @@ public class CompareCompetitorsChartDialog extends DialogBoxExt {
|
||||
private final RaceSelectionProvider raceSelectionProvider;
|
||||
|
||||
private final MultiChartPanel multiChartPanel;
|
||||
|
||||
private final RaceTimesInfoProvider raceTimesInfoProvider;
|
||||
|
||||
final ListBox racesListBox;
|
||||
|
||||
@@ -54,12 +51,9 @@ public class CompareCompetitorsChartDialog extends DialogBoxExt {
|
||||
raceSelectionProvider = new RaceSelectionModel();
|
||||
raceSelectionProvider.setAllRaces(races);
|
||||
|
||||
raceTimesInfoProvider = new RaceTimesInfoProvider(sailingService, errorReporter, races, 1000l);
|
||||
|
||||
multiChartPanel = new MultiChartPanel(sailingService, new AsyncActionsExecutor(), competitorSelectionProvider, raceSelectionProvider,
|
||||
timer, new TimeZoomModel(), stringConstants, errorReporter, false, false);
|
||||
timer, new TimeRangeWithZoomModel(), stringConstants, errorReporter, false, false);
|
||||
multiChartPanel.setSize("100%", "100%");
|
||||
raceTimesInfoProvider.addRaceTimesInfoProviderListener(multiChartPanel);
|
||||
|
||||
VerticalPanel contentPanel = new VerticalPanel();
|
||||
contentPanel.setSize("100%", "100%");
|
||||
|
||||
+7
-9
@@ -33,7 +33,7 @@ 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.TimeZoomModel;
|
||||
import com.sap.sailing.gwt.ui.client.TimeRangeWithZoomModel;
|
||||
import com.sap.sailing.gwt.ui.client.Timer;
|
||||
import com.sap.sailing.gwt.ui.client.UserAgentDetails;
|
||||
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel;
|
||||
@@ -84,7 +84,7 @@ public class RaceBoardPanel extends FormPanel implements RegattaDisplayer, RaceS
|
||||
private final RaceSelectionProvider raceSelectionProvider;
|
||||
private final UserAgentDetails userAgent;
|
||||
private final CompetitorSelectionModel competitorSelectionModel;
|
||||
private final TimeZoomModel timeZoomModel;
|
||||
private final TimeRangeWithZoomModel timeRangeWithZoomModel;
|
||||
private final RegattaAndRaceIdentifier selectedRaceIdentifier;
|
||||
|
||||
private LeaderboardPanel leaderboardPanel;
|
||||
@@ -123,7 +123,7 @@ public class RaceBoardPanel extends FormPanel implements RegattaDisplayer, RaceS
|
||||
setWidget(mainPanel);
|
||||
|
||||
this.timer = timer;
|
||||
timeZoomModel = new TimeZoomModel();
|
||||
timeRangeWithZoomModel = new TimeRangeWithZoomModel();
|
||||
componentViewers = new ArrayList<ComponentViewer>();
|
||||
competitorSelectionModel = new CompetitorSelectionModel(/* hasMultiSelection */ true);
|
||||
|
||||
@@ -138,8 +138,8 @@ public class RaceBoardPanel extends FormPanel implements RegattaDisplayer, RaceS
|
||||
break;
|
||||
}
|
||||
|
||||
timePanel = new RaceTimePanel(timer, stringMessages, raceTimesInfoProvider);
|
||||
timeZoomModel.addTimeZoomChangeListener(timePanel);
|
||||
timePanel = new RaceTimePanel(timer, timeRangeWithZoomModel, stringMessages, raceTimesInfoProvider);
|
||||
timeRangeWithZoomModel.addTimeZoomChangeListener(timePanel);
|
||||
raceTimesInfoProvider.addRaceTimesInfoProviderListener(timePanel);
|
||||
raceSelectionProvider.addRaceSelectionChangeListener(timePanel);
|
||||
timePanel.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
|
||||
@@ -155,16 +155,14 @@ public class RaceBoardPanel extends FormPanel implements RegattaDisplayer, RaceS
|
||||
List<Component<?>> components = new ArrayList<Component<?>>();
|
||||
|
||||
competitorChart = new MultiChartPanel(sailingService, asyncActionsExecutor, competitorSelectionModel, raceSelectionProvider,
|
||||
timer, timeZoomModel, stringMessages, errorReporter, true, true);
|
||||
timer, timeRangeWithZoomModel, stringMessages, errorReporter, true, true);
|
||||
competitorChart.setVisible(false);
|
||||
raceTimesInfoProvider.addRaceTimesInfoProviderListener(competitorChart);
|
||||
competitorChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
|
||||
components.add(competitorChart);
|
||||
|
||||
windChart = new WindChart(sailingService, raceSelectionProvider, timer, timeZoomModel, new WindChartSettings(),
|
||||
windChart = new WindChart(sailingService, raceSelectionProvider, timer, timeRangeWithZoomModel, new WindChartSettings(),
|
||||
stringMessages, asyncActionsExecutor, errorReporter, /* compactChart */ true);
|
||||
windChart.setVisible(false);
|
||||
raceTimesInfoProvider.addRaceTimesInfoProviderListener(windChart);
|
||||
windChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
|
||||
components.add(windChart);
|
||||
|
||||
|
||||
+7
-9
@@ -47,7 +47,7 @@ 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.TimeZoomProvider;
|
||||
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.CompetitorDTO;
|
||||
@@ -88,9 +88,9 @@ implements CompetitorSelectionChangeListener, RequiresResize {
|
||||
|
||||
public AbstractChartPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
|
||||
CompetitorSelectionProvider competitorSelectionProvider, RaceSelectionProvider raceSelectionProvider,
|
||||
Timer timer, TimeZoomProvider timeZoomProvider, final StringMessages stringMessages, ErrorReporter errorReporter, DetailType dataToShow,
|
||||
Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, final StringMessages stringMessages, ErrorReporter errorReporter, DetailType dataToShow,
|
||||
boolean compactChart, boolean allowTimeAdjust) {
|
||||
super(sailingService, timer, timeZoomProvider, stringMessages, asyncActionsExecutor, errorReporter);
|
||||
super(sailingService, timer, timeRangeWithZoomProvider, stringMessages, asyncActionsExecutor, errorReporter);
|
||||
this.competitorSelectionProvider = competitorSelectionProvider;
|
||||
this.dataToShow = dataToShow;
|
||||
this.compactChart = compactChart;
|
||||
@@ -107,8 +107,6 @@ implements CompetitorSelectionChangeListener, RequiresResize {
|
||||
|
||||
competitorSelectionProvider.addCompetitorSelectionChangeListener(this);
|
||||
raceSelectionProvider.addRaceSelectionChangeListener(this);
|
||||
timer.addTimeListener(this);
|
||||
timeZoomProvider.addTimeZoomChangeListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -243,14 +241,14 @@ implements CompetitorSelectionChangeListener, RequiresResize {
|
||||
if (!chartData.contains(competitor)) {
|
||||
dataQuery.add(new Pair<Date, CompetitorDTO>(new Date(0), competitor));
|
||||
} else if (competitorDateOfNewestData.before(chartDataDateOfNewestData)
|
||||
|| competitorDateOfNewestData.before(maxTimepoint)) {
|
||||
|| competitorDateOfNewestData.before(timeRangeWithZoomProvider.getToTime())) {
|
||||
dataQuery.add(new Pair<Date, CompetitorDTO>(new Date(competitorDateOfNewestData.getTime()
|
||||
+ getStepSize()), competitor));
|
||||
}
|
||||
}
|
||||
|
||||
GetCompetitorsRaceDataAction getCompetitorsRaceDataAction = new GetCompetitorsRaceDataAction(
|
||||
sailingService, selectedRaceIdentifier, dataQuery, maxTimepoint, getStepSize(),
|
||||
sailingService, selectedRaceIdentifier, dataQuery, timeRangeWithZoomProvider.getToTime(), getStepSize(),
|
||||
getDataToShow(), new AsyncCallback<MultiCompetitorRaceDataDTO>() {
|
||||
|
||||
@Override
|
||||
@@ -273,8 +271,8 @@ implements CompetitorSelectionChangeListener, RequiresResize {
|
||||
}
|
||||
}
|
||||
}
|
||||
chart.getXAxis().setMin(minTimepoint.getTime());
|
||||
chart.getXAxis().setMax(maxTimepoint.getTime());
|
||||
chart.getXAxis().setMin(timeRangeWithZoomProvider.getFromTime().getTime());
|
||||
chart.getXAxis().setMax(timeRangeWithZoomProvider.getToTime().getTime());
|
||||
|
||||
drawChartData();
|
||||
chart.redraw();
|
||||
|
||||
+3
-3
@@ -7,7 +7,7 @@ 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.TimeZoomProvider;
|
||||
import com.sap.sailing.gwt.ui.client.TimeRangeWithZoomProvider;
|
||||
import com.sap.sailing.gwt.ui.client.Timer;
|
||||
import com.sap.sailing.gwt.ui.shared.components.Component;
|
||||
import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent;
|
||||
@@ -27,9 +27,9 @@ import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent;
|
||||
public class ChartPanel extends AbstractChartPanel<ChartSettings> implements Component<ChartSettings> {
|
||||
|
||||
public ChartPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, CompetitorSelectionProvider competitorSelectionProvider,
|
||||
RaceSelectionProvider raceSelectionProvider, Timer timer, TimeZoomProvider timeZoomProvider, DetailType dataToShow, StringMessages stringMessages,
|
||||
RaceSelectionProvider raceSelectionProvider, Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, DetailType dataToShow, StringMessages stringMessages,
|
||||
ErrorReporter errorReporter, boolean compactChart, boolean allowTimeAdjust) {
|
||||
super(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, timer, timeZoomProvider, stringMessages, errorReporter,
|
||||
super(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, timer, timeRangeWithZoomProvider, stringMessages, errorReporter,
|
||||
dataToShow, compactChart, allowTimeAdjust);
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -7,7 +7,7 @@ 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.TimeZoomProvider;
|
||||
import com.sap.sailing.gwt.ui.client.TimeRangeWithZoomProvider;
|
||||
import com.sap.sailing.gwt.ui.client.Timer;
|
||||
import com.sap.sailing.gwt.ui.shared.components.Component;
|
||||
import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent;
|
||||
@@ -27,9 +27,9 @@ import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent;
|
||||
public class MultiChartPanel extends AbstractChartPanel<MultiChartSettings> implements Component<MultiChartSettings> {
|
||||
public MultiChartPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
|
||||
CompetitorSelectionProvider competitorSelectionProvider, RaceSelectionProvider raceSelectionProvider,
|
||||
Timer timer, TimeZoomProvider timeZoomProvider, final StringMessages stringMessages, ErrorReporter errorReporter, boolean compactChart,
|
||||
Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, final StringMessages stringMessages, ErrorReporter errorReporter, boolean compactChart,
|
||||
boolean allowTimeAdjust) {
|
||||
super(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, timer, timeZoomProvider, stringMessages, errorReporter,
|
||||
super(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, timer, timeRangeWithZoomProvider, stringMessages, errorReporter,
|
||||
/*show initially*/ DetailType.WINDWARD_DISTANCE_TO_OVERALL_LEADER, compactChart, allowTimeAdjust);
|
||||
}
|
||||
|
||||
|
||||
+38
-53
@@ -1,7 +1,6 @@
|
||||
package com.sap.sailing.gwt.ui.shared.charts;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
|
||||
import org.moxieapps.gwt.highcharts.client.Chart;
|
||||
import org.moxieapps.gwt.highcharts.client.Legend;
|
||||
@@ -18,33 +17,26 @@ import org.moxieapps.gwt.highcharts.client.plotOptions.SeriesPlotOptions;
|
||||
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.actions.AsyncActionsExecutor;
|
||||
import com.sap.sailing.gwt.ui.client.ErrorReporter;
|
||||
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
|
||||
import com.sap.sailing.gwt.ui.client.RaceTimesCalculationUtil;
|
||||
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.TimeRangeChangeListener;
|
||||
import com.sap.sailing.gwt.ui.client.TimeRangeWithZoomProvider;
|
||||
import com.sap.sailing.gwt.ui.client.TimeZoomChangeListener;
|
||||
import com.sap.sailing.gwt.ui.client.TimeZoomProvider;
|
||||
import com.sap.sailing.gwt.ui.client.Timer;
|
||||
import com.sap.sailing.gwt.ui.client.Timer.PlayModes;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
|
||||
|
||||
public abstract class RaceChart extends SimplePanel implements RaceTimesInfoProviderListener, RaceSelectionChangeListener,
|
||||
TimeListener, TimeZoomChangeListener {
|
||||
public abstract class RaceChart extends SimplePanel implements RaceSelectionChangeListener,
|
||||
TimeListener, TimeZoomChangeListener, TimeRangeChangeListener {
|
||||
protected Chart chart;
|
||||
|
||||
protected final Timer timer;
|
||||
protected final TimeZoomProvider timeZoomProvider;
|
||||
|
||||
protected Date minTimepoint;
|
||||
protected Date maxTimepoint;
|
||||
|
||||
protected final TimeRangeWithZoomProvider timeRangeWithZoomProvider;
|
||||
|
||||
protected RegattaAndRaceIdentifier selectedRaceIdentifier;
|
||||
protected RaceTimesInfoDTO lastRaceTimesInfo;
|
||||
|
||||
protected final DateTimeFormat dateFormat = DateTimeFormat.getFormat("HH:mm:ss");
|
||||
protected final DateTimeFormat dateFormatHoursMinutes = DateTimeFormat.getFormat("HH:mm");
|
||||
@@ -62,47 +54,17 @@ public abstract class RaceChart extends SimplePanel implements RaceTimesInfoProv
|
||||
|
||||
private boolean ignoreNextClickEvent;
|
||||
|
||||
public RaceChart(SailingServiceAsync sailingService, Timer timer, TimeZoomProvider timeZoomProvider, final StringMessages stringMessages,
|
||||
public RaceChart(SailingServiceAsync sailingService, Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, final StringMessages stringMessages,
|
||||
AsyncActionsExecutor asyncActionsExecutor, ErrorReporter errorReporter) {
|
||||
this.sailingService = sailingService;
|
||||
this.timer = timer;
|
||||
this.timeZoomProvider = timeZoomProvider;
|
||||
this.timeRangeWithZoomProvider = timeRangeWithZoomProvider;
|
||||
this.stringMessages = stringMessages;
|
||||
this.asyncActionsExecutor = asyncActionsExecutor;
|
||||
this.errorReporter = errorReporter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void raceTimesInfosReceived(Map<RegattaAndRaceIdentifier, RaceTimesInfoDTO> raceTimesInfos) {
|
||||
this.lastRaceTimesInfo = raceTimesInfos.get(selectedRaceIdentifier);
|
||||
|
||||
Pair<Date, Date> raceMinMax = RaceTimesCalculationUtil.caluclateRaceMinMax(timer, this.lastRaceTimesInfo);
|
||||
boolean updateMinMax = false;
|
||||
|
||||
if(chart != null) {
|
||||
if (minTimepoint == null || maxTimepoint == null) {
|
||||
minTimepoint = raceMinMax.getA();
|
||||
maxTimepoint = raceMinMax.getB();
|
||||
updateMinMax = true;
|
||||
} else if(minTimepoint.getTime() != raceMinMax.getA().getTime() || maxTimepoint.getTime() != raceMinMax.getB().getTime()) {
|
||||
minTimepoint = raceMinMax.getA();
|
||||
maxTimepoint = raceMinMax.getB();
|
||||
updateMinMax = true;
|
||||
}
|
||||
}
|
||||
if (updateMinMax) {
|
||||
if (minTimepoint != null) {
|
||||
chart.getXAxis().setMin(minTimepoint.getTime());
|
||||
}
|
||||
if (maxTimepoint != null) {
|
||||
chart.getXAxis().setMax(maxTimepoint.getTime());
|
||||
}
|
||||
if (minTimepoint != null && maxTimepoint != null) {
|
||||
chart.getXAxis().setExtremes(minTimepoint.getTime(), maxTimepoint.getTime(), false, false);
|
||||
long tickInterval = (maxTimepoint.getTime() - minTimepoint.getTime()) / TICKCOUNT;
|
||||
chart.getXAxis().setTickInterval(tickInterval);
|
||||
}
|
||||
}
|
||||
timer.addTimeListener(this);
|
||||
timeRangeWithZoomProvider.addTimeZoomChangeListener(this);
|
||||
timeRangeWithZoomProvider.addTimeRangeChangeListener(this);
|
||||
}
|
||||
|
||||
protected void showLoading(String message) {
|
||||
@@ -126,10 +88,10 @@ public abstract class RaceChart extends SimplePanel implements RaceTimesInfoProv
|
||||
if (!isZoomed) {
|
||||
isZoomed = true;
|
||||
}
|
||||
timeZoomProvider.setTimeZoom(new Date(xAxisMin), new Date(xAxisMax), this);
|
||||
timeRangeWithZoomProvider.setTimeZoom(new Date(xAxisMin), new Date(xAxisMax), this);
|
||||
} catch (Throwable t) {
|
||||
// in case the user clicks the "reset zoom" button chartSelectionEvent.getXAxisMinAsLong() throws in exception
|
||||
timeZoomProvider.resetTimeZoom(this);
|
||||
timeRangeWithZoomProvider.resetTimeZoom(this);
|
||||
// Trigger the redrawing... otherwise chart wouldn't reset the zoom
|
||||
chart.redraw();
|
||||
isZoomed = false;
|
||||
@@ -151,19 +113,42 @@ public abstract class RaceChart extends SimplePanel implements RaceTimesInfoProv
|
||||
return true;
|
||||
}
|
||||
|
||||
protected void resetMinMaxInterval(Date minIntervalTimepoint, Date maxIntervalTimepoint) {
|
||||
XAxis xAxis = chart.getXAxis();
|
||||
Date minTimepoint = timeRangeWithZoomProvider.getFromTime();
|
||||
Date maxTimepoint = timeRangeWithZoomProvider.getToTime();
|
||||
|
||||
if (minTimepoint != null) {
|
||||
xAxis.setMin(minTimepoint.getTime());
|
||||
}
|
||||
if (maxTimepoint != null) {
|
||||
xAxis.setMax(maxTimepoint.getTime());
|
||||
}
|
||||
if (minTimepoint != null && maxTimepoint != null) {
|
||||
xAxis.setExtremes(minTimepoint.getTime(), maxTimepoint.getTime(), false, false);
|
||||
long tickInterval = (maxTimepoint.getTime() - minTimepoint.getTime()) / TICKCOUNT;
|
||||
xAxis.setTickInterval(tickInterval);
|
||||
}
|
||||
chart.redraw();
|
||||
}
|
||||
|
||||
protected void changeMinMaxInterval(Date minIntervalTimepoint, Date maxIntervalTimepoint) {
|
||||
XAxis xAxis = chart.getXAxis();
|
||||
xAxis.setExtremes(minIntervalTimepoint.getTime(), maxIntervalTimepoint.getTime(), true, true);
|
||||
}
|
||||
|
||||
public void onTimeZoom(Date zoomStartTimepoint, Date zoomEndTimepoint) {
|
||||
public void onTimeZoomChanged(Date zoomStartTimepoint, Date zoomEndTimepoint) {
|
||||
changeMinMaxInterval(zoomStartTimepoint, zoomEndTimepoint);
|
||||
// Probably there is a function for this in a newer version of highcharts: http://jsfiddle.net/mqz3N/1071/
|
||||
// chart.showResetZoom();
|
||||
}
|
||||
|
||||
public void onTimeRangeChanged(Date fromTime, Date toTime) {
|
||||
resetMinMaxInterval(fromTime, toTime);
|
||||
}
|
||||
|
||||
public void onTimeZoomReset() {
|
||||
changeMinMaxInterval(minTimepoint, maxTimepoint);
|
||||
changeMinMaxInterval(timeRangeWithZoomProvider.getFromTime(), timeRangeWithZoomProvider.getToTime());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+7
-9
@@ -43,7 +43,7 @@ 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.TimeZoomProvider;
|
||||
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.WindSourceTypeFormatter;
|
||||
@@ -75,9 +75,9 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
|
||||
* server and displayed in this chart. If no race is selected, the chart is cleared.
|
||||
*/
|
||||
public WindChart(SailingServiceAsync sailingService, RaceSelectionProvider raceSelectionProvider, Timer timer,
|
||||
TimeZoomProvider timeZoomProvider, WindChartSettings settings, final StringMessages stringMessages,
|
||||
TimeRangeWithZoomProvider timeRangeWithZoomProvider, WindChartSettings settings, final StringMessages stringMessages,
|
||||
AsyncActionsExecutor asyncActionsExecutor, ErrorReporter errorReporter, boolean compactChart) {
|
||||
super(sailingService, timer, timeZoomProvider, stringMessages, asyncActionsExecutor, errorReporter);
|
||||
super(sailingService, timer, timeRangeWithZoomProvider, stringMessages, asyncActionsExecutor, errorReporter);
|
||||
this.windSourceDirectionSeries = new HashMap<WindSource, Series>();
|
||||
this.windSourceSpeedSeries = new HashMap<WindSource, Series>();
|
||||
this.colorMap = new ColorMap<WindSource>();
|
||||
@@ -170,8 +170,6 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
|
||||
setSize("100%", "100%");
|
||||
|
||||
raceSelectionProvider.addRaceSelectionChangeListener(this);
|
||||
timer.addTimeListener(this);
|
||||
timeZoomProvider.addTimeZoomChangeListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -424,7 +422,7 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
|
||||
timeOfEarliestRequestInMillis = null;
|
||||
timeOfLatestRequestInMillis = null;
|
||||
|
||||
loadData(minTimepoint, maxTimepoint, /* append */false);
|
||||
loadData(timeRangeWithZoomProvider.getFromTime(), timeRangeWithZoomProvider.getToTime(), /* append */false);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -504,9 +502,9 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
|
||||
{
|
||||
// is date before first cache entry or is cache empty?
|
||||
if (timeOfEarliestRequestInMillis == null || timeOfEarliestRequestInMillis > date.getTime()) {
|
||||
loadData(minTimepoint, date, /* append */ true);
|
||||
loadData(timeRangeWithZoomProvider.getFromTime(), date, /* append */ true);
|
||||
} else if (timeOfLatestRequestInMillis < date.getTime()) {
|
||||
loadData(new Date(timeOfLatestRequestInMillis), maxTimepoint, /* append */true);
|
||||
loadData(new Date(timeOfLatestRequestInMillis), timeRangeWithZoomProvider.getToTime(), /* append */true);
|
||||
}
|
||||
// otherwise the cache spans across date and so we don't need to load anything
|
||||
break;
|
||||
@@ -515,7 +513,7 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
|
||||
{
|
||||
// assuming play mode is replay / non-live
|
||||
if (timeOfLatestRequestInMillis == null) {
|
||||
loadData(minTimepoint, maxTimepoint, /* append */false); // replace old series
|
||||
loadData(timeRangeWithZoomProvider.getFromTime(), timeRangeWithZoomProvider.getToTime(), /* append */false); // replace old series
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user