mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-25 21:43:49 +00:00
add copy course functionality for racelogs
This commit is contained in:
1 parent
1ebed6373e
commit
02ce1e8c00
13 files changed
+158
-8
No files matched your search
@@ -11,6 +11,7 @@ public class FleetDTO extends NamedDTO {
|
||||
public boolean raceLogTrackerCanBeAdded;
|
||||
public RaceLogTrackingState raceLogTrackingState;
|
||||
public boolean raceLogTrackerExists;
|
||||
public boolean courseDefinitionInRaceLog;
|
||||
|
||||
public FleetDTO() {}
|
||||
|
||||
|
||||
+1
-1
@@ -76,7 +76,7 @@ TrackedRaceChangedListener {
|
||||
|
||||
protected final RaceSelectionProvider raceSelectionProvider;
|
||||
|
||||
protected static class RaceColumnDTOAndFleetDTOWithNameBasedEquality extends Pair<RaceColumnDTO, FleetDTO> {
|
||||
public static class RaceColumnDTOAndFleetDTOWithNameBasedEquality extends Pair<RaceColumnDTO, FleetDTO> {
|
||||
private static final long serialVersionUID = -8742476113296862662L;
|
||||
|
||||
public RaceColumnDTOAndFleetDTOWithNameBasedEquality(RaceColumnDTO a, FleetDTO b) {
|
||||
|
||||
+3
@@ -82,4 +82,7 @@ interface AdminConsoleResources extends ClientBundle {
|
||||
|
||||
@Source("com/sap/sailing/gwt/ui/client/images/ping.png")
|
||||
ImageResource ping();
|
||||
|
||||
@Source("com/sap/sailing/gwt/ui/client/images/copy_course.png")
|
||||
ImageResource copyCourse();
|
||||
}
|
||||
+1
@@ -53,6 +53,7 @@ public class RaceLogTrackingCourseDefinitionDialog extends RaceLogTrackingDialog
|
||||
});
|
||||
courseActionsPanel.insert(addMark, courseActionsPanel.getWidgetIndex(RaceLogCourseManagementWidget.this.saveButton));
|
||||
|
||||
|
||||
Button cancel = new Button(stringMessages.cancel());
|
||||
cancel.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
|
||||
+41
-5
@@ -5,7 +5,11 @@ import com.google.gwt.user.cellview.client.CellTable;
|
||||
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
|
||||
import com.google.gwt.user.cellview.client.TextColumn;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.Panel;
|
||||
import com.google.gwt.user.client.ui.VerticalPanel;
|
||||
import com.google.gwt.view.client.SelectionChangeEvent;
|
||||
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
|
||||
import com.sap.sailing.domain.common.dto.FleetDTO;
|
||||
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
|
||||
import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState;
|
||||
@@ -18,8 +22,7 @@ import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
|
||||
/**
|
||||
* Allows the user to start and stop tracking of races using the RaceLog-tracking connector.
|
||||
*/
|
||||
public class RaceLogTrackingEventManagementPanel extends AbstractLeaderboardConfigPanel {
|
||||
|
||||
public class RaceLogTrackingEventManagementPanel extends AbstractLeaderboardConfigPanel {
|
||||
public RaceLogTrackingEventManagementPanel(SailingServiceAsync sailingService, AdminConsoleEntryPoint adminConsole,
|
||||
RegattaRefresher regattaRefresher,
|
||||
ErrorReporter errorReporter, StringMessages stringMessages) {
|
||||
@@ -101,9 +104,9 @@ public class RaceLogTrackingEventManagementPanel extends AbstractLeaderboardConf
|
||||
raceActionColumn.setFieldUpdater(new FieldUpdater<RaceColumnDTOAndFleetDTOWithNameBasedEquality, String>() {
|
||||
@Override
|
||||
public void update(int index, RaceColumnDTOAndFleetDTOWithNameBasedEquality object, String value) {
|
||||
String leaderboardName = getSelectedLeaderboardName();
|
||||
String raceColumnName = object.getA().getName();
|
||||
String fleetName = object.getB().getName();
|
||||
final String leaderboardName = getSelectedLeaderboardName();
|
||||
final String raceColumnName = object.getA().getName();
|
||||
final String fleetName = object.getB().getName();
|
||||
if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_ADD_RACELOG_TRACKER.equals(value)) {
|
||||
addRaceLogTracker(object.getA(), object.getB());
|
||||
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_DENOTE_FOR_RACELOG_TRACKING.equals(value)) {
|
||||
@@ -118,6 +121,39 @@ public class RaceLogTrackingEventManagementPanel extends AbstractLeaderboardConf
|
||||
new RaceLogTrackingCourseDefinitionDialog(sailingService, stringMessages, errorReporter, leaderboardName, raceColumnName, fleetName).show();
|
||||
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_MAP_DEVICES.equals(value)) {
|
||||
//TODO
|
||||
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_COPY_COURSE.equals(value)) {
|
||||
final Label selectToCopy = new Label(stringMessages.selectRowInTableToCopyCourse());
|
||||
final VerticalPanel panelToAddTo = (VerticalPanel) selectedLeaderBoardPanel.getContentWidget();
|
||||
panelToAddTo.add(selectToCopy);
|
||||
raceColumnTableSelectionModel.addSelectionChangeHandler(new Handler() {
|
||||
private boolean done = false;
|
||||
@Override
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
if (! done && raceColumnTableSelectionModel.getSelectedSet().size() == 1) {
|
||||
final String leaderboardTo = getSelectedLeaderboardName();
|
||||
final String raceColumnTo = getSelectedRaceColumnWithFleet().getA().getName();
|
||||
String fleetTo = getSelectedRaceColumnWithFleet().getB().getName();
|
||||
if (!(leaderboardTo.equals(leaderboardName) && raceColumnTo.equals(raceColumnName) && fleetTo
|
||||
.equals(fleetName)) && getSelectedRaceColumnWithFleet().getB().raceLogTrackingState.isForTracking()) {
|
||||
|
||||
done = true;
|
||||
panelToAddTo.remove(selectToCopy);
|
||||
sailingService.copyCourseToOtherRaceLog(leaderboardName, raceColumnName, fleetName,
|
||||
leaderboardTo, raceColumnTo, fleetTo, new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onSuccess(Void result) {
|
||||
loadAndRefreshLeaderboard(leaderboardTo, raceColumnTo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Could not copy course: " + caught.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
+5
@@ -16,6 +16,7 @@ public class RaceLogTrackingEventManagementRaceImagesBarCell extends ImagesBarCe
|
||||
public final static String ACTION_COMPETITOR_REGISTRATIONS = "ACTION_COMPETITOR_REGISTRATIONS";
|
||||
public final static String ACTION_DEFINE_COURSE = "ACTION_DEFINE_COURSE";
|
||||
public final static String ACTION_MAP_DEVICES = "ACTION_MAP_DEVICES";
|
||||
public final static String ACTION_COPY_COURSE = "ACTION_COPY_COURSE";
|
||||
|
||||
private final StringMessages stringMessages;
|
||||
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
|
||||
@@ -46,6 +47,10 @@ public class RaceLogTrackingEventManagementRaceImagesBarCell extends ImagesBarCe
|
||||
result.add(new ImageSpec(ACTION_MAP_DEVICES, stringMessages.mapDevices(), makeImagePrototype(resources.mapDevices())));
|
||||
}
|
||||
|
||||
if (object.getB().courseDefinitionInRaceLog) {
|
||||
result.add(new ImageSpec(ACTION_COPY_COURSE, stringMessages.copyCourseToOther(), makeImagePrototype(resources.copyCourse())));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
+5
@@ -420,4 +420,9 @@ public interface SailingService extends RemoteService {
|
||||
* Adds a fix to the {@link GPSFixStore}, and creates a mapping with a virtual device for exactly the current timepoint.
|
||||
*/
|
||||
void pingMarkViaRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, MarkDTO mark, PositionDTO position);
|
||||
|
||||
List<RaceCourseDTO> getCoursesFromRaceLogsInLeaderboard(String leaderboardName);
|
||||
|
||||
void copyCourseToOtherRaceLog(String leaderboardFrom, String raceColumnFrom, String fleetFrom,
|
||||
String leaderboardTo, String raceColumnTo, String fleetTo);
|
||||
}
|
||||
+5
@@ -552,5 +552,10 @@ public interface SailingServiceAsync {
|
||||
|
||||
void pingMarkViaRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName, MarkDTO mark,
|
||||
PositionDTO position, AsyncCallback<Void> callback);
|
||||
|
||||
void copyCourseToOtherRaceLog(String leaderboardFrom, String raceColumnFrom, String fleetFrom,
|
||||
String leaderboardTo, String raceColumnTo, String fleetTo, AsyncCallback<Void> callback);
|
||||
|
||||
void getCoursesFromRaceLogsInLeaderboard(String leaderboardName, AsyncCallback<List<RaceCourseDTO>> callback);
|
||||
}
|
||||
|
||||
+3
@@ -980,4 +980,7 @@ public interface StringMessages extends Messages {
|
||||
String pleaseEnterA(String what);
|
||||
String pingPosition(String whose);
|
||||
String pleaseEnterAValidValueFor(String what, String validTemplate);
|
||||
String copyCourseToOther();
|
||||
String nowSelectRaceColumnAndFleetToCopyTo();
|
||||
String selectRowInTableToCopyCourse();
|
||||
}
|
||||
+4
-1
@@ -965,4 +965,7 @@ add_what=Add {0}
|
||||
remove_what=Remove {0}
|
||||
pleaseEnterA=Please enter a {0}
|
||||
pingPosition=Ping {0} position
|
||||
pleaseEnterAValidValueFor=Please enter a valid value for {0} ({1})
|
||||
pleaseEnterAValidValueFor=Please enter a valid value for {0} ({1})
|
||||
copyCourseToOther=Copy course to other
|
||||
nowSelectRaceColumnAndFleetToCopyTo=Now select the race column and fleet to copy the course to.
|
||||
selectRowInTableToCopyCourse=Select a single row in the table, to which to copy the course.
|
||||
+4
-1
@@ -961,4 +961,7 @@ add_what={0} hinzufügen
|
||||
remove_what={0} entfernen
|
||||
pleaseEnterA=Bitte {0} eingeben.
|
||||
pingPosition={0}-Position pingen
|
||||
pleaseEnterAValidValueFor=Bitte geben Sie für {0} einen gültigen Wert ein ({1})
|
||||
pleaseEnterAValidValueFor=Bitte geben Sie für {0} einen gültigen Wert ein ({1})
|
||||
copyCourseToOther=Diesen Kurs kopieren
|
||||
nowSelectRaceColumnAndFleetToCopyTo=Bitte wählen Sie nun die Renn-Spalte und Flotte zum Kopieren des Kurses aus.
|
||||
selectRowInTableToCopyCourse=Bitte selektieren Sie eine einzelne Zeile der Tabelle, um den Kurs dorthin zu kopieren.
|
||||
+85
@@ -2021,6 +2021,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
RaceLog raceLog = raceColumn.getRaceLog(fleet);
|
||||
fleetDTO.raceLogTrackingState = new RaceLogTrackingStateAnalyzer(raceLog).analyze();
|
||||
fleetDTO.raceLogTrackerExists = getService().getRaceTrackerById(raceLog.getId()) != null;
|
||||
fleetDTO.courseDefinitionInRaceLog = new LastPublishedCourseDesignFinder(raceLog).analyze() != null;
|
||||
|
||||
if (getRaceLogTrackingAdapter().isDenotedForRaceLogTracking(getService(), raceColumn, fleet)) {
|
||||
leaderboardDTO.isDenotedForRaceLogTracking = true;
|
||||
@@ -4093,4 +4094,88 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
|
||||
getService().getGPSFixStore().storeFix(device, fix);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RaceCourseDTO> getCoursesFromRaceLogsInLeaderboard(String leaderboardName) {
|
||||
List<RaceCourseDTO> result = new ArrayList<RaceCourseDTO>();
|
||||
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
|
||||
for (RaceColumn raceColumn : leaderboard.getRaceColumns()) {
|
||||
for (Fleet fleet : raceColumn.getFleets()) {
|
||||
RaceCourseDTO last = getLastCourseDefinitionInRaceLog(leaderboardName, raceColumn.getName(), fleet.getName());
|
||||
if (last != null) {
|
||||
result.add(last);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private Waypoint duplicateWaypoint(Waypoint waypoint, Map<ControlPoint, ControlPoint> controlPointDuplicationCache,
|
||||
Map<Mark, Mark> markDuplicationCache) {
|
||||
ControlPoint oldCP = waypoint.getControlPoint();
|
||||
ControlPoint newCP = null;
|
||||
PassingInstruction pi = waypoint.getPassingInstructions();
|
||||
if (controlPointDuplicationCache.get(oldCP) != null) {
|
||||
newCP = controlPointDuplicationCache.get(oldCP);
|
||||
} else {
|
||||
Mark[] newMarks = new Mark[Util.size(oldCP.getMarks())];
|
||||
int i = 0;
|
||||
for (Mark oldMark : oldCP.getMarks()) {
|
||||
newMarks[i] = null;
|
||||
if (markDuplicationCache.get(oldMark) != null) {
|
||||
newMarks[i] = markDuplicationCache.get(oldMark);
|
||||
} else {
|
||||
newMarks[i] = baseDomainFactory.getOrCreateMark(UUID.randomUUID(), oldMark.getName(), oldMark.getType(),
|
||||
oldMark.getColor(), oldMark.getShape(), oldMark.getPattern());
|
||||
markDuplicationCache.put(oldMark, newMarks[i]);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
switch (newMarks.length) {
|
||||
case 1:
|
||||
newCP = newMarks[0];
|
||||
break;
|
||||
case 2:
|
||||
newCP = baseDomainFactory.createControlPointWithTwoMarks(newMarks[0], newMarks[1], oldCP.getName());
|
||||
break;
|
||||
default:
|
||||
logger.log(Level.WARNING, "Don't know how to duplicate CP with more than 2 marks");
|
||||
throw new RuntimeException("Don't know how to duplicate CP with more than 2 marks");
|
||||
}
|
||||
controlPointDuplicationCache.put(oldCP, newCP);
|
||||
}
|
||||
|
||||
return baseDomainFactory.createWaypoint(newCP, pi);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void copyCourseToOtherRaceLog(String leaderboardFrom, String raceColumnFrom, String fleetFrom,
|
||||
String leaderboardTo, String raceColumnTo, String fleetTo) {
|
||||
if (leaderboardFrom == leaderboardTo && raceColumnFrom == raceColumnTo && fleetFrom == fleetTo) {
|
||||
return;
|
||||
}
|
||||
TimePoint now = MillisecondsTimePoint.now();
|
||||
RaceLog fromRaceLog = getRaceLog(leaderboardFrom, raceColumnFrom, fleetFrom);
|
||||
RaceLog toRaceLog = getRaceLog(leaderboardTo, raceColumnTo, fleetTo);
|
||||
CourseBase from = new LastPublishedCourseDesignFinder(fromRaceLog).analyze();
|
||||
CourseBase to = new CourseDataImpl("Copy of \"" + from.getName()
|
||||
+ "\" for " + leaderboardTo + " - " + raceColumnTo + " - " + fleetTo);
|
||||
if (from != null && new RaceLogTrackingStateAnalyzer(toRaceLog).analyze().isForTracking()) {
|
||||
int i = 0;
|
||||
Map<ControlPoint, ControlPoint> controlPointDuplicationCache = new HashMap<ControlPoint, ControlPoint>();
|
||||
Map<Mark, Mark> markDuplicationCache = new HashMap<Mark, Mark>();
|
||||
for (Waypoint oldWaypoint : from.getWaypoints()) {
|
||||
to.addWaypoint(i++, duplicateWaypoint(oldWaypoint, controlPointDuplicationCache, markDuplicationCache));
|
||||
}
|
||||
|
||||
for (Mark mark : markDuplicationCache.values()) {
|
||||
RaceLogEvent event = RaceLogEventFactory.INSTANCE.createDefineMarkEvent(now, getService().getServerAuthor(),
|
||||
toRaceLog.getCurrentPassId(), mark);
|
||||
toRaceLog.add(event);
|
||||
}
|
||||
}
|
||||
|
||||
RaceLogEvent duplicatedEvent = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(now, getService().getServerAuthor(), toRaceLog.getCurrentPassId(), to);
|
||||
toRaceLog.add(duplicatedEvent);
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 3.0 KiB |
Reference in new issue
Block a user