mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-08 21:30:57 +00:00
Merge remote-tracking branch 'server/master' into leaderboard-refactoring
This commit is contained in:
commit
0e63eeda1e
4 files changed
+169
-126
No files matched your search
+7
-16
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
+40
-39
@@ -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);
|
||||
}
|
||||
}
|
||||
+48
-10
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+74
-61
@@ -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() {
|
||||
|
||||
Reference in new issue
Block a user