Merge branch 'master' into jbross-buoy-tender

Conflicts:
	java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java
This commit is contained in:
Axel Uhl committed 2015-03-23 20:52:00 +01:00
commit 911cdeb86b
91 files changed
+1114 -720

No files matched your search

@@ -6,6 +6,7 @@ import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.UIObject;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO.RaceColumnLiveState;
import com.sap.sse.gwt.client.player.Timer;
public class RegattaPhaseRace extends UIObject {
@@ -14,7 +15,7 @@ public class RegattaPhaseRace extends UIObject {
interface RegattaPhaseRaceUiBinder extends UiBinder<DivElement, RegattaPhaseRace> {
}
@UiField DivElement raceStatus;
@UiField DivElement raceColumnStatus;
private enum DataStatusEnum {
FINISHED ("finished"), LIVE("live"), SCHEDULED("scheduled");
@@ -31,14 +32,20 @@ public class RegattaPhaseRace extends UIObject {
RegattaResources.INSTANCE.css().ensureInjected();
setElement(uiBinder.createAndBindUi(this));
DataStatusEnum dataStatus;
if(raceColumn.hasLiveRaces(timerForClientServerOffset.getLiveTimePointInMillis())) {
dataStatus = DataStatusEnum.LIVE;
} else if (raceColumn.hasTrackedRaces()) {
dataStatus = DataStatusEnum.FINISHED;
} else {
dataStatus = DataStatusEnum.SCHEDULED;
DataStatusEnum dataStatus = DataStatusEnum.SCHEDULED;
RaceColumnLiveState liveState = raceColumn.getLiveState(timerForClientServerOffset.getLiveTimePointInMillis());
switch(liveState) {
case NOT_TRACKED:
dataStatus = DataStatusEnum.SCHEDULED;
break;
case TRACKED:
dataStatus = DataStatusEnum.FINISHED;
break;
case TRACKED_AND_LIVE:
dataStatus = DataStatusEnum.LIVE;
break;
}
raceStatus.setAttribute(DataStatusEnum.ATTRIBUTE_NAME, dataStatus.attributeValue);
raceColumnStatus.setAttribute(DataStatusEnum.ATTRIBUTE_NAME, dataStatus.attributeValue);
}
}
@@ -5,5 +5,5 @@
<ui:with field="i18n" type="com.sap.sailing.gwt.common.client.i18n.TextMessages"/>
<ui:with field="res" type="com.sap.sailing.gwt.common.client.SharedResources" />
<ui:with field="local_res" type="com.sap.sailing.gwt.home.client.place.event.regatta.RegattaResources" />
<div ui:field="raceStatus" class="{local_res.css.regatta_intro_phases_phase_races_race}"></div>
<div ui:field="raceColumnStatus" class="{local_res.css.regatta_intro_phases_phase_races_race}"></div>
</ui:UiBinder>
@@ -16,6 +16,7 @@ import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.domain.common.dto.RaceDTO;
import com.sap.sailing.domain.common.dto.RaceDTO.RaceLiveState;
import com.sap.sailing.gwt.home.client.place.event.EventPlaceNavigator;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sse.gwt.client.player.Timer;
@@ -23,8 +24,6 @@ import com.sap.sse.gwt.client.player.Timer;
public class EventRegattaRacesRace extends Composite {
private static EventRegattaRacesRaceUiBinder uiBinder = GWT.create(EventRegattaRacesRaceUiBinder.class);
private enum SimpleRaceStates { NOT_TRACKED, TRACKED, TRACKED_AND_LIVE, TRACKED_BUT_NOT_SCHEDULED };
interface EventRegattaRacesRaceUiBinder extends UiBinder<Widget, EventRegattaRacesRace> {
}
@@ -62,16 +61,12 @@ public class EventRegattaRacesRace extends Composite {
private final DateTimeFormat raceTimeFormat = DateTimeFormat.getFormat("EEE, h:mm a");
private final FleetDTO fleet;
private final RaceColumnDTO raceColumn;
private final RaceDTO race;
private final Timer timerForClientServerOffset;
private Element[] allConditionalElements;
public EventRegattaRacesRace(StrippedLeaderboardDTO leaderboard, FleetDTO fleet, RaceColumnDTO raceColumn, Timer timerForClientServerOffset, EventPlaceNavigator pageNavigator) {
this.fleet = fleet;
this.raceColumn = raceColumn;
this.timerForClientServerOffset = timerForClientServerOffset;
race = raceColumn.getRace(fleet);
@@ -97,25 +92,6 @@ public class EventRegattaRacesRace extends Composite {
updateUI();
}
private SimpleRaceStates getSimpleRaceState() {
SimpleRaceStates simpleRaceState = SimpleRaceStates.NOT_TRACKED;
if(race != null && race.trackedRace != null && race.trackedRace.hasGPSData && race.trackedRace.hasWindData) {
simpleRaceState = SimpleRaceStates.TRACKED;
if(isLive()) {
simpleRaceState = SimpleRaceStates.TRACKED_AND_LIVE;
if(race.startOfRace == null) {
simpleRaceState = SimpleRaceStates.TRACKED_BUT_NOT_SCHEDULED;
}
}
}
return simpleRaceState;
}
private boolean isLive() {
return raceColumn.isLive(fleet, timerForClientServerOffset.getLiveTimePointInMillis());
}
private void updateUI() {
averageRaceWind.setInnerText("tbd.");
@@ -123,7 +99,8 @@ public class EventRegattaRacesRace extends Composite {
hideElement(el);
}
switch(getSimpleRaceState()) {
RaceLiveState liveState = race != null ? race.getLiveState(timerForClientServerOffset.getLiveTimePointInMillis()) : RaceLiveState.NOT_TRACKED;
switch(liveState) {
case NOT_TRACKED:
showElement(raceNotTrackedDiv);
break;
@@ -32,7 +32,7 @@ public class CompetitorTableWrapper<S extends SelectionModel<CompetitorDTO>> ext
public CompetitorTableWrapper(SailingServiceAsync sailingService, StringMessages stringMessages,ErrorReporter errorReporter,
boolean multiSelection, boolean enablePager) {
super(sailingService, stringMessages, errorReporter, multiSelection, enablePager);
ListHandler<CompetitorDTO> competitorColumnListHandler = new ListHandler<CompetitorDTO>(dataProvider.getList());
ListHandler<CompetitorDTO> competitorColumnListHandler = getColumnSortHandler();
// competitors table
TextColumn<CompetitorDTO> competitorNameColumn = new TextColumn<CompetitorDTO>() {
@@ -34,7 +34,7 @@ import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public abstract class CourseManagementWidget implements IsWidget {
protected final MarkTableWrapper<MultiSelectionModel<MarkDTO>> marks;
protected final ControlPointTableWrapper<MultiSelectionModel<ControlPointDTO>> multiMarkControlPoints;
protected final ControlPointTableWrapper<SingleSelectionModel<ControlPointDTO>> multiMarkControlPoints;
protected final WaypointTableWrapper<SingleSelectionModel<WaypointDTO>> waypoints;
protected final Grid mainPanel;
@@ -70,8 +70,8 @@ public abstract class CourseManagementWidget implements IsWidget {
waypoints = new WaypointTableWrapper<SingleSelectionModel<WaypointDTO>>(
/* multiSelection */ false, sailingService, stringMessages, errorReporter);
multiMarkControlPoints = new ControlPointTableWrapper<MultiSelectionModel<ControlPointDTO>>(
/* multiSelection */ true, sailingService, stringMessages, errorReporter);
multiMarkControlPoints = new ControlPointTableWrapper<SingleSelectionModel<ControlPointDTO>>(
/* multiSelection */ false, sailingService, stringMessages, errorReporter);
marks = new MarkTableWrapper<MultiSelectionModel<MarkDTO>>(
/* multiSelection */ true, sailingService, stringMessages, errorReporter);
@@ -31,7 +31,6 @@ public class DeviceMappingTableWrapper extends TableWrapper<DeviceMappingDTO, Si
public DeviceMappingTableWrapper(SailingServiceAsync sailingService, final StringMessages stringMessages,
ErrorReporter errorReporter) {
super(sailingService, stringMessages, errorReporter, /* multiSelection */ false, /* enablePager */ true);
showPingMappingsCb = new CheckBox(stringMessages.showPingMarkMappings());
showPingMappingsCb.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@Override
@@ -40,12 +39,9 @@ public class DeviceMappingTableWrapper extends TableWrapper<DeviceMappingDTO, Si
}
});
mainPanel.insert(showPingMappingsCb, 0);
table.setWidth("1000px", true);
table.addStyleName("wrap-cols");
ListHandler<DeviceMappingDTO> listHandler = new ListHandler<DeviceMappingDTO>(dataProvider.getList());
ListHandler<DeviceMappingDTO> listHandler = getColumnSortHandler();
TextColumn<DeviceMappingDTO> itemTypeCol = new TextColumn<DeviceMappingDTO>() {
@Override
public String getValue(DeviceMappingDTO mapping) {
@@ -1,5 +1,6 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
@@ -10,6 +11,7 @@ import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.view.client.SelectionModel;
import com.sap.sailing.domain.common.RegattaNameAndRaceName;
import com.sap.sailing.domain.common.impl.NaturalComparator;
import com.sap.sailing.gwt.ui.adminconsole.AbstractLeaderboardConfigPanel.RaceColumnDTOAndFleetDTOWithNameBasedEquality;
import com.sap.sailing.gwt.ui.adminconsole.LeaderboardConfigPanel.AnchorCell;
import com.sap.sailing.gwt.ui.adminconsole.LeaderboardConfigPanel.AnchorTemplates;
@@ -45,14 +47,26 @@ extends TableWrapper<RaceColumnDTOAndFleetDTOWithNameBasedEquality, S> {
}
}
};
raceNameColumn.setSortable(true);
getColumnSortHandler().setComparator(raceNameColumn, new Comparator<RaceColumnDTOAndFleetDTOWithNameBasedEquality>() {
@Override
public int compare(RaceColumnDTOAndFleetDTOWithNameBasedEquality o1, RaceColumnDTOAndFleetDTOWithNameBasedEquality o2) {
return new NaturalComparator().compare(o1.getA().getName(), o2.getA().getName());
}
});
TextColumn<RaceColumnDTOAndFleetDTOWithNameBasedEquality> fleetNameColumn = new TextColumn<RaceColumnDTOAndFleetDTOWithNameBasedEquality>() {
@Override
public String getValue(RaceColumnDTOAndFleetDTOWithNameBasedEquality object) {
return object.getB().getName();
}
};
fleetNameColumn.setSortable(true);
getColumnSortHandler().setComparator(fleetNameColumn, new Comparator<RaceColumnDTOAndFleetDTOWithNameBasedEquality>() {
@Override
public int compare(RaceColumnDTOAndFleetDTOWithNameBasedEquality o1, RaceColumnDTOAndFleetDTOWithNameBasedEquality o2) {
return new NaturalComparator().compare(o1.getB().getName(), o2.getB().getName());
}
});
table.addColumn(raceNameColumn, stringMessages.race());
table.addColumn(fleetNameColumn, stringMessages.fleet());
}
@@ -2,6 +2,7 @@ package com.sap.sailing.gwt.ui.adminconsole;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.cellview.client.SimplePager;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.VerticalPanel;
@@ -16,7 +17,9 @@ import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter;
/**
* Implementing classes still have to add the table to the main panel.
* Implementing classes still have to add the table to the main panel. The table created and wrapped by this object
* offers already a {@link ListHandler} for sorting. Subclasses can obtain the table's default column sort handler
* created by this class's constructor by calling {@link #getColumnSortHandler}.
*/
public abstract class TableWrapper<T, S extends SelectionModel<T>> implements IsWidget {
protected final CellTable<T> table;
@@ -27,6 +30,7 @@ public abstract class TableWrapper<T, S extends SelectionModel<T>> implements Is
protected final ErrorReporter errorReporter;
private final AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
private final ListHandler<T> columnSortHandler;
@Override
public Widget asWidget() {
@@ -38,6 +42,9 @@ public abstract class TableWrapper<T, S extends SelectionModel<T>> implements Is
this.sailingService = sailingService;
this.errorReporter = errorReporter;
table = new CellTable<T>(10000, tableRes);
this.dataProvider = new ListDataProvider<T>();
this.columnSortHandler = new ListHandler<T>(dataProvider.getList());
table.addColumnSortHandler(this.columnSortHandler);
if (multiSelection) {
SelectionCheckboxColumn<T> selectionCheckboxColumn = new SelectionCheckboxColumn<T>(
tableRes.cellTableStyle().cellTableCheckboxSelected(),
@@ -48,6 +55,7 @@ public abstract class TableWrapper<T, S extends SelectionModel<T>> implements Is
return dataProvider;
}
};
columnSortHandler.setComparator(selectionCheckboxColumn, selectionCheckboxColumn.getComparator());
@SuppressWarnings("unchecked")
S typedSelectionModel = (S) selectionCheckboxColumn.getSelectionModel();
selectionModel = typedSelectionModel;
@@ -59,7 +67,6 @@ public abstract class TableWrapper<T, S extends SelectionModel<T>> implements Is
selectionModel = typedSelectionModel;
table.setSelectionModel(selectionModel);
}
this.dataProvider = new ListDataProvider<T>();
mainPanel = new VerticalPanel();
dataProvider.addDataDisplay(table);
mainPanel.add(table);
@@ -71,6 +78,10 @@ public abstract class TableWrapper<T, S extends SelectionModel<T>> implements Is
}
}
public ListHandler<T> getColumnSortHandler() {
return columnSortHandler;
}
public CellTable<T> getTable() {
return table;
}
@@ -14,6 +14,8 @@ public class DetailTypeFormatter {
switch (detailType) {
case DISTANCE_TRAVELED:
return stringMessages.distanceInMeters();
case DISTANCE_TRAVELED_INCLUDING_GATE_START:
return stringMessages.distanceIncludingGateStartInMeters();
case AVERAGE_SPEED_OVER_GROUND_IN_KNOTS:
return stringMessages.averageSpeedInKnots();
case RANK_GAIN:
@@ -50,6 +52,8 @@ public class DetailTypeFormatter {
return stringMessages.windwardDistanceToGoInMeters();
case RACE_DISTANCE_TRAVELED:
return stringMessages.distanceInMeters();
case RACE_DISTANCE_TRAVELED_INCLUDING_GATE_START:
return stringMessages.distanceIncludingGateStartInMeters();
case RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS:
return stringMessages.averageSpeedInKnots();
case RACE_GAP_TO_LEADER_IN_SECONDS:
@@ -159,8 +163,10 @@ public class DetailTypeFormatter {
case WINDWARD_DISTANCE_TO_OVERALL_LEADER:
case WINDWARD_DISTANCE_TO_GO_IN_METERS:
case DISTANCE_TRAVELED:
case DISTANCE_TRAVELED_INCLUDING_GATE_START:
case RACE_DISTANCE_TO_LEADER_IN_METERS:
case RACE_DISTANCE_TRAVELED:
case RACE_DISTANCE_TRAVELED_INCLUDING_GATE_START:
case AVERAGE_TACK_LOSS_IN_METERS:
case AVERAGE_JIBE_LOSS_IN_METERS:
case AVERAGE_MANEUVER_LOSS_IN_METERS:
@@ -257,6 +263,8 @@ public class DetailTypeFormatter {
return "";
case DISTANCE_TRAVELED:
return stringMessages.distanceTraveledTooltip();
case DISTANCE_TRAVELED_INCLUDING_GATE_START:
return stringMessages.distanceTraveledIncludingGateStartTooltip();
case AVERAGE_SPEED_OVER_GROUND_IN_KNOTS:
return stringMessages.averageSpeedInKnotsTooltip();
case ESTIMATED_TIME_TO_NEXT_WAYPOINT_IN_SECONDS:
@@ -295,6 +303,8 @@ public class DetailTypeFormatter {
return stringMessages.startTackTooltip();
case RACE_DISTANCE_TRAVELED:
return stringMessages.raceDistanceTraveledTooltip();
case RACE_DISTANCE_TRAVELED_INCLUDING_GATE_START:
return stringMessages.raceDistanceTraveledIncludingGateStartTooltip();
case RACE_GAP_TO_LEADER_IN_SECONDS:
return stringMessages.gapToLeaderInSecondsTooltip();
case RACE_RANK:
@@ -1165,6 +1165,9 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c
String orMultipleEmails();
String courseOverGroundTrueDegreesTooltip();
String courseOverGroundTrueDegrees();
String distanceIncludingGateStartInMeters();
String distanceTraveledIncludingGateStartTooltip();
String raceDistanceTraveledIncludingGateStartTooltip();
String results();
String group();
String valueAscending();
@@ -1145,6 +1145,9 @@ inviteBuoyTenders=Invite Buoy Tenders
orMultipleEmails=or multiple E-Mails separated by comma
courseOverGroundTrueDegreesTooltip=True course over ground in degrees
courseOverGroundTrueDegrees=COG
distanceIncludingGateStartInMeters=Distance (w/ Gate Start)
distanceTraveledIncludingGateStartTooltip=The distance traveled from the leg start to the end\nor to the current time point, if the leg isn''t finished.\nIf the leg includes a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times.
raceDistanceTraveledIncludingGateStartTooltip=The distance traveled from the race start to the end\nor to the current time point, if the race isn''t finished. For a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times.
results=Results
group=Group
valueAscending=Value (Ascending)
@@ -165,7 +165,7 @@ chooseChart=Diagramm wählen
raceNameEmpty=Rennname leer
distanceTraveled=Zurückgelegte Strecke
distanceTraveledTooltip=Die zurückgelegt Strecke vom Start des Schenkels bis zum Ende\noder bis zum aktuellen Zeitpunkt, falls der Schenkel noch nicht beendet ist.
raceDistanceTraveledTooltip=Die zurückgelegt Strecke vom Start des Rennens, bis zum Ende\noder bis zum aktuellen Zeitpunkt, falls das Rennen noch nicht beendet ist.
raceDistanceTraveledTooltip=Die zurückgelegte Strecke vom Start des Rennens, bis zum Ende\noder bis zum aktuellen Zeitpunkt, falls das Rennen noch nicht beendet ist.
velocityMadeGoodLong=Velocity Made Good
speedOverGroundLong=Speed Over Ground
gapToLeaderLong=Abstand zum führenden Boot
@@ -1135,6 +1135,9 @@ inviteBuoyTenders=Tonnenleger einladen
orMultipleEmails=oder mehrere E-Mails (Komma-separiert)
courseOverGroundTrueDegreesTooltip=Rechtweisender Kurs über Grund in Grad
courseOverGroundTrueDegrees=KüG
distanceIncludingGateStartInMeters=Distanz (m. Torstart)
distanceTraveledIncludingGateStartTooltip=Die zurückgelegt Strecke vom Start des Schenkels bis zum Ende\noder bis zum aktuellen Zeitpunkt, falls der Schenkel noch nicht beendet ist.\nEnthält der Schenkel einen Torstart, so wird die Distanz vom Pin End bis zur Startposition des Teilnehmers hinzugezählt,\num so vergleichbare Distanzen auch für Teilneher zu erhalten, die zu verschiedenen Zeiten gestartet sind.
raceDistanceTraveledIncludingGateStartTooltip=Die zurückgelegte Strecke vom Start des Rennens, bis zum Ende\noder bis zum aktuellen Zeitpunkt, falls das Rennen noch nicht beendet ist. Bei einem Torstart wird die Distanz vom Pin End bis zur Startposition des Teilnehmers hinzugezählt,\num so vergleichbare Distanzen auch für Teilneher zu erhalten, die zu verschiedenen Zeiten gestartet sind.
results=Ergebnisse
group=Gruppe
valueAscending=Wert (Aufsteigend)
@@ -1084,6 +1084,9 @@ inviteBuoyTenders=Invite Buoy Tenders
orMultipleEmails=or multiple E-Mails separated by comma
courseOverGroundTrueDegreesTooltip=True course over ground in degrees
courseOverGroundTrueDegrees=COG
distanceIncludingGateStartInMeters=Distance (w/ Gate Start)
distanceTraveledIncludingGateStartTooltip=The distance traveled from the leg start to the end\nor to the current time point, if the leg isn''t finished.\nIf the leg includes a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times.
raceDistanceTraveledIncludingGateStartTooltip=The distance traveled from the race start to the end\nor to the current time point, if the race isn''t finished. For a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times.
results=Results
group=Group
valueAscending=Value (Ascending)
@@ -27,6 +27,7 @@ public class MultiCompetitorRaceChartSettingsComponent extends AbstractChartSett
availableDetailsTypes = new ArrayList<DetailType>();
availableDetailsTypes.add(DetailType.WINDWARD_DISTANCE_TO_OVERALL_LEADER);
availableDetailsTypes.add(DetailType.DISTANCE_TRAVELED);
availableDetailsTypes.add(DetailType.DISTANCE_TRAVELED_INCLUDING_GATE_START);
availableDetailsTypes.add(DetailType.VELOCITY_MADE_GOOD_IN_KNOTS);
availableDetailsTypes.add(DetailType.GAP_TO_LEADER_IN_SECONDS);
availableDetailsTypes.add(DetailType.RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS);
@@ -49,11 +49,11 @@ public class DataMiningEntryPoint extends AbstractSailingEntryPoint {
SplitLayoutPanel splitPanel = new SplitLayoutPanel();
rootPanel.add(splitPanel);
DockLayoutPanel dockPanel = new DockLayoutPanel(Unit.PX);
dockPanel.addNorth(createLogoAndTitlePanel(), 68);
DockLayoutPanel selectionDockPanel = new DockLayoutPanel(Unit.PX);
selectionDockPanel.addNorth(createLogoAndTitlePanel(), 68);
BufferingQueryDefinitionProviderWithControls queryDefinitionProviderWithControls = new BufferingQueryDefinitionProviderWithControls(session, getStringMessages(), sailingService, dataMiningService, this);
queryDefinitionProviderWithControls.getEntryWidget().addStyleName("dataMiningPanel");
dockPanel.add(queryDefinitionProviderWithControls.getEntryWidget());
selectionDockPanel.add(queryDefinitionProviderWithControls.getEntryWidget());
ResultsPresenter<Number> resultsPresenter = new ResultsChart(getStringMessages());
if (GwtHttpRequestUtils.getBooleanParameter("benchmark", false)) {
@@ -63,7 +63,7 @@ public class DataMiningEntryPoint extends AbstractSailingEntryPoint {
splitPanel.addSouth(resultsPresenter.getWidget(), 400);
}
splitPanel.add(dockPanel);
splitPanel.add(selectionDockPanel);
QueryRunner queryRunner = new SimpleQueryRunner(session, getStringMessages(), dataMiningService, this, queryDefinitionProviderWithControls, resultsPresenter);
queryDefinitionProviderWithControls.addControl(queryRunner.getEntryWidget());
@@ -22,17 +22,17 @@ import org.moxieapps.gwt.highcharts.client.labels.AxisLabelsData;
import org.moxieapps.gwt.highcharts.client.labels.AxisLabelsFormatter;
import org.moxieapps.gwt.highcharts.client.labels.YAxisLabels;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.text.shared.AbstractRenderer;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ValueListBox;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.panels.ResizingFlowPanel;
import com.sap.sailing.gwt.ui.client.shared.panels.ResizingSimplePanel;
import com.sap.sailing.gwt.ui.datamining.ResultsPresenter;
import com.sap.sse.datamining.shared.GroupKey;
@@ -76,7 +76,7 @@ public class ResultsChart implements ResultsPresenter<Number> {
};
private final StringMessages stringMessages;
private final FlowPanel mainPanel;
private final DockLayoutPanel mainPanel;
private final HorizontalPanel sortByPanel;
private final ValueListBox<Comparator<GroupKey>> keyComparatorListBox;
@@ -95,17 +95,12 @@ public class ResultsChart implements ResultsPresenter<Number> {
super();
this.stringMessages = stringMessages;
mainPanel = new ResizingFlowPanel() {
@Override
public void onResize() {
presentationPanel.onResize();
}
};
mainPanel = new DockLayoutPanel(Unit.PX);
sortByPanel = new HorizontalPanel();
sortByPanel.setSpacing(5);
sortByPanel.setVisible(false);
mainPanel.add(sortByPanel);
mainPanel.addNorth(sortByPanel, 50);
sortByPanel.add(new Label(stringMessages.sortBy()));
keyComparatorListBox = new ValueListBox<>(new AbstractRenderer<Comparator<?>>() {
@Override
@@ -810,6 +810,7 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS
if (isShowAddedScores()) {
double o1AddedScore = computeAddedScores(o1);
double o2AddedScore = computeAddedScores(o2);
// FIXME bug 2717: need to respect the scoring scheme's isHigherBetter() flag here
double result = o1AddedScore == 0. ? o2AddedScore == 0. ? 0. : isAscending() ? 1. : -1. : o2AddedScore == 0. ? isAscending() ? 1. : -1. : o2AddedScore - o1AddedScore;
return result > 0 ? 1 : result < 0 ? -1 : 0;
} else {
@@ -840,7 +841,7 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS
public static DetailType[] getAvailableRaceDetailColumnTypes() {
return new DetailType[] { DetailType.RACE_GAP_TO_LEADER_IN_SECONDS,
DetailType.RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS,
DetailType.RACE_DISTANCE_TRAVELED,
DetailType.RACE_DISTANCE_TRAVELED, DetailType.RACE_DISTANCE_TRAVELED_INCLUDING_GATE_START,
DetailType.RACE_TIME_TRAVELED,
DetailType.RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS, DetailType.RACE_DISTANCE_TO_LEADER_IN_METERS,
DetailType.NUMBER_OF_MANEUVERS, DetailType.DISPLAY_LEGS, DetailType.CURRENT_LEG,
@@ -903,6 +904,9 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS
result.put(DetailType.RACE_DISTANCE_TRAVELED,
new FormattedDoubleDetailTypeColumn(DetailType.RACE_DISTANCE_TRAVELED, new RaceDistanceTraveledInMeters(),
LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE, LeaderboardPanel.this));
result.put(DetailType.RACE_DISTANCE_TRAVELED_INCLUDING_GATE_START,
new FormattedDoubleDetailTypeColumn(DetailType.RACE_DISTANCE_TRAVELED_INCLUDING_GATE_START, new RaceDistanceTraveledIncludingGateStartInMeters(),
LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE, LeaderboardPanel.this));
result.put(DetailType.RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS,
new FormattedDoubleDetailTypeColumn(DetailType.RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS, new RaceAverageSpeedInKnots(),
LEG_COLUMN_HEADER_STYLE, LEG_COLUMN_STYLE, LeaderboardPanel.this));
@@ -1254,6 +1258,35 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS
}
}
/**
* Accumulates the distance traveled over all legs of a race and considers the specifics of a gate start. The
* first leg of a gate start gets as additional distance traveled the distance from the port side of the line to
* the point where the competitor started which helps normalize the distance traveled and make them comparable
* across early and late starters.
*
* @author Axel Uhl (D043530)
*/
private class RaceDistanceTraveledIncludingGateStartInMeters implements LegDetailField<Double> {
@Override
public Double get(LeaderboardRowDTO row) {
Double result = null;
LeaderboardEntryDTO fieldsForRace = row.fieldsByRaceColumnName.get(getRaceColumnName());
if (fieldsForRace != null && fieldsForRace.legDetails != null) {
for (LegEntryDTO legDetail : fieldsForRace.legDetails) {
if (legDetail != null) {
if (legDetail.distanceTraveledIncludingGateStartInMeters != null) {
if (result == null) {
result = 0.0;
}
result += legDetail.distanceTraveledIncludingGateStartInMeters;
}
}
}
}
return result;
}
}
private class CurrentLeg implements LegDetailField<Double> {
@Override
public Double get(LeaderboardRowDTO row) {
@@ -54,6 +54,13 @@ public class LegColumn extends ExpandableSortableColumn<String> {
}
}
private class DistanceTraveledIncludingGateStartInMeters extends AbstractLegDetailField<Double> {
@Override
protected Double getFromNonNullEntry(LegEntryDTO entry) {
return entry.distanceTraveledIncludingGateStartInMeters;
}
}
private class TimeTraveledInSeconds extends AbstractLegDetailField<Double> {
@Override
protected Double getFromNonNullEntry(LegEntryDTO entry) {
@@ -234,6 +241,7 @@ public class LegColumn extends ExpandableSortableColumn<String> {
public static DetailType[] getAvailableLegDetailColumnTypes() {
return new DetailType[] { DetailType.AVERAGE_SPEED_OVER_GROUND_IN_KNOTS, DetailType.DISTANCE_TRAVELED,
DetailType.DISTANCE_TRAVELED_INCLUDING_GATE_START,
DetailType.GAP_TO_LEADER_IN_SECONDS, DetailType.GAP_CHANGE_SINCE_LEG_START_IN_SECONDS,
DetailType.SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED, DetailType.CURRENT_SPEED_OVER_GROUND_IN_KNOTS,
DetailType.WINDWARD_DISTANCE_TO_GO_IN_METERS, DetailType.NUMBER_OF_MANEUVERS,
@@ -251,6 +259,9 @@ public class LegColumn extends ExpandableSortableColumn<String> {
result.put(DetailType.DISTANCE_TRAVELED,
new FormattedDoubleDetailTypeColumn(DetailType.DISTANCE_TRAVELED, new DistanceTraveledInMeters(), detailHeaderStyle, detailColumnStyle, leaderboardPanel));
result.put(DetailType.DISTANCE_TRAVELED_INCLUDING_GATE_START,
new FormattedDoubleDetailTypeColumn(DetailType.DISTANCE_TRAVELED_INCLUDING_GATE_START, new DistanceTraveledIncludingGateStartInMeters(), detailHeaderStyle, detailColumnStyle, leaderboardPanel));
result.put(DetailType.AVERAGE_SPEED_OVER_GROUND_IN_KNOTS,
new FormattedDoubleDetailTypeColumn(DetailType.AVERAGE_SPEED_OVER_GROUND_IN_KNOTS, new AverageSpeedOverGroundInKnots(), detailHeaderStyle, detailColumnStyle, leaderboardPanel));
@@ -129,6 +129,7 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
Iterable<Function<?>> dimensions = functionDTOsAsFunctions(dimensionDTOs);
Locale locale = ResourceBundleStringMessages.Util.getLocaleFor(localeInfoName);
Query<Set<Object>> dimensionValuesQuery = getDataMiningServer().createDimensionValuesQuery(retrieverChainDefinition, retrieverLevel, dimensions, locale);
// QueryResult<Set<Object>> result = getDataMiningServer().runNewQueryAndAbortPreviousQueries(session, dimensionValuesQuery);
QueryResult<Set<Object>> result = dimensionValuesQuery.run();
return result;
}
@@ -2746,6 +2746,12 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
result = distanceTraveled == null ? null : distanceTraveled.getMeters();
}
break;
case DISTANCE_TRAVELED_INCLUDING_GATE_START:
if (trackedLeg != null) {
Distance distanceTraveledConsideringGateStart = trackedRace.getDistanceTraveledIncludingGateStart(competitor, timePoint);
result = distanceTraveledConsideringGateStart == null ? null : distanceTraveledConsideringGateStart.getMeters();
}
break;
case GAP_TO_LEADER_IN_SECONDS:
if (trackedLeg != null) {
result = trackedLeg.getGapToLeaderInSeconds(timePoint, WindPositionMode.LEG_MIDDLE, cache);