From 0b0a7f2cf00cf3a00ed24586305307a11aa0b321 Mon Sep 17 00:00:00 2001 From: fmittag Date: Mon, 14 May 2012 18:55:14 +0200 Subject: [PATCH 1/4] Introduced a TimeZoomModel for zooming the time Unified the way how the WindChart and CompetitorCharts are handling the race times --- .../gwt/ui/adminconsole/WindPanel.java | 3 +- .../gwt/ui/client/TimeZoomChangeListener.java | 10 ++ .../sailing/gwt/ui/client/TimeZoomModel.java | 59 ++++++++ .../gwt/ui/client/TimeZoomProvider.java | 20 +++ .../CompareCompetitorsChartDialog.java | 3 +- .../gwt/ui/raceboard/RaceBoardPanel.java | 7 +- .../ui/shared/charts/AbstractChartPanel.java | 121 ++-------------- .../gwt/ui/shared/charts/ChartPanel.java | 5 +- .../gwt/ui/shared/charts/MultiChartPanel.java | 7 +- .../gwt/ui/shared/charts/RaceChart.java | 137 ++++++++++++++++++ .../gwt/ui/shared/charts/WindChart.java | 87 ++--------- 11 files changed, 265 insertions(+), 194 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimeZoomChangeListener.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimeZoomModel.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimeZoomProvider.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/RaceChart.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindPanel.java index 96e0c7f7faa..442e8afd74a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindPanel.java @@ -50,6 +50,7 @@ import com.sap.sailing.gwt.ui.client.RaceSelectionModel; 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.TimeZoomModel; import com.sap.sailing.gwt.ui.client.Timer; import com.sap.sailing.gwt.ui.client.Timer.PlayModes; import com.sap.sailing.gwt.ui.shared.EventDTO; @@ -185,7 +186,7 @@ public class WindPanel extends FormPanel implements EventDisplayer, WindShower, windSourceSelectionPanel.add(showConfigAnchor); grid.setWidget(1, 0, windSourceSelectionPanel); WindChartSettings windChartSettings = new WindChartSettings(false, true, new HashSet(Arrays.asList(WindSourceType.values()))); - windChart = new WindChart(sailingService, raceSelectionProvider, new Timer(PlayModes.Replay), windChartSettings, stringMessages, asyncActionsExecutor, errorReporter, false); + windChart = new WindChart(sailingService, raceSelectionProvider, new Timer(PlayModes.Replay), new TimeZoomModel(), windChartSettings, stringMessages, asyncActionsExecutor, errorReporter, false); windChart.onResize(); grid.setWidget(2, 0, windChart.getEntryWidget()); grid.getCellFormatter().setVerticalAlignment(1, 1, HasVerticalAlignment.ALIGN_TOP); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimeZoomChangeListener.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimeZoomChangeListener.java new file mode 100644 index 00000000000..f75679738ec --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimeZoomChangeListener.java @@ -0,0 +1,10 @@ +package com.sap.sailing.gwt.ui.client; + +import java.util.Date; + +public interface TimeZoomChangeListener { + + void onTimeZoom(Date zoomStartTimepoint, Date zoomEndTimepoint); + + void onTimeZoomReset(); +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimeZoomModel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimeZoomModel.java new file mode 100644 index 00000000000..52c608b2405 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimeZoomModel.java @@ -0,0 +1,59 @@ +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 TimeZoomModel implements TimeZoomProvider { + private Date zoomStartTimepoint; + private Date zoomEndTimepoint; + private boolean isTimeZoomed; + + private final Set listeners; + + public TimeZoomModel() { + isTimeZoomed = false; + listeners = new HashSet(); + } + + @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.onTimeZoom(zoomStartTimepoint, zoomEndTimepoint); + } + } + } + + public void resetTimeZoom(TimeZoomChangeListener... listenersNotToNotify) { + isTimeZoomed = false; + for (TimeZoomChangeListener listener : listeners) { + if (listenersNotToNotify == null || !Arrays.asList(listenersNotToNotify).contains(listener)) { + listener.onTimeZoomReset(); + } + } + } + + public Pair getTimeZoom() { + return new Pair(zoomStartTimepoint, zoomEndTimepoint); + } + + public boolean isZoomed() { + return isTimeZoomed; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimeZoomProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimeZoomProvider.java new file mode 100644 index 00000000000..d05ccd45ca0 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimeZoomProvider.java @@ -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 TimeZoomProvider { + + 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 getTimeZoom(); + + public boolean isZoomed(); +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/CompareCompetitorsChartDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/CompareCompetitorsChartDialog.java index 81a382fbe24..ef084db6f31 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/CompareCompetitorsChartDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/CompareCompetitorsChartDialog.java @@ -28,6 +28,7 @@ import com.sap.sailing.gwt.ui.client.RaceSelectionModel; 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.TimeZoomModel; 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; @@ -57,7 +58,7 @@ public class CompareCompetitorsChartDialog extends DialogBox { raceSelectionProvider.setAllRaces(races); multiChartPanel = new MultiChartPanel(sailingService, new AsyncActionsExecutor(), competitorSelectionProvider, raceSelectionProvider, - timer, stringConstants, errorReporter, false, false); + timer, new TimeZoomModel(), stringConstants, errorReporter, false, false); multiChartPanel.setSize("100%", "100%"); FlowPanel contentPanel = new FlowPanel(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java index 867c3060de0..ca2984d595c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java @@ -33,6 +33,7 @@ import com.sap.sailing.gwt.ui.client.RaceTimePanel; 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.Timer; import com.sap.sailing.gwt.ui.client.UserAgentChecker.UserAgentTypes; import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel; @@ -85,6 +86,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel private final RaceSelectionProvider raceSelectionProvider; private final UserAgentTypes userAgentType; private final CompetitorSelectionModel competitorSelectionModel; + private final TimeZoomModel timeZoomModel; private final EventAndRaceIdentifier selectedRaceIdentifier; private LeaderboardPanel leaderboardPanel; @@ -123,6 +125,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel setWidget(mainPanel); this.timer = timer; + timeZoomModel = new TimeZoomModel(); componentViewers = new ArrayList(); competitorSelectionModel = new CompetitorSelectionModel(/* hasMultiSelection */ true); @@ -156,7 +159,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel List> components = new ArrayList>(); competitorChart = new MultiChartPanel(sailingService, asyncActionsExecutor, competitorSelectionModel, raceSelectionProvider, - timer, stringMessages, errorReporter, true, true); + timer, timeZoomModel, stringMessages, errorReporter, true, true); competitorChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces()); components.add(competitorChart); competitorChart.setVisible(false); @@ -234,7 +237,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel private WindChart createWindChart(AsyncActionsExecutor asyncActionsExecutor) { WindChartSettings windChartSettings = new WindChartSettings(false, true, new HashSet(Arrays.asList(WindSourceType.values()))); - return new WindChart(sailingService, raceSelectionProvider, timer, windChartSettings, + return new WindChart(sailingService, raceSelectionProvider, timer, timeZoomModel, windChartSettings, stringMessages, asyncActionsExecutor, errorReporter, viewMode == RaceBoardViewModes.ONESCREEN); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/AbstractChartPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/AbstractChartPanel.java index 93c22f0dd84..f6a670b6652 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/AbstractChartPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/AbstractChartPanel.java @@ -11,7 +11,6 @@ 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.Extremes; import org.moxieapps.gwt.highcharts.client.Point; import org.moxieapps.gwt.highcharts.client.Series; import org.moxieapps.gwt.highcharts.client.ToolTip; @@ -25,12 +24,8 @@ import org.moxieapps.gwt.highcharts.client.plotOptions.LinePlotOptions; import org.moxieapps.gwt.highcharts.client.plotOptions.Marker; import org.moxieapps.gwt.highcharts.client.plotOptions.ScatterPlotOptions; -import com.google.gwt.core.client.Scheduler; -import com.google.gwt.core.client.Scheduler.ScheduledCommand; -import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.user.client.rpc.AsyncCallback; -import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RequiresResize; import com.google.gwt.user.client.ui.Widget; @@ -45,19 +40,16 @@ import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.DetailTypeFormatter; import com.sap.sailing.gwt.ui.client.ErrorReporter; -import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener; 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.TimeListener; +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.CompetitorDTO; import com.sap.sailing.gwt.ui.shared.CompetitorRaceDataDTO; import com.sap.sailing.gwt.ui.shared.MultiCompetitorRaceDataDTO; import com.sap.sailing.gwt.ui.shared.components.Component; -import com.sap.sailing.gwt.ui.shared.panels.BusyIndicator; -import com.sap.sailing.gwt.ui.shared.panels.SimpleBusyIndicator; /** * ChartPanel is a GWT panel that can show one sort of competitor data (e.g. current speed over ground, windward distance to @@ -71,47 +63,32 @@ import com.sap.sailing.gwt.ui.shared.panels.SimpleBusyIndicator; * @author Benjamin Ebling (D056866), Axel Uhl (d043530) * */ -public abstract class AbstractChartPanel extends SimpleChartPanel -implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeListener, RequiresResize { +public abstract class AbstractChartPanel extends RaceChart +implements CompetitorSelectionChangeListener, RequiresResize { private static final int LINE_WIDTH = 1; private MultiCompetitorRaceDataDTO chartData; - private final SailingServiceAsync sailingService; - private final AsyncActionsExecutor asyncActionsExecutor; - private final ErrorReporter errorReporter; - private Chart chart; private boolean compactChart; - private final AbsolutePanel busyIndicatorPanel; private final Label noCompetitorsSelectedLabel; private final Map dataSeriesByCompetitor; private final Map markPassingSeriesByCompetitor; - private Series timeLineSeries; - private boolean timeLineNeedsUpdate = true; private final boolean allowTimeAdjust; - private boolean ignoreTimeAdjustOnce; private final RaceSelectionProvider raceSelectionProvider; private long stepSize = 5000; - protected final StringMessages stringMessages; - private final DateTimeFormat dateFormat = DateTimeFormat.getFormat("HH:mm:ss"); private DetailType dataToShow; private final CompetitorSelectionProvider competitorSelectionProvider; public AbstractChartPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, CompetitorSelectionProvider competitorSelectionProvider, RaceSelectionProvider raceSelectionProvider, - Timer timer, final StringMessages stringMessages, ErrorReporter errorReporter, DetailType dataToShow, + Timer timer, TimeZoomProvider timeZoomProvider, final StringMessages stringMessages, ErrorReporter errorReporter, DetailType dataToShow, boolean compactChart, boolean allowTimeAdjust) { - super(timer); - this.stringMessages = stringMessages; + super(sailingService, timer, timeZoomProvider, stringMessages, asyncActionsExecutor, errorReporter); dataSeriesByCompetitor = new HashMap(); markPassingSeriesByCompetitor = new HashMap(); - this.timer.addTimeListener(this); this.competitorSelectionProvider = competitorSelectionProvider; competitorSelectionProvider.addCompetitorSelectionChangeListener(this); - this.errorReporter = errorReporter; this.dataToShow = dataToShow; chartData = null; this.compactChart = compactChart; - this.sailingService = sailingService; - this.asyncActionsExecutor = asyncActionsExecutor; this.raceSelectionProvider = raceSelectionProvider; this.allowTimeAdjust = allowTimeAdjust; raceSelectionProvider.addRaceSelectionChangeListener(this); @@ -121,26 +98,13 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL noCompetitorsSelectedLabel.setStyleName("abstractChartPanel-importantMessageOfChart"); chart = createChart(dataToShow); - if (allowTimeAdjust) { - timeLineSeries = createTimeLineSeries(); - } - busyIndicatorPanel = new AbsolutePanel(); - final BusyIndicator busyIndicator = new SimpleBusyIndicator(/*busy*/ true, /*scale*/ 1); - //Adding the busyIndicator with an scheduler, to be sure that the busyIndicatorPanel has a width and a height - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - busyIndicatorPanel.setSize("100%", "100%"); - busyIndicatorPanel.add(busyIndicator, busyIndicatorPanel.getOffsetWidth() / 2, busyIndicatorPanel.getOffsetHeight() / 2); - } - }); - List selectedRaces = raceSelectionProvider.getSelectedRaces(); if(!selectedRaces.isEmpty()) { loadData(true); } timer.addTimeListener(this); + timeZoomProvider.addTimeZoomChangeListener(this); } protected void selectRace(final RaceIdentifier selectedRace) { @@ -169,26 +133,14 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL chart.setClickEventHandler(new ChartClickEventHandler() { @Override public boolean onClick(ChartClickEvent chartClickEvent) { - if (ignoreTimeAdjustOnce) { - ignoreTimeAdjustOnce = false; - } else { - timer.setPlayMode(PlayModes.Replay); - timer.setTime(chartClickEvent.getXAxisValueAsLong()); - } + AbstractChartPanel.this.onClick(chartClickEvent); return true; } }); chart.setSelectionEventHandler(new ChartSelectionEventHandler() { @Override public boolean onSelection(ChartSelectionEvent chartSelectionEvent) { - try { - chartSelectionEvent.getXAxisMaxAsLong(); - chartSelectionEvent.getXAxisMinAsLong(); - ignoreTimeAdjustOnce = true; - } catch (Throwable t) { - // Redrawing, or the chart wouldn't rezoom - AbstractChartPanel.this.chart.redraw(); - } + AbstractChartPanel.this.onSelectionChange(chartSelectionEvent); return true; } }); @@ -256,7 +208,8 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL protected void loadData(boolean showBusyIndicator) { if (needsDataLoading()) { if (showBusyIndicator) { - setWidget(busyIndicatorPanel); + setWidget(chart); + chart.showLoading("Loading competitor data..."); } if (chartData == null || chartData.getDetailType() != getDataToShow()) { chartData = new MultiCompetitorRaceDataDTO(getDataToShow()); @@ -282,6 +235,7 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL public void onFailure(Throwable caught) { errorReporter.reportError(getStringMessages().failedToLoadRaceData() + ": " + caught.toString(), timer.getPlayMode() == PlayModes.Live); + chart.hideLoading(); } @Override @@ -297,7 +251,7 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL } } drawChartData(); - setWidget(chart); + chart.hideLoading(); } }); asyncActionsExecutor.execute(getCompetitorsRaceDataAction); @@ -317,7 +271,6 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL @Override public void addedToSelection(CompetitorDTO competitor) { - timeLineNeedsUpdate = true; loadData(true); } @@ -400,9 +353,6 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL } } } - if (timeLineNeedsUpdate) { - forceTimeLineUpdate(); - } } } @@ -437,14 +387,6 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL return result; } - private Series createTimeLineSeries() { - return chart - .createSeries() - .setType(Series.Type.LINE) - .setName(stringMessages.time()) - .setPlotOptions(new LinePlotOptions().setShowInLegend(false).setHoverStateEnabled(false).setLineWidth(2)); - } - private String getUnit() { String unit = ""; switch (getDataToShow()) { @@ -569,7 +511,6 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL public void onRaceSelectionChange(List selectedRaces) { setChartData(null); clearChart(); - timeLineNeedsUpdate = true; loadData(true); } @@ -613,48 +554,10 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL return new Pair(everyPassingInRange, twoPassingsInRangeBeforeError); } - /** - * Forces the chart to {@link #updateTimeLine(Date) update} the position and to {@link #ensureTimeLineIsVisible() - * ensure}, that the time line is visible. - */ - public void forceTimeLineUpdate() { - updateTimeLine(timer.getTime()); - } - - /** - * Updates the position of the time line for the given {@link Date}, if {@link #allowTimeAdjust} is true.
- * @param date Defines the x-Value of the line points - */ - private void updateTimeLine(Date date) { - if (allowTimeAdjust && chart != null) { - raceSelectionProvider.getSelectedRaces().get(0); - - Long x = date.getTime(); - Extremes extremes = chart.getYAxis(0).getExtremes(); - Point[] points = new Point[2]; - points[0] = new Point(x, extremes.getDataMin()); - points[1] = new Point(x, extremes.getDataMax()); - timeLineSeries.setPoints(points); - ensureTimeLineIsVisible(); - timeLineNeedsUpdate = false; - } - } - - /** - * Checks if the series of the chart contain the {@link #timeLineSeries}. If not, it is added to the chart.
- * Throws a NPE if the chart is null. - */ - private void ensureTimeLineIsVisible() { - if (!Arrays.asList(chart.getSeries()).contains(timeLineSeries)) { - chart.addSeries(timeLineSeries); - } - } - @Override public void timeChanged(Date date) { if (getChartData() != null) { Date newestEvent = getChartData().getOldestDateOfNewestData(); - updateTimeLine(date); if ((newestEvent == null || (newestEvent.before(date) && (date.getTime() - newestEvent.getTime()) >= getStepSize()))) { loadData(false); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/ChartPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/ChartPanel.java index 0e699effba2..8bdb5e08862 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/ChartPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/ChartPanel.java @@ -7,6 +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.Timer; import com.sap.sailing.gwt.ui.shared.components.Component; import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; @@ -26,9 +27,9 @@ import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; public class ChartPanel extends AbstractChartPanel implements Component { public ChartPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, CompetitorSelectionProvider competitorSelectionProvider, - RaceSelectionProvider raceSelectionProvider, Timer timer, DetailType dataToShow, StringMessages stringMessages, + RaceSelectionProvider raceSelectionProvider, Timer timer, TimeZoomProvider timeZoomProvider, DetailType dataToShow, StringMessages stringMessages, ErrorReporter errorReporter, boolean compactChart, boolean allowTimeAdjust) { - super(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, timer, stringMessages, errorReporter, + super(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, timer, timeZoomProvider, stringMessages, errorReporter, dataToShow, compactChart, allowTimeAdjust); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/MultiChartPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/MultiChartPanel.java index 2cd7afe73d0..a1a56b674fb 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/MultiChartPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/MultiChartPanel.java @@ -7,6 +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.Timer; import com.sap.sailing.gwt.ui.shared.components.Component; import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; @@ -26,10 +27,10 @@ import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; public class MultiChartPanel extends AbstractChartPanel implements Component { public MultiChartPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, CompetitorSelectionProvider competitorSelectionProvider, RaceSelectionProvider raceSelectionProvider, - Timer timer, final StringMessages stringMessages, ErrorReporter errorReporter, boolean compactChart, + Timer timer, TimeZoomProvider timeZoomProvider, final StringMessages stringMessages, ErrorReporter errorReporter, boolean compactChart, boolean allowTimeAdjust) { - super(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, timer, stringMessages, errorReporter, - /*show initially*/ DetailType.WINDWARD_DISTANCE_TO_OVERALL_LEADER, compactChart, allowTimeAdjust); + super(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, timer, timeZoomProvider, stringMessages, errorReporter, + /*show initially*/ DetailType.DISTANCE_TRAVELED, compactChart, allowTimeAdjust); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/RaceChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/RaceChart.java new file mode 100644 index 00000000000..01210a93e96 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/RaceChart.java @@ -0,0 +1,137 @@ +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; +import org.moxieapps.gwt.highcharts.client.events.ChartClickEvent; +import org.moxieapps.gwt.highcharts.client.events.ChartSelectionEvent; +import org.moxieapps.gwt.highcharts.client.events.SeriesCheckboxClickEvent; +import org.moxieapps.gwt.highcharts.client.events.SeriesCheckboxClickEventHandler; +import org.moxieapps.gwt.highcharts.client.events.SeriesLegendItemClickEvent; +import org.moxieapps.gwt.highcharts.client.events.SeriesLegendItemClickEventHandler; +import org.moxieapps.gwt.highcharts.client.plotOptions.PlotOptions; +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.RaceIdentifier; +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.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 { + protected Chart chart; + + protected final Timer timer; + protected final TimeZoomProvider timeZoomProvider; + + protected Date minTimepoint; + protected Date maxTimepoint; + + protected boolean ignoreClickOnce; + + protected RaceIdentifier selectedRaceIdentifier; + protected RaceTimesInfoDTO lastRaceTimesInfo; + + protected final DateTimeFormat dateFormat = DateTimeFormat.getFormat("HH:mm:ss"); + + protected final StringMessages stringMessages; + protected final ErrorReporter errorReporter; + protected final AsyncActionsExecutor asyncActionsExecutor; + protected final SailingServiceAsync sailingService; + + public RaceChart(SailingServiceAsync sailingService, Timer timer, TimeZoomProvider timeZoomProvider, final StringMessages stringMessages, + AsyncActionsExecutor asyncActionsExecutor, ErrorReporter errorReporter) { + this.sailingService = sailingService; + this.timer = timer; + this.timeZoomProvider = timeZoomProvider; + this.stringMessages = stringMessages; + this.asyncActionsExecutor = asyncActionsExecutor; + this.errorReporter = errorReporter; + } + + @Override + public void raceTimesInfosReceived(Map raceTimesInfos) { + this.lastRaceTimesInfo = raceTimesInfos.get(selectedRaceIdentifier); + + Pair raceMinMax = RaceTimesCalculationUtil.caluclateRaceMinMax(timer, this.lastRaceTimesInfo); + + this.minTimepoint = raceMinMax.getA(); + this.maxTimepoint = raceMinMax.getB(); + } + + protected void onSelectionChange(ChartSelectionEvent chartSelectionEvent) { + try { + 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); + //Redrawing, or the chart wouldn't rezoom + chart.redraw(); + } + } + + protected void onClick(ChartClickEvent chartClickEvent) { + if (ignoreClickOnce) { + ignoreClickOnce = false; + } else { + timer.setPlayMode(PlayModes.Replay); + timer.setTime(chartClickEvent.getXAxisValueAsLong()); + } + } + + public void onTimeZoom(Date zoomStartTimepoint, Date zoomEndTimepoint) { + chart.getXAxis().setExtremes(zoomStartTimepoint.getTime(), zoomEndTimepoint.getTime(), true, true); + // 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); + } + + /** + * When using this method to enable the use of checkboxes only for hiding / showing a series, callers need to ensure + * that all series have {@link PlotOptions#setSelected(boolean)} set to true for all series that are + * added to the chart and hence visible. Otherwise, the checkbox won't initially be in sync with the series' + * visibility state. + */ + protected void useCheckboxesToShowAndHide(final Chart chart) { + chart.setLegend(new Legend().setEnabled(true).setBorderWidth(0).setSymbolPadding(20)); // make room for checkbox + chart.setSeriesPlotOptions(new SeriesPlotOptions().setSeriesCheckboxClickEventHandler(new SeriesCheckboxClickEventHandler() { + @Override + public boolean onClick(SeriesCheckboxClickEvent seriesCheckboxClickEvent) { + if (seriesCheckboxClickEvent.isChecked()) { + chart.getSeries(seriesCheckboxClickEvent.getSeriesId()).show(); + } else { + chart.getSeries(seriesCheckboxClickEvent.getSeriesId()).hide(); + } + return false; // don't toggle the select state of the series + } + }).setShowCheckbox(true). + setSeriesLegendItemClickEventHandler(new SeriesLegendItemClickEventHandler() { + @Override + public boolean onClick(SeriesLegendItemClickEvent seriesLegendItemClickEvent) { + // disable toggling visibility by clicking the legend item; force user to use checkbox instead + return false; + } + })); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/WindChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/WindChart.java index 6da4dcdc111..e60f0a0d996 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/WindChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/WindChart.java @@ -30,7 +30,6 @@ import org.moxieapps.gwt.highcharts.client.labels.YAxisLabels; import org.moxieapps.gwt.highcharts.client.plotOptions.LinePlotOptions; import org.moxieapps.gwt.highcharts.client.plotOptions.Marker; -import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.RequiresResize; @@ -39,34 +38,27 @@ import com.sap.sailing.domain.common.EventAndRaceIdentifier; 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.domain.common.impl.Util.Pair; import com.sap.sailing.gwt.ui.actions.AsyncActionsExecutor; import com.sap.sailing.gwt.ui.actions.GetWindInfoAction; import com.sap.sailing.gwt.ui.client.ColorMap; import com.sap.sailing.gwt.ui.client.ErrorReporter; -import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener; import com.sap.sailing.gwt.ui.client.RaceSelectionProvider; -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.TimeZoomProvider; 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; -import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO; 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.sailing.gwt.ui.shared.components.Component; import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; -public class WindChart extends SimpleChartPanel implements Component, RaceSelectionChangeListener, - RaceTimesInfoProviderListener, TimeListener, RequiresResize { +public class WindChart extends RaceChart implements Component, RequiresResize { public static final long DEFAULT_RESOLUTION_IN_MILLISECONDS = 10000; private static final int LINE_WIDTH = 1; - private final StringMessages stringMessages; private final Set windSourceTypesToDisplay; private long resolutionInMilliseconds; private boolean showWindSpeedSeries; @@ -78,26 +70,10 @@ public class WindChart extends SimpleChartPanel implements Component windSourceDirectionSeries; private final Map windSourceSpeedSeries; - private final ErrorReporter errorReporter; - private final AsyncActionsExecutor asyncActionsExecutor; - private final SailingServiceAsync sailingService; - private final Chart chart; - private boolean ignoreClickOnce; - private final DateTimeFormat dateFormat = DateTimeFormat.getFormat("HH:mm:ss"); - private Long timeOfEarliestRequestInMillis; private Long timeOfLatestRequestInMillis; - - private Date minTimepoint; - private Date maxTimepoint; - private Date minSelectedTimepoint; - private Date maxSelectedTimepoint; - - private RaceIdentifier selectedRaceIdentifier; - private RaceTimesInfoDTO lastRaceTimesInfo; - + private final ColorMap colorMap; - private boolean isZoomed = false; /** * @param raceSelectionProvider @@ -106,13 +82,9 @@ public class WindChart extends SimpleChartPanel implements Component(); this.windSourceSpeedSeries = new HashMap(); this.colorMap = new ColorMap(); @@ -160,12 +132,7 @@ public class WindChart extends SimpleChartPanel implements Component raceTimesInfos) { - this.lastRaceTimesInfo = raceTimesInfos.get(selectedRaceIdentifier); - - Pair raceMinMax = RaceTimesCalculationUtil.caluclateRaceMinMax(timer, this.lastRaceTimesInfo); - - this.minTimepoint = raceMinMax.getA(); - this.maxTimepoint = raceMinMax.getB(); - } - /** * If in live mode, fetches what's missing since the last fix and date. If nothing has been loaded yet, * loads from the beginning up to date. If in replay mode, checks if anything has been loaded at all. If not, @@ -566,16 +513,4 @@ public class WindChart extends SimpleChartPanel implements Component Date: Tue, 15 May 2012 10:39:30 +0200 Subject: [PATCH 2/4] removed getDeprecatedRegatta() on RaceDTO --- .../gwt/ui/adminconsole/TrackedRacesListComposite.java | 4 ++-- .../src/main/java/com/sap/sailing/gwt/ui/shared/RaceDTO.java | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java index 54304a1f2c9..eb29c81b339 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java @@ -183,7 +183,7 @@ public class TrackedRacesListComposite extends FormPanel implements RegattaDispl TextColumn deprecatedRegattaNameColumn = new TextColumn() { @Override public String getValue(RaceDTO raceDTO) { - return raceDTO.getDeprecatedRegatta().boatClass.name; + return raceDTO.getRegatta().boatClass.name; } }; deprecatedRegattaNameColumn.setSortable(true); @@ -481,7 +481,7 @@ public class TrackedRacesListComposite extends FormPanel implements RegattaDispl for (String word : wordsToFilter) { String textAsUppercase = word.toUpperCase().trim(); if (!raceDTO.getRegatta().name.toUpperCase().contains(textAsUppercase) - && !raceDTO.getDeprecatedRegatta().boatClass.name.toUpperCase().contains(textAsUppercase) + && !raceDTO.getRegatta().boatClass.name.toUpperCase().contains(textAsUppercase) && !raceDTO.name.toUpperCase().contains(textAsUppercase)) { failed = true; break; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceDTO.java index 2b68480736b..e9b96cb83be 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceDTO.java @@ -32,10 +32,6 @@ public class RaceDTO extends NamedDTO implements IsSerializable { this.currentlyTracked = currentlyTracked; } - public RegattaDTO getDeprecatedRegatta() { - return regatta; - } - public void setRegatta(RegattaDTO regatta) { this.regatta = regatta; } From 45e61f3edbbb9bdd9bf27b197ff9760e1a272944 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 15 May 2012 10:43:23 +0200 Subject: [PATCH 3/4] renamed RaceInLeaderboardImpl to RaceColumnImpl to make consistent with renamed RaceColumn interface --- .../impl/LeaderboardImplWithDelayedCarriedPoints.java | 6 +++--- .../sailing/domain/leaderboard/impl/LeaderboardImpl.java | 6 +++--- .../{RaceInLeaderboardImpl.java => RaceColumnImpl.java} | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) rename java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/{RaceInLeaderboardImpl.java => RaceColumnImpl.java} (89%) diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/LeaderboardImplWithDelayedCarriedPoints.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/LeaderboardImplWithDelayedCarriedPoints.java index 68e008329f3..6374c72c411 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/LeaderboardImplWithDelayedCarriedPoints.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/LeaderboardImplWithDelayedCarriedPoints.java @@ -11,7 +11,7 @@ import com.sap.sailing.domain.leaderboard.RaceColumn; import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.impl.LeaderboardImpl; -import com.sap.sailing.domain.leaderboard.impl.RaceInLeaderboardImpl; +import com.sap.sailing.domain.leaderboard.impl.RaceColumnImpl; import com.sap.sailing.domain.tracking.TrackedRace; /** @@ -42,7 +42,7 @@ public class LeaderboardImplWithDelayedCarriedPoints extends LeaderboardImpl { * * @author Axel Uhl (D043530) */ - private class RaceInLeaderboardForDelayedCarriedPoints extends RaceInLeaderboardImpl { + private class RaceInLeaderboardForDelayedCarriedPoints extends RaceColumnImpl { private static final long serialVersionUID = -1243132535406059096L; public RaceInLeaderboardForDelayedCarriedPoints(Leaderboard leaderboard, String name, boolean medalRace) { @@ -76,7 +76,7 @@ public class LeaderboardImplWithDelayedCarriedPoints extends LeaderboardImpl { } @Override - protected RaceInLeaderboardImpl createRaceColumn(String columnName, boolean medalRace) { + protected RaceColumnImpl createRaceColumn(String columnName, boolean medalRace) { return new RaceInLeaderboardForDelayedCarriedPoints(this, columnName, medalRace); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardImpl.java index 4d3e0b5f42a..869b18f2931 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/LeaderboardImpl.java @@ -107,7 +107,7 @@ public class LeaderboardImpl implements Named, Leaderboard { @Override public RaceColumn addRaceColumn(String name, boolean medalRace) { - RaceInLeaderboardImpl column = createRaceColumn(name, medalRace); + RaceColumnImpl column = createRaceColumn(name, medalRace); races.add(column); return column; } @@ -145,8 +145,8 @@ public class LeaderboardImpl implements Named, Leaderboard { return column; } - protected RaceInLeaderboardImpl createRaceColumn(String columnName, boolean medalRace) { - return new RaceInLeaderboardImpl(columnName, medalRace); + protected RaceColumnImpl createRaceColumn(String columnName, boolean medalRace) { + return new RaceColumnImpl(columnName, medalRace); } private Iterable getTrackedRaces() { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceInLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java similarity index 89% rename from java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceInLeaderboardImpl.java rename to java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java index 43d0fafbcbe..ffb3786f521 100644 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceInLeaderboardImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RaceColumnImpl.java @@ -6,14 +6,14 @@ import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.leaderboard.RaceColumn; import com.sap.sailing.domain.tracking.TrackedRace; -public class RaceInLeaderboardImpl implements RaceColumn { +public class RaceColumnImpl implements RaceColumn { private static final long serialVersionUID = -7801617988982540470L; private TrackedRace trackedRace; private boolean medalRace; private String name; private RaceIdentifier raceIdentifier; - public RaceInLeaderboardImpl(String name, boolean medalRace) { + public RaceColumnImpl(String name, boolean medalRace) { this.name = name; this.medalRace = medalRace; } From 7dcd877dc06b6839b4e4f42832557b293b0003e1 Mon Sep 17 00:00:00 2001 From: fmittag Date: Tue, 15 May 2012 11:30:32 +0200 Subject: [PATCH 4/4] Fixed the missing setting of BoatClassDTO in the RegattaDTO in SailingService.listEvents() --- .../com/sap/sailing/gwt/ui/server/SailingServiceImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 8f36bfcd649..9e4cd45a4a2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -35,6 +35,7 @@ import org.osgi.framework.BundleContext; import org.osgi.util.tracker.ServiceTracker; import com.google.gwt.user.server.rpc.RemoteServiceServlet; +import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Buoy; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.Course; @@ -422,6 +423,10 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS List competitorList = getCompetitorDTOs(regatta.getCompetitors()); RegattaDTO regattaDTO = new RegattaDTO(regatta.getName(), competitorList); regattaDTO.races = getRaceDTOs(regatta); + BoatClass boatClass = regatta.getBoatClass(); + if(boatClass != null) { + regattaDTO.boatClass = new BoatClassDTO(boatClass.getName(), boatClass.getHullLength().getMeters()); + } if (!regattaDTO.races.isEmpty()) { for (RaceDTO race : regattaDTO.races) { race.setRegatta(regattaDTO);