mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-02 17:19:37 +00:00
a first working implementation of a competitor search box shown above the leaderboard
This commit is contained in:
1 parent
1790f75971
commit
47821a1141
18 files changed
+221
-23
No files matched your search
+14
@@ -1,6 +1,8 @@
|
||||
package com.sap.sailing.gwt.ui.client;
|
||||
|
||||
import com.sap.sailing.domain.common.dto.CompetitorDTO;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
import com.sap.sse.common.filter.FilterSet;
|
||||
|
||||
|
||||
/**
|
||||
@@ -9,6 +11,18 @@ import com.sap.sailing.domain.common.dto.CompetitorDTO;
|
||||
public interface CompetitorSelectionChangeListener {
|
||||
|
||||
void competitorsListChanged(Iterable<CompetitorDTO> competitors);
|
||||
|
||||
/**
|
||||
* Notifies listeners of a change of the competitor filter set. Note that if the list of filtered competitors has
|
||||
* changed, a separate call to filteredCompetitorsListChanged will occur, and that this does not necessarily have to
|
||||
* be the case, e.g., if old and new filter match the same set of competitors.
|
||||
*/
|
||||
void filterChanged(FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> oldFilterSet, FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> newFilterSet);
|
||||
|
||||
/**
|
||||
* Notifies listeners that the list of filtered competitors has changed. Possible reasons include a change of the
|
||||
* filter condition or a change in the overall list of competitors.
|
||||
*/
|
||||
void filteredCompetitorsListChanged(Iterable<CompetitorDTO> filteredCompetitors);
|
||||
|
||||
void addedToSelection(CompetitorDTO competitor);
|
||||
|
||||
+8
-1
@@ -12,6 +12,7 @@ import com.sap.sailing.domain.common.Color;
|
||||
import com.sap.sailing.domain.common.ColorMap;
|
||||
import com.sap.sailing.domain.common.dto.CompetitorDTO;
|
||||
import com.sap.sailing.domain.common.impl.ColorMapImpl;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
import com.sap.sse.common.filter.FilterSet;
|
||||
|
||||
@@ -32,7 +33,7 @@ public class CompetitorSelectionModel implements CompetitorSelectionProvider {
|
||||
this(hasMultiSelection, null);
|
||||
}
|
||||
|
||||
public CompetitorSelectionModel(boolean hasMultiSelection, FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> competitorsFilterSet) {
|
||||
private CompetitorSelectionModel(boolean hasMultiSelection, FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> competitorsFilterSet) {
|
||||
super();
|
||||
this.hasMultiSelection = hasMultiSelection;
|
||||
this.competitorsFilterSet = competitorsFilterSet;
|
||||
@@ -243,7 +244,13 @@ public class CompetitorSelectionModel implements CompetitorSelectionProvider {
|
||||
|
||||
@Override
|
||||
public void setCompetitorsFilterSet(FilterSet<CompetitorDTO, ? extends 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());
|
||||
}
|
||||
|
||||
+1
@@ -1066,4 +1066,5 @@ public interface StringMessages extends Messages {
|
||||
String currentOrAverageSpeedOverGroundInKnotsTooltip();
|
||||
String currentOrAverageSpeedOverGroundInKnots();
|
||||
String scoringSchemeHighPointFirstGetsTenOrEight();
|
||||
String competitorSearchFilter();
|
||||
}
|
||||
+2
-1
@@ -1049,4 +1049,5 @@ averageMessageSize=Average size per message in bytes
|
||||
totalNumberOfOperations=Total number of operations
|
||||
currentOrAverageSpeedOverGroundInKnotsTooltip=Current speed over ground in knots while leg is still running; average speed over ground when leg is completed
|
||||
currentOrAverageSpeedOverGroundInKnots=SOG (\u2205 at end)
|
||||
scoringSchemeHighPointFirstGetsTenOrEight=High Point, winner gets 10 points (or 8)
|
||||
scoringSchemeHighPointFirstGetsTenOrEight=High Point, winner gets 10 points (or 8)
|
||||
competitorSearchFilter=Competitor Search Filter
|
||||
+2
-1
@@ -1044,4 +1044,5 @@ averageMessageSize=Durchschnittsgrösse einer Nachricht
|
||||
totalNumberOfOperations=Gesamtanzahl gesendete Operationen
|
||||
currentOrAverageSpeedOverGroundInKnotsTooltip=Momentane Fahrt über Grund während der Teilnehmer sich im Bahnabschnitt befindet; Durchschnitt, nachdem der Teilnehmer den Abschnitt beendet hat.
|
||||
currentOrAverageSpeedOverGroundInKnots=FüG (\u2205 nach Abschluss)
|
||||
scoringSchemeHighPointFirstGetsTenOrEight=High Point, Gewinner bekommt 10 Punkte (oder 8)
|
||||
scoringSchemeHighPointFirstGetsTenOrEight=High Point, Gewinner bekommt 10 Punkte (oder 8)
|
||||
competitorSearchFilter=Teilnehmer-Suchfilter
|
||||
+2
-1
@@ -999,4 +999,5 @@ averageMessageSize=Average Size per message
|
||||
totalNumberOfOperations=Total number of operations
|
||||
currentOrAverageSpeedOverGroundInKnotsTooltip=Current speed over ground in knots while leg is still running; average speed over ground when leg is completed
|
||||
currentOrAverageSpeedOverGroundInKnots=SOG (\u2205 at end)
|
||||
scoringSchemeHighPointFirstGetsTenOrEight=High Point, winner gets 10 points (or 8)
|
||||
scoringSchemeHighPointFirstGetsTenOrEight=High Point, winner gets 10 points (or 8)
|
||||
competitorSearchFilter=Competitor Search Filter
|
||||
+7
@@ -42,6 +42,8 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.client.shared.components.AbstractLazyComponent;
|
||||
import com.sap.sailing.gwt.ui.client.shared.components.Component;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
import com.sap.sse.common.filter.FilterSet;
|
||||
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
|
||||
import com.sap.sse.gwt.client.player.TimeListener;
|
||||
import com.sap.sse.gwt.client.player.Timer;
|
||||
@@ -381,4 +383,9 @@ public abstract class AbstractCompetitorLeaderboardChart<SettingsType> extends A
|
||||
@Override
|
||||
public void filteredCompetitorsListChanged(Iterable<CompetitorDTO> filteredCompetitors) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void filterChanged(FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> oldFilterSet,
|
||||
FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> newFilterSet) {
|
||||
}
|
||||
}
|
||||
+8
@@ -52,6 +52,8 @@ import com.sap.sailing.gwt.ui.client.shared.components.Component;
|
||||
import com.sap.sailing.gwt.ui.shared.CompetitorRaceDataDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
import com.sap.sse.common.filter.FilterSet;
|
||||
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
|
||||
import com.sap.sse.gwt.client.player.TimeRangeWithZoomProvider;
|
||||
import com.sap.sse.gwt.client.player.Timer;
|
||||
@@ -655,4 +657,10 @@ public abstract class AbstractCompetitorRaceChart<SettingsType extends ChartSett
|
||||
public void filteredCompetitorsListChanged(Iterable<CompetitorDTO> filteredCompetitors) {
|
||||
timeChanged(timer.getTime(), null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void filterChanged(FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> oldFilterSet,
|
||||
FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> newFilterSet) {
|
||||
// nothing to do; if it changes the filtered competitor list, a separate call to filteredCompetitorsListChanged will occur
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -22,8 +22,8 @@ public class CompetitorsFilterSets {
|
||||
|
||||
public FilterSet<CompetitorDTO, FilterWithUI<CompetitorDTO>> findFilterSetByName(String filterSetName) {
|
||||
FilterSet<CompetitorDTO, FilterWithUI<CompetitorDTO>> result = null;
|
||||
for(FilterSet<CompetitorDTO, FilterWithUI<CompetitorDTO>> filterSet: filterSets) {
|
||||
if(filterSet.getName().equals(filterSetName)) {
|
||||
for (FilterSet<CompetitorDTO, FilterWithUI<CompetitorDTO>> filterSet : filterSets) {
|
||||
if (filterSet.getName().equals(filterSetName)) {
|
||||
result = filterSet;
|
||||
break;
|
||||
}
|
||||
@@ -32,8 +32,8 @@ public class CompetitorsFilterSets {
|
||||
}
|
||||
|
||||
public void setActiveFilterSet(FilterSet<CompetitorDTO, FilterWithUI<CompetitorDTO>> newActiveFilterSet) {
|
||||
if(newActiveFilterSet != null) {
|
||||
if(filterSets.contains(newActiveFilterSet)) {
|
||||
if (newActiveFilterSet != null) {
|
||||
if (filterSets.contains(newActiveFilterSet)) {
|
||||
this.activeFilterSet = newActiveFilterSet;
|
||||
}
|
||||
} else {
|
||||
|
||||
+8
@@ -102,6 +102,8 @@ import com.sap.sailing.gwt.ui.shared.racemap.GoogleMapStyleHelper;
|
||||
import com.sap.sailing.gwt.ui.shared.racemap.WindStreamletsRaceboardOverlay;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.Util.Triple;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
import com.sap.sse.common.filter.FilterSet;
|
||||
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
|
||||
import com.sap.sse.gwt.client.player.TimeListener;
|
||||
import com.sap.sse.gwt.client.player.Timer;
|
||||
@@ -1917,6 +1919,12 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
|
||||
public void filteredCompetitorsListChanged(Iterable<CompetitorDTO> filteredCompetitors) {
|
||||
timeChanged(timer.getTime(), null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void filterChanged(FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> oldFilterSet,
|
||||
FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> newFilterSet) {
|
||||
// nothing to do; if the list of filtered competitors has changed, a separate call to filteredCompetitorsListChanged will occur
|
||||
}
|
||||
|
||||
@Override
|
||||
public PolylineOptions createTailStyle(CompetitorDTO competitor, boolean isHighlighted) {
|
||||
|
||||
+136
@@ -0,0 +1,136 @@
|
||||
package com.sap.sailing.gwt.ui.leaderboard;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
import com.google.gwt.event.dom.client.KeyUpEvent;
|
||||
import com.google.gwt.event.dom.client.KeyUpHandler;
|
||||
import com.google.gwt.user.client.ui.Button;
|
||||
import com.google.gwt.user.client.ui.HorizontalPanel;
|
||||
import com.google.gwt.user.client.ui.TextBox;
|
||||
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.StringMessages;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.filter.AbstractListFilter;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
import com.sap.sse.common.filter.FilterSet;
|
||||
|
||||
/**
|
||||
* A text box that belongs to a {@link LeaderboardPanel} and allows the user to search for competitors by sail number
|
||||
* and competitor name. When the user provides a non-empty search string, a new {@link Filter} for type {@link CompetitorDTO}
|
||||
* will be added that accepts competitors whose {@link CompetitorDTO#getSailID() sail number} or {@link CompetitorDTO#getName() name}
|
||||
* matches the user input. When the text box is emptied,
|
||||
*
|
||||
* @author Axel Uhl (D043530)
|
||||
*
|
||||
*/
|
||||
public class CompetitorSearchTextBox extends HorizontalPanel implements KeyUpHandler, Filter<CompetitorDTO>, CompetitorSelectionChangeListener {
|
||||
private final TextBox searchTextBox;
|
||||
private final Button clearTextBoxButton;
|
||||
private final StringMessages stringMessages;
|
||||
private final AbstractListFilter<CompetitorDTO> filter;
|
||||
private final CompetitorSelectionProvider competitorSelectionProvider;
|
||||
private String lastFilterSetNameWithoutThis;
|
||||
|
||||
public CompetitorSearchTextBox(CompetitorSelectionProvider competitorSelectionProvider, StringMessages stringMessages) {
|
||||
this.stringMessages = stringMessages;
|
||||
this.competitorSelectionProvider = competitorSelectionProvider;
|
||||
filter = new AbstractListFilter<CompetitorDTO>() {
|
||||
@Override
|
||||
public Iterable<String> getStrings(CompetitorDTO competitor) {
|
||||
return Arrays.asList(competitor.getName().toLowerCase(), competitor.getSailID().toLowerCase());
|
||||
}
|
||||
};
|
||||
searchTextBox = new TextBox();
|
||||
searchTextBox.addKeyUpHandler(this);
|
||||
clearTextBoxButton = new Button("x");
|
||||
clearTextBoxButton.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
searchTextBox.setText("");
|
||||
onKeyUp(null);
|
||||
}
|
||||
});
|
||||
add(searchTextBox);
|
||||
add(clearTextBoxButton);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param event ignored; may be <code>null</code>
|
||||
*/
|
||||
@Override
|
||||
public void onKeyUp(KeyUpEvent event) {
|
||||
String newValue = searchTextBox.getValue();
|
||||
if (newValue.trim().isEmpty()) {
|
||||
removeSearchFilter();
|
||||
} else {
|
||||
ensureSearchFilterIsSet();
|
||||
competitorSelectionProvider.setCompetitorsFilterSet(competitorSelectionProvider.getCompetitorsFilterSet()); //
|
||||
}
|
||||
}
|
||||
|
||||
private void ensureSearchFilterIsSet() {
|
||||
if (competitorSelectionProvider.getCompetitorsFilterSet() == null || !Util.contains(competitorSelectionProvider.getCompetitorsFilterSet().getFilters(), this)) {
|
||||
FilterSet<CompetitorDTO, Filter<CompetitorDTO>> newFilterSetWithThis = new FilterSet<>(getName());
|
||||
if (competitorSelectionProvider.getCompetitorsFilterSet() != null) {
|
||||
for (Filter<CompetitorDTO> oldFilter : competitorSelectionProvider.getCompetitorsFilterSet()
|
||||
.getFilters()) {
|
||||
newFilterSetWithThis.addFilter(oldFilter);
|
||||
}
|
||||
}
|
||||
newFilterSetWithThis.addFilter(this);
|
||||
competitorSelectionProvider.setCompetitorsFilterSet(newFilterSetWithThis);
|
||||
}
|
||||
}
|
||||
|
||||
private void removeSearchFilter() {
|
||||
if (competitorSelectionProvider.getCompetitorsFilterSet() != null
|
||||
&& Util.contains(competitorSelectionProvider.getCompetitorsFilterSet().getFilters(), this)) {
|
||||
FilterSet<CompetitorDTO, Filter<CompetitorDTO>> newFilterSetWithThis = new FilterSet<>(lastFilterSetNameWithoutThis);
|
||||
for (Filter<CompetitorDTO> oldFilter : competitorSelectionProvider.getCompetitorsFilterSet().getFilters()) {
|
||||
if (oldFilter != this) {
|
||||
newFilterSetWithThis.addFilter(oldFilter);
|
||||
}
|
||||
}
|
||||
competitorSelectionProvider.setCompetitorsFilterSet(newFilterSetWithThis);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(CompetitorDTO competitor) {
|
||||
final String[] keywords = searchTextBox.getText().split(" ");
|
||||
final List<String> lowercaseKeywords = new ArrayList<>(keywords.length);
|
||||
for (String keyword : keywords) {
|
||||
lowercaseKeywords.add(keyword.toLowerCase());
|
||||
}
|
||||
return !Util.isEmpty(filter.applyFilter(lowercaseKeywords, Collections.singleton(competitor)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return stringMessages.competitorSearchFilter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void filterChanged(FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> oldFilterSet,
|
||||
FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> newFilterSet) {
|
||||
if (newFilterSet != null && !Util.contains(newFilterSet.getFilters(), this)) {
|
||||
lastFilterSetNameWithoutThis = newFilterSet.getName();
|
||||
}
|
||||
if (!Util.contains(newFilterSet.getFilters(), this)) {
|
||||
onKeyUp(null); // ensure that if the search box has text, this filter is in the current filter set
|
||||
} // else, this filter is part of the current filter set, and it will be so if and only if it shall be, e.g., because this object
|
||||
// has added itself as a filter
|
||||
}
|
||||
|
||||
@Override public void competitorsListChanged(Iterable<CompetitorDTO> competitors) {}
|
||||
@Override public void filteredCompetitorsListChanged(Iterable<CompetitorDTO> filteredCompetitors) {}
|
||||
@Override public void addedToSelection(CompetitorDTO competitor) {}
|
||||
@Override public void removedFromSelection(CompetitorDTO competitor) {}
|
||||
}
|
||||
+14
-3
@@ -88,6 +88,8 @@ import com.sap.sailing.gwt.ui.leaderboard.DetailTypeColumn.LegDetailField;
|
||||
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings.RaceColumnSelectionStrategies;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
import com.sap.sse.common.filter.FilterSet;
|
||||
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
|
||||
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
|
||||
import com.sap.sse.gwt.client.controls.busyindicator.BusyIndicator;
|
||||
@@ -1501,7 +1503,7 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS
|
||||
// perform the first request as "live" but don't by default auto-play
|
||||
PlayModes.Live, PlayStates.Paused, /* delayBetweenAutoAdvancesInMilliseconds */3000l), leaderboardGroupName,
|
||||
leaderboardName, errorReporter, stringMessages, userAgent, showRaceDetails,
|
||||
/* optionalRaceTimesInfoProvider */ null, /* autoExpandLastRaceColumn */ false, /* adjustTimerDelay */ true);
|
||||
/* showCompetitorSearchBox */ false, /* optionalRaceTimesInfoProvider */ null, /* autoExpandLastRaceColumn */ false, /* adjustTimerDelay */ true);
|
||||
}
|
||||
|
||||
public LeaderboardPanel(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
|
||||
@@ -1509,7 +1511,7 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS
|
||||
CompetitorSelectionProvider competitorSelectionProvider, Timer timer, String leaderboardGroupName,
|
||||
String leaderboardName, ErrorReporter errorReporter, final StringMessages stringMessages,
|
||||
final UserAgentDetails userAgent, boolean showRaceDetails,
|
||||
RaceTimesInfoProvider optionalRaceTimesInfoProvider, boolean autoExpandLastRaceColumn, boolean adjustTimerDelay) {
|
||||
boolean showCompetitorSearchBox, RaceTimesInfoProvider optionalRaceTimesInfoProvider, boolean autoExpandLastRaceColumn, boolean adjustTimerDelay) {
|
||||
this.dummyFocusElement = new Anchor("");
|
||||
this.showRaceDetails = showRaceDetails;
|
||||
this.sailingService = sailingService;
|
||||
@@ -1678,6 +1680,9 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS
|
||||
if (!isEmbedded) {
|
||||
contentPanel.add(toolbarPanel);
|
||||
}
|
||||
if (showCompetitorSearchBox) {
|
||||
contentPanel.add(new CompetitorSearchTextBox(competitorSelectionProvider, stringMessages));
|
||||
}
|
||||
contentPanel.add(getLeaderboardTable());
|
||||
contentPanel.add(dummyFocusElement); // ensure dummy element is part of the DOM
|
||||
setWidget(contentPanel);
|
||||
@@ -2730,7 +2735,13 @@ public class LeaderboardPanel extends SimplePanel implements TimeListener, PlayS
|
||||
public void filteredCompetitorsListChanged(Iterable<CompetitorDTO> filteredCompetitors) {
|
||||
updateLeaderboard(getLeaderboard());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void filterChanged(FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> oldFilterSet,
|
||||
FilterSet<CompetitorDTO, ? extends Filter<CompetitorDTO>> newFilterSet) {
|
||||
// nothing to do; if the list of filtered competitors has changed, a separate call to filteredCompetitorsListChanged will occur
|
||||
}
|
||||
|
||||
public RaceColumnSelection getRaceColumnSelection() {
|
||||
return raceColumnSelection;
|
||||
}
|
||||
|
||||
+3
-3
@@ -47,8 +47,8 @@ public class LeaderboardViewer extends AbstractLeaderboardViewer {
|
||||
super(competitorSelectionModel, asyncActionsExecutor, timer, stringMessages, hideToolbar, new LeaderboardPanel(
|
||||
sailingService, asyncActionsExecutor, leaderboardSettings, preselectedRace,
|
||||
competitorSelectionModel, timer, leaderboardGroupName, leaderboardName, errorReporter,
|
||||
stringMessages, userAgent, showRaceDetails, /* raceTimesInfoProvider */null, autoExpandLastRaceColumn, /* adjustTimerDelay */
|
||||
true));
|
||||
stringMessages, userAgent, showRaceDetails, /* showCompetitorSearchBox */ false, /* raceTimesInfoProvider */null, /* adjustTimerDelay */
|
||||
autoExpandLastRaceColumn, true));
|
||||
final FlowPanel mainPanel = createViewerPanel();
|
||||
setWidget(mainPanel);
|
||||
multiCompetitorChart = new MultiCompetitorLeaderboardChart(sailingService, asyncActionsExecutor, leaderboardName, chartDetailType,
|
||||
@@ -78,7 +78,7 @@ public class LeaderboardViewer extends AbstractLeaderboardViewer {
|
||||
overallLeaderboardPanel = new LeaderboardPanel(sailingService, asyncActionsExecutor,
|
||||
leaderboardSettings, preselectedRace, competitorSelectionProvider, timer,
|
||||
leaderboardGroupName, overallLeaderboardName, errorReporter, stringMessages, userAgent,
|
||||
false, /* raceTimesInfoProvider */null, false, /* adjustTimerDelay */ true);
|
||||
false, /* showCompetitorSearchBox */ false, /* raceTimesInfoProvider */null, false, /* adjustTimerDelay */ true);
|
||||
mainPanel.add(overallLeaderboardPanel);
|
||||
addComponentToNavigationMenu(overallLeaderboardPanel, true, stringMessages.seriesLeaderboard(),
|
||||
/* hasSettingsWhenComponentIsInvisible*/ true);
|
||||
|
||||
+1
-1
@@ -47,7 +47,7 @@ public class MetaLeaderboardViewer extends AbstractLeaderboardViewer {
|
||||
new LeaderboardPanel(sailingService, asyncActionsExecutor,
|
||||
leaderboardSettings, preselectedRace, competitorSelectionModel, timer,
|
||||
leaderboardGroupName, metaLeaderboardName, errorReporter, stringMessages, userAgent,
|
||||
showRaceDetails, /* raceTimesInfoProvider */null, autoExpandLastRaceColumn, /* adjustTimerDelay */ true));
|
||||
showRaceDetails, /* showCompetitorSearchBox */ false, /* raceTimesInfoProvider */null, autoExpandLastRaceColumn, /* adjustTimerDelay */ true));
|
||||
FlowPanel mainPanel = createViewerPanel();
|
||||
setWidget(mainPanel);
|
||||
final Label overallStandingsLabel = new Label(stringMessages.overallStandings());
|
||||
|
||||
+1
-1
@@ -202,7 +202,7 @@ public class MultiLeaderboardPanel extends AbstractLazyComponent<LeaderboardSett
|
||||
selectedLeaderboardPanel = new LeaderboardPanel(sailingService, asyncActionsExecutor, newLeaderboardSettings,
|
||||
/* preselectedRace*/ null, new CompetitorSelectionModel(true), timer,
|
||||
null, newSelectedLeaderboardName, errorReporter, stringMessages, userAgent,
|
||||
showRaceDetails, /* raceTimesInfoProvider */null, false, /* adjustTimerDelay */ true);
|
||||
showRaceDetails, /* showCompetitorSearchBox */ false, /* raceTimesInfoProvider */null, false, /* adjustTimerDelay */ true);
|
||||
selectedLeaderboardFlowPanel.add(selectedLeaderboardPanel);
|
||||
} else {
|
||||
if(selectedLeaderboardPanel != null && selectedLeaderboardFlowPanel != null) {
|
||||
|
||||
+8
-5
@@ -301,8 +301,8 @@ public class RaceBoardPanel extends SimplePanel implements RegattasDisplayer, Ra
|
||||
new ExplicitRaceColumnSelectionWithPreselectedRace(selectedRaceIdentifier));
|
||||
return new LeaderboardPanel(sailingService, asyncActionsExecutor, leaderBoardSettings, selectedRaceIdentifier,
|
||||
competitorSelectionModel, timer, leaderboardGroupName, leaderboardName, errorReporter, stringMessages,
|
||||
userAgent, /* showRaceDetails */ true, raceTimesInfoProvider, /* autoExpandLastRaceColumn */ false,
|
||||
/* don't adjust the timer's delay from the leaderboard; control it solely from the RaceTimesInfoProvider */ false);
|
||||
userAgent, /* showRaceDetails */ true, /* showCompetitorSearchBox */ true, raceTimesInfoProvider,
|
||||
/* autoExpandLastRaceColumn */ false, /* don't adjust the timer's delay from the leaderboard; control it solely from the RaceTimesInfoProvider */ false);
|
||||
}
|
||||
|
||||
private void updateCompetitorsFilterContexts(CompetitorsFilterSets filterSets) {
|
||||
@@ -322,6 +322,10 @@ public class RaceBoardPanel extends SimplePanel implements RegattasDisplayer, Ra
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the competitor filter checkbox state by setting its check mark and updating its labal according to the
|
||||
* current filter selected
|
||||
*/
|
||||
private void updateCompetitorsFilterControlState(CompetitorsFilterSets filterSets) {
|
||||
String competitorsFilterTitle = stringMessages.competitorsFilter();
|
||||
FilterSet<CompetitorDTO, FilterWithUI<CompetitorDTO>> activeFilterSet = filterSets.getActiveFilterSet();
|
||||
@@ -334,8 +338,7 @@ public class RaceBoardPanel extends SimplePanel implements RegattasDisplayer, Ra
|
||||
}
|
||||
competitorsFilterCheckBox.setValue(activeFilterSet != null, false /* fireChangeValue */);
|
||||
if (lastActiveCompetitorFilterSet != null) {
|
||||
competitorsFilterCheckBox.setText(competitorsFilterTitle + " (" + lastActiveCompetitorFilterSet.getName()
|
||||
+ ")");
|
||||
competitorsFilterCheckBox.setText(competitorsFilterTitle+" ("+lastActiveCompetitorFilterSet.getName()+")");
|
||||
} else {
|
||||
competitorsFilterCheckBox.setText(competitorsFilterTitle);
|
||||
}
|
||||
@@ -352,7 +355,7 @@ public class RaceBoardPanel extends SimplePanel implements RegattasDisplayer, Ra
|
||||
public void onValueChange(ValueChangeEvent<Boolean> newValue) {
|
||||
boolean isChecked = competitorsFilterCheckBox.getValue();
|
||||
if (isChecked) {
|
||||
if(lastActiveCompetitorFilterSet != null) {
|
||||
if (lastActiveCompetitorFilterSet != null) {
|
||||
competitorsFilterSets.setActiveFilterSet(lastActiveCompetitorFilterSet);
|
||||
competitorSelectionModel.setCompetitorsFilterSet(competitorsFilterSets.getActiveFilterSet());
|
||||
updateCompetitorsFilterControlState(competitorsFilterSets);
|
||||
|
||||
+1
-1
@@ -116,7 +116,7 @@ public class TVViewController implements RaceTimesInfoProviderListener {
|
||||
CompetitorSelectionModel selectionModel = new CompetitorSelectionModel(/* hasMultiSelection */ true);
|
||||
LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, asyncActionsExecutor, leaderboardSettings,
|
||||
/* preSelectedRace */null, selectionModel, leaderboardTimer, leaderboardGroupName, leaderboardName, errorReporter, stringMessages,
|
||||
userAgent, showRaceDetails, /* raceTimesInfoProvider */ null, /* autoExpandLastRaceColumn */ false, /* adjustTimerDelay */ true) {
|
||||
userAgent, showRaceDetails, /* showCompetitorSearchBox */ false, /* raceTimesInfoProvider */ null, /* autoExpandLastRaceColumn */ false, /* adjustTimerDelay */ true) {
|
||||
@Override
|
||||
protected void setLeaderboard(LeaderboardDTO leaderboard) {
|
||||
super.setLeaderboard(leaderboard);
|
||||
|
||||
@@ -239,7 +239,7 @@ public class Util {
|
||||
* A null-safe check whether <code>t</code> is contained in <code>ts</code>. For <code>ts==null</code> the method
|
||||
* immediately returns <code>false</code>.
|
||||
*/
|
||||
public static <T> boolean contains(Iterable<T> ts, T t) {
|
||||
public static <T> boolean contains(Iterable<T> ts, Object t) {
|
||||
if (ts == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user