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;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
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.actions.GetRibDashboardRaceInfoAction;
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.player.TimeListener;
@@ -26,11 +22,10 @@ import com.sap.sse.gwt.client.player.TimeListener;
* @author Alexander Ries
*
*/
public class RibDashboardDataRetriever implements TimeListener, RaceSelectionProvider {
public class RibDashboardDataRetriever implements TimeListener {
private String leaderboardName;
private ArrayList<RibDashboardDataRetrieverListener> dataRetrieverListener;
private ArrayList<RaceSelectionChangeListener> raceSelectionChangeListener;
private AsyncActionsExecutor asyncActionsExecutor;
@@ -51,7 +46,6 @@ public class RibDashboardDataRetriever implements TimeListener, RaceSelectionPro
private void initNonFinalMemberVariablesWithNoArgumentConstructor() {
dataRetrieverListener = new ArrayList<RibDashboardDataRetrieverListener>();
raceSelectionChangeListener = new ArrayList<RaceSelectionChangeListener>();
}
private void loadLiveRaceInfoFromRibDashboadService() {
@@ -66,10 +60,8 @@ public class RibDashboardDataRetriever implements TimeListener, RaceSelectionPro
switch (result.responseMessage) {
case 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);
List<RegattaAndRaceIdentifier> singletonList = Collections.singletonList(result.idOfLastTrackedRace);
setSelection(singletonList);
} else {
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) {
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,
StringMessages.INSTANCE, false, false, false, false, startAnalysisDTO.regattaAndRaceIdentifier,
resources.combinedWindPanelStyle(), /* showHeaderPanel */ true);
raceMap.onRaceSelectionChange(Collections.singletonList(startAnalysisDTO.regattaAndRaceIdentifier));
raceMap.getSettings().setZoomSettings(new RaceMapZoomSettings(zoomTypes, false));
raceMap.getSettings().setHelpLinesSettings(getHelpLineSettings());
raceMap.getSettings().setTailLengthInMilliseconds(startAnalysisDTO.tailLenghtInMilliseconds);
@@ -1,9 +1,7 @@
package com.sap.sailing.gwt.autoplay.client.place.player;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
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.ui.client.CompetitorSelectionModel;
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.RaceTimesInfoProviderListener;
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) {
RaceSelectionModel raceSelectionModel = new RaceSelectionModel();
List<RegattaAndRaceIdentifier> singletonList = Collections.singletonList(raceToShow);
raceSelectionModel.setSelection(singletonList);
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);
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.VerticalPanel;
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.CompetitorDTOImpl;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDialog<Set<CompetitorDTO>> {
protected CompetitorTableWrapper<MultiSelectionModel<CompetitorDTO>> allCompetitorsTable;
protected CompetitorTableWrapper<MultiSelectionModel<CompetitorDTO>> registeredCompetitorsTable;
protected CompetitorTableWrapper<RefreshableMultiSelectionModel<CompetitorDTO>> allCompetitorsTable;
protected CompetitorTableWrapper<RefreshableMultiSelectionModel<CompetitorDTO>> registeredCompetitorsTable;
protected final boolean filterByLeaderBoardInitially = false;
private final StringMessages stringMessages;
protected final SailingServiceAsync sailingService;
@@ -145,8 +145,8 @@ public abstract class AbstractCompetitorRegistrationsDialog extends DataEntryDia
}
}
private void moveSelected(CompetitorTableWrapper<MultiSelectionModel<CompetitorDTO>> from,
CompetitorTableWrapper<MultiSelectionModel<CompetitorDTO>> to) {
private void moveSelected(CompetitorTableWrapper<RefreshableMultiSelectionModel<CompetitorDTO>> from,
CompetitorTableWrapper<RefreshableMultiSelectionModel<CompetitorDTO>> to) {
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.SelectionChangeEvent;
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.RegattaNameAndRaceName;
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 RaceTableWrapper<SetSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>> raceColumnTable;
protected final RaceTableWrapper<RefreshableSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>> raceColumnTable;
protected final RefreshableSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality> raceColumnTableSelectionModel;
protected RaceColumnDTOAndFleetDTOWithNameBasedEquality selectedRaceInLeaderboard;
@@ -86,7 +85,7 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
protected final RefreshableMultiSelectionModel<StrippedLeaderboardDTO> refreshableLeaderboardSelectionModel;
protected final RefreshableSingleSelectionModel<RaceDTO> raceSingelSelectionModel;
protected final RefreshableSingleSelectionModel<RaceDTO> raceSingleSelectionModel;
protected boolean reactOnSelectionChangeEvent;
private final LeaderboardsRefresher leaderboardsRefresher;
@@ -218,16 +217,15 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
trackedRacesListComposite.ensureDebugId("TrackedRacesListComposite");
trackedRacesPanel.add(trackedRacesListComposite);
trackedRacesListComposite.addTrackedRaceChangeListener(this);
this.raceSingelSelectionModel = (RefreshableSingleSelectionModel<RaceDTO>) trackedRacesListComposite.getSelectionModel();
this.raceSingelSelectionModel.addSelectionChangeHandler(new Handler() {
this.raceSingleSelectionModel = (RefreshableSingleSelectionModel<RaceDTO>) trackedRacesListComposite.getSelectionModel();
this.raceSingleSelectionModel.addSelectionChangeHandler(new Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
if (reactOnSelectionChangeEvent) {
// if no leaderboard column is selected, ignore the race selection change
RaceColumnDTOAndFleetDTOWithNameBasedEquality selectedRaceColumnAndFleetName = getSelectedRaceColumnWithFleet();
if (selectedRaceColumnAndFleetName != null) {
if (raceSingelSelectionModel.getSelectedSet().isEmpty()) {
if (raceSingleSelectionModel.getSelectedSet().isEmpty()) {
if (selectedRaceColumnAndFleetName.getA()
.getRaceIdentifier(selectedRaceColumnAndFleetName.getB()) != null) {
unlinkRaceColumnFromTrackedRace(
@@ -237,7 +235,7 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
} else {
linkTrackedRaceToSelectedRaceColumn(selectedRaceColumnAndFleetName.getA(),
selectedRaceColumnAndFleetName.getB(),
raceSingelSelectionModel.getSelectedObject().getRaceIdentifier());
raceSingleSelectionModel.getSelectedObject().getRaceIdentifier());
}
}
}
@@ -261,11 +259,11 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
vPanel.add(reloadAllRaceLogs);
Label lblRaceNamesIn = new Label(stringMessages.races());
vPanel.add(lblRaceNamesIn);
raceColumnTable = new RaceTableWrapper<SetSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>(
raceColumnTable = new RaceTableWrapper<RefreshableSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>(
sailingService, stringMessages, errorReporter, multiSelection);
raceColumnTable.getTable().setWidth("100%");
addColumnsToRacesTable(raceColumnTable.getTable());
this.raceColumnTableSelectionModel = raceColumnTable.getRefreshableSelectionModel();
this.raceColumnTableSelectionModel = raceColumnTable.getSelectionModel();
raceColumnTableSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
public void onSelectionChange(SelectionChangeEvent event) {
leaderboardRaceColumnSelectionChanged();
@@ -336,7 +334,7 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
}
replaceLeaderboardInList(availableLeaderboardList, leaderboardName, leaderboard);
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) {
selectRaceColumn(nameOfRaceColumnToSelect);
}
@@ -356,12 +354,12 @@ public abstract class AbstractLeaderboardConfigPanel extends FormPanel implement
int index = -1;
for (StrippedLeaderboardDTO existingLeaderboard : leaderboardList) {
index++;
if (existingLeaderboard.name.equals(leaderboardToReplace)) {
if (existingLeaderboard.name.equals(leaderboardToReplace)) { // TODO Lukas: this should be the EntityIdentityComparator used for the RefreshableSelectionModel
break;
}
}
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.TrackFileImportDeviceIdentifierDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public abstract class AbstractLogImportFixesAndAddMappingsDialog extends DataEntryDialog<Collection<DeviceMappingDTO>> {
TrackFileImportWidget importWidget;
private TrackFileImportDeviceIdentifierTableWrapper deviceIdTable;
protected final CompetitorTableWrapper<SingleSelectionModel<CompetitorDTO>> competitorTable;
protected final MarkTableWrapper<SingleSelectionModel<MarkDTO>> markTable;
protected final CompetitorTableWrapper<RefreshableSingleSelectionModel<CompetitorDTO>> competitorTable;
protected final MarkTableWrapper<RefreshableSingleSelectionModel<MarkDTO>> markTable;
private final StringMessages stringMessages;
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);
markTable = new MarkTableWrapper<SingleSelectionModel<MarkDTO>>(
markTable = new MarkTableWrapper<RefreshableSingleSelectionModel<MarkDTO>>(
/* multiSelection */ false, sailingService, stringMessages, errorReporter);
competitorTable.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@@ -29,27 +29,38 @@ public abstract class AbstractRaceManagementPanel extends AbstractEventManagemen
public AbstractRaceManagementPanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter,
RegattaRefresher regattaRefresher, boolean actionButtonsEnabled, StringMessages stringMessages) {
super(sailingService, regattaRefresher, errorReporter, actionButtonsEnabled, stringMessages);
VerticalPanel mainPanel = new VerticalPanel();
this.setWidget(mainPanel);
mainPanel.setWidth("100%");
mainPanel.add(trackedRacesListComposite);
trackedRacesListComposite.getSelectionModel().addSelectionChangeHandler(new Handler() {
@Override
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;
selectedCaptionRacePanel = new CaptionPanel(stringMessages.race());
selectedCaptionRacePanel.setWidth("100%");
mainPanel.add(selectedCaptionRacePanel);
selectedRaceContentPanel = new VerticalPanel();
selectedRaceContentPanel.setWidth("100%");
selectedCaptionRacePanel.setContentWidget(selectedRaceContentPanel);
@@ -57,25 +68,4 @@ public abstract class AbstractRaceManagementPanel extends AbstractEventManagemen
}
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() {
AdminConsoleTableResources tableResources = GWT.create(AdminConsoleTableResources.class);
raceList = new ListDataProvider<RaceDTO>();
settings = new TrackedRacesSettings();
settings.setDelayToLiveInSeconds(DEFAULT_LIVE_DELAY_IN_MILLISECONDS / 1000l);
VerticalPanel panel = new VerticalPanel();
setWidget(panel);
HorizontalPanel filterPanel = new HorizontalPanel();
panel.add(filterPanel);
Label lblFilterRaces = new Label(stringMessages.filterRacesByName() + ":");
@@ -116,23 +113,21 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
noTrackedRacesLabel = new Label(stringMessages.noRacesYet());
noTrackedRacesLabel.setWordWrap(false);
panel.add(noTrackedRacesLabel);
AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
raceTable = new CellTable<RaceDTO>(/* pageSize */10000, tableRes);
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) {
this.selectionCheckboxColumn = new SelectionCheckboxColumn<RaceDTO>(
tableResources.cellTableStyle().cellTableCheckboxSelected(),
tableResources.cellTableStyle().cellTableCheckboxDeselected(),
tableResources.cellTableStyle().cellTableCheckboxColumnCell(),
new EntityIdentityComparator<RaceDTO>() {
@Override
public boolean representSameEntity(RaceDTO dto1, RaceDTO dto2) {
return dto1.getRaceIdentifier().equals(dto2.getRaceIdentifier());
}
}) {
entityIdentityComparator) {
@Override
protected ListDataProvider<RaceDTO> getListDataProvider() {
return raceList;
@@ -146,7 +141,7 @@ public abstract class AbstractTrackedRacesListComposite extends SimplePanel impl
refreshableSelectionModel = selectionCheckboxColumn.getSelectionModel();
raceTable.setSelectionModel(refreshableSelectionModel, this.selectionCheckboxColumn.getSelectionManager());
} else {
refreshableSelectionModel = new RefreshableSingleSelectionModel<RaceDTO>();
refreshableSelectionModel = new RefreshableSingleSelectionModel<RaceDTO>(entityIdentityComparator);
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.SimplePanel;
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.Handler;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
@@ -36,7 +35,7 @@ public class CompetitorPanel extends SimplePanel {
private final SailingServiceAsync sailingService;
private final StringMessages stringMessages;
private final ErrorReporter errorReporter;
private final CompetitorTableWrapper<MultiSelectionModel<CompetitorDTO>> competitorTable;
private final CompetitorTableWrapper<RefreshableMultiSelectionModel<CompetitorDTO>> competitorTable;
private final RefreshableMultiSelectionModel<CompetitorDTO> refreshableCompetitorSelectionModel;
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.ui.ImageResourceRenderer;
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.gwt.ui.adminconsole.ColorColumn.ColorRetriever;
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.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;
public CompetitorTableWrapper(SailingServiceAsync sailingService, StringMessages stringMessages,ErrorReporter errorReporter,
@@ -1,7 +1,6 @@
package com.sap.sailing.gwt.ui.adminconsole;
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.StringMessages;
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.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,
ErrorReporter errorReporter) {
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.HorizontalPanel;
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.Handler;
import com.sap.sailing.gwt.ui.adminconsole.AbstractLeaderboardConfigPanel.RaceColumnDTOAndFleetDTOWithNameBasedEquality;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class CopyCourseAndCompetitorsDialog extends DataEntryDialog<CourseAndCompetitorCopyOperation> {
private final RaceTableWrapper<MultiSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>
private final RaceTableWrapper<RefreshableMultiSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>
racesTable;
private final CheckBox courseCheckBox;
private final CheckBox competitorCheckBox;
@@ -38,7 +38,7 @@ public class CopyCourseAndCompetitorsDialog extends DataEntryDialog<CourseAndCom
return null;
}
}, true, dialogCallback);
racesTable = new RaceTableWrapper<MultiSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>(
racesTable = new RaceTableWrapper<RefreshableMultiSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>(
sailingService, stringMessages, errorReporter, /* multiSelection */ true);
racesTable.setSelectedLeaderboardName(leaderboardName);
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.IsWidget;
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.Handler;
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.gwt.ui.client.SailingServiceAsync;
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.WaypointDTO;
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;
public abstract class CourseManagementWidget implements IsWidget {
protected final MarkTableWrapper<MultiSelectionModel<MarkDTO>> marks;
protected final ControlPointTableWrapper<SingleSelectionModel<ControlPointDTO>> multiMarkControlPoints;
protected final WaypointTableWrapper<SingleSelectionModel<WaypointDTO>> waypoints;
protected final MarkTableWrapper<RefreshableMultiSelectionModel<MarkDTO>> marks;
protected final ControlPointTableWrapper<RefreshableSingleSelectionModel<ControlPointDTO>> multiMarkControlPoints;
protected final WaypointTableWrapper<RefreshableSingleSelectionModel<WaypointDTO>> waypoints;
protected final Grid mainPanel;
@@ -67,11 +67,11 @@ public abstract class CourseManagementWidget implements IsWidget {
mainPanel.setCellPadding(5);
mainPanel.getRowFormatter().setVerticalAlign(0, HasVerticalAlignment.ALIGN_TOP);
waypoints = new WaypointTableWrapper<SingleSelectionModel<WaypointDTO>>(
waypoints = new WaypointTableWrapper<RefreshableSingleSelectionModel<WaypointDTO>>(
/* multiSelection */ false, sailingService, stringMessages, errorReporter);
multiMarkControlPoints = new ControlPointTableWrapper<SingleSelectionModel<ControlPointDTO>>(
multiMarkControlPoints = new ControlPointTableWrapper<RefreshableSingleSelectionModel<ControlPointDTO>>(
/* multiSelection */ false, sailingService, stringMessages, errorReporter);
marks = new MarkTableWrapper<MultiSelectionModel<MarkDTO>>(
marks = new MarkTableWrapper<RefreshableMultiSelectionModel<MarkDTO>>(
/* multiSelection */ true, sailingService, stringMessages, errorReporter);
CaptionPanel waypointsPanel = new CaptionPanel(stringMessages.waypoints());
@@ -1,13 +1,13 @@
package com.sap.sailing.gwt.ui.adminconsole;
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.StringMessages;
import com.sap.sailing.gwt.ui.shared.DeviceIdentifierDTO;
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,
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.client.ui.CheckBox;
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.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil;
import com.sap.sailing.gwt.ui.shared.DeviceMappingDTO;
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 {
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.TextBox;
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.Handler;
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.MarkDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class GateCreationDialog extends DataEntryDialog<GateDTO> {
private final MarkTableWrapper<MultiSelectionModel<MarkDTO>> marksWrapper;
private final MarkTableWrapper<RefreshableMultiSelectionModel<MarkDTO>> marksWrapper;
private final TextBox name;
private final StringMessages stringMessages;
@@ -42,7 +42,7 @@ public class GateCreationDialog extends DataEntryDialog<GateDTO> {
}, /* animationEnabled */ false, callback);
this.stringMessages = stringMessages;
name = createTextBox("");
marksWrapper = new MarkTableWrapper<MultiSelectionModel<MarkDTO>>(
marksWrapper = new MarkTableWrapper<RefreshableMultiSelectionModel<MarkDTO>>(
/* multiSelection */ true, sailingService, stringMessages, errorReporter);
marksWrapper.getDataProvider().getList().addAll(marks);
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.shared.MarkDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
public class ItemToMapToDeviceSelectionPanel implements IsWidget {
private final CompetitorTableWrapper<SingleSelectionModel<CompetitorDTO>> competitorTable;
private final MarkTableWrapper<SingleSelectionModel<MarkDTO>> markTable;
private final CompetitorTableWrapper<RefreshableSingleSelectionModel<CompetitorDTO>> competitorTable;
private final MarkTableWrapper<RefreshableSingleSelectionModel<MarkDTO>> markTable;
private MappableToDevice selected;
private final VerticalPanel mainPanel;
private final ErrorReporter errorReporter;
@@ -34,7 +35,7 @@ public class ItemToMapToDeviceSelectionPanel implements IsWidget {
this.selected = selected;
this.errorReporter = errorReporter;
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);
final SingleSelectionModel<MarkDTO> markSelectionModel = markTable.getSelectionModel();
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.user.cellview.client.Column;
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.client.SailingServiceAsync;
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.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,
ErrorReporter errorReporter) {
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.user.cellview.client.Column;
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.gwt.ui.adminconsole.AbstractLeaderboardConfigPanel.RaceColumnDTOAndFleetDTOWithNameBasedEquality;
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.celltable.RefreshableSelectionModel;
public class RaceTableWrapper<S extends SelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>
public class RaceTableWrapper<S extends RefreshableSelectionModel<RaceColumnDTOAndFleetDTOWithNameBasedEquality>>
extends TableWrapper<RaceColumnDTOAndFleetDTOWithNameBasedEquality, S> {
private final AnchorTemplates ANCHORTEMPLATE = GWT.create(AnchorTemplates.class);
private String selectedLeaderboardName;
@@ -75,8 +74,4 @@ extends TableWrapper<RaceColumnDTOAndFleetDTOWithNameBasedEquality, S> {
public void setSelectedLeaderboardName(String 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
public void onSuccess(List<DeviceMappingDTO> result) {
mappings = result;
updateChart();
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.Widget;
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.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.controls.SelectionCheckboxColumn;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel;
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
* 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 SelectionModel<T>> implements IsWidget {
public abstract class TableWrapper<T, S extends RefreshableSelectionModel<T>> implements IsWidget {
protected final CellTable<T> table;
private final S selectionModel;
protected final ListDataProvider<T> dataProvider;
@@ -154,7 +154,7 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite
@Override
protected void makeControlsReactToSelectionChange(Set<RaceDTO> selectedRaces) {
if(actionButtonsEnabled) {
if (actionButtonsEnabled) {
if (selectedRaces.isEmpty()) {
btnRemoveRace.setEnabled(false);
btnUntrack.setEnabled(false);
@@ -164,7 +164,7 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite
btnUntrack.setEnabled(true);
btnExport.setEnabled(true);
}
}
}
}
@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.view.client.SelectionChangeEvent;
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.gwt.ui.client.SailingServiceAsync;
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.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class WaypointCreationDialog extends DataEntryDialog<WaypointDTO> {
private final ControlPointTableWrapper<SingleSelectionModel<ControlPointDTO>> controlPointsWrapper;
private final ControlPointTableWrapper<RefreshableSingleSelectionModel<ControlPointDTO>> controlPointsWrapper;
private final ListBox passingInstructions;
private final StringMessages stringMessages;
@@ -39,7 +39,7 @@ public class WaypointCreationDialog extends DataEntryDialog<WaypointDTO> {
}, /* animationEnabled */ false, callback);
this.stringMessages = stringMessages;
controlPointsWrapper = new ControlPointTableWrapper<SingleSelectionModel<ControlPointDTO>>(
controlPointsWrapper = new ControlPointTableWrapper<RefreshableSingleSelectionModel<ControlPointDTO>>(
/* multiSelection */ false, sailingService, stringMessages, errorReporter);
controlPointsWrapper.getDataProvider().getList().addAll(controlPoints);
@@ -1,7 +1,6 @@
package com.sap.sailing.gwt.ui.adminconsole;
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.StringMessages;
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.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,
ErrorReporter errorReporter) {
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);
for (CompetitorDTO newCompetitor : newCompetitors) {
if (allCompetitors.contains(newCompetitor)) {
oldCompetitorsToRemove.remove(newCompetitor);
if (allCompetitors.contains(newCompetitor)) { // TODO Lukas: should this use an EntityIdentityComparator instead?
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 {
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;
}
}
@@ -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.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 RegattaAndRaceIdentifier selectedRace;
@@ -30,11 +30,15 @@ public class RaceTimePanel extends TimePanel<RaceTimePanelSettings> implements R
private boolean redrawAllMarkersPendingForMinMaxBeingInitialized;
public RaceTimePanel(Timer timer, TimeRangeWithZoomProvider timeRangeProvider, StringMessages stringMessages,
RaceTimesInfoProvider raceTimesInfoProvider, boolean canReplayWhileLiveIsPossible) {
RaceTimesInfoProvider raceTimesInfoProvider, boolean canReplayWhileLiveIsPossible, RegattaAndRaceIdentifier selectedRaceIdentifier) {
super(timer, timeRangeProvider, stringMessages, canReplayWhileLiveIsPossible);
this.raceTimesInfoProvider = raceTimesInfoProvider;
selectedRace = null;
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));
}
@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
public void playStateChanged(PlayStates playState, PlayModes 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.CompetitorSelectionProvider;
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.StringMessages;
import com.sap.sailing.gwt.ui.shared.CompetitorRaceDataDTO;
@@ -94,16 +93,16 @@ public abstract class AbstractCompetitorRaceChart<SettingsType extends ChartSett
private Long timeOfLatestRequestInMillis;
protected AbstractCompetitorRaceChart(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
CompetitorSelectionProvider competitorSelectionProvider, RaceSelectionProvider raceSelectionProvider,
CompetitorSelectionProvider competitorSelectionProvider, RegattaAndRaceIdentifier selectedRaceIdentifier,
Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, Button settingsButton,
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,
null, null);
}
AbstractCompetitorRaceChart(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
CompetitorSelectionProvider competitorSelectionProvider, RaceSelectionProvider raceSelectionProvider,
CompetitorSelectionProvider competitorSelectionProvider, RegattaAndRaceIdentifier selectedRaceIdentifier,
Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, final StringMessages stringMessages,
ErrorReporter errorReporter, DetailType detailType, boolean compactChart, boolean allowTimeAdjust,
String leaderboardGroupName, String leaderboardName) {
@@ -124,9 +123,12 @@ public abstract class AbstractCompetitorRaceChart<SettingsType extends ChartSett
noDataFoundLabel.setStyleName("abstractChartPanel-importantMessageOfChart");
createChart();
setSelectedDetailType(detailType);
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);
}
@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.
*
@@ -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.Widget;
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.StringMessages;
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.shared.components.SettingsDialog;
public abstract class AbstractRaceChart extends AbsolutePanel implements RaceSelectionChangeListener,
TimeListener, TimeZoomChangeListener, TimeRangeChangeListener {
public abstract class AbstractRaceChart extends AbsolutePanel implements TimeListener, TimeZoomChangeListener, TimeRangeChangeListener {
/**
* 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.
@@ -32,7 +32,6 @@ import com.sap.sailing.domain.common.dto.LeaderboardDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionChangeListener;
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.StringMessages;
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.SettingsDialogComponent;
public class EditMarkPassingsPanel extends AbsolutePanel implements Component<AbstractSettings>, RaceSelectionChangeListener,
CompetitorSelectionChangeListener {
public class EditMarkPassingsPanel extends AbsolutePanel implements Component<AbstractSettings>, CompetitorSelectionChangeListener {
private static class AnchorCell extends AbstractCell<SafeHtml> {
@Override
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(selectCompetitorLabel);
enableButtons();
refreshWaypoints();
}
@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) {
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.ui.Button;
import com.sap.sailing.domain.common.DetailType;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.RaceSelectionProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
@@ -33,11 +33,11 @@ public class MultiCompetitorRaceChart extends AbstractCompetitorRaceChart<MultiC
private boolean hasOverallLeaderboard;
public MultiCompetitorRaceChart(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
CompetitorSelectionProvider competitorSelectionProvider, RaceSelectionProvider raceSelectionProvider,
CompetitorSelectionProvider competitorSelectionProvider, RegattaAndRaceIdentifier selectedRaceIdentifier,
Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, final StringMessages stringMessages,
final ErrorReporter errorReporter, boolean compactChart, boolean allowTimeAdjust,
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);
if (leaderboardGroupName != null) {
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.impl.ColorMapImpl;
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.StringMessages;
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;
/**
* @param raceSelectionProvider
* @param selectedRaceIdentifier
* 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
* 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
* 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,
AsyncActionsExecutor asyncActionsExecutor, ErrorReporter errorReporter, boolean compactChart) {
super(sailingService, timer, timeRangeWithZoomProvider, stringMessages, asyncActionsExecutor, errorReporter);
@@ -190,7 +188,15 @@ public class WindChart extends AbstractRaceChart implements Component<WindChartS
.getXAxis().setAxisTitle(null);
}
setSize("100%", "100%");
raceSelectionProvider.addRaceSelectionChangeListener(this);
this.selectedRaceIdentifier = selectedRaceIdentifier;
if (selectedRaceIdentifier != null) {
clearCacheAndReload();
if (isVisible()) {
updateVisibleSeries();
}
} else {
clearChart();
}
}
@Override
@@ -497,23 +503,6 @@ public class WindChart extends AbstractRaceChart implements Component<WindChartS
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,
* 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;
/**
* @param selectionmodel
* @param selectionModel
* {@link RefreshableSelectionModel} to set an already existing selectionmodel for the
* {@link SelectionCheckboxColumn}
* @param selectedCheckboxCSSClass
@@ -62,9 +62,10 @@ public abstract class SelectionCheckboxColumn<T> extends AbstractSortableColumnW
* @param checkboxColumnCellCSSClass
* 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) {
this(selectionmodel, new BetterCheckboxCell(selectedCheckboxCSSClass, deselectedCheckboxCSSClass), checkboxColumnCellCSSClass);
this(selectionModel, new BetterCheckboxCell(selectedCheckboxCSSClass, deselectedCheckboxCSSClass), checkboxColumnCellCSSClass);
}
/**
* @param selectedCheckboxCSSClass
@@ -82,6 +83,7 @@ public abstract class SelectionCheckboxColumn<T> extends AbstractSortableColumnW
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) {
super(checkboxCell, SortingOrder.DESCENDING);
this.cell = checkboxCell;
@@ -143,7 +145,6 @@ public abstract class SelectionCheckboxColumn<T> extends AbstractSortableColumnW
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.CompetitorSelectionProvider;
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.RequiresDataInitialization;
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.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 {
public static final String GET_RACE_MAP_DATA_CATEGORY = "getRaceMapData";
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 List<RegattaAndRaceIdentifier> selectedRaces;
/**
* 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.setVisible(true);
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;
}
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
mapFirstZoomDone = false;
// TODO bug 494: reset zoom settings to user preferences
this.selectedRaces = selectedRaces;
}
@Override
public void raceTimesInfosReceived(Map<RegattaAndRaceIdentifier, RaceTimesInfoDTO> raceTimesInfos, long clientTimeWhenRequestWasSent, Date serverTimeDuringRequest, long 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
public void timeChanged(final Date newTime, final Date oldTime) {
if (newTime != null && isMapInitialized) {
if (selectedRaces != null && !selectedRaces.isEmpty()) {
RegattaAndRaceIdentifier race = selectedRaces.get(selectedRaces.size() - 1);
if (raceIdentifier != null) {
RegattaAndRaceIdentifier race = raceIdentifier;
final Iterable<CompetitorDTO> competitorsToShow = getCompetitorsToShow();
if (race != null) {
@@ -1941,8 +1933,8 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
vPanel.add(createInfoWindowLabelAndValue(stringMessages.degreesBoatToTheWind(),
(int) Math.abs(lastFix.degreesBoatToTheWind) + " " + stringMessages.degreesShort()));
}
if (!selectedRaces.isEmpty()) {
RegattaAndRaceIdentifier race = selectedRaces.get(selectedRaces.size() - 1);
if (raceIdentifier != null) {
RegattaAndRaceIdentifier race = raceIdentifier;
if (race != null) {
Map<CompetitorDTO, Date> from = new HashMap<CompetitorDTO, Date>();
from.put(competitorDTO, fixesAndTails.getFixes(competitorDTO).get(fixesAndTails.getFirstShownFix(competitorDTO)).timepoint);
@@ -2,9 +2,7 @@
package com.sap.sailing.gwt.ui.raceboard;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
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.CompetitorSelectionProvider;
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.TimePanelSettings;
import com.sap.sailing.gwt.ui.client.shared.charts.WindChart;
@@ -141,9 +138,6 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint
title.append(fleetName);
}
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 Timer timer = new Timer(play ? PlayModes.Live : PlayModes.Replay);
AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor();
@@ -187,14 +181,12 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint
}
mapSettings.setWindUp(windUp);
raceMap.updateSettings(mapSettings);
raceMap.onRaceSelectionChange(raceList);
final WindChart windChart;
if (showWindChart) {
windChart = new WindChart(sailingService, raceSelectionModel, timer,
windChart = new WindChart(sailingService, selectedRaceIdentifier, timer,
timeRangeWithZoomProvider, new WindChartSettings(), getStringMessages(),
asyncActionsExecutor, /* errorReporter */
EmbeddedMapAndWindChartEntryPoint.this, /* compactChart */ true);
windChart.onRaceSelectionChange(raceList);
} else {
windChart = null;
}
@@ -2,7 +2,6 @@
package com.sap.sailing.gwt.ui.raceboard;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
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.Label;
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.LogoAndTitlePanel;
import com.sap.sailing.gwt.ui.client.MediaService;
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.RemoteServiceMappingConstants;
import com.sap.sailing.gwt.ui.shared.RaceWithCompetitorsDTO;
@@ -140,14 +137,12 @@ public class RaceBoardEntryPoint extends AbstractSailingEntryPoint {
}
selectedRace = raceboardData.getRace();
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);
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,
raceboardData.getCompetitorAndTheirBoats(), timer, raceSelectionModel, leaderboardName, leaderboardGroupName, eventId,
raceboardData.getCompetitorAndTheirBoats(), timer, selectedRace.getRaceIdentifier(), leaderboardName, leaderboardGroupName, eventId,
raceboardViewConfig, RaceBoardEntryPoint.this, getStringMessages(), userAgent, raceTimesInfoProvider, showMapControls);
createRaceBoardInOneScreenMode(raceBoardPanel, raceboardViewConfig);
@@ -1,7 +1,6 @@
package com.sap.sailing.gwt.ui.raceboard;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
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.LeaderboardUpdateListener;
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.RaceTimesInfoProvider;
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)
*
*/
public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeListener, LeaderboardUpdateListener, PopupPositionProvider {
public class RaceBoardPanel extends SimplePanel implements LeaderboardUpdateListener, PopupPositionProvider {
private final SailingServiceAsync sailingService;
private final MediaServiceAsync mediaService;
private final UUID eventId;
@@ -91,7 +88,6 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi
private final List<ComponentViewer> componentViewers;
private RaceTimePanel timePanel;
private final Timer timer;
private final RaceSelectionProvider raceSelectionProvider;
private final UserAgentDetails userAgent;
private final CompetitorSelectionProvider competitorSelectionProvider;
private final TimeRangeWithZoomModel timeRangeWithZoomModel;
@@ -126,7 +122,7 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi
*/
public RaceBoardPanel(SailingServiceAsync sailingService, MediaServiceAsync mediaService,
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,
ErrorReporter errorReporter, final StringMessages stringMessages,
UserAgentDetails userAgent, RaceTimesInfoProvider raceTimesInfoProvider, boolean showMapControls) {
@@ -134,7 +130,6 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi
this.mediaService = mediaService;
this.stringMessages = stringMessages;
this.raceboardViewConfiguration = raceboardViewConfiguration;
this.raceSelectionProvider = theRaceSelectionProvider;
this.raceTimesInfoProvider = raceTimesInfoProvider;
this.errorReporter = errorReporter;
this.userAgent = userAgent;
@@ -142,8 +137,7 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi
this.eventId = eventId;
this.currentRaceHasBeenSelectedOnce = false;
this.leaderboardName = leaderboardName;
raceSelectionProvider.addRaceSelectionChangeListener(this);
selectedRaceIdentifier = raceSelectionProvider.getSelectedRaces().iterator().next();
this.selectedRaceIdentifier = selectedRaceIdentifier;
this.setRaceBoardName(selectedRaceIdentifier.getRaceName());
this.asyncActionsExecutor = asyncActionsExecutor;
FlowPanel mainPanel = new FlowPanel();
@@ -190,11 +184,9 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi
}
}
timePanel = new RaceTimePanel(timer, timeRangeWithZoomModel, stringMessages, raceTimesInfoProvider,
raceboardViewConfiguration.isCanReplayDuringLiveRaces());
raceboardViewConfiguration.isCanReplayDuringLiveRaces(), selectedRaceIdentifier);
timeRangeWithZoomModel.addTimeZoomChangeListener(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) {
// create the default leaderboard and select the right race
raceTimesInfoProvider.addRaceTimesInfoProviderListener(raceMap);
raceMap.onRaceSelectionChange(Collections.singletonList(selectedRaceIdentifier));
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);
competitorChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
competitorChart.getEntryWidget().setTitle(stringMessages.competitorCharts());
competitorChart.setVisible(false);
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);
windChart.setVisible(false);
windChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
windChart.getEntryWidget().setTitle(stringMessages.windChart());
components.add(windChart);
editMarkPassingPanel = new EditMarkPassingsPanel(sailingService, selectedRaceIdentifier,
@@ -334,10 +323,6 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi
return errorReporter;
}
@Override
public void onRaceSelectionChange(List<RegattaAndRaceIdentifier> selectedRaces) {
}
public RaceBoardViewConfiguration getConfiguration() {
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.SelectionChangeEvent;
/**
* TODO Lukas: Add Javadoc
*
* @param <T>
*/
public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T> implements RefreshableSelectionModel<T> {
private final EntityIdentityComparator<T> comp;
@@ -14,11 +19,19 @@ public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T> im
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) {
super();
this.comp = comp;
}
/**
* TODO Lukas: Add Javadoc
*/
public RefreshableMultiSelectionModel(ProvidesKey<T> keyProvider, EntityIdentityComparator<T> comp) {
super(keyProvider);
this.comp = comp;