mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-25 06:58:39 +00:00
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:
+3
-3
@@ -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));
|
||||
|
||||
+1
@@ -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();
|
||||
|
||||
+3
-3
@@ -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,
|
||||
|
||||
+4
-4
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
+4
-4
@@ -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,
|
||||
|
||||
+2
-8
@@ -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;
|
||||
|
||||
-3
@@ -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);
|
||||
|
||||
|
||||
+313
@@ -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();
|
||||
}
|
||||
}
|
||||
+36
@@ -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);
|
||||
}
|
||||
}
|
||||
+15
@@ -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);
|
||||
}
|
||||
+3
-3
@@ -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,
|
||||
|
||||
+2
-2
@@ -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) {
|
||||
|
||||
+3
-3
@@ -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());
|
||||
|
||||
+3
-2
@@ -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;
|
||||
|
||||
+15
-10
@@ -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() {
|
||||
|
||||
+8
-1
@@ -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.
|
||||
|
||||
+29
-4
@@ -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;
|
||||
|
||||
+8
-8
@@ -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; }
|
||||
|
||||
+4
-3
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user