Merge local branch newSelectionModelinto newSelectionModel

This commit is contained in:
Lukas Furmanek committed 2015-12-02 13:24:34 +01:00
commit d9624dd385
42 files changed
+155 -748

No files matched your search

@@ -1,7 +1,6 @@
package com.sap.sailing.dashboards.gwt.client.dataretriever; package com.sap.sailing.dashboards.gwt.client.dataretriever;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
@@ -12,9 +11,6 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.dashboards.gwt.client.RibDashboardServiceAsync; import com.sap.sailing.dashboards.gwt.client.RibDashboardServiceAsync;
import com.sap.sailing.dashboards.gwt.client.actions.GetRibDashboardRaceInfoAction; import com.sap.sailing.dashboards.gwt.client.actions.GetRibDashboardRaceInfoAction;
import com.sap.sailing.dashboards.gwt.shared.dto.RibDashboardRaceInfoDTO; import com.sap.sailing.dashboards.gwt.shared.dto.RibDashboardRaceInfoDTO;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor; import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.TimeListener; import com.sap.sse.gwt.client.player.TimeListener;
@@ -26,11 +22,10 @@ import com.sap.sse.gwt.client.player.TimeListener;
* @author Alexander Ries * @author Alexander Ries
* *
*/ */
public class RibDashboardDataRetriever implements TimeListener, RaceSelectionProvider { public class RibDashboardDataRetriever implements TimeListener {
private String leaderboardName; private String leaderboardName;
private ArrayList<RibDashboardDataRetrieverListener> dataRetrieverListener; private ArrayList<RibDashboardDataRetrieverListener> dataRetrieverListener;
private ArrayList<RaceSelectionChangeListener> raceSelectionChangeListener;
private AsyncActionsExecutor asyncActionsExecutor; private AsyncActionsExecutor asyncActionsExecutor;
@@ -51,7 +46,6 @@ public class RibDashboardDataRetriever implements TimeListener, RaceSelectionPro
private void initNonFinalMemberVariablesWithNoArgumentConstructor() { private void initNonFinalMemberVariablesWithNoArgumentConstructor() {
dataRetrieverListener = new ArrayList<RibDashboardDataRetrieverListener>(); dataRetrieverListener = new ArrayList<RibDashboardDataRetrieverListener>();
raceSelectionChangeListener = new ArrayList<RaceSelectionChangeListener>();
} }
private void loadLiveRaceInfoFromRibDashboadService() { private void loadLiveRaceInfoFromRibDashboadService() {
@@ -66,10 +60,8 @@ public class RibDashboardDataRetriever implements TimeListener, RaceSelectionPro
switch (result.responseMessage) { switch (result.responseMessage) {
case RACE_LIVE: case RACE_LIVE:
logger.log(Level.INFO, "RibDashboardRaceInfoDTO.responseMessage is RACE_LIVE"); logger.log(Level.INFO, "RibDashboardRaceInfoDTO.responseMessage is RACE_LIVE");
if(result.idOfLastTrackedRace != null) { if (result.idOfLastTrackedRace != null) {
logger.log(Level.INFO, "RibDashboardRaceInfoDTO idOfLastTrackedRace is "+result.idOfLastTrackedRace); logger.log(Level.INFO, "RibDashboardRaceInfoDTO idOfLastTrackedRace is "+result.idOfLastTrackedRace);
List<RegattaAndRaceIdentifier> singletonList = Collections.singletonList(result.idOfLastTrackedRace);
setSelection(singletonList);
} else { } else {
logger.log(Level.INFO, "RibDashboardRaceInfoDTO.idOfLastTrackedRace is null"); logger.log(Level.INFO, "RibDashboardRaceInfoDTO.idOfLastTrackedRace is null");
} }
@@ -123,45 +115,4 @@ public class RibDashboardDataRetriever implements TimeListener, RaceSelectionPro
public void timeChanged(Date newTime, Date oldTime) { public void timeChanged(Date newTime, Date oldTime) {
loadLiveRaceInfoFromRibDashboadService(); loadLiveRaceInfoFromRibDashboadService();
} }
@Override
public void addRaceSelectionChangeListener(RaceSelectionChangeListener listener) {
synchronized (MUTEX) {
if (listener != null) {
raceSelectionChangeListener.add(listener);
}
}
}
@Override
public void removeRaceSelectionChangeListener(RaceSelectionChangeListener listener) {
synchronized (MUTEX) {
raceSelectionChangeListener.remove(listener);
}
}
@Override
public void setSelection(List<RegattaAndRaceIdentifier> newSelection,
RaceSelectionChangeListener... listenersNotToNotify) {
synchronized (MUTEX) {
for (RaceSelectionChangeListener currentRaceSelectionChangeListener : raceSelectionChangeListener) {
currentRaceSelectionChangeListener.onRaceSelectionChange(newSelection);
}
}
}
@Override
public List<RegattaAndRaceIdentifier> getAllRaces() {
return null;
}
@Override
public void setAllRaces(List<RegattaAndRaceIdentifier> newAllRaces,
RaceSelectionChangeListener... listenersNotToNotify) {
}
@Override
public List<RegattaAndRaceIdentifier> getSelectedRaces() {
return null;
}
} }
@@ -153,7 +153,6 @@ public class StartlineAnalysisCard extends Composite implements HasWidgets, Star
raceMap = new RaceMap(sailingServiceAsync, asyncActionsExecutor, null, timer, competitorSelectionModel, raceMap = new RaceMap(sailingServiceAsync, asyncActionsExecutor, null, timer, competitorSelectionModel,
StringMessages.INSTANCE, false, false, false, false, startAnalysisDTO.regattaAndRaceIdentifier, StringMessages.INSTANCE, false, false, false, false, startAnalysisDTO.regattaAndRaceIdentifier,
resources.combinedWindPanelStyle(), /* showHeaderPanel */ true); resources.combinedWindPanelStyle(), /* showHeaderPanel */ true);
raceMap.onRaceSelectionChange(Collections.singletonList(startAnalysisDTO.regattaAndRaceIdentifier));
raceMap.getSettings().setZoomSettings(new RaceMapZoomSettings(zoomTypes, false)); raceMap.getSettings().setZoomSettings(new RaceMapZoomSettings(zoomTypes, false));
raceMap.getSettings().setHelpLinesSettings(getHelpLineSettings()); raceMap.getSettings().setHelpLinesSettings(getHelpLineSettings());
raceMap.getSettings().setTailLengthInMilliseconds(startAnalysisDTO.tailLenghtInMilliseconds); raceMap.getSettings().setTailLengthInMilliseconds(startAnalysisDTO.tailLenghtInMilliseconds);
@@ -1,9 +1,7 @@
package com.sap.sailing.gwt.autoplay.client.place.player; package com.sap.sailing.gwt.autoplay.client.place.player;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.Map; import java.util.Map;
import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler;
@@ -29,7 +27,6 @@ import com.sap.sailing.gwt.common.client.FullscreenUtil;
import com.sap.sailing.gwt.common.client.i18n.TextMessages; import com.sap.sailing.gwt.common.client.i18n.TextMessages;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.MediaServiceAsync; import com.sap.sailing.gwt.ui.client.MediaServiceAsync;
import com.sap.sailing.gwt.ui.client.RaceSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider; import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProviderListener; import com.sap.sailing.gwt.ui.client.RaceTimesInfoProviderListener;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
@@ -167,12 +164,8 @@ public class AutoPlayController implements RaceTimesInfoProviderListener {
} }
private RaceBoardPanel createRaceBoardPanel(String leaderboardName, RegattaAndRaceIdentifier raceToShow, Map<CompetitorDTO, BoatDTO> competitorsAndTheirBoats) { private RaceBoardPanel createRaceBoardPanel(String leaderboardName, RegattaAndRaceIdentifier raceToShow, Map<CompetitorDTO, BoatDTO> competitorsAndTheirBoats) {
RaceSelectionModel raceSelectionModel = new RaceSelectionModel();
List<RegattaAndRaceIdentifier> singletonList = Collections.singletonList(raceToShow);
raceSelectionModel.setSelection(singletonList);
RaceBoardPanel raceBoardPanel = new RaceBoardPanel(sailingService, mediaService, userService, asyncActionsExecutor, RaceBoardPanel raceBoardPanel = new RaceBoardPanel(sailingService, mediaService, userService, asyncActionsExecutor,
competitorsAndTheirBoats, raceboardTimer, raceSelectionModel, leaderboardName, null, /* event */null, raceboardViewConfig, competitorsAndTheirBoats, raceboardTimer, raceToShow, leaderboardName, null, /* event */null, raceboardViewConfig,
errorReporter, StringMessages.INSTANCE, userAgent, raceTimesInfoProvider, /* showMapControls */false); errorReporter, StringMessages.INSTANCE, userAgent, raceTimesInfoProvider, /* showMapControls */false);
return raceBoardPanel; return raceBoardPanel;
} }
@@ -17,18 +17,18 @@ import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.MultiSelectionModel;
import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTOImpl; import com.sap.sailing.domain.common.dto.CompetitorDTOImpl;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util; import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.dialog.DataEntryDialog; import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDialog<Set<CompetitorDTO>> { public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDialog<Set<CompetitorDTO>> {
protected CompetitorTableWrapper<MultiSelectionModel<CompetitorDTO>> allCompetitorsTable; protected CompetitorTableWrapper<RefreshableMultiSelectionModel<CompetitorDTO>> allCompetitorsTable;
protected CompetitorTableWrapper<MultiSelectionModel<CompetitorDTO>> registeredCompetitorsTable; protected CompetitorTableWrapper<RefreshableMultiSelectionModel<CompetitorDTO>> registeredCompetitorsTable;
protected final boolean filterByLeaderBoardInitially = false; protected final boolean filterByLeaderBoardInitially = false;
private final StringMessages stringMessages; private final StringMessages stringMessages;
protected final SailingServiceAsync sailingService; protected final SailingServiceAsync sailingService;
@@ -145,8 +145,8 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia
} }
} }
private void moveSelected(CompetitorTableWrapper<MultiSelectionModel<CompetitorDTO>> from, private void moveSelected(CompetitorTableWrapper<RefreshableMultiSelectionModel<CompetitorDTO>> from,
CompetitorTableWrapper<MultiSelectionModel<CompetitorDTO>> to) { CompetitorTableWrapper<RefreshableMultiSelectionModel<CompetitorDTO>> to) {
move(from, to, from.getSelectionModel().getSelectedSet()); move(from, to, from.getSelectionModel().getSelectedSet());
} }
@@ -25,7 +25,6 @@ import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SetSelectionModel;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.RegattaNameAndRaceName; import com.sap.sailing.domain.common.RegattaNameAndRaceName;
import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.FleetDTO;
@@ -71,7 +70,7 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
protected final CellTable<StrippedLeaderboardDTO> leaderboardTable; protected final CellTable<StrippedLeaderboardDTO> leaderboardTable;
protected final RaceTableWrapper<SetSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>> raceColumnTable; protected final RaceTableWrapper<RefreshableSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>> raceColumnTable;
protected final RefreshableSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality> raceColumnTableSelectionModel; protected final RefreshableSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality> raceColumnTableSelectionModel;
protected RaceColumnDTOAndFleetDTOWithNameBasedEquality selectedRaceInLeaderboard; protected RaceColumnDTOAndFleetDTOWithNameBasedEquality selectedRaceInLeaderboard;
@@ -86,7 +85,7 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
protected final RefreshableMultiSelectionModel<StrippedLeaderboardDTO> refreshableLeaderboardSelectionModel; protected final RefreshableMultiSelectionModel<StrippedLeaderboardDTO> refreshableLeaderboardSelectionModel;
protected final RefreshableSingleSelectionModel<RaceDTO> raceSingelSelectionModel; protected final RefreshableSingleSelectionModel<RaceDTO> raceSingleSelectionModel;
protected boolean reactOnSelectionChangeEvent; protected boolean reactOnSelectionChangeEvent;
private final LeaderboardsRefresher leaderboardsRefresher; private final LeaderboardsRefresher leaderboardsRefresher;
@@ -218,16 +217,15 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
trackedRacesListComposite.ensureDebugId("TrackedRacesListComposite"); trackedRacesListComposite.ensureDebugId("TrackedRacesListComposite");
trackedRacesPanel.add(trackedRacesListComposite); trackedRacesPanel.add(trackedRacesListComposite);
trackedRacesListComposite.addTrackedRaceChangeListener(this); trackedRacesListComposite.addTrackedRaceChangeListener(this);
this.raceSingelSelectionModel = (RefreshableSingleSelectionModel<RaceDTO>) trackedRacesListComposite.getSelectionModel(); this.raceSingleSelectionModel = (RefreshableSingleSelectionModel<RaceDTO>) trackedRacesListComposite.getSelectionModel();
this.raceSingelSelectionModel.addSelectionChangeHandler(new Handler() { this.raceSingleSelectionModel.addSelectionChangeHandler(new Handler() {
@Override @Override
public void onSelectionChange(SelectionChangeEvent event) { public void onSelectionChange(SelectionChangeEvent event) {
if (reactOnSelectionChangeEvent) { if (reactOnSelectionChangeEvent) {
// if no leaderboard column is selected, ignore the race selection change // if no leaderboard column is selected, ignore the race selection change
RaceColumnDTOAndFleetDTOWithNameBasedEquality selectedRaceColumnAndFleetName = getSelectedRaceColumnWithFleet(); RaceColumnDTOAndFleetDTOWithNameBasedEquality selectedRaceColumnAndFleetName = getSelectedRaceColumnWithFleet();
if (selectedRaceColumnAndFleetName != null) { if (selectedRaceColumnAndFleetName != null) {
if (raceSingelSelectionModel.getSelectedSet().isEmpty()) { if (raceSingleSelectionModel.getSelectedSet().isEmpty()) {
if (selectedRaceColumnAndFleetName.getA() if (selectedRaceColumnAndFleetName.getA()
.getRaceIdentifier(selectedRaceColumnAndFleetName.getB()) != null) { .getRaceIdentifier(selectedRaceColumnAndFleetName.getB()) != null) {
unlinkRaceColumnFromTrackedRace( unlinkRaceColumnFromTrackedRace(
@@ -237,7 +235,7 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
} else { } else {
linkTrackedRaceToSelectedRaceColumn(selectedRaceColumnAndFleetName.getA(), linkTrackedRaceToSelectedRaceColumn(selectedRaceColumnAndFleetName.getA(),
selectedRaceColumnAndFleetName.getB(), selectedRaceColumnAndFleetName.getB(),
raceSingelSelectionModel.getSelectedObject().getRaceIdentifier()); raceSingleSelectionModel.getSelectedObject().getRaceIdentifier());
} }
} }
} }
@@ -261,11 +259,11 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
vPanel.add(reloadAllRaceLogs); vPanel.add(reloadAllRaceLogs);
Label lblRaceNamesIn = new Label(stringMessages.races()); Label lblRaceNamesIn = new Label(stringMessages.races());
vPanel.add(lblRaceNamesIn); vPanel.add(lblRaceNamesIn);
raceColumnTable = new RaceTableWrapper<SetSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>( raceColumnTable = new RaceTableWrapper<RefreshableSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>(
sailingService, stringMessages, errorReporter, multiSelection); sailingService, stringMessages, errorReporter, multiSelection);
raceColumnTable.getTable().setWidth("100%"); raceColumnTable.getTable().setWidth("100%");
addColumnsToRacesTable(raceColumnTable.getTable()); addColumnsToRacesTable(raceColumnTable.getTable());
this.raceColumnTableSelectionModel = raceColumnTable.getRefreshableSelectionModel(); this.raceColumnTableSelectionModel = raceColumnTable.getSelectionModel();
raceColumnTableSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { raceColumnTableSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
public void onSelectionChange(SelectionChangeEvent event) { public void onSelectionChange(SelectionChangeEvent event) {
leaderboardRaceColumnSelectionChanged(); leaderboardRaceColumnSelectionChanged();
@@ -336,7 +334,7 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
} }
replaceLeaderboardInList(availableLeaderboardList, leaderboardName, leaderboard); replaceLeaderboardInList(availableLeaderboardList, leaderboardName, leaderboard);
filterLeaderboardPanel.updateAll(availableLeaderboardList); // also updates leaderboardList provider filterLeaderboardPanel.updateAll(availableLeaderboardList); // also updates leaderboardList provider
refreshableLeaderboardSelectionModel.setSelected(leaderboard, true); refreshableLeaderboardSelectionModel.setSelected(leaderboard, true); // TODO Lukas: should/will this replace a previously selected element that is compared equal by the EntityIdentityComparator?
if (nameOfRaceColumnToSelect != null) { if (nameOfRaceColumnToSelect != null) {
selectRaceColumn(nameOfRaceColumnToSelect); selectRaceColumn(nameOfRaceColumnToSelect);
} }
@@ -356,12 +354,12 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
int index = -1; int index = -1;
for (StrippedLeaderboardDTO existingLeaderboard : leaderboardList) { for (StrippedLeaderboardDTO existingLeaderboard : leaderboardList) {
index++; index++;
if (existingLeaderboard.name.equals(leaderboardToReplace)) { if (existingLeaderboard.name.equals(leaderboardToReplace)) { // TODO Lukas: this should be the EntityIdentityComparator used for the RefreshableSelectionModel
break; break;
} }
} }
if (index >= 0) { if (index >= 0) {
leaderboardList.set(index, newLeaderboard); leaderboardList.set(index, newLeaderboard); // TODO Lukas: update refreshable selection model accordingly
} }
} }
@@ -21,13 +21,14 @@ import com.sap.sailing.gwt.ui.shared.DeviceMappingDTO;
import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sailing.gwt.ui.shared.TrackFileImportDeviceIdentifierDTO; import com.sap.sailing.gwt.ui.shared.TrackFileImportDeviceIdentifierDTO;
import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
import com.sap.sse.gwt.client.dialog.DataEntryDialog; import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public abstract class AbstractLogImportFixesAndAddMappingsDialog extends DataEntryDialog<Collection<DeviceMappingDTO>> { public abstract class AbstractLogImportFixesAndAddMappingsDialog extends DataEntryDialog<Collection<DeviceMappingDTO>> {
TrackFileImportWidget importWidget; TrackFileImportWidget importWidget;
private TrackFileImportDeviceIdentifierTableWrapper deviceIdTable; private TrackFileImportDeviceIdentifierTableWrapper deviceIdTable;
protected final CompetitorTableWrapper<SingleSelectionModel<CompetitorDTO>> competitorTable; protected final CompetitorTableWrapper<RefreshableSingleSelectionModel<CompetitorDTO>> competitorTable;
protected final MarkTableWrapper<SingleSelectionModel<MarkDTO>> markTable; protected final MarkTableWrapper<RefreshableSingleSelectionModel<MarkDTO>> markTable;
private final StringMessages stringMessages; private final StringMessages stringMessages;
private final Map<TrackFileImportDeviceIdentifierDTO, MappableToDevice> mappings = new HashMap<>(); private final Map<TrackFileImportDeviceIdentifierDTO, MappableToDevice> mappings = new HashMap<>();
@@ -56,7 +57,7 @@ public abstract class AbstractLogImportFixesAndAddMappingsDialog extends DataEnt
} }
}); });
competitorTable = new CompetitorTableWrapper<>(sailingService, stringMessages, errorReporter, /* multiSelection */ false, true); competitorTable = new CompetitorTableWrapper<>(sailingService, stringMessages, errorReporter, /* multiSelection */ false, true);
markTable = new MarkTableWrapper<SingleSelectionModel<MarkDTO>>( markTable = new MarkTableWrapper<RefreshableSingleSelectionModel<MarkDTO>>(
/* multiSelection */ false, sailingService, stringMessages, errorReporter); /* multiSelection */ false, sailingService, stringMessages, errorReporter);
competitorTable.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() { competitorTable.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@@ -29,27 +29,38 @@ public abstract class AbstractRaceManagementPanel extends AbstractEventManagemen
public AbstractRaceManagementPanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter, public AbstractRaceManagementPanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter,
RegattaRefresher regattaRefresher, boolean actionButtonsEnabled, StringMessages stringMessages) { RegattaRefresher regattaRefresher, boolean actionButtonsEnabled, StringMessages stringMessages) {
super(sailingService, regattaRefresher, errorReporter, actionButtonsEnabled, stringMessages); super(sailingService, regattaRefresher, errorReporter, actionButtonsEnabled, stringMessages);
VerticalPanel mainPanel = new VerticalPanel(); VerticalPanel mainPanel = new VerticalPanel();
this.setWidget(mainPanel); this.setWidget(mainPanel);
mainPanel.setWidth("100%"); mainPanel.setWidth("100%");
mainPanel.add(trackedRacesListComposite); mainPanel.add(trackedRacesListComposite);
trackedRacesListComposite.getSelectionModel().addSelectionChangeHandler(new Handler() { trackedRacesListComposite.getSelectionModel().addSelectionChangeHandler(new Handler() {
@Override @Override
public void onSelectionChange(SelectionChangeEvent event) { public void onSelectionChange(SelectionChangeEvent event) {
onRaceSelectionChange(trackedRacesListComposite.getSelectionModel().getSelectedSet()); Set<RaceDTO> selectedRaces = trackedRacesListComposite.getSelectionModel().getSelectedSet();
if (selectedRaces.size() == 1) {
singleSelectedRace = selectedRaces.iterator().next().getRaceIdentifier();
selectedCaptionRacePanel.setCaptionText(singleSelectedRace.getRaceName());
selectedCaptionRacePanel.setVisible(true);
for (RegattaDTO regatta : getAvailableRegattas()) {
for (RaceDTO race : regatta.races) {
if (race != null && race.getRaceIdentifier().equals(singleSelectedRace)) {
AbstractRaceManagementPanel.this.selectedRaceDTO = race;
refreshSelectedRaceData();
break;
}
}
}
} else {
selectedCaptionRacePanel.setCaptionText("");
singleSelectedRace = null;
selectedCaptionRacePanel.setVisible(false);
}
} }
}); });
singleSelectedRace = null; singleSelectedRace = null;
selectedCaptionRacePanel = new CaptionPanel(stringMessages.race()); selectedCaptionRacePanel = new CaptionPanel(stringMessages.race());
selectedCaptionRacePanel.setWidth("100%"); selectedCaptionRacePanel.setWidth("100%");
mainPanel.add(selectedCaptionRacePanel); mainPanel.add(selectedCaptionRacePanel);
selectedRaceContentPanel = new VerticalPanel(); selectedRaceContentPanel = new VerticalPanel();
selectedRaceContentPanel.setWidth("100%"); selectedRaceContentPanel.setWidth("100%");
selectedCaptionRacePanel.setContentWidget(selectedRaceContentPanel); selectedCaptionRacePanel.setContentWidget(selectedRaceContentPanel);
@@ -57,25 +68,4 @@ public abstract class AbstractRaceManagementPanel extends AbstractEventManagemen
} }
abstract void refreshSelectedRaceData(); abstract void refreshSelectedRaceData();
public void onRaceSelectionChange(Set<RaceDTO> selectedRaces) {
if (selectedRaces.size() == 1) {
singleSelectedRace = selectedRaces.iterator().next().getRaceIdentifier();
selectedCaptionRacePanel.setCaptionText(singleSelectedRace.getRaceName());
selectedCaptionRacePanel.setVisible(true);
for (RegattaDTO regatta : getAvailableRegattas()) {
for (RaceDTO race : regatta.races) {
if (race != null && race.getRaceIdentifier().equals(singleSelectedRace)) {
this.selectedRaceDTO = race;
refreshSelectedRaceData();
break;
}
}
}
} else {
selectedCaptionRacePanel.setCaptionText("");
singleSelectedRace = null;
selectedCaptionRacePanel.setVisible(false);
}
}
} }
@@ -98,14 +98,11 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
protected void createUI() { protected void createUI() {
AdminConsoleTableResources tableResources = GWT.create(AdminConsoleTableResources.class); AdminConsoleTableResources tableResources = GWT.create(AdminConsoleTableResources.class);
raceList = new ListDataProvider<RaceDTO>(); raceList = new ListDataProvider<RaceDTO>();
settings = new TrackedRacesSettings(); settings = new TrackedRacesSettings();
settings.setDelayToLiveInSeconds(DEFAULT_LIVE_DELAY_IN_MILLISECONDS / 1000l); settings.setDelayToLiveInSeconds(DEFAULT_LIVE_DELAY_IN_MILLISECONDS / 1000l);
VerticalPanel panel = new VerticalPanel(); VerticalPanel panel = new VerticalPanel();
setWidget(panel); setWidget(panel);
HorizontalPanel filterPanel = new HorizontalPanel(); HorizontalPanel filterPanel = new HorizontalPanel();
panel.add(filterPanel); panel.add(filterPanel);
Label lblFilterRaces = new Label(stringMessages.filterRacesByName() + ":"); Label lblFilterRaces = new Label(stringMessages.filterRacesByName() + ":");
@@ -116,23 +113,21 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
noTrackedRacesLabel = new Label(stringMessages.noRacesYet()); noTrackedRacesLabel = new Label(stringMessages.noRacesYet());
noTrackedRacesLabel.setWordWrap(false); noTrackedRacesLabel.setWordWrap(false);
panel.add(noTrackedRacesLabel); panel.add(noTrackedRacesLabel);
AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class); AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
raceTable = new CellTable<RaceDTO>(/* pageSize */10000, tableRes); raceTable = new CellTable<RaceDTO>(/* pageSize */10000, tableRes);
raceTable.ensureDebugId("TrackedRacesCellTable"); raceTable.ensureDebugId("TrackedRacesCellTable");
final EntityIdentityComparator<RaceDTO> entityIdentityComparator = new EntityIdentityComparator<RaceDTO>() {
@Override
public boolean representSameEntity(RaceDTO dto1, RaceDTO dto2) {
return dto1.getRaceIdentifier().equals(dto2.getRaceIdentifier());
}
};
if (multiSelection) { if (multiSelection) {
this.selectionCheckboxColumn = new SelectionCheckboxColumn<RaceDTO>( this.selectionCheckboxColumn = new SelectionCheckboxColumn<RaceDTO>(
tableResources.cellTableStyle().cellTableCheckboxSelected(), tableResources.cellTableStyle().cellTableCheckboxSelected(),
tableResources.cellTableStyle().cellTableCheckboxDeselected(), tableResources.cellTableStyle().cellTableCheckboxDeselected(),
tableResources.cellTableStyle().cellTableCheckboxColumnCell(), tableResources.cellTableStyle().cellTableCheckboxColumnCell(),
new EntityIdentityComparator<RaceDTO>() { entityIdentityComparator) {
@Override
public boolean representSameEntity(RaceDTO dto1, RaceDTO dto2) {
return dto1.getRaceIdentifier().equals(dto2.getRaceIdentifier());
}
}) {
@Override @Override
protected ListDataProvider<RaceDTO> getListDataProvider() { protected ListDataProvider<RaceDTO> getListDataProvider() {
return raceList; return raceList;
@@ -146,7 +141,7 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
refreshableSelectionModel = selectionCheckboxColumn.getSelectionModel(); refreshableSelectionModel = selectionCheckboxColumn.getSelectionModel();
raceTable.setSelectionModel(refreshableSelectionModel, this.selectionCheckboxColumn.getSelectionManager()); raceTable.setSelectionModel(refreshableSelectionModel, this.selectionCheckboxColumn.getSelectionManager());
} else { } else {
refreshableSelectionModel = new RefreshableSingleSelectionModel<RaceDTO>(); refreshableSelectionModel = new RefreshableSingleSelectionModel<RaceDTO>(entityIdentityComparator);
raceTable.setSelectionModel(refreshableSelectionModel); raceTable.setSelectionModel(refreshableSelectionModel);
} }
@@ -14,7 +14,6 @@ import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.CompetitorDTO;
@@ -36,7 +35,7 @@ public class CompetitorPanel extends SimplePanel {
private final SailingServiceAsync sailingService; private final SailingServiceAsync sailingService;
private final StringMessages stringMessages; private final StringMessages stringMessages;
private final ErrorReporter errorReporter; private final ErrorReporter errorReporter;
private final CompetitorTableWrapper<MultiSelectionModel<CompetitorDTO>> competitorTable; private final CompetitorTableWrapper<RefreshableMultiSelectionModel<CompetitorDTO>> competitorTable;
private final RefreshableMultiSelectionModel<CompetitorDTO> refreshableCompetitorSelectionModel; private final RefreshableMultiSelectionModel<CompetitorDTO> refreshableCompetitorSelectionModel;
private final String leaderboardName; private final String leaderboardName;
@@ -15,7 +15,6 @@ import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.ImageResourceRenderer; import com.google.gwt.user.client.ui.ImageResourceRenderer;
import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Label;
import com.google.gwt.view.client.SelectionModel;
import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.adminconsole.ColorColumn.ColorRetriever; import com.sap.sailing.gwt.ui.adminconsole.ColorColumn.ColorRetriever;
import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.FlagImageResolver;
@@ -28,7 +27,7 @@ import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel; import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel;
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel; import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
public class CompetitorTableWrapper<S extends SelectionModel<CompetitorDTO>> extends TableWrapper<CompetitorDTO, S> { public class CompetitorTableWrapper<S extends RefreshableSelectionModel<CompetitorDTO>> extends TableWrapper<CompetitorDTO, S> {
private final LabeledAbstractFilterablePanel<CompetitorDTO> filterField; private final LabeledAbstractFilterablePanel<CompetitorDTO> filterField;
public CompetitorTableWrapper(SailingServiceAsync sailingService, StringMessages stringMessages,ErrorReporter errorReporter, public CompetitorTableWrapper(SailingServiceAsync sailingService, StringMessages stringMessages,ErrorReporter errorReporter,
@@ -1,7 +1,6 @@
package com.sap.sailing.gwt.ui.adminconsole; package com.sap.sailing.gwt.ui.adminconsole;
import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.view.client.SelectionModel;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.ControlPointDTO; import com.sap.sailing.gwt.ui.shared.ControlPointDTO;
@@ -11,7 +10,7 @@ import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.EntityIdentityComparator; import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel; import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel;
public class ControlPointTableWrapper<S extends SelectionModel<ControlPointDTO>> extends TableWrapper<ControlPointDTO, S> { public class ControlPointTableWrapper<S extends RefreshableSelectionModel<ControlPointDTO>> extends TableWrapper<ControlPointDTO, S> {
public ControlPointTableWrapper(boolean multiSelection, SailingServiceAsync sailingService, final StringMessages stringMessages, public ControlPointTableWrapper(boolean multiSelection, SailingServiceAsync sailingService, final StringMessages stringMessages,
ErrorReporter errorReporter) { ErrorReporter errorReporter) {
super(sailingService, stringMessages, errorReporter, multiSelection, /* enablePager */ true, super(sailingService, stringMessages, errorReporter, multiSelection, /* enablePager */ true,
@@ -7,17 +7,17 @@ import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.sap.sailing.gwt.ui.adminconsole.AbstractLeaderboardConfigPanel.RaceColumnDTOAndFleetDTOWithNameBasedEquality; import com.sap.sailing.gwt.ui.adminconsole.AbstractLeaderboardConfigPanel.RaceColumnDTOAndFleetDTOWithNameBasedEquality;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.dialog.DataEntryDialog; import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class CopyCourseAndCompetitorsDialog extends DataEntryDialog<CourseAndCompetitorCopyOperation> { public class CopyCourseAndCompetitorsDialog extends DataEntryDialog<CourseAndCompetitorCopyOperation> {
private final RaceTableWrapper<MultiSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>> private final RaceTableWrapper<RefreshableMultiSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>
racesTable; racesTable;
private final CheckBox courseCheckBox; private final CheckBox courseCheckBox;
private final CheckBox competitorCheckBox; private final CheckBox competitorCheckBox;
@@ -38,7 +38,7 @@ public class CopyCourseAndCompetitorsDialog extends DataEntryDialog<CourseAndCom
return null; return null;
} }
}, true, dialogCallback); }, true, dialogCallback);
racesTable = new RaceTableWrapper<MultiSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>( racesTable = new RaceTableWrapper<RefreshableMultiSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>(
sailingService, stringMessages, errorReporter, /* multiSelection */ true); sailingService, stringMessages, errorReporter, /* multiSelection */ true);
racesTable.setSelectedLeaderboardName(leaderboardName); racesTable.setSelectedLeaderboardName(leaderboardName);
racesTable.getDataProvider().getList().addAll(races); racesTable.getDataProvider().getList().addAll(races);
@@ -16,11 +16,9 @@ import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SetSelectionModel; import com.google.gwt.view.client.SetSelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -30,12 +28,14 @@ import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO; import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
import com.sap.sailing.gwt.ui.shared.WaypointDTO; import com.sap.sailing.gwt.ui.shared.WaypointDTO;
import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
import com.sap.sse.gwt.client.dialog.DataEntryDialog; import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public abstract class CourseManagementWidget implements IsWidget { public abstract class CourseManagementWidget implements IsWidget {
protected final MarkTableWrapper<MultiSelectionModel<MarkDTO>> marks; protected final MarkTableWrapper<RefreshableMultiSelectionModel<MarkDTO>> marks;
protected final ControlPointTableWrapper<SingleSelectionModel<ControlPointDTO>> multiMarkControlPoints; protected final ControlPointTableWrapper<RefreshableSingleSelectionModel<ControlPointDTO>> multiMarkControlPoints;
protected final WaypointTableWrapper<SingleSelectionModel<WaypointDTO>> waypoints; protected final WaypointTableWrapper<RefreshableSingleSelectionModel<WaypointDTO>> waypoints;
protected final Grid mainPanel; protected final Grid mainPanel;
@@ -67,11 +67,11 @@ public abstract class CourseManagementWidget implements IsWidget {
mainPanel.setCellPadding(5); mainPanel.setCellPadding(5);
mainPanel.getRowFormatter().setVerticalAlign(0, HasVerticalAlignment.ALIGN_TOP); mainPanel.getRowFormatter().setVerticalAlign(0, HasVerticalAlignment.ALIGN_TOP);
waypoints = new WaypointTableWrapper<SingleSelectionModel<WaypointDTO>>( waypoints = new WaypointTableWrapper<RefreshableSingleSelectionModel<WaypointDTO>>(
/* multiSelection */ false, sailingService, stringMessages, errorReporter); /* multiSelection */ false, sailingService, stringMessages, errorReporter);
multiMarkControlPoints = new ControlPointTableWrapper<SingleSelectionModel<ControlPointDTO>>( multiMarkControlPoints = new ControlPointTableWrapper<RefreshableSingleSelectionModel<ControlPointDTO>>(
/* multiSelection */ false, sailingService, stringMessages, errorReporter); /* multiSelection */ false, sailingService, stringMessages, errorReporter);
marks = new MarkTableWrapper<MultiSelectionModel<MarkDTO>>( marks = new MarkTableWrapper<RefreshableMultiSelectionModel<MarkDTO>>(
/* multiSelection */ true, sailingService, stringMessages, errorReporter); /* multiSelection */ true, sailingService, stringMessages, errorReporter);
CaptionPanel waypointsPanel = new CaptionPanel(stringMessages.waypoints()); CaptionPanel waypointsPanel = new CaptionPanel(stringMessages.waypoints());
@@ -1,13 +1,13 @@
package com.sap.sailing.gwt.ui.adminconsole; package com.sap.sailing.gwt.ui.adminconsole;
import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.view.client.MultiSelectionModel;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.DeviceIdentifierDTO; import com.sap.sailing.gwt.ui.shared.DeviceIdentifierDTO;
import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
public class DeviceIdentifierTableWrapper extends TableWrapper<DeviceIdentifierDTO, MultiSelectionModel<DeviceIdentifierDTO>> { public class DeviceIdentifierTableWrapper extends TableWrapper<DeviceIdentifierDTO, RefreshableMultiSelectionModel<DeviceIdentifierDTO>> {
public DeviceIdentifierTableWrapper(SailingServiceAsync sailingService, StringMessages stringMessages, public DeviceIdentifierTableWrapper(SailingServiceAsync sailingService, StringMessages stringMessages,
ErrorReporter errorReporter) { ErrorReporter errorReporter) {
@@ -11,15 +11,15 @@ import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil; import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil;
import com.sap.sailing.gwt.ui.shared.DeviceMappingDTO; import com.sap.sailing.gwt.ui.shared.DeviceMappingDTO;
import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
public class DeviceMappingTableWrapper extends TableWrapper<DeviceMappingDTO, SingleSelectionModel<DeviceMappingDTO>> { public class DeviceMappingTableWrapper extends TableWrapper<DeviceMappingDTO, RefreshableSingleSelectionModel<DeviceMappingDTO>> {
static interface FilterChangedHandler { static interface FilterChangedHandler {
void onFilterChanged(List<DeviceMappingDTO> filteredList); void onFilterChanged(List<DeviceMappingDTO> filteredList);
} }
@@ -10,7 +10,6 @@ import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
@@ -18,10 +17,11 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.GateDTO; import com.sap.sailing.gwt.ui.shared.GateDTO;
import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.dialog.DataEntryDialog; import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class GateCreationDialog extends DataEntryDialog<GateDTO> { public class GateCreationDialog extends DataEntryDialog<GateDTO> {
private final MarkTableWrapper<MultiSelectionModel<MarkDTO>> marksWrapper; private final MarkTableWrapper<RefreshableMultiSelectionModel<MarkDTO>> marksWrapper;
private final TextBox name; private final TextBox name;
private final StringMessages stringMessages; private final StringMessages stringMessages;
@@ -42,7 +42,7 @@ public class GateCreationDialog extends DataEntryDialog<GateDTO> {
}, /* animationEnabled */ false, callback); }, /* animationEnabled */ false, callback);
this.stringMessages = stringMessages; this.stringMessages = stringMessages;
name = createTextBox(""); name = createTextBox("");
marksWrapper = new MarkTableWrapper<MultiSelectionModel<MarkDTO>>( marksWrapper = new MarkTableWrapper<RefreshableMultiSelectionModel<MarkDTO>>(
/* multiSelection */ true, sailingService, stringMessages, errorReporter); /* multiSelection */ true, sailingService, stringMessages, errorReporter);
marksWrapper.getDataProvider().getList().addAll(marks); marksWrapper.getDataProvider().getList().addAll(marks);
marksWrapper.getSelectionModel().addSelectionChangeHandler(new Handler() { marksWrapper.getSelectionModel().addSelectionChangeHandler(new Handler() {
@@ -16,10 +16,11 @@ import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
public class ItemToMapToDeviceSelectionPanel implements IsWidget { public class ItemToMapToDeviceSelectionPanel implements IsWidget {
private final CompetitorTableWrapper<SingleSelectionModel<CompetitorDTO>> competitorTable; private final CompetitorTableWrapper<RefreshableSingleSelectionModel<CompetitorDTO>> competitorTable;
private final MarkTableWrapper<SingleSelectionModel<MarkDTO>> markTable; private final MarkTableWrapper<RefreshableSingleSelectionModel<MarkDTO>> markTable;
private MappableToDevice selected; private MappableToDevice selected;
private final VerticalPanel mainPanel; private final VerticalPanel mainPanel;
private final ErrorReporter errorReporter; private final ErrorReporter errorReporter;
@@ -34,7 +35,7 @@ public class ItemToMapToDeviceSelectionPanel implements IsWidget {
this.selected = selected; this.selected = selected;
this.errorReporter = errorReporter; this.errorReporter = errorReporter;
competitorTable = new CompetitorTableWrapper<>(sailingService, stringMessages, errorReporter, /* multiSelection */ false, /* enablePager */ true); competitorTable = new CompetitorTableWrapper<>(sailingService, stringMessages, errorReporter, /* multiSelection */ false, /* enablePager */ true);
markTable = new MarkTableWrapper<SingleSelectionModel<MarkDTO>>(/* multiSelection */ false, sailingService, markTable = new MarkTableWrapper<RefreshableSingleSelectionModel<MarkDTO>>(/* multiSelection */ false, sailingService,
stringMessages, errorReporter); stringMessages, errorReporter);
final SingleSelectionModel<MarkDTO> markSelectionModel = markTable.getSelectionModel(); final SingleSelectionModel<MarkDTO> markSelectionModel = markTable.getSelectionModel();
competitorTable.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() { competitorTable.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@@ -6,7 +6,6 @@ import java.util.Comparator;
import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.view.client.SelectionModel;
import com.sap.sailing.gwt.ui.adminconsole.ColorColumn.ColorRetriever; import com.sap.sailing.gwt.ui.adminconsole.ColorColumn.ColorRetriever;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -17,7 +16,7 @@ import com.sap.sse.common.impl.RGBColor;
import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel; import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel;
public class MarkTableWrapper<S extends SelectionModel<MarkDTO>> extends TableWrapper<MarkDTO, S> { public class MarkTableWrapper<S extends RefreshableSelectionModel<MarkDTO>> extends TableWrapper<MarkDTO, S> {
public MarkTableWrapper(boolean multiSelection, SailingServiceAsync sailingService, StringMessages stringMessages, public MarkTableWrapper(boolean multiSelection, SailingServiceAsync sailingService, StringMessages stringMessages,
ErrorReporter errorReporter) { ErrorReporter errorReporter) {
super(sailingService, stringMessages, errorReporter, multiSelection, true, null /*EntityIdentityComparator for RefreshableSelectionModel*/); super(sailingService, stringMessages, errorReporter, multiSelection, true, null /*EntityIdentityComparator for RefreshableSelectionModel*/);
@@ -9,7 +9,6 @@ import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.view.client.SelectionModel;
import com.sap.sailing.domain.common.RegattaNameAndRaceName; import com.sap.sailing.domain.common.RegattaNameAndRaceName;
import com.sap.sailing.gwt.ui.adminconsole.AbstractLeaderboardConfigPanel.RaceColumnDTOAndFleetDTOWithNameBasedEquality; import com.sap.sailing.gwt.ui.adminconsole.AbstractLeaderboardConfigPanel.RaceColumnDTOAndFleetDTOWithNameBasedEquality;
import com.sap.sailing.gwt.ui.adminconsole.LeaderboardConfigPanel.AnchorCell; import com.sap.sailing.gwt.ui.adminconsole.LeaderboardConfigPanel.AnchorCell;
@@ -21,7 +20,7 @@ import com.sap.sse.common.util.NaturalComparator;
import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel; import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel;
public class RaceTableWrapper<S extends SelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>> public class RaceTableWrapper<S extends RefreshableSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>
extends TableWrapper<RaceColumnDTOAndFleetDTOWithNameBasedEquality, S> { extends TableWrapper<RaceColumnDTOAndFleetDTOWithNameBasedEquality, S> {
private final AnchorTemplates ANCHORTEMPLATE = GWT.create(AnchorTemplates.class); private final AnchorTemplates ANCHORTEMPLATE = GWT.create(AnchorTemplates.class);
private String selectedLeaderboardName; private String selectedLeaderboardName;
@@ -75,8 +74,4 @@ extends TableWrapper<RaceColumnDTOAndFleetDTOWithNameBasedEquality, S> {
public void setSelectedLeaderboardName(String name) { public void setSelectedLeaderboardName(String name) {
this.selectedLeaderboardName = name; this.selectedLeaderboardName = name;
} }
public RefreshableSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality> getRefreshableSelectionModel() {
return (RefreshableSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>) super.getSelectionModel();
}
} }
@@ -1,152 +0,0 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.dto.RaceDTO;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
import com.sap.sailing.gwt.ui.client.RegattasDisplayer;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
public class RacesListBoxPanel extends FormPanel implements RegattasDisplayer, RaceSelectionChangeListener {
private final List<RaceDTO> raceList;
private final ListBox raceListBox;
private final RegattaRefresher regattaRefresher;
private final StringMessages stringConstants;
private final RaceSelectionProvider raceSelectionProvider;
public RacesListBoxPanel(RegattaRefresher regattaRefresher, RaceSelectionProvider raceSelectionProvider, StringMessages stringConstants) {
this.regattaRefresher = regattaRefresher;
this.stringConstants = stringConstants;
this.raceSelectionProvider = raceSelectionProvider;
raceListBox = new ListBox();
raceListBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
RacesListBoxPanel.this.raceSelectionProvider.setSelection(getSelectedRaceIdentifiers(), RacesListBoxPanel.this);
}
});
raceListBox.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
RacesListBoxPanel.this.raceSelectionProvider.setSelection(getSelectedRaceIdentifiers(), RacesListBoxPanel.this);
}
});
raceList = new ArrayList<RaceDTO>();
VerticalPanel vp = new VerticalPanel();
HorizontalPanel labelAndRefreshButton = new HorizontalPanel();
labelAndRefreshButton.setSpacing(20);
vp.add(labelAndRefreshButton);
labelAndRefreshButton.add(new Label(stringConstants.races()));
vp.add(raceListBox);
Button btnRefresh = new Button(stringConstants.refresh());
btnRefresh.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
RacesListBoxPanel.this.regattaRefresher.fillRegattas();
}
});
labelAndRefreshButton.add(btnRefresh);
setWidget(vp);
}
@Override
public void fillRegattas(Iterable<RegattaDTO> result) {
raceList.clear();
raceListBox.clear();
for (RegattaDTO regatta : result) {
for (RaceDTO race : regatta.races) {
raceList.add(race);
}
}
Collections.sort(raceList, new Comparator<RaceDTO>() {
@Override
public int compare(RaceDTO o1, RaceDTO o2) {
String name1 = RacesListBoxPanel.this.toString(o1);
String name2 = RacesListBoxPanel.this.toString(o2);
return name1.compareTo(name2);
}
});
for (RaceDTO p : raceList) {
raceListBox.addItem(toString(p));
}
raceSelectionProvider.setSelection(getSelectedRaceIdentifiers(), this);
}
private List<RegattaAndRaceIdentifier> getSelectedRaceIdentifiers() {
List<RegattaAndRaceIdentifier> result = new ArrayList<RegattaAndRaceIdentifier>();
for (RaceDTO selectedRace : getSelectedRaces()) {
result.add(selectedRace.getRaceIdentifier());
}
return result;
}
private List<RaceDTO> getSelectedRaces() {
int i=0;
List<RaceDTO> result = new ArrayList<RaceDTO>();
for (RaceDTO triple : raceList) {
if (raceListBox.isItemSelected(i)) {
result.add(triple);
}
i++;
}
return result;
}
private String toString(RaceDTO race) {
return race.getRegattaName()+" - "+race.getName()+(race.isTracked ? " ("+stringConstants.tracked()+")" : "");
}
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
if (selectedRaces != null && !selectedRaces.isEmpty()) {
RaceDTO newSelection = getRace(selectedRaces.iterator().next());
int index = raceList.indexOf(newSelection);
if (index >= 0) {
raceListBox.setSelectedIndex(index);
} else {
deselectAll();
}
} else {
deselectAll();
}
}
private void deselectAll() {
for (int i=0; i<raceListBox.getItemCount(); i++) {
raceListBox.setItemSelected(i, false);
}
}
public List<RaceDTO> getAllRaces() {
return Collections.unmodifiableList(raceList);
}
public RaceDTO getRace(RaceIdentifier raceIdentifier) {
for (RaceDTO race : getAllRaces()) {
if (raceIdentifier.equals(race.getRaceIdentifier())) {
return race;
}
}
return null;
}
}
@@ -29,7 +29,6 @@ public class RegattaLogTrackingDeviceMappingsDialog extends AbstractLogTrackingD
@Override @Override
public void onSuccess(List<DeviceMappingDTO> result) { public void onSuccess(List<DeviceMappingDTO> result) {
mappings = result; mappings = result;
updateChart(); updateChart();
deviceMappingTable.refresh(mappings); deviceMappingTable.refresh(mappings);
} }
@@ -8,13 +8,13 @@ import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionModel;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.controls.SelectionCheckboxColumn; import com.sap.sailing.gwt.ui.client.shared.controls.SelectionCheckboxColumn;
import com.sap.sse.common.Util; import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.EntityIdentityComparator; import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel;
import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel; import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
/** /**
@@ -22,8 +22,7 @@ import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
* offers already a {@link ListHandler} for sorting. Subclasses can obtain the table's default column sort handler * offers already a {@link ListHandler} for sorting. Subclasses can obtain the table's default column sort handler
* created by this class's constructor by calling {@link #getColumnSortHandler}. * created by this class's constructor by calling {@link #getColumnSortHandler}.
*/ */
//TODO change <T, S extends SelectionModel<T>> to <T, S extents RefreshableSelectionModel<T>> public abstract class TableWrapper<T, S extends RefreshableSelectionModel<T>> implements IsWidget {
public abstract class TableWrapper<T, S extends SelectionModel<T>> implements IsWidget {
protected final CellTable<T> table; protected final CellTable<T> table;
private final S selectionModel; private final S selectionModel;
protected final ListDataProvider<T> dataProvider; protected final ListDataProvider<T> dataProvider;
@@ -154,7 +154,7 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite
@Override @Override
protected void makeControlsReactToSelectionChange(Set<RaceDTO> selectedRaces) { protected void makeControlsReactToSelectionChange(Set<RaceDTO> selectedRaces) {
if(actionButtonsEnabled) { if (actionButtonsEnabled) {
if (selectedRaces.isEmpty()) { if (selectedRaces.isEmpty()) {
btnRemoveRace.setEnabled(false); btnRemoveRace.setEnabled(false);
btnUntrack.setEnabled(false); btnUntrack.setEnabled(false);
@@ -164,7 +164,7 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite
btnUntrack.setEnabled(true); btnUntrack.setEnabled(true);
btnExport.setEnabled(true); btnExport.setEnabled(true);
} }
} }
} }
@Override @Override
@@ -9,7 +9,6 @@ import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler; import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -17,10 +16,11 @@ import com.sap.sailing.gwt.ui.shared.ControlPointDTO;
import com.sap.sailing.gwt.ui.shared.WaypointDTO; import com.sap.sailing.gwt.ui.shared.WaypointDTO;
import com.sap.sse.common.Util; import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
import com.sap.sse.gwt.client.dialog.DataEntryDialog; import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class WaypointCreationDialog extends DataEntryDialog<WaypointDTO> { public class WaypointCreationDialog extends DataEntryDialog<WaypointDTO> {
private final ControlPointTableWrapper<SingleSelectionModel<ControlPointDTO>> controlPointsWrapper; private final ControlPointTableWrapper<RefreshableSingleSelectionModel<ControlPointDTO>> controlPointsWrapper;
private final ListBox passingInstructions; private final ListBox passingInstructions;
private final StringMessages stringMessages; private final StringMessages stringMessages;
@@ -39,7 +39,7 @@ public class WaypointCreationDialog extends DataEntryDialog<WaypointDTO> {
}, /* animationEnabled */ false, callback); }, /* animationEnabled */ false, callback);
this.stringMessages = stringMessages; this.stringMessages = stringMessages;
controlPointsWrapper = new ControlPointTableWrapper<SingleSelectionModel<ControlPointDTO>>( controlPointsWrapper = new ControlPointTableWrapper<RefreshableSingleSelectionModel<ControlPointDTO>>(
/* multiSelection */ false, sailingService, stringMessages, errorReporter); /* multiSelection */ false, sailingService, stringMessages, errorReporter);
controlPointsWrapper.getDataProvider().getList().addAll(controlPoints); controlPointsWrapper.getDataProvider().getList().addAll(controlPoints);
@@ -1,7 +1,6 @@
package com.sap.sailing.gwt.ui.adminconsole; package com.sap.sailing.gwt.ui.adminconsole;
import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.view.client.SelectionModel;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.ControlPointDTO; import com.sap.sailing.gwt.ui.shared.ControlPointDTO;
@@ -11,7 +10,7 @@ import com.sap.sailing.gwt.ui.shared.WaypointDTO;
import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel; import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel;
public class WaypointTableWrapper<S extends SelectionModel<WaypointDTO>> extends TableWrapper<WaypointDTO, S> { public class WaypointTableWrapper<S extends RefreshableSelectionModel<WaypointDTO>> extends TableWrapper<WaypointDTO, S> {
public WaypointTableWrapper(boolean multiSelection, SailingServiceAsync sailingService, final StringMessages stringMessages, public WaypointTableWrapper(boolean multiSelection, SailingServiceAsync sailingService, final StringMessages stringMessages,
ErrorReporter errorReporter) { ErrorReporter errorReporter) {
super(sailingService, stringMessages, errorReporter, multiSelection, true, null /*EntityIdentityComparator for RefreshableSelectionModel*/); super(sailingService, stringMessages, errorReporter, multiSelection, true, null /*EntityIdentityComparator for RefreshableSelectionModel*/);
@@ -217,10 +217,10 @@ public class CompetitorSelectionModel implements CompetitorSelectionProvider {
Set<CompetitorDTO> oldCompetitorsToRemove = new HashSet<CompetitorDTO>(allCompetitors); Set<CompetitorDTO> oldCompetitorsToRemove = new HashSet<CompetitorDTO>(allCompetitors);
for (CompetitorDTO newCompetitor : newCompetitors) { for (CompetitorDTO newCompetitor : newCompetitors) {
if (allCompetitors.contains(newCompetitor)) { if (allCompetitors.contains(newCompetitor)) { // TODO Lukas: should this use an EntityIdentityComparator instead?
oldCompetitorsToRemove.remove(newCompetitor); oldCompetitorsToRemove.remove(newCompetitor); // TODO Lukas: the old competitor object remains in allCompetitors; it is equal but doesn't have to be identical to newCompetitor; should it be replaced?
} else { } else {
add(newCompetitor, false); add(newCompetitor, false); // due to the equals definition of CompetitorDTOImpl that compares most fields, state changes lead to a replacement here
changed = true; changed = true;
} }
} }
@@ -1,23 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import java.util.List;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
/**
* Allows UI components to observe a race selector, such as a drop-down box showing a list of races
*
* @author Axel Uhl (d043530)
*
*/
public interface RaceSelectionChangeListener {
/**
* The first element is the first one selected
*
* @param selectedRaces a non-<code>null</code> list which is empty if nothing is selected
*/
void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces);
}
@@ -1,90 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
public class RaceSelectionModel implements RaceSelectionProvider {
private final List<RegattaAndRaceIdentifier> selection;
private final List<RegattaAndRaceIdentifier> allRaces;
private final Set<RaceSelectionChangeListener> listeners;
public RaceSelectionModel() {
this.selection = new ArrayList<RegattaAndRaceIdentifier>();
this.allRaces = new ArrayList<RegattaAndRaceIdentifier>();
listeners = new HashSet<RaceSelectionChangeListener>();
}
@Override
public List<RegattaAndRaceIdentifier> getSelectedRaces() {
return Collections.unmodifiableList(selection);
}
@Override
public void addRaceSelectionChangeListener(RaceSelectionChangeListener listener) {
listeners.add(listener);
}
@Override
public void removeRaceSelectionChangeListener(RaceSelectionChangeListener listener) {
listeners.remove(listener);
}
@Override
public void setSelection(List<RegattaAndRaceIdentifier> newSelection, RaceSelectionChangeListener... listenersNotToNotify) {
boolean notify = !selection.equals(newSelection);
selection.clear();
selection.addAll(newSelection);
if (notify) {
notifyListeners(listenersNotToNotify);
}
}
private void notifyListeners(RaceSelectionChangeListener[] listenersNotToNotify) {
List<RegattaAndRaceIdentifier> selectedRaces = getSelectedRaces();
for (RaceSelectionChangeListener listener : listeners) {
if (listenersNotToNotify == null || !Arrays.asList(listenersNotToNotify).contains(listener)) {
listener.onRaceSelectionChange(selectedRaces);
}
}
}
/**
* Sets the universe of all races from which this selection model may select. An equal list will subsequently be
* returned by {@link #getAllRaces()}. Races from the {@link #getSelectedRaces() selection} not in
* <code>newAllRaces</code> are removed from the selection. If this happens, the selection listeners are notified.
*/
@Override
public void setAllRaces(List<RegattaAndRaceIdentifier> newAllRaces, RaceSelectionChangeListener... listenersNotToNotify) {
allRaces.clear();
for (RegattaAndRaceIdentifier r : newAllRaces) {
allRaces.add(r);
}
boolean notify = false;
for (Iterator<RegattaAndRaceIdentifier> i=selection.iterator(); i.hasNext(); ) {
RaceIdentifier selectedRace = i.next();
if (!allRaces.contains(selectedRace)) {
notify = true;
i.remove();
}
}
if (notify) {
notifyListeners(listenersNotToNotify);
}
}
@Override
public List<RegattaAndRaceIdentifier> getAllRaces() {
return Collections.unmodifiableList(allRaces);
}
}
@@ -1,25 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import java.util.List;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
public interface RaceSelectionProvider {
/**
* @return a non-<code>null</code> list which may be empty
*/
List<RegattaAndRaceIdentifier> getSelectedRaces();
void addRaceSelectionChangeListener(RaceSelectionChangeListener listener);
void removeRaceSelectionChangeListener(RaceSelectionChangeListener listener);
void setSelection(List<RegattaAndRaceIdentifier> newSelection, RaceSelectionChangeListener... listenersNotToNotify);
/**
* @return a non-<code>null</code> list which may be empty
*/
List<RegattaAndRaceIdentifier> getAllRaces();
void setAllRaces(List<RegattaAndRaceIdentifier> newAllRaces, RaceSelectionChangeListener... listenersNotToNotify);
}
@@ -15,7 +15,7 @@ import com.sap.sse.gwt.client.player.Timer.PlayModes;
import com.sap.sse.gwt.client.player.Timer.PlayStates; import com.sap.sse.gwt.client.player.Timer.PlayStates;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent; import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
public class RaceTimePanel extends TimePanel<RaceTimePanelSettings> implements RaceSelectionChangeListener, RaceTimesInfoProviderListener { public class RaceTimePanel extends TimePanel<RaceTimePanelSettings> implements RaceTimesInfoProviderListener {
private final RaceTimesInfoProvider raceTimesInfoProvider; private final RaceTimesInfoProvider raceTimesInfoProvider;
private RegattaAndRaceIdentifier selectedRace; private RegattaAndRaceIdentifier selectedRace;
@@ -30,11 +30,15 @@ public class RaceTimePanel extends TimePanel<RaceTimePanelSettings> implements R
private boolean redrawAllMarkersPendingForMinMaxBeingInitialized; private boolean redrawAllMarkersPendingForMinMaxBeingInitialized;
public RaceTimePanel(Timer timer, TimeRangeWithZoomProvider timeRangeProvider, StringMessages stringMessages, public RaceTimePanel(Timer timer, TimeRangeWithZoomProvider timeRangeProvider, StringMessages stringMessages,
RaceTimesInfoProvider raceTimesInfoProvider, boolean canReplayWhileLiveIsPossible) { RaceTimesInfoProvider raceTimesInfoProvider, boolean canReplayWhileLiveIsPossible, RegattaAndRaceIdentifier selectedRaceIdentifier) {
super(timer, timeRangeProvider, stringMessages, canReplayWhileLiveIsPossible); super(timer, timeRangeProvider, stringMessages, canReplayWhileLiveIsPossible);
this.raceTimesInfoProvider = raceTimesInfoProvider; this.raceTimesInfoProvider = raceTimesInfoProvider;
selectedRace = null; selectedRace = null;
autoAdjustPlayMode = true; autoAdjustPlayMode = true;
selectedRace = selectedRaceIdentifier;
if (!raceTimesInfoProvider.containsRaceIdentifier(selectedRace)) {
raceTimesInfoProvider.addRaceIdentifier(selectedRace, true);
}
} }
/** /**
@@ -148,16 +152,6 @@ public class RaceTimePanel extends TimePanel<RaceTimePanelSettings> implements R
(lastRaceTimesInfo.startOfRace != null && liveTimePointInMillis > lastRaceTimesInfo.startOfRace.getTime() - timeBeforeRaceStartTolerance)); (lastRaceTimesInfo.startOfRace != null && liveTimePointInMillis > lastRaceTimesInfo.startOfRace.getTime() - timeBeforeRaceStartTolerance));
} }
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
if (selectedRaces != null && !selectedRaces.isEmpty()) {
selectedRace = selectedRaces.iterator().next();
if (!raceTimesInfoProvider.containsRaceIdentifier(selectedRace)) {
raceTimesInfoProvider.addRaceIdentifier(selectedRace, true);
}
}
}
@Override @Override
public void playStateChanged(PlayStates playState, PlayModes playMode) { public void playStateChanged(PlayStates playState, PlayModes playMode) {
super.playStateChanged(playState, playMode); super.playStateChanged(playState, playMode);
@@ -1,159 +0,0 @@
package com.sap.sailing.gwt.ui.client;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
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.gwt.ui.shared.WindDTO;
import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO;
import com.sap.sailing.gwt.ui.shared.WindTrackInfoDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.player.TimeListener;
/**
* Displays a bit of wind history around the time notified to this time listener.
*
* @author Axel Uhl (d043530)
*
*/
public class SmallWindHistoryPanel extends FormPanel implements TimeListener, RaceSelectionChangeListener {
private final Position position;
private final WindIndicator[] windIndicators;
private final Label selectedWindSourceLabel;
private Date date;
private RegattaAndRaceIdentifier race;
private final SailingServiceAsync sailingService;
private final long millisecondStepsPerLabel;
private final ErrorReporter errorReporter;
private final StringMessages stringConstants;
/**
* @param position
* the position to show the wind for; can, e.g., be the middle of the race course if an average wind
* display for a race is desired
* @param numberOfTimepoints
* the number of wind displays arranged in this panel; each display shows the estimated wind
* @param windTrack
* the wind track to visualize using this panel
*/
public SmallWindHistoryPanel(SailingServiceAsync sailingService, Position position,
int numberOfTimepoints, long millisecondStepsPerLabel, StringMessages stringConstants, ErrorReporter errorReporter) {
this.sailingService = sailingService;
this.position = position;
this.stringConstants = stringConstants;
this.millisecondStepsPerLabel = millisecondStepsPerLabel;
this.errorReporter = errorReporter;
windIndicators = new WindIndicator[numberOfTimepoints];
VerticalPanel vp = new VerticalPanel();
setWidget(vp);
Grid grid = new Grid(2, numberOfTimepoints);
selectedWindSourceLabel = new Label();
vp.add(selectedWindSourceLabel);
for (int i=0; i<numberOfTimepoints; i++) {
windIndicators[i] = new WindIndicator();
grid.setWidget(0, i, new Label("t-"+((numberOfTimepoints-i-1)*millisecondStepsPerLabel/1000)+"s"));
grid.setWidget(1, i, windIndicators[i]);
}
vp.add(grid);
}
private void updateWindDisplay() {
if (date != null) {
Date from = new Date(date.getTime() - windIndicators.length * millisecondStepsPerLabel);
if (race != null) {
sailingService.getAveragedWindInfo(race, from, millisecondStepsPerLabel,
windIndicators.length, position.getLatDeg(), position.getLngDeg(), /* all sources */ null,
new AsyncCallback<WindInfoForRaceDTO>() {
@Override
public void onSuccess(WindInfoForRaceDTO result) {
if (result != null) {
WindSource bestWindSource = getBestWindSource(result, windIndicators.length);
// expecting to find windIndicators.length fixes
if (result == null
|| result.windTrackInfoByWindSource.get(bestWindSource).windFixes.size() != windIndicators.length) {
clearWindDisplay();
} else {
setSelectedWindSource(bestWindSource);
int i = 0;
for (WindDTO fix : result.windTrackInfoByWindSource.get(bestWindSource).windFixes) {
updateWindIndicator(i, fix);
i++;
}
}
}
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to obtain wind information for race "
+ race + ": " + caught.getMessage());
}
});
}
}
}
/**
* Looks for the best wind source in <code>windInfo</code> that has <code>length</code> fixes. Uses the order of
* literals of {@link WindSourceType} to determine precedence.
*
* @return <code>null</code> if no wind source has the expected number of fixes; the best wind source with the
* expected number of fixes otherwise
*/
private WindSource getBestWindSource(WindInfoForRaceDTO windInfo, int expectedNumberOfFixes) {
List<WindSourceType> windSourceTypesInOrder = Arrays.asList(WindSourceType.values());
WindSource result = null;
int bestIndexSoFar = Integer.MAX_VALUE;
for (Map.Entry<WindSource, WindTrackInfoDTO> e : windInfo.windTrackInfoByWindSource.entrySet()) {
if (e.getValue().windFixes.size() == expectedNumberOfFixes) {
int index = windSourceTypesInOrder.indexOf(e.getKey());
if (index < bestIndexSoFar) {
bestIndexSoFar = index;
result = e.getKey();
}
}
}
return result;
}
private void clearWindDisplay() {
for (int i=0; i<windIndicators.length; i++) {
windIndicators[i].setFromDeg(0);
windIndicators[i].setSpeedInKnots(0.0);
}
}
private void updateWindIndicator(int i, WindDTO fix) {
windIndicators[i].setFromDeg(fix.dampenedTrueWindFromDeg);
windIndicators[i].setSpeedInKnots(fix.dampenedTrueWindSpeedInKnots);
}
private void setSelectedWindSource(WindSource selectedWindSource) {
selectedWindSourceLabel.setText(stringConstants.windSource()+": "+selectedWindSource.name());
}
@Override
public void timeChanged(Date newTime, Date oldTime) {
this.date = newTime;
updateWindDisplay();
}
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
if (!selectedRaces.isEmpty()) {
race = selectedRaces.get(selectedRaces.size() - 1);
updateWindDisplay();
}
}
}
@@ -45,7 +45,6 @@ import com.sap.sailing.gwt.ui.actions.GetCompetitorsRaceDataAction;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener; import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.DetailTypeFormatter; import com.sap.sailing.gwt.ui.client.DetailTypeFormatter;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.CompetitorRaceDataDTO; import com.sap.sailing.gwt.ui.shared.CompetitorRaceDataDTO;
@@ -94,16 +93,16 @@ public abstract class AbstractCompetitorRaceChart<SettingsType extends ChartSett
private Long timeOfLatestRequestInMillis; private Long timeOfLatestRequestInMillis;
protected AbstractCompetitorRaceChart(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, protected AbstractCompetitorRaceChart(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
CompetitorSelectionProvider competitorSelectionProvider, RaceSelectionProvider raceSelectionProvider, CompetitorSelectionProvider competitorSelectionProvider, RegattaAndRaceIdentifier selectedRaceIdentifier,
Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, Button settingsButton, Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, Button settingsButton,
final StringMessages stringMessages, ErrorReporter errorReporter, DetailType detailType, boolean compactChart, boolean allowTimeAdjust) { final StringMessages stringMessages, ErrorReporter errorReporter, DetailType detailType, boolean compactChart, boolean allowTimeAdjust) {
this(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, timer, this(sailingService, asyncActionsExecutor, competitorSelectionProvider, selectedRaceIdentifier, timer,
timeRangeWithZoomProvider, stringMessages, errorReporter, detailType, compactChart, allowTimeAdjust, timeRangeWithZoomProvider, stringMessages, errorReporter, detailType, compactChart, allowTimeAdjust,
null, null); null, null);
} }
AbstractCompetitorRaceChart(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, AbstractCompetitorRaceChart(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
CompetitorSelectionProvider competitorSelectionProvider, RaceSelectionProvider raceSelectionProvider, CompetitorSelectionProvider competitorSelectionProvider, RegattaAndRaceIdentifier selectedRaceIdentifier,
Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, final StringMessages stringMessages, Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, final StringMessages stringMessages,
ErrorReporter errorReporter, DetailType detailType, boolean compactChart, boolean allowTimeAdjust, ErrorReporter errorReporter, DetailType detailType, boolean compactChart, boolean allowTimeAdjust,
String leaderboardGroupName, String leaderboardName) { String leaderboardGroupName, String leaderboardName) {
@@ -124,9 +123,12 @@ public abstract class AbstractCompetitorRaceChart<SettingsType extends ChartSett
noDataFoundLabel.setStyleName("abstractChartPanel-importantMessageOfChart"); noDataFoundLabel.setStyleName("abstractChartPanel-importantMessageOfChart");
createChart(); createChart();
setSelectedDetailType(detailType); setSelectedDetailType(detailType);
competitorSelectionProvider.addCompetitorSelectionChangeListener(this); competitorSelectionProvider.addCompetitorSelectionChangeListener(this);
raceSelectionProvider.addRaceSelectionChangeListener(this); this.selectedRaceIdentifier = selectedRaceIdentifier;
clearChart();
if (selectedRaceIdentifier != null) {
timeChanged(timer.getTime(), null);
}
} }
/** /**
@@ -550,20 +552,6 @@ public abstract class AbstractCompetitorRaceChart<SettingsType extends ChartSett
return hasReversedYAxis(selectedDetailType); return hasReversedYAxis(selectedDetailType);
} }
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
if (selectedRaces != null && !selectedRaces.isEmpty()) {
selectedRaceIdentifier = selectedRaces.iterator().next();
} else {
selectedRaceIdentifier = null;
}
clearChart();
if (selectedRaceIdentifier != null) {
timeChanged(timer.getTime(), null);
}
}
/** /**
* Checks the relation of the mark passings to the selection range. * Checks the relation of the mark passings to the selection range.
* *
@@ -18,7 +18,6 @@ import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.charts.ChartCssResources.ChartsCss; import com.sap.sailing.gwt.ui.client.shared.charts.ChartCssResources.ChartsCss;
@@ -33,8 +32,7 @@ import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.player.Timer.PlayModes; import com.sap.sse.gwt.client.player.Timer.PlayModes;
import com.sap.sse.gwt.client.shared.components.SettingsDialog; import com.sap.sse.gwt.client.shared.components.SettingsDialog;
public abstract class AbstractRaceChart extends AbsolutePanel implements RaceSelectionChangeListener, public abstract class AbstractRaceChart extends AbsolutePanel implements TimeListener, TimeZoomChangeListener, TimeRangeChangeListener {
TimeListener, TimeZoomChangeListener, TimeRangeChangeListener {
/** /**
* Used as the turboThreshold for the Highcharts series; this is basically the maximum number of points in a series * Used as the turboThreshold for the Highcharts series; this is basically the maximum number of points in a series
* to be displayed. Default is 1000. See also bug 1742. * to be displayed. Default is 1000. See also bug 1742.
@@ -32,7 +32,6 @@ import com.sap.sailing.domain.common.dto.LeaderboardDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener; import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO; import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
@@ -47,8 +46,7 @@ import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.shared.components.Component; import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent; import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
public class EditMarkPassingsPanel extends AbsolutePanel implements Component<AbstractSettings>, RaceSelectionChangeListener, public class EditMarkPassingsPanel extends AbsolutePanel implements Component<AbstractSettings>, CompetitorSelectionChangeListener {
CompetitorSelectionChangeListener {
private static class AnchorCell extends AbstractCell<SafeHtml> { private static class AnchorCell extends AbstractCell<SafeHtml> {
@Override @Override
public void render(com.google.gwt.cell.client.Cell.Context context, SafeHtml safeHtml, SafeHtmlBuilder sb) { public void render(com.google.gwt.cell.client.Cell.Context context, SafeHtml safeHtml, SafeHtmlBuilder sb) {
@@ -259,6 +257,7 @@ public class EditMarkPassingsPanel extends AbsolutePanel implements Component<Ab
buttonPanel.add(removeSuppressedPassingButton); buttonPanel.add(removeSuppressedPassingButton);
buttonPanel.add(selectCompetitorLabel); buttonPanel.add(selectCompetitorLabel);
enableButtons(); enableButtons();
refreshWaypoints();
} }
@Override @Override
@@ -383,12 +382,6 @@ public class EditMarkPassingsPanel extends AbsolutePanel implements Component<Ab
} }
} }
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
raceIdentifier = selectedRaces.iterator().next();
refreshWaypoints();
}
public void setLeaderboard(LeaderboardDTO leaderboard) { public void setLeaderboard(LeaderboardDTO leaderboard) {
this.leaderboard = leaderboard; this.leaderboard = leaderboard;
} }
@@ -3,8 +3,8 @@ package com.sap.sailing.gwt.ui.client.shared.charts;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Button;
import com.sap.sailing.domain.common.DetailType; 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.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
@@ -33,11 +33,11 @@ public class MultiCompetitorRaceChart extends AbstractCompetitorRaceChart<MultiC
private boolean hasOverallLeaderboard; private boolean hasOverallLeaderboard;
public MultiCompetitorRaceChart(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, public MultiCompetitorRaceChart(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
CompetitorSelectionProvider competitorSelectionProvider, RaceSelectionProvider raceSelectionProvider, CompetitorSelectionProvider competitorSelectionProvider, RegattaAndRaceIdentifier selectedRaceIdentifier,
Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, final StringMessages stringMessages, Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, final StringMessages stringMessages,
final ErrorReporter errorReporter, boolean compactChart, boolean allowTimeAdjust, final ErrorReporter errorReporter, boolean compactChart, boolean allowTimeAdjust,
final String leaderboardGroupName, String leaderboardName) { final String leaderboardGroupName, String leaderboardName) {
super(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, timer, timeRangeWithZoomProvider, stringMessages, errorReporter, super(sailingService, asyncActionsExecutor, competitorSelectionProvider, selectedRaceIdentifier, timer, timeRangeWithZoomProvider, stringMessages, errorReporter,
/*show initially*/ DetailType.WINDWARD_DISTANCE_TO_COMPETITOR_FARTHEST_AHEAD, compactChart, allowTimeAdjust, leaderboardGroupName, leaderboardName); /*show initially*/ DetailType.WINDWARD_DISTANCE_TO_COMPETITOR_FARTHEST_AHEAD, compactChart, allowTimeAdjust, leaderboardGroupName, leaderboardName);
if (leaderboardGroupName != null) { if (leaderboardGroupName != null) {
sailingService.getLeaderboardGroupByName(leaderboardGroupName, false, sailingService.getLeaderboardGroupByName(leaderboardGroupName, false,
@@ -44,8 +44,6 @@ import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.impl.ColorMapImpl; import com.sap.sailing.domain.common.impl.ColorMapImpl;
import com.sap.sailing.gwt.ui.actions.GetWindInfoAction; import com.sap.sailing.gwt.ui.actions.GetWindInfoAction;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.WindSourceTypeFormatter; import com.sap.sailing.gwt.ui.client.WindSourceTypeFormatter;
@@ -84,14 +82,14 @@ public class WindChart extends AbstractRaceChart implements Component<WindChartS
private final ColorMapImpl<WindSource> colorMap; private final ColorMapImpl<WindSource> colorMap;
/** /**
* @param raceSelectionProvider * @param selectedRaceIdentifier
* if <code>null</code>, this chart won't update its contents automatically upon race selection change; * if <code>null</code>, this chart won't update its contents automatically upon race selection change;
* otherwise, whenever the selection changes, the wind data of the race selected now is loaded from the * otherwise, whenever the selection changes, the wind data of the race selected now is loaded from the
* server and displayed in this chart. If no race is selected, the chart is cleared. The caller of this * server and displayed in this chart. If no race is selected, the chart is cleared. The caller of this
* constructor must ensure to trigger {@link RaceSelectionChangeListener#onRaceSelectionChange(List)} at * constructor must ensure to trigger {@link RaceSelectionChangeListener#onRaceSelectionChange(List)} at
* least once to ensure that this chart sets its {@link AbstractRaceChart#selectedRaceIdentifier} field. * least once to ensure that this chart sets its {@link AbstractRaceChart#selectedRaceIdentifier} field.
*/ */
public WindChart(SailingServiceAsync sailingService, RaceSelectionProvider raceSelectionProvider, Timer timer, public WindChart(SailingServiceAsync sailingService, RegattaAndRaceIdentifier selectedRaceIdentifier, Timer timer,
TimeRangeWithZoomProvider timeRangeWithZoomProvider, WindChartSettings settings, final StringMessages stringMessages, TimeRangeWithZoomProvider timeRangeWithZoomProvider, WindChartSettings settings, final StringMessages stringMessages,
AsyncActionsExecutor asyncActionsExecutor, ErrorReporter errorReporter, boolean compactChart) { AsyncActionsExecutor asyncActionsExecutor, ErrorReporter errorReporter, boolean compactChart) {
super(sailingService, timer, timeRangeWithZoomProvider, stringMessages, asyncActionsExecutor, errorReporter); super(sailingService, timer, timeRangeWithZoomProvider, stringMessages, asyncActionsExecutor, errorReporter);
@@ -190,7 +188,15 @@ public class WindChart extends AbstractRaceChart implements Component<WindChartS
.getXAxis().setAxisTitle(null); .getXAxis().setAxisTitle(null);
} }
setSize("100%", "100%"); setSize("100%", "100%");
raceSelectionProvider.addRaceSelectionChangeListener(this); this.selectedRaceIdentifier = selectedRaceIdentifier;
if (selectedRaceIdentifier != null) {
clearCacheAndReload();
if (isVisible()) {
updateVisibleSeries();
}
} else {
clearChart();
}
} }
@Override @Override
@@ -497,23 +503,6 @@ public class WindChart extends AbstractRaceChart implements Component<WindChartS
chart.removeAllSeries(); chart.removeAllSeries();
} }
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
if (selectedRaces != null && !selectedRaces.isEmpty()) {
selectedRaceIdentifier = selectedRaces.iterator().next();
} else {
selectedRaceIdentifier = null;
}
if(selectedRaceIdentifier != null) {
clearCacheAndReload();
if(isVisible())
updateVisibleSeries();
} else {
clearChart();
}
}
/** /**
* If in live mode, fetches what's missing since the last fix and <code>date</code>. If nothing has been loaded yet, * If in live mode, fetches what's missing since the last fix and <code>date</code>. If nothing has been loaded yet,
* loads from the beginning up to <code>date</code>. If in replay mode, checks if anything has been loaded at all. If not, * loads from the beginning up to <code>date</code>. If in replay mode, checks if anything has been loaded at all. If not,
@@ -52,7 +52,7 @@ public abstract class SelectionCheckboxColumn<T> extends AbstractSortableColumnW
private final RefreshableMultiSelectionModel<T> selectionModel; private final RefreshableMultiSelectionModel<T> selectionModel;
/** /**
* @param selectionmodel * @param selectionModel
* {@link RefreshableSelectionModel} to set an already existing selectionmodel for the * {@link RefreshableSelectionModel} to set an already existing selectionmodel for the
* {@link SelectionCheckboxColumn} * {@link SelectionCheckboxColumn}
* @param selectedCheckboxCSSClass * @param selectedCheckboxCSSClass
@@ -62,9 +62,10 @@ public abstract class SelectionCheckboxColumn<T> extends AbstractSortableColumnW
* @param checkboxColumnCellCSSClass * @param checkboxColumnCellCSSClass
* CSS class for the <code>&lt;td&gt;</code> element rendering the cell * CSS class for the <code>&lt;td&gt;</code> element rendering the cell
*/ */
protected SelectionCheckboxColumn(RefreshableMultiSelectionModel<T> selectionmodel, String selectedCheckboxCSSClass, // TODO Lukas: test whether using an arbitrary selection model here that does not trigger the redrawRow method displays the checkbox correctly when the selection is changed programmatically; is this required at all, or could the client grab the selection model from this column instead?
protected SelectionCheckboxColumn(RefreshableMultiSelectionModel<T> selectionModel, String selectedCheckboxCSSClass,
String deselectedCheckboxCSSClass, String checkboxColumnCellCSSClass) { String deselectedCheckboxCSSClass, String checkboxColumnCellCSSClass) {
this(selectionmodel, new BetterCheckboxCell(selectedCheckboxCSSClass, deselectedCheckboxCSSClass), checkboxColumnCellCSSClass); this(selectionModel, new BetterCheckboxCell(selectedCheckboxCSSClass, deselectedCheckboxCSSClass), checkboxColumnCellCSSClass);
} }
/** /**
* @param selectedCheckboxCSSClass * @param selectedCheckboxCSSClass
@@ -82,6 +83,7 @@ public abstract class SelectionCheckboxColumn<T> extends AbstractSortableColumnW
entityIdentityComparator); entityIdentityComparator);
} }
// TODO Lukas: test whether using an arbitrary selection model here that does not trigger the redrawRow method displays the checkbox correctly when the selection is changed programmatically; is this required at all, or could the client grab the selection model from this column instead?
private SelectionCheckboxColumn(RefreshableMultiSelectionModel<T> selectionModel, BetterCheckboxCell checkboxCell, String checkboxColumnCellCSSClass) { private SelectionCheckboxColumn(RefreshableMultiSelectionModel<T> selectionModel, BetterCheckboxCell checkboxCell, String checkboxColumnCellCSSClass) {
super(checkboxCell, SortingOrder.DESCENDING); super(checkboxCell, SortingOrder.DESCENDING);
this.cell = checkboxCell; this.cell = checkboxCell;
@@ -143,7 +145,6 @@ public abstract class SelectionCheckboxColumn<T> extends AbstractSortableColumnW
redrawRow(item, getListDataProvider().getList()); redrawRow(item, getListDataProvider().getList());
} }
} }
}; };
} }
@@ -90,7 +90,6 @@ import com.sap.sailing.gwt.ui.client.ClientResources;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener; import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.NumberFormatterFactory; import com.sap.sailing.gwt.ui.client.NumberFormatterFactory;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProviderListener; import com.sap.sailing.gwt.ui.client.RaceTimesInfoProviderListener;
import com.sap.sailing.gwt.ui.client.RequiresDataInitialization; import com.sap.sailing.gwt.ui.client.RequiresDataInitialization;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
@@ -137,7 +136,7 @@ import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.SettingsDialog; import com.sap.sse.gwt.client.shared.components.SettingsDialog;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent; import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSelectionChangeListener, RaceSelectionChangeListener, public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSelectionChangeListener,
RaceTimesInfoProviderListener, TailFactory, Component<RaceMapSettings>, RequiresDataInitialization, RequiresResize, QuickRankProvider { RaceTimesInfoProviderListener, TailFactory, Component<RaceMapSettings>, RequiresDataInitialization, RequiresResize, QuickRankProvider {
public static final String GET_RACE_MAP_DATA_CATEGORY = "getRaceMapData"; public static final String GET_RACE_MAP_DATA_CATEGORY = "getRaceMapData";
public static final String GET_WIND_DATA_CATEGORY = "getWindData"; public static final String GET_WIND_DATA_CATEGORY = "getWindData";
@@ -286,8 +285,6 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
private final CompetitorSelectionProvider competitorSelection; private final CompetitorSelectionProvider competitorSelection;
private List<RegattaAndRaceIdentifier> selectedRaces;
/** /**
* Used to check if the first initial zoom to the mark markers was already done. * Used to check if the first initial zoom to the mark markers was already done.
*/ */
@@ -441,6 +438,8 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
trueNorthIndicatorPanel = new TrueNorthIndicatorPanel(this, raceMapImageManager, combinedWindPanelStyle, stringMessages, coordinateSystem); trueNorthIndicatorPanel = new TrueNorthIndicatorPanel(this, raceMapImageManager, combinedWindPanelStyle, stringMessages, coordinateSystem);
trueNorthIndicatorPanel.setVisible(true); trueNorthIndicatorPanel.setVisible(true);
orientationChangeInProgress = false; orientationChangeInProgress = false;
mapFirstZoomDone = false;
// TODO bug 494: reset zoom settings to user preferences
} }
/** /**
@@ -735,17 +734,10 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
return panelForRightHeaderLabels; return panelForRightHeaderLabels;
} }
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
mapFirstZoomDone = false;
// TODO bug 494: reset zoom settings to user preferences
this.selectedRaces = selectedRaces;
}
@Override @Override
public void raceTimesInfosReceived(Map<RegattaAndRaceIdentifier, RaceTimesInfoDTO> raceTimesInfos, long clientTimeWhenRequestWasSent, Date serverTimeDuringRequest, long clientTimeWhenResponseWasReceived) { public void raceTimesInfosReceived(Map<RegattaAndRaceIdentifier, RaceTimesInfoDTO> raceTimesInfos, long clientTimeWhenRequestWasSent, Date serverTimeDuringRequest, long clientTimeWhenResponseWasReceived) {
timer.adjustClientServerOffset(clientTimeWhenRequestWasSent, serverTimeDuringRequest, clientTimeWhenResponseWasReceived); timer.adjustClientServerOffset(clientTimeWhenRequestWasSent, serverTimeDuringRequest, clientTimeWhenResponseWasReceived);
this.lastRaceTimesInfo = raceTimesInfos.get(selectedRaces.get(0)); this.lastRaceTimesInfo = raceTimesInfos.get(raceIdentifier);
} }
/** /**
@@ -761,8 +753,8 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
@Override @Override
public void timeChanged(final Date newTime, final Date oldTime) { public void timeChanged(final Date newTime, final Date oldTime) {
if (newTime != null && isMapInitialized) { if (newTime != null && isMapInitialized) {
if (selectedRaces != null && !selectedRaces.isEmpty()) { if (raceIdentifier != null) {
RegattaAndRaceIdentifier race = selectedRaces.get(selectedRaces.size() - 1); RegattaAndRaceIdentifier race = raceIdentifier;
final Iterable<CompetitorDTO> competitorsToShow = getCompetitorsToShow(); final Iterable<CompetitorDTO> competitorsToShow = getCompetitorsToShow();
if (race != null) { if (race != null) {
@@ -1941,8 +1933,8 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
vPanel.add(createInfoWindowLabelAndValue(stringMessages.degreesBoatToTheWind(), vPanel.add(createInfoWindowLabelAndValue(stringMessages.degreesBoatToTheWind(),
(int) Math.abs(lastFix.degreesBoatToTheWind) + " " + stringMessages.degreesShort())); (int) Math.abs(lastFix.degreesBoatToTheWind) + " " + stringMessages.degreesShort()));
} }
if (!selectedRaces.isEmpty()) { if (raceIdentifier != null) {
RegattaAndRaceIdentifier race = selectedRaces.get(selectedRaces.size() - 1); RegattaAndRaceIdentifier race = raceIdentifier;
if (race != null) { if (race != null) {
Map<CompetitorDTO, Date> from = new HashMap<CompetitorDTO, Date>(); Map<CompetitorDTO, Date> from = new HashMap<CompetitorDTO, Date>();
from.put(competitorDTO, fixesAndTails.getFixes(competitorDTO).get(fixesAndTails.getFirstShownFix(competitorDTO)).timepoint); from.put(competitorDTO, fixesAndTails.getFixes(competitorDTO).get(fixesAndTails.getFirstShownFix(competitorDTO)).timepoint);
@@ -2,9 +2,7 @@
package com.sap.sailing.gwt.ui.raceboard; package com.sap.sailing.gwt.ui.raceboard;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@@ -29,7 +27,6 @@ import com.sap.sailing.gwt.ui.client.CompetitorColorProviderImpl;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel; import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel;
import com.sap.sailing.gwt.ui.client.RaceSelectionModel;
import com.sap.sailing.gwt.ui.client.TimePanel; import com.sap.sailing.gwt.ui.client.TimePanel;
import com.sap.sailing.gwt.ui.client.TimePanelSettings; import com.sap.sailing.gwt.ui.client.TimePanelSettings;
import com.sap.sailing.gwt.ui.client.shared.charts.WindChart; import com.sap.sailing.gwt.ui.client.shared.charts.WindChart;
@@ -141,9 +138,6 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint
title.append(fleetName); title.append(fleetName);
} }
Window.setTitle(title.toString()); Window.setTitle(title.toString());
final RaceSelectionModel raceSelectionModel = new RaceSelectionModel();
final List<RegattaAndRaceIdentifier> raceList = Collections.singletonList(selectedRaceIdentifier);
raceSelectionModel.setSelection(raceList);
final long refreshInterval = Duration.ONE_SECOND.times(3).asMillis(); final long refreshInterval = Duration.ONE_SECOND.times(3).asMillis();
final Timer timer = new Timer(play ? PlayModes.Live : PlayModes.Replay); final Timer timer = new Timer(play ? PlayModes.Live : PlayModes.Replay);
AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor(); AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor();
@@ -187,14 +181,12 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint
} }
mapSettings.setWindUp(windUp); mapSettings.setWindUp(windUp);
raceMap.updateSettings(mapSettings); raceMap.updateSettings(mapSettings);
raceMap.onRaceSelectionChange(raceList);
final WindChart windChart; final WindChart windChart;
if (showWindChart) { if (showWindChart) {
windChart = new WindChart(sailingService, raceSelectionModel, timer, windChart = new WindChart(sailingService, selectedRaceIdentifier, timer,
timeRangeWithZoomProvider, new WindChartSettings(), getStringMessages(), timeRangeWithZoomProvider, new WindChartSettings(), getStringMessages(),
asyncActionsExecutor, /* errorReporter */ asyncActionsExecutor, /* errorReporter */
EmbeddedMapAndWindChartEntryPoint.this, /* compactChart */ true); EmbeddedMapAndWindChartEntryPoint.this, /* compactChart */ true);
windChart.onRaceSelectionChange(raceList);
} else { } else {
windChart = null; windChart = null;
} }
@@ -2,7 +2,6 @@
package com.sap.sailing.gwt.ui.raceboard; package com.sap.sailing.gwt.ui.raceboard;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.GWT;
@@ -17,12 +16,10 @@ import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootLayoutPanel; import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint; import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint;
import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel; import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel;
import com.sap.sailing.gwt.ui.client.MediaService; import com.sap.sailing.gwt.ui.client.MediaService;
import com.sap.sailing.gwt.ui.client.MediaServiceAsync; import com.sap.sailing.gwt.ui.client.MediaServiceAsync;
import com.sap.sailing.gwt.ui.client.RaceSelectionModel;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider; import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants; import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
import com.sap.sailing.gwt.ui.shared.RaceWithCompetitorsDTO; import com.sap.sailing.gwt.ui.shared.RaceWithCompetitorsDTO;
@@ -140,14 +137,12 @@ public class RaceBoardEntryPoint extends AbstractSailingEntryPoint {
} }
selectedRace = raceboardData.getRace(); selectedRace = raceboardData.getRace();
Window.setTitle(selectedRace.getName()); Window.setTitle(selectedRace.getName());
RaceSelectionModel raceSelectionModel = new RaceSelectionModel();
List<RegattaAndRaceIdentifier> singletonList = Collections.singletonList(selectedRace.getRaceIdentifier());
raceSelectionModel.setSelection(singletonList);
Timer timer = new Timer(PlayModes.Replay, 1000l); Timer timer = new Timer(PlayModes.Replay, 1000l);
AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor(); AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor();
RaceTimesInfoProvider raceTimesInfoProvider = new RaceTimesInfoProvider(sailingService, asyncActionsExecutor, this, singletonList, 5000l /* requestInterval*/); RaceTimesInfoProvider raceTimesInfoProvider = new RaceTimesInfoProvider(sailingService, asyncActionsExecutor, this,
Collections.singletonList(selectedRace.getRaceIdentifier()), 5000l /* requestInterval*/);
RaceBoardPanel raceBoardPanel = new RaceBoardPanel(sailingService, mediaService, getUserService(), asyncActionsExecutor, RaceBoardPanel raceBoardPanel = new RaceBoardPanel(sailingService, mediaService, getUserService(), asyncActionsExecutor,
raceboardData.getCompetitorAndTheirBoats(), timer, raceSelectionModel, leaderboardName, leaderboardGroupName, eventId, raceboardData.getCompetitorAndTheirBoats(), timer, selectedRace.getRaceIdentifier(), leaderboardName, leaderboardGroupName, eventId,
raceboardViewConfig, RaceBoardEntryPoint.this, getStringMessages(), userAgent, raceTimesInfoProvider, showMapControls); raceboardViewConfig, RaceBoardEntryPoint.this, getStringMessages(), userAgent, raceTimesInfoProvider, showMapControls);
createRaceBoardInOneScreenMode(raceBoardPanel, raceboardViewConfig); createRaceBoardInOneScreenMode(raceBoardPanel, raceboardViewConfig);
@@ -1,7 +1,6 @@
package com.sap.sailing.gwt.ui.raceboard; package com.sap.sailing.gwt.ui.raceboard;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -36,8 +35,6 @@ import com.sap.sailing.gwt.ui.client.EntryPointLinkFactory;
import com.sap.sailing.gwt.ui.client.GlobalNavigationPanel; import com.sap.sailing.gwt.ui.client.GlobalNavigationPanel;
import com.sap.sailing.gwt.ui.client.LeaderboardUpdateListener; import com.sap.sailing.gwt.ui.client.LeaderboardUpdateListener;
import com.sap.sailing.gwt.ui.client.MediaServiceAsync; import com.sap.sailing.gwt.ui.client.MediaServiceAsync;
import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
import com.sap.sailing.gwt.ui.client.RaceTimePanel; import com.sap.sailing.gwt.ui.client.RaceTimePanel;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider; import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
@@ -79,7 +76,7 @@ import com.sap.sse.security.ui.client.UserService;
* @author Frank Mittag, Axel Uhl (d043530) * @author Frank Mittag, Axel Uhl (d043530)
* *
*/ */
public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeListener, LeaderboardUpdateListener, PopupPositionProvider { public class RaceBoardPanel extends SimplePanel implements LeaderboardUpdateListener, PopupPositionProvider {
private final SailingServiceAsync sailingService; private final SailingServiceAsync sailingService;
private final MediaServiceAsync mediaService; private final MediaServiceAsync mediaService;
private final UUID eventId; private final UUID eventId;
@@ -91,7 +88,6 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi
private final List<ComponentViewer> componentViewers; private final List<ComponentViewer> componentViewers;
private RaceTimePanel timePanel; private RaceTimePanel timePanel;
private final Timer timer; private final Timer timer;
private final RaceSelectionProvider raceSelectionProvider;
private final UserAgentDetails userAgent; private final UserAgentDetails userAgent;
private final CompetitorSelectionProvider competitorSelectionProvider; private final CompetitorSelectionProvider competitorSelectionProvider;
private final TimeRangeWithZoomModel timeRangeWithZoomModel; private final TimeRangeWithZoomModel timeRangeWithZoomModel;
@@ -126,7 +122,7 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi
*/ */
public RaceBoardPanel(SailingServiceAsync sailingService, MediaServiceAsync mediaService, public RaceBoardPanel(SailingServiceAsync sailingService, MediaServiceAsync mediaService,
UserService userService, AsyncActionsExecutor asyncActionsExecutor, Map<CompetitorDTO, BoatDTO> competitorsAndTheirBoats, UserService userService, AsyncActionsExecutor asyncActionsExecutor, Map<CompetitorDTO, BoatDTO> competitorsAndTheirBoats,
Timer timer, RaceSelectionProvider theRaceSelectionProvider, String leaderboardName, Timer timer, RegattaAndRaceIdentifier selectedRaceIdentifier, String leaderboardName,
String leaderboardGroupName, UUID eventId, RaceBoardViewConfiguration raceboardViewConfiguration, String leaderboardGroupName, UUID eventId, RaceBoardViewConfiguration raceboardViewConfiguration,
ErrorReporter errorReporter, final StringMessages stringMessages, ErrorReporter errorReporter, final StringMessages stringMessages,
UserAgentDetails userAgent, RaceTimesInfoProvider raceTimesInfoProvider, boolean showMapControls) { UserAgentDetails userAgent, RaceTimesInfoProvider raceTimesInfoProvider, boolean showMapControls) {
@@ -134,7 +130,6 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi
this.mediaService = mediaService; this.mediaService = mediaService;
this.stringMessages = stringMessages; this.stringMessages = stringMessages;
this.raceboardViewConfiguration = raceboardViewConfiguration; this.raceboardViewConfiguration = raceboardViewConfiguration;
this.raceSelectionProvider = theRaceSelectionProvider;
this.raceTimesInfoProvider = raceTimesInfoProvider; this.raceTimesInfoProvider = raceTimesInfoProvider;
this.errorReporter = errorReporter; this.errorReporter = errorReporter;
this.userAgent = userAgent; this.userAgent = userAgent;
@@ -142,8 +137,7 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi
this.eventId = eventId; this.eventId = eventId;
this.currentRaceHasBeenSelectedOnce = false; this.currentRaceHasBeenSelectedOnce = false;
this.leaderboardName = leaderboardName; this.leaderboardName = leaderboardName;
raceSelectionProvider.addRaceSelectionChangeListener(this); this.selectedRaceIdentifier = selectedRaceIdentifier;
selectedRaceIdentifier = raceSelectionProvider.getSelectedRaces().iterator().next();
this.setRaceBoardName(selectedRaceIdentifier.getRaceName()); this.setRaceBoardName(selectedRaceIdentifier.getRaceName());
this.asyncActionsExecutor = asyncActionsExecutor; this.asyncActionsExecutor = asyncActionsExecutor;
FlowPanel mainPanel = new FlowPanel(); FlowPanel mainPanel = new FlowPanel();
@@ -190,11 +184,9 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi
} }
} }
timePanel = new RaceTimePanel(timer, timeRangeWithZoomModel, stringMessages, raceTimesInfoProvider, timePanel = new RaceTimePanel(timer, timeRangeWithZoomModel, stringMessages, raceTimesInfoProvider,
raceboardViewConfiguration.isCanReplayDuringLiveRaces()); raceboardViewConfiguration.isCanReplayDuringLiveRaces(), selectedRaceIdentifier);
timeRangeWithZoomModel.addTimeZoomChangeListener(timePanel); timeRangeWithZoomModel.addTimeZoomChangeListener(timePanel);
raceTimesInfoProvider.addRaceTimesInfoProviderListener(timePanel); raceTimesInfoProvider.addRaceTimesInfoProviderListener(timePanel);
raceSelectionProvider.addRaceSelectionChangeListener(timePanel);
timePanel.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
} }
/** /**
@@ -205,18 +197,15 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi
boolean showMapControls, RaceMap raceMap, UserService userService) { boolean showMapControls, RaceMap raceMap, UserService userService) {
// create the default leaderboard and select the right race // create the default leaderboard and select the right race
raceTimesInfoProvider.addRaceTimesInfoProviderListener(raceMap); raceTimesInfoProvider.addRaceTimesInfoProviderListener(raceMap);
raceMap.onRaceSelectionChange(Collections.singletonList(selectedRaceIdentifier));
List<Component<?>> components = new ArrayList<Component<?>>(); List<Component<?>> components = new ArrayList<Component<?>>();
competitorChart = new MultiCompetitorRaceChart(sailingService, asyncActionsExecutor, competitorSelectionProvider, raceSelectionProvider, competitorChart = new MultiCompetitorRaceChart(sailingService, asyncActionsExecutor, competitorSelectionProvider, selectedRaceIdentifier,
timer, timeRangeWithZoomModel, stringMessages, errorReporter, true, true, leaderboardGroupName, leaderboardName); timer, timeRangeWithZoomModel, stringMessages, errorReporter, true, true, leaderboardGroupName, leaderboardName);
competitorChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
competitorChart.getEntryWidget().setTitle(stringMessages.competitorCharts()); competitorChart.getEntryWidget().setTitle(stringMessages.competitorCharts());
competitorChart.setVisible(false); competitorChart.setVisible(false);
components.add(competitorChart); components.add(competitorChart);
windChart = new WindChart(sailingService, raceSelectionProvider, timer, timeRangeWithZoomModel, new WindChartSettings(), windChart = new WindChart(sailingService, selectedRaceIdentifier, timer, timeRangeWithZoomModel, new WindChartSettings(),
stringMessages, asyncActionsExecutor, errorReporter, /* compactChart */ true); stringMessages, asyncActionsExecutor, errorReporter, /* compactChart */ true);
windChart.setVisible(false); windChart.setVisible(false);
windChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
windChart.getEntryWidget().setTitle(stringMessages.windChart()); windChart.getEntryWidget().setTitle(stringMessages.windChart());
components.add(windChart); components.add(windChart);
editMarkPassingPanel = new EditMarkPassingsPanel(sailingService, selectedRaceIdentifier, editMarkPassingPanel = new EditMarkPassingsPanel(sailingService, selectedRaceIdentifier,
@@ -334,10 +323,6 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi
return errorReporter; return errorReporter;
} }
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
}
public RaceBoardViewConfiguration getConfiguration() { public RaceBoardViewConfiguration getConfiguration() {
return raceboardViewConfiguration; return raceboardViewConfiguration;
} }
@@ -6,6 +6,11 @@ import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.ProvidesKey; import com.google.gwt.view.client.ProvidesKey;
import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SelectionChangeEvent;
/**
* TODO Lukas: Add Javadoc
*
* @param <T>
*/
public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T> implements RefreshableSelectionModel<T> { public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T> implements RefreshableSelectionModel<T> {
private final EntityIdentityComparator<T> comp; private final EntityIdentityComparator<T> comp;
@@ -14,11 +19,19 @@ public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T> im
comp = null; comp = null;
} }
// TODO / FIXME: Need to redefine setSelected here: if an element is set selected for which another element is in the current selection that is compared equal by the EntityIdentityComparator then it should be replaced
/**
* TODO Lukas: Add Javadoc
*/
public RefreshableMultiSelectionModel(EntityIdentityComparator<T> comp) { public RefreshableMultiSelectionModel(EntityIdentityComparator<T> comp) {
super(); super();
this.comp = comp; this.comp = comp;
} }
/**
* TODO Lukas: Add Javadoc
*/
public RefreshableMultiSelectionModel(ProvidesKey<T> keyProvider, EntityIdentityComparator<T> comp) { public RefreshableMultiSelectionModel(ProvidesKey<T> keyProvider, EntityIdentityComparator<T> comp) {
super(keyProvider); super(keyProvider);
this.comp = comp; this.comp = comp;