Introduced a 'RaceCompetitorSelectionModel' which extends 'CompetitorSelectionModel' to provde some race specific functions and also provide a way to store boat information for the managed competitors

This commit is contained in:
Frank Mittag
2017-09-14 11:53:17 +02:00
parent 23a1519cbe
commit 4159c57e63
20 changed files with 459 additions and 64 deletions
@@ -26,7 +26,7 @@ import com.sap.sailing.dashboards.gwt.shared.dto.StartAnalysisDTO;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.gwt.ui.client.CompetitorColorProvider;
import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -74,7 +74,7 @@ public class StartAnalysisCard extends Composite implements HasWidgets, StartAna
private SailingServiceAsync sailingServiceAsync;
private StringMessages stringMessages;
private final CompetitorSelectionModel competitorSelectionModel;
private final RaceCompetitorSelectionModel competitorSelectionModel;
private final CompetitorColorProvider colorProvider;
private final double WIND_LINE_ADVANTAGE_DIV_WIDTH_IN_PT = 185;
@@ -88,7 +88,7 @@ public class StartAnalysisCard extends Composite implements HasWidgets, StartAna
this.sailingServiceAsync = sailingServiceAsync;
this.raceMapResources = raceMapResources;
colorProvider = new CompetitorColorProviderImpl();
competitorSelectionModel = new CompetitorSelectionModel(/* hasMultiSelection */true, colorProvider);
competitorSelectionModel = new RaceCompetitorSelectionModel(/* hasMultiSelection */true, colorProvider);
competitorSelectionModel.setCompetitors(startAnalysisDTO.getCompetitorDTOsFromStartAnaylsisCompetitorDTOs(),
raceMap);
initWidget(uiBinder.createAndBindUi(this));
@@ -10,6 +10,7 @@ package com.sap.sailing.domain.common.dto;
*
*/
public interface CompetitorDTO extends CompetitorWithoutBoatDTO {
// TODO bug2822: Should we remove this?
String getSailID();
BoatDTO getBoat();
@@ -14,8 +14,8 @@ import com.sap.sailing.gwt.autoplay.client.app.AutoPlayClientFactory;
import com.sap.sailing.gwt.autoplay.client.app.AutoPlayPresenterConfigured;
import com.sap.sailing.gwt.autoplay.client.events.AutoPlayHeaderEvent;
import com.sap.sailing.gwt.settings.client.leaderboard.SingleRaceLeaderboardSettings;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.LeaderboardUpdateListener;
import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardEntryPoint;
@@ -33,7 +33,7 @@ public class RaceEndWithBoatsPresenterImpl extends AutoPlayPresenterConfigured<A
protected static final int SWITCH_COMPETITOR_DELAY = 2000;
private RaceEndWithBoatsView view;
private SingleRaceLeaderboardPanel leaderboardPanel;
private CompetitorSelectionModel competitorSelectionProvider;
private RaceCompetitorSelectionModel competitorSelectionProvider;
private Timer timer;
public RaceEndWithBoatsPresenterImpl(AbstractRaceEndWithImagesTop3Place place, AutoPlayClientFactory clientFactory,
@@ -61,7 +61,7 @@ public class RaceEndWithBoatsPresenterImpl extends AutoPlayPresenterConfigured<A
false,
false, true);
competitorSelectionProvider = new CompetitorSelectionModel(/* hasMultiSelection */ false);
competitorSelectionProvider = new RaceCompetitorSelectionModel(/* hasMultiSelection */ false);
timer = new com.sap.sse.gwt.client.player.Timer(PlayModes.Live,
PlayStates.Paused,
@@ -3,7 +3,7 @@ package com.sap.sailing.gwt.autoplay.client.places.screens.liveraceloop.racemapw
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceTokenizer;
import com.sap.sailing.gwt.home.communication.event.sixtyinch.GetSixtyInchStatisticDTO;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMap;
public class LiveRaceWithRacemapAndLeaderBoardPlace extends Place {
@@ -21,10 +21,10 @@ public class LiveRaceWithRacemapAndLeaderBoardPlace extends Place {
private RaceMap raceMap;
private Throwable error;
private CompetitorSelectionModel raceMapSelectionProvider;
private RaceCompetitorSelectionModel raceMapSelectionProvider;
private GetSixtyInchStatisticDTO statistic;
public void setRaceMap(RaceMap result, CompetitorSelectionModel csel) {
public void setRaceMap(RaceMap result, RaceCompetitorSelectionModel csel) {
this.raceMap = result;
this.raceMapSelectionProvider = csel;
}
@@ -45,7 +45,7 @@ public class LiveRaceWithRacemapAndLeaderBoardPlace extends Place {
this.error = caught;
}
public CompetitorSelectionModel getRaceMapSelectionProvider() {
public RaceCompetitorSelectionModel getRaceMapSelectionProvider() {
return raceMapSelectionProvider;
}
@@ -14,7 +14,7 @@ import com.sap.sailing.gwt.autoplay.client.app.AnimationPanel;
import com.sap.sailing.gwt.autoplay.client.app.AutoPlayClientFactory;
import com.sap.sailing.gwt.autoplay.client.app.AutoPlayPresenterConfigured;
import com.sap.sailing.gwt.settings.client.leaderboard.SingleRaceLeaderboardSettings;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardEntryPoint;
@@ -33,7 +33,7 @@ public class PreLiveRaceLeaderBoardWithImagePresenterImpl
private PreLeaderboardWithImageView view;
private SingleRaceLeaderboardPanel leaderboardPanel;
private Timer selectionTimer;
private CompetitorSelectionModel competitorSelectionProvider;
private RaceCompetitorSelectionModel competitorSelectionProvider;
ArrayList<CompetitorDTO> compList = new ArrayList<>();
private com.sap.sse.gwt.client.player.Timer timer;
@@ -97,7 +97,7 @@ public class PreLiveRaceLeaderBoardWithImagePresenterImpl
false, false, true, false, false, false);
GWT.log("event " + getSlideCtx().getEvent());
competitorSelectionProvider = new CompetitorSelectionModel(/* hasMultiSelection */ false);
competitorSelectionProvider = new RaceCompetitorSelectionModel(/* hasMultiSelection */ false);
timer = new com.sap.sse.gwt.client.player.Timer(
// perform the first request as "live" but don't by default auto-play
@@ -17,7 +17,7 @@ import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.gwt.home.communication.SailingDispatchSystem;
import com.sap.sailing.gwt.ui.client.CompetitorColorProvider;
import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProviderListener;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
@@ -157,13 +157,13 @@ public class AutoplayHelper {
public static class RVWrapper {
public RVWrapper(RaceMap raceboardPerspective2, CompetitorSelectionModel competitorSelectionProvider) {
public RVWrapper(RaceMap raceboardPerspective2, RaceCompetitorSelectionModel competitorSelectionProvider) {
this.raceboardPerspective = raceboardPerspective2;
this.csel = competitorSelectionProvider;
}
public RaceMap raceboardPerspective;
public CompetitorSelectionModel csel;
public RaceCompetitorSelectionModel csel;
}
public static void create(SailingServiceAsync sailingService, ErrorReporter errorReporter, String leaderBoardName,
@@ -281,7 +281,7 @@ public class AutoplayHelper {
RaceMapLifecycle raceMapLifecycle = new RaceMapLifecycle(StringMessages.INSTANCE);
final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(currentLiveRace, result);
CompetitorSelectionModel competitorSelectionProvider = new CompetitorSelectionModel(
RaceCompetitorSelectionModel competitorSelectionProvider = new RaceCompetitorSelectionModel(
/* hasMultiSelection */ true, colorProvider);
competitorSelectionProvider.setCompetitors(competitors);
RaceMap raceboardPerspective = new RaceMap(null, null, raceMapLifecycle, settings, sailingService,
@@ -11,7 +11,6 @@ import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sse.common.Color;
import com.sap.sse.common.Util;
@@ -19,7 +18,7 @@ import com.sap.sse.common.filter.Filter;
import com.sap.sse.common.filter.FilterSet;
public class CompetitorSelectionModel implements CompetitorSelectionProvider {
private final Set<CompetitorDTO> allCompetitors;
protected final Set<CompetitorDTO> allCompetitors;
/**
* Keys are {@link CompetitorDTO#getIdAsString()} of their values
@@ -32,7 +31,7 @@ public class CompetitorSelectionModel implements CompetitorSelectionProvider {
private FilterSet<CompetitorDTO, Filter<CompetitorDTO>> competitorsFilterSet;
private final CompetitorColorProvider competitorColorProvider;
protected final CompetitorColorProvider competitorColorProvider;
public CompetitorSelectionModel(boolean hasMultiSelection) {
this(hasMultiSelection, new CompetitorColorProviderImpl(), null);
@@ -260,11 +259,6 @@ public class CompetitorSelectionModel implements CompetitorSelectionProvider {
return allCompetitors.contains(competitor) ? competitorColorProvider.getColor(competitor) : null;
}
@Override
public Color getColor(CompetitorDTO competitor, RegattaAndRaceIdentifier raceIdentfier) {
return allCompetitors.contains(competitor) ? competitorColorProvider.getColor(competitor, raceIdentfier) : Color.WHITE /* safe default */;
}
@Override
public FilterSet<CompetitorDTO, Filter<CompetitorDTO>> getCompetitorsFilterSet() {
return competitorsFilterSet;
@@ -1,6 +1,5 @@
package com.sap.sailing.gwt.ui.client;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sse.common.Color;
import com.sap.sse.common.filter.Filter;
@@ -62,8 +61,6 @@ public interface CompetitorSelectionProvider {
boolean hasMultiSelection();
Color getColor(CompetitorDTO competitor);
Color getColor(CompetitorDTO competitor, RegattaAndRaceIdentifier raceIdentfier);
void addCompetitorSelectionChangeListener(CompetitorSelectionChangeListener listener);
@@ -0,0 +1,313 @@
package com.sap.sailing.gwt.ui.client;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sse.common.Color;
import com.sap.sse.common.Util;
import com.sap.sse.common.filter.Filter;
import com.sap.sse.common.filter.FilterSet;
public class CompetitorWithBoatSelectionModel implements CompetitorSelectionProvider {
private final Set<CompetitorDTO> allCompetitors;
/**
* Keys are {@link CompetitorDTO#getIdAsString()} of their values
*/
private final LinkedHashMap<String, CompetitorDTO> selectedCompetitors;
private final Set<CompetitorSelectionChangeListener> listeners;
private final boolean hasMultiSelection;
private FilterSet<CompetitorDTO, Filter<CompetitorDTO>> competitorsFilterSet;
private final CompetitorColorProvider competitorColorProvider;
public CompetitorWithBoatSelectionModel(boolean hasMultiSelection) {
this(hasMultiSelection, new CompetitorColorProviderImpl(), null);
}
public CompetitorWithBoatSelectionModel(boolean hasMultiSelection, CompetitorColorProvider competitorColorProvider) {
this(hasMultiSelection, competitorColorProvider, null);
}
private CompetitorWithBoatSelectionModel(boolean hasMultiSelection, CompetitorColorProvider competitorColorProvider, FilterSet<CompetitorDTO, Filter<CompetitorDTO>> competitorsFilterSet) {
super();
this.hasMultiSelection = hasMultiSelection;
this.competitorColorProvider = competitorColorProvider;
this.competitorsFilterSet = competitorsFilterSet;
this.allCompetitors = new LinkedHashSet<CompetitorDTO>();
this.selectedCompetitors = new LinkedHashMap<>();
this.listeners = new HashSet<CompetitorSelectionChangeListener>();
}
/**
* Adds a competitor to the {@link #getAllCompetitors() set of all competitors}. If the competitor was not yet
* contained, it will be deselected.
*/
public void add(CompetitorDTO competitor) {
add(competitor, true);
}
private void add(CompetitorDTO competitor, boolean notifyListeners) {
if (competitor.getColor() != null) {
competitorColorProvider.addBlockedColor(competitor.getColor());
}
boolean changed = allCompetitors.add(competitor);
if (notifyListeners && changed) {
fireListChanged(getAllCompetitors());
}
}
@Override
public boolean hasMultiSelection() {
return hasMultiSelection;
}
/**
* Removes all competitors. Afterwards, this model is empty. Deselection events are issued for all competitors that
* were selected so far.
*/
public void clear() {
Iterator<CompetitorDTO> selIter = getSelectedCompetitors().iterator();
while (selIter.hasNext()) {
CompetitorDTO selected = selIter.next();
setSelected(selected, false);
selIter = getSelectedCompetitors().iterator();
}
assert selectedCompetitors.isEmpty();
allCompetitors.clear();
fireListChanged(getAllCompetitors());
}
public void addAll(Iterable<CompetitorDTO> competitors) {
boolean changed = false;
for (CompetitorDTO competitor : competitors) {
add(competitor, false);
changed = true;
}
if (changed) {
fireListChanged(getAllCompetitors());
}
}
/**
* Removes the competitor from the {@link #getAllCompetitors() set of all competitor}. If the competitor was previously
* contained and selected, it is deselected first.
*/
public void remove(CompetitorDTO competitor) {
if (isSelected(competitor)) {
setSelected(competitor, false);
}
if (competitor.getColor() != null) {
competitorColorProvider.removeBlockedColor(competitor.getColor());
}
boolean changed = allCompetitors.remove(competitor);
if (changed) {
fireListChanged(getAllCompetitors());
}
}
@Override
public Iterable<CompetitorDTO> getSelectedCompetitors() {
return Collections.unmodifiableCollection(selectedCompetitors.values());
}
@Override
public Iterable<CompetitorDTO> getSelectedFilteredCompetitors() {
Set<CompetitorDTO> result = new HashSet<>(selectedCompetitors.values());
result.retainAll(getFilteredCompetitors());
return result;
}
@Override
public Iterable<CompetitorDTO> getAllCompetitors() {
return Collections.unmodifiableCollection(allCompetitors);
}
@Override
public Collection<CompetitorDTO> getFilteredCompetitors() {
Set<CompetitorDTO> currentFilteredList = new LinkedHashSet<CompetitorDTO>(allCompetitors);
if (competitorsFilterSet != null) {
for (Filter<CompetitorDTO> filter : competitorsFilterSet.getFilters()) {
for (Iterator<CompetitorDTO> i=currentFilteredList.iterator(); i.hasNext(); ) {
CompetitorDTO competitorDTO = i.next();
if (!filter.matches(competitorDTO)) {
i.remove();
}
}
}
}
return currentFilteredList;
}
public void setSelected(CompetitorDTO competitor, boolean selected, CompetitorSelectionChangeListener... listenersNotToNotify) {
if (selected) {
if (allCompetitors.contains(competitor) && !selectedCompetitors.containsKey(competitor.getIdAsString())) {
selectedCompetitors.put(competitor.getIdAsString(), competitor);
fireAddedToSelection(competitor, listenersNotToNotify);
}
} else {
if (selectedCompetitors.containsKey(competitor.getIdAsString())) {
selectedCompetitors.remove(competitor.getIdAsString());
fireRemovedFromSelection(competitor, listenersNotToNotify);
}
}
}
private void fireAddedToSelection(CompetitorDTO competitor, CompetitorSelectionChangeListener... listenersNotToNotify) {
for (CompetitorSelectionChangeListener listener : listeners) {
if (listenersNotToNotify == null || !Arrays.asList(listenersNotToNotify).contains(listener)) {
listener.addedToSelection(competitor);
}
}
}
private void fireRemovedFromSelection(CompetitorDTO competitor, CompetitorSelectionChangeListener... listenersNotToNotify) {
for (CompetitorSelectionChangeListener listener : listeners) {
if (listenersNotToNotify == null || !Arrays.asList(listenersNotToNotify).contains(listener)) {
listener.removedFromSelection(competitor);
}
}
}
private void fireListChanged(Iterable<CompetitorDTO> competitors, CompetitorSelectionChangeListener... listenersNotToNotify) {
for (CompetitorSelectionChangeListener listener : listeners) {
if (listenersNotToNotify == null || !Arrays.asList(listenersNotToNotify).contains(listener)) {
listener.competitorsListChanged(competitors);
}
}
}
@Override
public boolean isSelected(CompetitorDTO competitor) {
return selectedCompetitors.containsKey(competitor.getIdAsString());
}
@Override
public void addCompetitorSelectionChangeListener(CompetitorSelectionChangeListener listener) {
listeners.add(listener);
}
@Override
public void removeCompetitorSelectionChangeListener(CompetitorSelectionChangeListener listener) {
listeners.remove(listener);
}
@Override
public void setSelection(Iterable<CompetitorDTO> newSelection, CompetitorSelectionChangeListener... listenersNotToNotify) {
Set<CompetitorDTO> competitorsToRemoveFromSelection = new HashSet<CompetitorDTO>(selectedCompetitors.values());
for (CompetitorDTO newSelectedCompetitor : newSelection) {
setSelected(newSelectedCompetitor, true, listenersNotToNotify);
competitorsToRemoveFromSelection.remove(newSelectedCompetitor);
}
for (CompetitorDTO competitorToRemoveFromSelection : competitorsToRemoveFromSelection) {
setSelected(competitorToRemoveFromSelection, false, listenersNotToNotify);
}
}
@Override
public void setCompetitors(Iterable<CompetitorDTO> newCompetitors, CompetitorSelectionChangeListener... listenersNotToNotify) {
boolean changed = false;
Map<String, CompetitorDTO> oldCompetitorsToRemove = new HashMap<String, CompetitorDTO>();
for (final CompetitorDTO c : allCompetitors) {
oldCompetitorsToRemove.put(c.getIdAsString(), c);
}
for (CompetitorDTO newCompetitor : newCompetitors) {
// Search by equality, including all CompetitorDTO fields; if equal object is found, leave it in place;
// non-equal objects may still represent the same competitor entity; yet, replace the object to obtain the
// new, changed state; make sure the selection keeps unchanged regarding the selected competitor "entities";
// see also bug 3413 for more background.
if (allCompetitors.contains(newCompetitor)) {
oldCompetitorsToRemove.remove(newCompetitor.getIdAsString()); // the old competitor object remains in allCompetitors; it is equal but doesn't have to be identical to newCompetitor
} else {
boolean selected = isSelected(newCompetitor);
if (selected) {
remove(oldCompetitorsToRemove.get(newCompetitor.getIdAsString()));
oldCompetitorsToRemove.remove(newCompetitor.getIdAsString());
}
add(newCompetitor, false); // due to the equals definition of CompetitorDTOImpl that compares most fields, state changes lead to a replacement here
if (selected) {
// restore selection for replaced element
setSelected(newCompetitor, selected, listenersNotToNotify);
}
changed = true;
}
}
for (CompetitorDTO oldCompetitorToRemove : oldCompetitorsToRemove.values()) {
remove(oldCompetitorToRemove);
changed = true;
}
if (changed) {
fireListChanged(getAllCompetitors(), listenersNotToNotify);
}
}
@Override
public Color getColor(CompetitorDTO competitor) {
return allCompetitors.contains(competitor) ? competitorColorProvider.getColor(competitor) : null;
}
@Override
public FilterSet<CompetitorDTO, Filter<CompetitorDTO>> getCompetitorsFilterSet() {
return competitorsFilterSet;
}
@Override
public FilterSet<CompetitorDTO, Filter<CompetitorDTO>> getOrCreateCompetitorsFilterSet(String nameToAssignToNewFilterSet) {
if (competitorsFilterSet == null) {
competitorsFilterSet = new FilterSet<CompetitorDTO, Filter<CompetitorDTO>>(nameToAssignToNewFilterSet);
}
return getCompetitorsFilterSet();
}
@Override
public void setCompetitorsFilterSet(FilterSet<CompetitorDTO, Filter<CompetitorDTO>> competitorsFilterSet) {
FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> oldFilterSet = this.competitorsFilterSet;
this.competitorsFilterSet = competitorsFilterSet;
if (!Util.equalsWithNull(competitorsFilterSet, oldFilterSet)) {
for (CompetitorSelectionChangeListener listener : listeners) {
listener.filterChanged(oldFilterSet, competitorsFilterSet);
}
}
for (CompetitorSelectionChangeListener listener : listeners) {
listener.filteredCompetitorsListChanged(getFilteredCompetitors());
}
}
@Override
public boolean hasActiveFilters() {
return (competitorsFilterSet != null && !competitorsFilterSet.getFilters().isEmpty()
&& getFilteredCompetitors().size() != allCompetitors.size());
}
@Override
public void clearAllFilters() {
if (hasActiveFilters()) {
Iterator<CompetitorDTO> selIter = getSelectedCompetitors().iterator();
while (selIter.hasNext()) {
CompetitorDTO selected = selIter.next();
setSelected(selected, false);
selIter = getSelectedCompetitors().iterator();
}
competitorsFilterSet = null;
fireListChanged(getAllCompetitors());
}
}
@Override
public int getFilteredCompetitorsListSize() {
return getFilteredCompetitors().size();
}
}
@@ -0,0 +1,36 @@
package com.sap.sailing.gwt.ui.client;
import java.util.HashMap;
import java.util.Map;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sse.common.Color;
public class RaceCompetitorSelectionModel extends CompetitorSelectionModel implements RaceCompetitorSelectionProvider {
private final Map<CompetitorDTO, BoatDTO> boatsOfCompetitors = new HashMap<>();
public RaceCompetitorSelectionModel(boolean hasMultiSelection) {
super(hasMultiSelection);
}
public RaceCompetitorSelectionModel(boolean hasMultiSelection, CompetitorColorProvider competitorColorProvider) {
super(hasMultiSelection, competitorColorProvider);
}
@Override
public Color getColor(CompetitorDTO competitor, RegattaAndRaceIdentifier raceIdentfier) {
return allCompetitors.contains(competitor) ? competitorColorProvider.getColor(competitor, raceIdentfier) : Color.WHITE /* safe default */;
}
@Override
public void setBoat(CompetitorDTO competitor, BoatDTO boat) {
boatsOfCompetitors.put(competitor, boat);
}
@Override
public BoatDTO getBoat(CompetitorDTO competitor) {
return boatsOfCompetitors.get(competitor);
}
}
@@ -0,0 +1,15 @@
package com.sap.sailing.gwt.ui.client;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sse.common.Color;
public interface RaceCompetitorSelectionProvider extends CompetitorSelectionProvider {
Color getColor(CompetitorDTO competitor, RegattaAndRaceIdentifier raceIdentfier);
void setBoat(CompetitorDTO competitor, BoatDTO boat);
BoatDTO getBoat(CompetitorDTO competitor);
}
@@ -46,8 +46,8 @@ import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.actions.GetCompetitorsRaceDataAction;
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.RaceCompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.CompetitorRaceDataDTO;
@@ -87,7 +87,7 @@ public abstract class AbstractCompetitorRaceChart<SettingsType extends ChartSett
private final Label noCompetitorsSelectedLabel;
private final Label noDataFoundLabel;
private final CompetitorSelectionProvider competitorSelectionProvider;
private final RaceCompetitorSelectionProvider competitorSelectionProvider;
private DetailType selectedFirstDetailType;
private DetailType selectedSecondDetailType;
@@ -104,7 +104,7 @@ public abstract class AbstractCompetitorRaceChart<SettingsType extends ChartSett
AbstractCompetitorRaceChart(Component<?> parent, ComponentContext<?> context, SailingServiceAsync sailingService,
AsyncActionsExecutor asyncActionsExecutor,
CompetitorSelectionProvider competitorSelectionProvider, RegattaAndRaceIdentifier selectedRaceIdentifier,
RaceCompetitorSelectionProvider competitorSelectionProvider, RegattaAndRaceIdentifier selectedRaceIdentifier,
Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, final StringMessages stringMessages,
ErrorReporter errorReporter, DetailType firstDetailType, DetailType secondDetailType, boolean compactChart,
boolean allowTimeAdjust,
@@ -4,7 +4,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
@@ -38,7 +38,7 @@ public class MultiCompetitorRaceChart extends AbstractCompetitorRaceChart<MultiC
public MultiCompetitorRaceChart(Component<?> parent, ComponentContext<?> context,
MultiCompetitorRaceChartLifecycle lifecycle,
SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
CompetitorSelectionProvider competitorSelectionProvider, RegattaAndRaceIdentifier selectedRaceIdentifier,
RaceCompetitorSelectionProvider competitorSelectionProvider, RegattaAndRaceIdentifier selectedRaceIdentifier,
Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, final StringMessages stringMessages,
final ErrorReporter errorReporter, boolean compactChart, boolean allowTimeAdjust,
final String leaderboardGroupName, String leaderboardName) {
@@ -11,7 +11,7 @@ import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.LegType;
import com.sap.sailing.domain.common.Tack;
import com.sap.sailing.domain.common.dto.BoatClassDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.gwt.ui.shared.GPSFixDTOWithSpeedWindTackAndLegType;
import com.sap.sailing.gwt.ui.shared.SpeedWithBearingDTO;
import com.sap.sailing.gwt.ui.shared.racemap.BoatClassVectorGraphics;
@@ -69,9 +69,9 @@ public class BoatOverlay extends CanvasOverlayV3 {
*/
private Double boatDrawingAngle;
public BoatOverlay(final MapWidget map, int zIndex, final CompetitorDTO competitorDTO, Color color, CoordinateSystem coordinateSystem) {
public BoatOverlay(final MapWidget map, int zIndex, final BoatDTO boatDTO, Color color, CoordinateSystem coordinateSystem) {
super(map, zIndex, coordinateSystem);
this.boatClass = competitorDTO.getBoatClass();
this.boatClass = boatDTO.getBoatClass();
this.color = color;
boatScaleAndSizePerZoomCache = new HashMap<Integer, Util.Pair<Size,Size>>();
boatVectorGraphics = BoatClassVectorGraphicsResolver.resolveBoatClassVectorGraphics(boatClass.getName());
@@ -11,6 +11,7 @@ import com.sap.sailing.domain.common.RaceCompetitorIdsAsStringWithMD5Hash;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionProvider;
import com.sap.sse.common.filter.Filter;
import com.sap.sse.common.filter.FilterSet;
@@ -33,7 +34,7 @@ import com.sap.sse.common.filter.FilterSet;
public class RaceCompetitorSet extends RaceCompetitorIdsAsStringWithMD5Hash {
private static final long serialVersionUID = 3357742414149799988L;
private CompetitorSelectionProvider competitorSelection;
private RaceCompetitorSelectionProvider competitorSelection;
/**
* A subset of the competitor selection's {@link CompetitorSelectionProvider#getAllCompetitors()} describing the
@@ -61,7 +62,7 @@ public class RaceCompetitorSet extends RaceCompetitorIdsAsStringWithMD5Hash {
* {@link #setIdsAsStringsOfCompetitorsInRace(Iterable)} has been received may this set become adjusted to the
* actual subset participating in the race.
*/
public RaceCompetitorSet(CompetitorSelectionProvider competitorSelection) {
public RaceCompetitorSet(RaceCompetitorSelectionProvider competitorSelection) {
super();
this.competitorsForRaceDefinedListeners = new HashSet<>();
this.competitorSelection = competitorSelection;
@@ -78,6 +78,7 @@ import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.LeaderboardDTO;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
@@ -94,6 +95,7 @@ import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.ManeuverTypeFormatter;
import com.sap.sailing.gwt.ui.client.NumberFormatterFactory;
import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProviderListener;
import com.sap.sailing.gwt.ui.client.RequiresDataInitialization;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
@@ -307,10 +309,10 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
private Map<CompetitorDTO, List<GPSFixDTOWithSpeedWindTackAndLegType>> lastDouglasPeuckerResult;
private final CompetitorSelectionProvider competitorSelection;
private final RaceCompetitorSelectionProvider competitorSelection;
private final RaceCompetitorSet raceCompetitorSet;
/**
* Used to check if the first initial zoom to the mark markers was already done.
*/
@@ -436,8 +438,8 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
public RaceMap(Component<?> parent, ComponentContext<?> context, RaceMapLifecycle raceMapLifecycle,
RaceMapSettings raceMapSettings,
SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
ErrorReporter errorReporter, Timer timer, CompetitorSelectionProvider competitorSelection, RaceCompetitorSet raceCompetitorSet,
StringMessages stringMessages, RegattaAndRaceIdentifier raceIdentifier,
ErrorReporter errorReporter, Timer timer, RaceCompetitorSelectionProvider competitorSelection,
RaceCompetitorSet raceCompetitorSet, StringMessages stringMessages, RegattaAndRaceIdentifier raceIdentifier,
RaceMapResources raceMapResources, boolean showHeaderPanel, QuickRanksDTOProvider quickRanksDTOProvider) {
super(parent, context);
this.showHeaderPanel = showHeaderPanel;
@@ -793,7 +795,7 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
return Collections.unmodifiableMap(boatOverlays);
}
protected CompetitorSelectionProvider getCompetitorSelection() {
protected RaceCompetitorSelectionProvider getCompetitorSelection() {
return competitorSelection;
}
@@ -1463,7 +1465,8 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
lastBoatFix = getBoatFix(visibleLeaderInfo.getB(), date);
}
if (isVisibleLeaderInfoComplete && isLegTypeKnown && lastBoatFix != null && lastBoatFix.speedWithBearing != null) {
Distance distanceFromBoatPositionInKm = visibleLeaderInfo.getB().getBoatClass().getHullLength(); // one hull length
BoatDTO boat = competitorSelection.getBoat(visibleLeaderInfo.getB());
Distance distanceFromBoatPositionInKm = boat.getBoatClass().getHullLength(); // one hull length
// implement and use Position.translateRhumb()
double bearingOfBoatInDeg = lastBoatFix.speedWithBearing.bearingInDegrees;
LatLng boatPosition = coordinateSystem.toLatLng(lastBoatFix.position);
@@ -2053,7 +2056,8 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
}
private BoatOverlay createBoatOverlay(int zIndex, final CompetitorDTO competitorDTO, DisplayMode displayMode) {
final BoatOverlay boatCanvas = new BoatOverlay(map, zIndex, competitorDTO, competitorSelection.getColor(competitorDTO, raceIdentifier), coordinateSystem);
final BoatDTO boatOfCompetitor = competitorSelection.getBoat(competitorDTO);
final BoatOverlay boatCanvas = new BoatOverlay(map, zIndex, boatOfCompetitor, competitorSelection.getColor(competitorDTO, raceIdentifier), coordinateSystem);
boatCanvas.setDisplayMode(displayMode);
boatCanvas.addClickHandler(new ClickMapHandler() {
@Override
@@ -2075,7 +2079,7 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
boatCanvas.addMouseOverHandler(new MouseOverMapHandler() {
@Override
public void onEvent(MouseOverMapEvent event) {
map.setTitle(competitorDTO.getSailID());
map.setTitle(boatOfCompetitor.getSailId());
}
});
boatCanvas.addMouseOutMoveHandler(new MouseOutMapHandler() {
@@ -2213,7 +2217,7 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
private Widget getInfoWindowContent(CompetitorDTO competitorDTO, GPSFixDTOWithSpeedWindTackAndLegType lastFix) {
final VerticalPanel vPanel = new VerticalPanel();
vPanel.add(createInfoWindowLabelAndValue(stringMessages.competitor(), competitorDTO.getName()));
vPanel.add(createInfoWindowLabelAndValue(stringMessages.sailNumber(), competitorDTO.getSailID()));
vPanel.add(createInfoWindowLabelAndValue(stringMessages.sailNumber(), competitorSelection.getBoat(competitorDTO).getSailId()));
final Integer rank = getRank(competitorDTO);
if (rank != null) {
vPanel.add(createInfoWindowLabelAndValue(stringMessages.rank(), String.valueOf(rank)));
@@ -2828,6 +2832,7 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
@Override
public Polyline createTail(final CompetitorDTO competitor, List<LatLng> points) {
final BoatDTO boat = competitorSelection.getBoat(competitor);
PolylineOptions options = createTailStyle(competitor, displayHighlighted(competitor));
Polyline result = Polyline.newInstance(options);
MVCArray<LatLng> pointsAsArray = MVCArray.newInstance(points.toArray(new LatLng[0]));
@@ -2845,7 +2850,7 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
result.addMouseOverHandler(new MouseOverMapHandler() {
@Override
public void onEvent(MouseOverMapEvent event) {
map.setTitle(competitor.getSailID() + ", " + competitor.getName());
map.setTitle(boat.getSailId() + ", " + competitor.getName());
}
});
resultHoverline.addMouseOutMoveHandler(new MouseOutMapHandler() {
@@ -2450,7 +2450,7 @@ public abstract class LeaderboardPanel<LS extends LeaderboardSettings> extends A
for (RaceColumn<?> columnToCollapseAndExpandAgain : columnsToCollapseAndExpandAgain) {
columnToCollapseAndExpandAgain.changeExpansionState(/* expand */ false);
}
competitorSelectionProvider.setCompetitors(leaderboard.competitors, /* listenersNotToNotify */this);
updateCompetitors(leaderboard);
if (!initialCompetitorFilterHasBeenApplied) {
applyTop30FilterIfCompetitorSizeGreaterEqual40(leaderboard);
initialCompetitorFilterHasBeenApplied = true;
@@ -2574,6 +2574,13 @@ public abstract class LeaderboardPanel<LS extends LeaderboardSettings> extends A
}
}
/**
* Updates the competitors in the competitorSelectionProvider with the competitors received from the {@link LeaderboardDTO}
*/
protected void updateCompetitors(LeaderboardDTO leaderboard) {
competitorSelectionProvider.setCompetitors(leaderboard.competitors, /* listenersNotToNotify */this);
}
/**
* Due to a course change, a race may change its number of legs. All expanded race columns that show leg columns and
* whose leg count changed need to be collapsed before the leaderboard is replaced, and expanded afterwards again.
@@ -12,6 +12,7 @@ import com.sap.sailing.domain.common.InvertibleComparator;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.SortingOrder;
import com.sap.sailing.domain.common.dto.AbstractLeaderboardDTO;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.LeaderboardDTO;
import com.sap.sailing.domain.common.dto.LeaderboardRowDTO;
@@ -20,7 +21,7 @@ import com.sap.sailing.domain.common.impl.InvertibleComparatorAdapter;
import com.sap.sailing.gwt.settings.client.leaderboard.LeaderboardSettings;
import com.sap.sailing.gwt.settings.client.leaderboard.SingleRaceLeaderboardSettings;
import com.sap.sailing.gwt.settings.client.leaderboard.SingleRaceLeaderboardSettingsDialogComponent;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -60,7 +61,7 @@ public class SingleRaceLeaderboardPanel extends LeaderboardPanel<SingleRaceLeade
public SingleRaceLeaderboardPanel(Component<?> parent, ComponentContext<?> context,
SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, SingleRaceLeaderboardSettings settings,
boolean isEmbedded, RegattaAndRaceIdentifier preSelectedRace,
CompetitorSelectionProvider competitorSelectionProvider, Timer timer, String leaderboardGroupName,
RaceCompetitorSelectionProvider competitorSelectionProvider, Timer timer, String leaderboardGroupName,
String leaderboardName, ErrorReporter errorReporter, StringMessages stringMessages, boolean showRaceDetails,
CompetitorFilterPanel competitorSearchTextBox, boolean showSelectionCheckbox,
RaceTimesInfoProvider optionalRaceTimesInfoProvider, boolean autoExpandLastRaceColumn,
@@ -115,6 +116,26 @@ public class SingleRaceLeaderboardPanel extends LeaderboardPanel<SingleRaceLeade
raceColumnSelection = new ExplicitRaceColumnSelectionWithPreselectedRace(preSelectedRace);
}
/**
* Updates the competitors and their boats in the competitorSelectionProvider with the competitors received from the {@link LeaderboardDTO}
*/
protected void updateCompetitors(LeaderboardDTO leaderboard) {
RaceColumnDTO singleRaceColumn = null;
for (RaceColumnDTO raceColumn: leaderboard.getRaceList()) {
if (leaderboard.raceIsTracked(raceColumn.getRaceColumnName())) {
singleRaceColumn = raceColumn;
break;
}
}
if (singleRaceColumn != null) {
for (CompetitorDTO competitor: leaderboard.competitors) {
BoatDTO boatOfCompetitor = leaderboard.getBoatOfCompetitor(singleRaceColumn.getRaceColumnName(), competitor);
getRaceCompetitorSelection().setBoat(competitor, boatOfCompetitor);
}
}
super.updateCompetitors(leaderboard);
}
@Override
public SingleRaceLeaderboardSettings getSettings() {
SingleRaceLeaderboardSettings leaderboardSettings = new SingleRaceLeaderboardSettings(selectedManeuverDetails,
@@ -130,16 +151,20 @@ public class SingleRaceLeaderboardPanel extends LeaderboardPanel<SingleRaceLeade
return autoExpandPreSelectedRace;
}
private RaceCompetitorSelectionProvider getRaceCompetitorSelection() {
return (RaceCompetitorSelectionProvider) competitorSelectionProvider;
}
@Override
public String getCompetitorColor(CompetitorDTO competitor) {
return competitorSelectionProvider.getColor(competitor, preSelectedRace).getAsHtml();
return getRaceCompetitorSelection().getColor(competitor, preSelectedRace).getAsHtml();
}
@Override
public boolean renderBoatColorIfNecessary(CompetitorDTO competitor, SafeHtmlBuilder sb) {
boolean showBoatColor = !isShowCompetitorFullName() && isEmbedded;
if (showBoatColor) {
String competitorColor = competitorSelectionProvider.getColor(competitor, preSelectedRace).getAsHtml();
String competitorColor = getRaceCompetitorSelection().getColor(competitor, preSelectedRace).getAsHtml();
sb.appendHtmlConstant("<div style=\" "+style.determineBoatColorDivStyle(competitorColor)+ "\">");
}
return showBoatColor;
@@ -27,9 +27,9 @@ import com.sap.sailing.gwt.settings.client.raceboard.RaceBoardPerspectiveOwnSett
import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint;
import com.sap.sailing.gwt.ui.client.CompetitorColorProvider;
import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel;
import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProviderListener;
import com.sap.sailing.gwt.ui.client.TimePanel;
@@ -156,7 +156,7 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint
vp.add(new Label(message));
}
private void createEmbeddedMap(final RegattaAndRaceIdentifier selectedRaceIdentifier, Map<CompetitorDTO, BoatDTO> competitorBoats,
private void createEmbeddedMap(final RegattaAndRaceIdentifier selectedRaceIdentifier, Map<CompetitorDTO, BoatDTO> competitorsAndBoats,
final RaceBoardPerspectiveOwnSettings raceboardPerspectiveSettings, final RaceMapSettings raceMapSettings,
final boolean showCompetitors, final boolean play) {
final StringBuilder title = new StringBuilder(regattaLikeName);
@@ -193,10 +193,10 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint
final Button backToLivePlayButton = timePanel.getBackToLiveButton();
timePanel.updateSettings(new TimePanelSettings(refreshInterval));
raceMapResources.raceMapStyle().ensureInjected();
final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(selectedRaceIdentifier, competitorBoats);
final CompetitorSelectionProvider competitorSelection;
final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(selectedRaceIdentifier, competitorsAndBoats);
final RaceCompetitorSelectionProvider competitorSelection;
if (showCompetitors) {
competitorSelection = new CompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider);
competitorSelection = new RaceCompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider);
} else {
competitorSelection = createEmptyFilterCompetitorModel(colorProvider); // show no competitors
}
@@ -226,8 +226,8 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint
timer.setTime(timer.getTime().getTime()-1000l);
}
private CompetitorSelectionProvider createEmptyFilterCompetitorModel(CompetitorColorProvider colorProvider) {
final CompetitorSelectionModel result = new CompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider);
private RaceCompetitorSelectionProvider createEmptyFilterCompetitorModel(CompetitorColorProvider colorProvider) {
final RaceCompetitorSelectionModel result = new RaceCompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider);
final FilterSet<CompetitorDTO, Filter<CompetitorDTO>> filterSet = result.getOrCreateCompetitorsFilterSet("Empty");
filterSet.addFilter(new Filter<CompetitorDTO>() {
@Override public boolean matches(CompetitorDTO object) { return false; }
@@ -43,11 +43,12 @@ import com.sap.sailing.gwt.settings.client.leaderboard.SingleRaceLeaderboardSett
import com.sap.sailing.gwt.settings.client.raceboard.RaceBoardPerspectiveOwnSettings;
import com.sap.sailing.gwt.ui.client.CompetitorColorProvider;
import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.EntryPointLinkFactory;
import com.sap.sailing.gwt.ui.client.LeaderboardUpdateListener;
import com.sap.sailing.gwt.ui.client.MediaServiceAsync;
import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceCompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.RaceTimePanel;
import com.sap.sailing.gwt.ui.client.RaceTimePanelLifecycle;
import com.sap.sailing.gwt.ui.client.RaceTimePanelSettings;
@@ -123,7 +124,7 @@ public class RaceBoardPanel
private final RaceTimePanel racetimePanel;
private final Timer timer;
private final UserAgentDetails userAgent;
private final CompetitorSelectionProvider competitorSelectionProvider;
private final RaceCompetitorSelectionProvider competitorSelectionProvider;
private final TimeRangeWithZoomModel timeRangeWithZoomModel;
private final RegattaAndRaceIdentifier selectedRaceIdentifier;
@@ -209,7 +210,7 @@ public class RaceBoardPanel
timeRangeWithZoomModel = new TimeRangeWithZoomModel();
final CompetitorColorProvider colorProvider = new CompetitorColorProviderImpl(selectedRaceIdentifier, competitorsAndTheirBoats);
competitorSelectionProvider = new CompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider);
competitorSelectionProvider = new RaceCompetitorSelectionModel(/* hasMultiSelection */ true, colorProvider);
raceMapResources.raceMapStyle().ensureInjected();
RaceMapLifecycle raceMapLifecycle = lifecycle.getRaceMapLifecycle();