Merge remote-tracking branch 'server/master' into leaderboard-refactoring

This commit is contained in:
Axel Uhl committed 2012-05-21 10:56:41 +02:00
commit 0e63eeda1e
4 files changed
+169 -126

No files matched your search

@@ -159,14 +159,17 @@ public class RaceBoardPanel extends FormPanel implements RegattaDisplayer, RaceS
competitorChart = new MultiChartPanel(sailingService, asyncActionsExecutor, competitorSelectionModel, raceSelectionProvider,
timer, timeZoomModel, stringMessages, errorReporter, true, true);
competitorChart.setVisible(false);
raceTimesInfoProvider.addRaceTimesInfoProviderListener(competitorChart);
competitorChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
components.add(competitorChart);
competitorChart.setVisible(false);
windChart = createWindChart(asyncActionsExecutor);
WindChartSettings windChartSettings = new WindChartSettings(false, true, new HashSet<WindSourceType>(Arrays.asList(WindSourceType.values())));
windChart = new WindChart(sailingService, raceSelectionProvider, timer, timeZoomModel, windChartSettings,
stringMessages, asyncActionsExecutor, errorReporter, /* compactChart */ true);
windChart.setVisible(false);
raceTimesInfoProvider.addRaceTimesInfoProviderListener(windChart);
windChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
windChart.setVisible(false);
components.add(windChart);
leaderboardAndMapViewer = new SideBySideComponentViewer(leaderboardPanel, raceMap, components);
@@ -234,12 +237,6 @@ public class RaceBoardPanel extends FormPanel implements RegattaDisplayer, RaceS
userAgentType);
}
private WindChart createWindChart(AsyncActionsExecutor asyncActionsExecutor) {
WindChartSettings windChartSettings = new WindChartSettings(false, true, new HashSet<WindSourceType>(Arrays.asList(WindSourceType.values())));
return new WindChart(sailingService, raceSelectionProvider, timer, timeZoomModel, windChartSettings,
stringMessages, asyncActionsExecutor, errorReporter, viewMode == RaceBoardViewModes.ONESCREEN);
}
private void addComponentAsToogleButtonToNavigationMenu(final ComponentViewer componentViewer,
final Component<?> component) {
final ToggleButton toggleButton = new ToggleButton(component.getLocalizedShortName(),
@@ -258,13 +255,7 @@ public class RaceBoardPanel extends FormPanel implements RegattaDisplayer, RaceS
boolean visible = toggleButton.isDown();
setComponentVisible(componentViewer, component, visible);
// Forcing a chart time line update and a load of the data, or it wouldn't be displayed if the chart is
// set to visible
if (visible && component instanceof WindChart) {
windChart.timeChanged(timer.getTime());
} else if (visible && component instanceof AbstractChartPanel) {
competitorChart.triggerDataLoading();
} else if (visible && component instanceof LeaderboardPanel) {
if (visible && component instanceof LeaderboardPanel) {
leaderboardPanel.timeChanged(timer.getTime());
}
}
@@ -11,6 +11,7 @@ import org.moxieapps.gwt.highcharts.client.Axis;
import org.moxieapps.gwt.highcharts.client.Chart;
import org.moxieapps.gwt.highcharts.client.ChartSubtitle;
import org.moxieapps.gwt.highcharts.client.ChartTitle;
import org.moxieapps.gwt.highcharts.client.Color;
import org.moxieapps.gwt.highcharts.client.Point;
import org.moxieapps.gwt.highcharts.client.Series;
import org.moxieapps.gwt.highcharts.client.ToolTip;
@@ -30,8 +31,8 @@ import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
@@ -72,7 +73,6 @@ implements CompetitorSelectionChangeListener, RequiresResize {
private final Map<CompetitorDTO, Series> dataSeriesByCompetitor;
private final Map<CompetitorDTO, Series> markPassingSeriesByCompetitor;
private final boolean allowTimeAdjust;
private final RaceSelectionProvider raceSelectionProvider;
private long stepSize = 5000;
private DetailType dataToShow;
private final CompetitorSelectionProvider competitorSelectionProvider;
@@ -82,35 +82,26 @@ implements CompetitorSelectionChangeListener, RequiresResize {
Timer timer, TimeZoomProvider timeZoomProvider, final StringMessages stringMessages, ErrorReporter errorReporter, DetailType dataToShow,
boolean compactChart, boolean allowTimeAdjust) {
super(sailingService, timer, timeZoomProvider, stringMessages, asyncActionsExecutor, errorReporter);
dataSeriesByCompetitor = new HashMap<CompetitorDTO, Series>();
markPassingSeriesByCompetitor = new HashMap<CompetitorDTO, Series>();
this.competitorSelectionProvider = competitorSelectionProvider;
competitorSelectionProvider.addCompetitorSelectionChangeListener(this);
this.dataToShow = dataToShow;
chartData = null;
this.compactChart = compactChart;
this.raceSelectionProvider = raceSelectionProvider;
this.allowTimeAdjust = allowTimeAdjust;
raceSelectionProvider.addRaceSelectionChangeListener(this);
dataSeriesByCompetitor = new HashMap<CompetitorDTO, Series>();
markPassingSeriesByCompetitor = new HashMap<CompetitorDTO, Series>();
chartData = null;
setSize("100%", "100%");
noCompetitorsSelectedLabel = new Label(stringMessages.selectAtLeastOneCompetitor() + ".");
noCompetitorsSelectedLabel.setStyleName("abstractChartPanel-importantMessageOfChart");
chart = createChart(dataToShow);
List<RegattaAndRaceIdentifier> selectedRaces = raceSelectionProvider.getSelectedRaces();
if(!selectedRaces.isEmpty()) {
loadData(true);
}
competitorSelectionProvider.addCompetitorSelectionChangeListener(this);
raceSelectionProvider.addRaceSelectionChangeListener(this);
timer.addTimeListener(this);
timeZoomProvider.addTimeZoomChangeListener(this);
}
protected void selectRace(final RaceIdentifier selectedRace) {
}
/**
* Creates a new chart for the given {@link DetailType} <code>dataToShow</code> and also
* clears the {@link #chartData}, the {@link #dataSeriesByCompetitor} and the {@link #markPassingSeriesByCompetitor}.
@@ -123,6 +114,9 @@ implements CompetitorSelectionChangeListener, RequiresResize {
.setHeight100()
.setMarginLeft(65)
.setMarginRight(65)
.setBorderColor(new Color("#A6A6A6"))
.setBorderWidth(1)
// .setBackgroundColor(new Color("#C6C6C6"))
.setChartSubtitle(new ChartSubtitle().setText(stringMessages.clickAndDragToZoomIn()))
.setLinePlotOptions(new LinePlotOptions().setLineWidth(LINE_WIDTH).setMarker(new Marker().setEnabled(false).setHoverState(
new Marker().setEnabled(true).setRadius(4))).setShadow(false)
@@ -155,7 +149,8 @@ implements CompetitorSelectionChangeListener, RequiresResize {
chart.getYAxis().setReversed((dataToShow == DetailType.WINDWARD_DISTANCE_TO_OVERALL_LEADER ||
dataToShow == DetailType.GAP_TO_LEADER_IN_SECONDS) ? true : false);
chart.getXAxis().setType(Axis.Type.DATE_TIME).setMaxZoom(10000) // ten seconds
.setAxisTitleText(stringMessages.time());
.setAxisTitleText(stringMessages.time())
.setTickInterval(1000 * 60 * 10);
String decimalPlaces = "";
for (int i = 0; i < dataToShow.getPrecision(); i++) {
if (i == 0) {
@@ -210,33 +205,33 @@ implements CompetitorSelectionChangeListener, RequiresResize {
if (needsDataLoading()) {
if (showBusyIndicator) {
setWidget(chart);
chart.showLoading("Loading competitor data...");
showLoading("Loading competitor data...");
}
if (chartData == null || chartData.getDetailType() != getDataToShow()) {
chartData = new MultiCompetitorRaceDataDTO(getDataToShow());
}
Date toDate = new Date(System.currentTimeMillis() - timer.getLivePlayDelayInMillis());
// Date toDate = new Date(System.currentTimeMillis() - timer.getLivePlayDelayInMillis());
final ArrayList<Pair<Date, CompetitorDTO>> dataQuery = new ArrayList<Pair<Date, CompetitorDTO>>();
for (CompetitorDTO competitor : getVisibleCompetitors()) {
Date chartDataDateOfNewestData = chartData.getDateOfNewestData();
Date competitorDateOfNewestData = chartData.contains(competitor) ? chartData.getCompetitorData(competitor).getDateOfNewestData() : null;
if (!chartData.contains(competitor)) {
dataQuery.add(new Pair<Date, CompetitorDTO>(new Date(0), competitor));
} else if (competitorDateOfNewestData.before(chartDataDateOfNewestData) || competitorDateOfNewestData.before(toDate)) {
} else if (competitorDateOfNewestData.before(chartDataDateOfNewestData) || competitorDateOfNewestData.before(maxTimepoint)) {
dataQuery.add(new Pair<Date, CompetitorDTO>(new Date(competitorDateOfNewestData.getTime() + getStepSize()), competitor));
}
}
GetCompetitorsRaceDataAction getCompetitorsRaceDataAction = new GetCompetitorsRaceDataAction(sailingService,
getSelectedRace(), dataQuery, toDate, getStepSize(), getDataToShow(),
selectedRaceIdentifier, dataQuery, maxTimepoint, getStepSize(), getDataToShow(),
new AsyncCallback<MultiCompetitorRaceDataDTO>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(getStringMessages().failedToLoadRaceData() + ": " + caught.toString(),
timer.getPlayMode() == PlayModes.Live);
chart.hideLoading();
hideLoading();
}
@Override
@@ -251,25 +246,19 @@ implements CompetitorSelectionChangeListener, RequiresResize {
}
}
}
chart.getXAxis().setMin(minTimepoint.getTime());
chart.getXAxis().setMax(maxTimepoint.getTime());
drawChartData();
chart.hideLoading();
}
});
asyncActionsExecutor.execute(getCompetitorsRaceDataAction);
} else {
setWidget(noCompetitorsSelectedLabel);
setWidget(noCompetitorsSelectedLabel);
}
}
private RaceIdentifier getSelectedRace() {
RaceIdentifier result = null;
List<RegattaAndRaceIdentifier> selectedRaces = raceSelectionProvider.getSelectedRaces();
if (selectedRaces != null && !selectedRaces.isEmpty()) {
result = selectedRaces.iterator().next();
}
return result;
}
@Override
public void addedToSelection(CompetitorDTO competitor) {
loadData(true);
@@ -510,9 +499,16 @@ implements CompetitorSelectionChangeListener, RequiresResize {
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
setChartData(null);
if (selectedRaces != null && !selectedRaces.isEmpty()) {
selectedRaceIdentifier = selectedRaces.iterator().next();
} else {
selectedRaceIdentifier = null;
}
clearChart();
loadData(true);
if(selectedRaceIdentifier != null) {
loadData(true);
}
}
/**
@@ -555,6 +551,15 @@ implements CompetitorSelectionChangeListener, RequiresResize {
return new Pair<Boolean, Boolean>(everyPassingInRange, twoPassingsInRangeBeforeError);
}
@Override
public void setVisible(boolean isVisible) {
super.setVisible(isVisible);
if(isVisible) {
loadData(true);
}
}
@Override
public void timeChanged(Date date) {
if (getChartData() != null) {
@@ -580,8 +585,4 @@ implements CompetitorSelectionChangeListener, RequiresResize {
public void competitorsListChanged(Iterable<CompetitorDTO> competitors) {
timeChanged(timer.getTime());
}
public void triggerDataLoading() {
loadData(true);
}
}
@@ -5,6 +5,7 @@ import java.util.Map;
import org.moxieapps.gwt.highcharts.client.Chart;
import org.moxieapps.gwt.highcharts.client.Legend;
import org.moxieapps.gwt.highcharts.client.XAxis;
import org.moxieapps.gwt.highcharts.client.events.ChartClickEvent;
import org.moxieapps.gwt.highcharts.client.events.ChartSelectionEvent;
import org.moxieapps.gwt.highcharts.client.events.SeriesCheckboxClickEvent;
@@ -54,6 +55,10 @@ public abstract class RaceChart extends SimplePanel implements RaceTimesInfoProv
protected final AsyncActionsExecutor asyncActionsExecutor;
protected final SailingServiceAsync sailingService;
protected boolean isLoading = false;
private int NUMBER_OF_TICKS = 9;
public RaceChart(SailingServiceAsync sailingService, Timer timer, TimeZoomProvider timeZoomProvider, final StringMessages stringMessages,
AsyncActionsExecutor asyncActionsExecutor, ErrorReporter errorReporter) {
this.sailingService = sailingService;
@@ -69,9 +74,35 @@ public abstract class RaceChart extends SimplePanel implements RaceTimesInfoProv
this.lastRaceTimesInfo = raceTimesInfos.get(selectedRaceIdentifier);
Pair<Date, Date> raceMinMax = RaceTimesCalculationUtil.caluclateRaceMinMax(timer, this.lastRaceTimesInfo);
boolean updateMinMax = false;
this.minTimepoint = raceMinMax.getA();
this.maxTimepoint = raceMinMax.getB();
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) {
chart.getXAxis().setMin(minTimepoint.getTime());
chart.getXAxis().setMax(maxTimepoint.getTime());
}
}
protected void showLoading(String message) {
chart.showLoading(message);
isLoading = true;
}
protected void hideLoading() {
chart.hideLoading();
isLoading = false;
}
protected void onSelectionChange(ChartSelectionEvent chartSelectionEvent) {
@@ -79,7 +110,7 @@ public abstract class RaceChart extends SimplePanel implements RaceTimesInfoProv
long xAxisMin = chartSelectionEvent.getXAxisMinAsLong();
long xAxisMax = chartSelectionEvent.getXAxisMaxAsLong();
timeZoomProvider.setTimeZoom(new Date(xAxisMin), new Date(xAxisMax), this);
ignoreClickOnce = true;
} catch (Throwable t) {
timeZoomProvider.resetTimeZoom(this);
@@ -89,22 +120,29 @@ public abstract class RaceChart extends SimplePanel implements RaceTimesInfoProv
}
protected void onClick(ChartClickEvent chartClickEvent) {
if (ignoreClickOnce) {
ignoreClickOnce = false;
} else {
timer.setPlayMode(PlayModes.Replay);
timer.setTime(chartClickEvent.getXAxisValueAsLong());
if(!isLoading) {
if (ignoreClickOnce) {
ignoreClickOnce = false;
} else {
timer.setPlayMode(PlayModes.Replay);
timer.setTime(chartClickEvent.getXAxisValueAsLong());
}
}
}
protected void changeMinMaxInterval(Date minIntervalTimepoint, Date maxIntervalTimepoint, long numTicks) {
XAxis xAxis = chart.getXAxis();
xAxis.setExtremes(minIntervalTimepoint.getTime(), maxIntervalTimepoint.getTime(), true, true);
}
public void onTimeZoom(Date zoomStartTimepoint, Date zoomEndTimepoint) {
chart.getXAxis().setExtremes(zoomStartTimepoint.getTime(), zoomEndTimepoint.getTime(), true, true);
changeMinMaxInterval(zoomStartTimepoint, zoomEndTimepoint, NUMBER_OF_TICKS);
// Probably there is a function for this in a newer version of highcharts: http://jsfiddle.net/mqz3N/1071/
// chart.showResetZoom();
}
public void onTimeZoomReset() {
// chart.getXAxis().setExtremes(minTimepoint.getTime(), maxTimepoint.getTime(), true, true);
changeMinMaxInterval(minTimepoint, maxTimepoint, NUMBER_OF_TICKS);
}
/**
@@ -19,7 +19,6 @@ import org.moxieapps.gwt.highcharts.client.Series;
import org.moxieapps.gwt.highcharts.client.ToolTip;
import org.moxieapps.gwt.highcharts.client.ToolTipData;
import org.moxieapps.gwt.highcharts.client.ToolTipFormatter;
import org.moxieapps.gwt.highcharts.client.XAxis;
import org.moxieapps.gwt.highcharts.client.events.ChartClickEvent;
import org.moxieapps.gwt.highcharts.client.events.ChartClickEventHandler;
import org.moxieapps.gwt.highcharts.client.events.ChartSelectionEvent;
@@ -35,7 +34,6 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor;
@@ -97,6 +95,9 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
.setMarginRight(65)
.setWidth100()
.setHeight100()
.setBorderColor(new Color("#A6A6A6"))
.setBorderWidth(1)
// .setBackgroundColor(new Color("#C6C6C6"))
.setChartTitle(new ChartTitle().setText(stringMessages.wind()))
.setChartSubtitle(new ChartSubtitle().setText(stringMessages.clickAndDragToZoomIn()))
.setLinePlotOptions(new LinePlotOptions().setLineWidth(LINE_WIDTH).setMarker(
@@ -127,26 +128,26 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
}
}));
chart.setBackgroundColor(new Color("#ebebec"));
chart.setClickEventHandler(new ChartClickEventHandler() {
@Override
public boolean onClick(ChartClickEvent chartClickEvent) {
WindChart.this.onClick(chartClickEvent);
return true;
}
});
chart.setSelectionEventHandler(new ChartSelectionEventHandler() {
@Override
public boolean onSelection(ChartSelectionEvent chartSelectionEvent) {
WindChart.this.onSelectionChange(chartSelectionEvent);
return true;
}
});
chart.setClickEventHandler(new ChartClickEventHandler() {
@Override
public boolean onClick(ChartClickEvent chartClickEvent) {
WindChart.this.onClick(chartClickEvent);
return true;
}
});
chart.setSelectionEventHandler(new ChartSelectionEventHandler() {
@Override
public boolean onSelection(ChartSelectionEvent chartSelectionEvent) {
WindChart.this.onSelectionChange(chartSelectionEvent);
return true;
}
});
chart.getXAxis().setType(Axis.Type.DATE_TIME).setMaxZoom(10000) // ten seconds
.setAxisTitleText(stringMessages.time());
chart.getXAxis().setType(Axis.Type.DATE_TIME)
.setMaxZoom(60 * 1000) // 1 minute
.setAxisTitleText(stringMessages.time())
.setTickInterval(1000 * 60 * 10);
chart.getYAxis(0).setAxisTitleText(stringMessages.fromDeg()).setStartOnTick(false).setShowFirstLabel(false)
.setLabels(new YAxisLabels().setFormatter(new AxisLabelsFormatter() {
@Override
@@ -169,12 +170,13 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
setWidget(chart);
setSize("100%", "100%");
updateSettings(settings);
if (raceSelectionProvider != null) {
raceSelectionProvider.addRaceSelectionChangeListener(this);
onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
}
showVisibleSeries();
resolutionInMilliseconds = settings.getResolutionInMilliseconds();
showWindDirectionsSeries = settings.isShowWindDirectionsSeries();
showWindSpeedSeries = settings.isShowWindSpeedSeries();
windSourceTypesToDisplay.addAll(settings.getWindSourceTypesToDisplay());
raceSelectionProvider.addRaceSelectionChangeListener(this);
timer.addTimeListener(this);
timeZoomProvider.addTimeZoomChangeListener(this);
}
@@ -189,8 +191,18 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
return this;
}
@Override
public void setVisible(boolean isVisible) {
super.setVisible(isVisible);
if(isVisible) {
timeChanged(timer.getTime());
}
}
private void showVisibleSeries() {
Set<Series> visibleSeries = new HashSet<Series>(Arrays.asList(chart.getSeries()));
List<Series> currentSeries = Arrays.asList(chart.getSeries());
Set<Series> visibleSeries = new HashSet<Series>(currentSeries);
if(showWindDirectionsSeries) {
for (Map.Entry<WindSource, Series> e : windSourceDirectionSeries.entrySet()) {
@@ -398,7 +410,7 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
timeOfEarliestRequestInMillis = null;
timeOfLatestRequestInMillis = null;
loadData(selectedRaceIdentifier, minTimepoint, maxTimepoint, /* append */false);
loadData(minTimepoint, maxTimepoint, /* append */false);
}
/**
@@ -422,12 +434,12 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
* if <code>true</code>, the results retrieved from the server will be appended to the wind chart instead
* of overwriting the existing series.
*/
private void loadData(final RaceIdentifier raceIdentifier, final Date from, final Date to, final boolean append) {
if (raceIdentifier == null) {
private void loadData(final Date from, final Date to, final boolean append) {
if (selectedRaceIdentifier == null) {
clearChart();
} else if (needsDataLoading() && from != null && to != null) {
chart.showLoading("Loading wind data...");
GetWindInfoAction getWindInfoAction = new GetWindInfoAction(sailingService, raceIdentifier,
showLoading("Loading wind data...");
GetWindInfoAction getWindInfoAction = new GetWindInfoAction(sailingService, selectedRaceIdentifier,
// TODO Time interval should be determined by a selection in the chart but be at most 60s. See bug #121.
// Consider incremental updates for new data only.
from, to, resolutionInMilliseconds,
@@ -435,29 +447,20 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
@Override
public void onSuccess(WindInfoForRaceDTO result) {
if (result != null) {
XAxis xAxis = chart.getXAxis();
xAxis.setMin(minTimepoint.getTime());
xAxis.setMax(maxTimepoint.getTime());
xAxis.setStartOnTick(false);
xAxis.setEndOnTick(false);
long tickInterval = (maxTimepoint.getTime() - minTimepoint.getTime()) / 10;
xAxis.setTickInterval(tickInterval);
updateStripChartSeries(result, append);
} else {
if (!append) {
clearChart(); // no wind known for untracked race
}
}
chart.hideLoading();
hideLoading();
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(stringMessages.errorFetchingWindInformationForRace() + " "
+ raceIdentifier + ": " + caught.getMessage(), timer.getPlayMode() == PlayModes.Live);
chart.hideLoading();
+ selectedRaceIdentifier + ": " + caught.getMessage(), timer.getPlayMode() == PlayModes.Live);
hideLoading();
}
});
asyncActionsExecutor.execute(getWindInfoAction);
@@ -471,9 +474,14 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
if (selectedRaces != null && !selectedRaces.isEmpty()) {
// show wind of first selected race
selectedRaceIdentifier = selectedRaces.iterator().next();
} else {
selectedRaceIdentifier = null;
}
if(selectedRaceIdentifier != null) {
clearCacheAndReload();
showVisibleSeries();
} else {
clearChart();
}
@@ -486,27 +494,32 @@ public class WindChart extends RaceChart implements Component<WindChartSettings>
*/
@Override
public void timeChanged(Date date) {
if (timer.getPlayMode() == PlayModes.Live) {
// is date before first cache entry or is cache empty?
if (timeOfEarliestRequestInMillis == null || timeOfEarliestRequestInMillis > date.getTime()) {
loadData(selectedRaceIdentifier, minTimepoint, date, /* append */ true);
} else if (timeOfLatestRequestInMillis < date.getTime()) {
loadData(selectedRaceIdentifier, new Date(timeOfLatestRequestInMillis), maxTimepoint, /* append */true);
switch(timer.getPlayMode()) {
case Live:
{
// is date before first cache entry or is cache empty?
if (timeOfEarliestRequestInMillis == null || timeOfEarliestRequestInMillis > date.getTime()) {
loadData(minTimepoint, date, /* append */ true);
} else if (timeOfLatestRequestInMillis < date.getTime()) {
loadData(new Date(timeOfLatestRequestInMillis), maxTimepoint, /* append */true);
}
// otherwise the cache spans across date and so we don't need to load anything
break;
}
// otherwise the cache spans across date and so we don't need to load anything
} else {
// assuming play mode is replay / non-live
if (timeOfLatestRequestInMillis == null) {
loadData(selectedRaceIdentifier, minTimepoint, maxTimepoint, /* append */false); // replace old series
case Replay:
{
// assuming play mode is replay / non-live
if (timeOfLatestRequestInMillis == null) {
loadData(minTimepoint, maxTimepoint, /* append */false); // replace old series
}
break;
}
}
}
}
@Override
public void onResize() {
if(isVisible()) {
chart.setSizeToMatchContainer();
}
chart.setSizeToMatchContainer();
}
private boolean needsDataLoading() {