a first working implementation of a competitor search box shown above the leaderboard

This commit is contained in:
Axel Uhl committed 2014-07-31 17:44:43 +02:00
1 parent 1790f75971
commit 47821a1141
18 files changed
+221 -23

No files matched your search

@@ -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);
@@ -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());
}
@@ -1066,4 +1066,5 @@ public interface StringMessages extends Messages {
String currentOrAverageSpeedOverGroundInKnotsTooltip();
String currentOrAverageSpeedOverGroundInKnots();
String scoringSchemeHighPointFirstGetsTenOrEight();
String competitorSearchFilter();
}
@@ -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
@@ -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
@@ -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
@@ -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) {
}
}
@@ -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
}
}
@@ -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 {
@@ -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) {
@@ -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) {}
}
@@ -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;
}
@@ -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);
@@ -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());
@@ -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) {
@@ -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);
@@ -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;
}