provide an overall ORC PCS course / legs details editor

Change-Id: I397aa8dc35b9eab25bcfc35975e2259b06b2955a
This commit is contained in:
Axel Uhl
2019-10-09 16:36:14 +02:00
parent 5812cb8625
commit a4ea73ebe9
32 changed files with 520 additions and 85 deletions
@@ -3,7 +3,6 @@ package com.sap.sailing.gwt.autoplay.client.shared.leaderboard;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
@@ -12,6 +11,7 @@ import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.dialog.DoubleBox;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
public class LeaderboardPerspectiveSettingsDialogComponent implements SettingsDialogComponent<LeaderboardWithZoomingPerspectiveSettings> {
@@ -14,7 +14,6 @@ import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
@@ -39,6 +38,7 @@ import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.controls.datetime.DateAndTimeInput;
import com.sap.sse.gwt.client.controls.datetime.DateTimeInput.Accuracy;
import com.sap.sse.gwt.client.controls.listedit.ListEditorComposite;
import com.sap.sse.gwt.client.dialog.DoubleBox;
/**
* Uses a {@link RegattaDTO} to initialize the view. {@link #getRegattaDTO()} can be used by implementations of
@@ -2,7 +2,6 @@ package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Date;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
@@ -16,6 +15,7 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.CoursePositionsDTO;
import com.sap.sailing.gwt.ui.shared.WindDTO;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DoubleBox;
public class AddWindFixDialog extends DataEntryDialog<WindDTO> {
private final StringMessages stringMessages;
@@ -124,7 +124,10 @@ interface AdminConsoleResources extends ClientBundle {
@Source("com/sap/sailing/gwt/ui/client/images/orc_pcs_leg.png")
ImageResource orcPcsDefineLegIcon();
@Source("com/sap/sailing/gwt/ui/client/images/orc_pcs_all_legs.png")
ImageResource orcPcsDefineAllLegsIcon();
@Source("com/sap/sailing/gwt/ui/client/images/certificates.png")
ImageResource updateCertificatesIcon();
}
@@ -5,7 +5,6 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
@@ -24,6 +23,7 @@ import com.sap.sse.common.impl.MillisecondsDurationImpl;
import com.sap.sse.common.impl.RGBColor;
import com.sap.sse.gwt.adminconsole.URLFieldWithFileUpload;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DoubleBox;
/**
* The competitors produced by this dialog will have a <code>null</code>
@@ -75,10 +75,42 @@ public abstract class CourseManagementWidget implements IsWidget {
*/
private final Map<WaypointDTO, ORCPerformanceCurveLegImpl> orcPerformanceCurveLegInfo;
/**
* Abstracts from how the leg geometry for a single leg is obtained; implementations may, e.g., use
* different ways to identify the race from which to fetch the data.
*
* @author Axel Uhl (D043530)
*
*/
public static interface LegGeometrySupplier {
void getLegGeometry(int zeroBasedLegNumber, AsyncCallback<ORCPerformanceCurveLegImpl> callback);
void getLegGeometry(int[] zeroBasedLegNumbers, AsyncCallback<ORCPerformanceCurveLegImpl[]> callback);
}
public static class SingleLegValidator implements Validator<ORCPerformanceCurveLegImpl> {
private final StringMessages stringMessages;
public SingleLegValidator(StringMessages stringMessages) {
this.stringMessages = stringMessages;
}
@Override
public String getErrorMessage(ORCPerformanceCurveLegImpl valueToValidate) {
final String result;
if (valueToValidate == null) {
result = null; // empty is allowed
} else {
if (valueToValidate.getLength() == null) {
result = stringMessages.pleaseEnterADistance();
} else if (valueToValidate.getType() == ORCPerformanceCurveLegTypes.TWA && valueToValidate.getTwa() == null) {
result = stringMessages.pleaseEnterATwa();
} else {
result = null;
}
}
return result;
}
}
@Override
public Widget asWidget() {
return mainPanel;
@@ -130,6 +162,8 @@ public abstract class CourseManagementWidget implements IsWidget {
// ...as well as for setting any ORC PCS-related leg details:
waypointsActionColumn.addAction(WaypointImagesBarCell.ACTION_ORC_PCS_DEFINE_LEG, DefaultActions.UPDATE,
waypoint -> createOrcPcsLegEventForLegEndingAt(waypoint));
waypointsActionColumn.addAction(WaypointImagesBarCell.ACTION_ORC_PCS_DEFINE_ALL_LEGS, DefaultActions.UPDATE,
waypoint -> createOrcPcsLegEventsForAllLegs());
waypoints.getTable().addColumn(waypointsActionColumn);
waypoints.getSelectionModel().addSelectionChangeHandler(new Handler() {
@Override
@@ -197,24 +231,7 @@ public abstract class CourseManagementWidget implements IsWidget {
private void createOrcPcsLegEventForLegEndingAt(WaypointDTO waypoint) {
new ORCPerformanceCurveLegDialog(stringMessages, waypoint, waypoints.getDataProvider(),
orcPerformanceCurveLegInfo.get(waypoint), getLegGeometrySupplier(),
new Validator<ORCPerformanceCurveLegImpl>() {
@Override
public String getErrorMessage(ORCPerformanceCurveLegImpl valueToValidate) {
final String result;
if (valueToValidate == null) {
result = null; // empty is allowed
} else {
if (valueToValidate.getLength() == null) {
result = stringMessages.pleaseEnterADistance();
} else if (valueToValidate.getType() == ORCPerformanceCurveLegTypes.TWA && valueToValidate.getTwa() == null) {
result = stringMessages.pleaseEnterATwa();
} else {
result = null;
}
}
return result;
}
}, new DialogCallback<ORCPerformanceCurveLegImpl>() {
new SingleLegValidator(stringMessages), new DialogCallback<ORCPerformanceCurveLegImpl>() {
@Override
public void ok(ORCPerformanceCurveLegImpl legInfoForWaypoint) {
orcPerformanceCurveLegInfo.put(waypoint, legInfoForWaypoint);
@@ -225,6 +242,54 @@ public abstract class CourseManagementWidget implements IsWidget {
}
}).show();
}
/**
* Shows an editable dialog that is filled with the current ORC PCS definitions for all legs. Other than the
* {@link ORCPerformanceCurveLegDialog} that is good only for a single leg, the dialog presented by this method
* allows the user to
* <ul>
* <li>see the total distance of the course by adding up all leg distances</li>
* <li>set a common leg type, such as {@link ORCPerformanceCurveLegTypes#CIRCULAR_RANDOM}, for all legs at once</li>
* <li>set a total course distance and break it down proportionally to the legs, based on their current length</li>
* </ul>
*/
private void createOrcPcsLegEventsForAllLegs() {
new ORCPerformanceCurveAllLegsDialog(stringMessages, waypoints.getDataProvider(), getExplicitOrcPerformanceCurveLegInfos(),
getLegGeometrySupplier(), new Validator<ORCPerformanceCurveLegImpl[]>() {
@Override
public String getErrorMessage(ORCPerformanceCurveLegImpl[] valueToValidate) {
final SingleLegValidator singleLegValidator = new SingleLegValidator(stringMessages);
for (final ORCPerformanceCurveLegImpl legToValidate : valueToValidate) {
final String errorMessage = singleLegValidator.getErrorMessage(legToValidate);
if (errorMessage != null) {
return errorMessage;
}
}
return null;
}
},
new DialogCallback<ORCPerformanceCurveLegImpl[]>() {
@Override
public void ok(ORCPerformanceCurveLegImpl[] legInfos) {
for (int i=0; i<legInfos.length; i++) {
orcPerformanceCurveLegInfo.put(waypoints.getDataProvider().getList().get(i+1), legInfos[i]);
}
}
@Override
public void cancel() {
}
}).show();
}
private ORCPerformanceCurveLegImpl[] getExplicitOrcPerformanceCurveLegInfos() {
final ORCPerformanceCurveLegImpl[] result = new ORCPerformanceCurveLegImpl[waypoints.getDataProvider().getList().size()-1];
for (int i=0; i<result.length; i++) {
result[i] = orcPerformanceCurveLegInfo.get(waypoints.getDataProvider().getList().get(i+1));
}
return result;
}
protected void markSelectionChanged() {
}
@@ -0,0 +1,278 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.stream.IntStream;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.ListDataProvider;
import com.sap.sailing.domain.common.impl.NauticalMileDistance;
import com.sap.sailing.domain.common.orc.ORCPerformanceCurveLegTypes;
import com.sap.sailing.domain.common.orc.impl.ORCPerformanceCurveLegImpl;
import com.sap.sailing.gwt.ui.adminconsole.CourseManagementWidget.LegGeometrySupplier;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.WaypointDTO;
import com.sap.sse.common.Distance;
import com.sap.sse.common.Util;
import com.sap.sse.common.impl.DegreeBearingImpl;
import com.sap.sse.gwt.client.Notification;
import com.sap.sse.gwt.client.Notification.NotificationType;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DoubleBox;
/**
* An editor allowing users to specify the ORC Performance Curve leg type and distance for all legs currently in the
* course. See also {@link ORCPerformanceCurveLegDialog} which does this for a single leg only.
*
* @author Axel Uhl (D043530)
*
*/
public class ORCPerformanceCurveAllLegsDialog extends DataEntryDialog<ORCPerformanceCurveLegImpl[]> {
private final ListBox commonLegTypeBox;
private final DoubleBox desiredTotalCourseDistanceInNauticalMilesBox;
private final ListBox[] legTypeBoxes;
private final Label totalDistanceInNauticalMilesLabel;
private final DoubleBox[] distanceInNauticalMilesBoxes;
private final DoubleBox[] twaBoxes;
private final StringMessages stringMessages;
private final ListDataProvider<WaypointDTO> waypointList;
private final LegGeometrySupplier legGeometrySupplier;
private ORCPerformanceCurveLegImpl[] trackingBasedCourseGeometry;
private final Label[] trackedTwaInDegreesLabels;
private final Label[] trackedDistanceInNauticalMilesLabels;
final Button spreadTotalDistanceProportionallyAcrossLegsButton;
/**
* @param orcLegParametersSoFar
* element at index 0 has the parameters for the first leg, so the one ending at the waypoint with
* zero-based index 1 and one-based index 2, respectively.
*/
public ORCPerformanceCurveAllLegsDialog(StringMessages stringMessages, ListDataProvider<WaypointDTO> waypointList,
ORCPerformanceCurveLegImpl[] orcLegParametersSoFar, LegGeometrySupplier legGeometrySupplier,
Validator<ORCPerformanceCurveLegImpl[]> validator,
DialogCallback<ORCPerformanceCurveLegImpl[]> callback) {
super(stringMessages.orcPerformanceCurveLegs(),
stringMessages.orcPerformanceCurveLegs(), stringMessages.ok(),
stringMessages.cancel(), validator, callback);
this.stringMessages = stringMessages;
this.waypointList = waypointList;
this.legGeometrySupplier = legGeometrySupplier;
commonLegTypeBox = createLegTypeBox(null);
desiredTotalCourseDistanceInNauticalMilesBox = createDoubleBox(/* visibleLength */ 5);
totalDistanceInNauticalMilesLabel = new Label();
legTypeBoxes = new ListBox[waypointList.getList().size()-1];
twaBoxes = new DoubleBox[waypointList.getList().size()-1];
distanceInNauticalMilesBoxes = new DoubleBox[waypointList.getList().size()-1];
trackedTwaInDegreesLabels = new Label[waypointList.getList().size()-1];
trackedDistanceInNauticalMilesLabels = new Label[waypointList.getList().size()-1];
for (int i=0; i<waypointList.getList().size()-1; i++) {
final int zeroBasedLegNumber = i;
legTypeBoxes[i] = createLegTypeBox(orcLegParametersSoFar[i]);
distanceInNauticalMilesBoxes[i] = createDoubleBox(/* visibleLength */ 5);
distanceInNauticalMilesBoxes[i].addChangeHandler(e->updateTotalDistanceLabel());
twaBoxes[i] = createDoubleBox(/* visibleLength */ 5);
if (orcLegParametersSoFar != null && orcLegParametersSoFar[i] != null) {
distanceInNauticalMilesBoxes[i].setValue(orcLegParametersSoFar[i].getLength().getNauticalMiles());
twaBoxes[i].setValue(orcLegParametersSoFar[i].getTwa() == null ? null : orcLegParametersSoFar[i].getTwa().getDegrees());
}
trackedTwaInDegreesLabels[i] = new Label();
trackedDistanceInNauticalMilesLabels[i] = new Label();
legTypeBoxes[i].addChangeHandler(e->updateAfterLegTypeChange(zeroBasedLegNumber));
updateAfterLegTypeChange(zeroBasedLegNumber);
}
spreadTotalDistanceProportionallyAcrossLegsButton = new Button(stringMessages.spreadTotalDistanceProportionallyAcrossLegs());
desiredTotalCourseDistanceInNauticalMilesBox.addChangeHandler(e->adjustEnablednessOfSpreadButton());
spreadTotalDistanceProportionallyAcrossLegsButton.addClickHandler(e->spreadTotalDistance());
adjustEnablednessOfSpreadButton();
commonLegTypeBox.addChangeHandler(e->{
int zeroBasedLegNumber = 0;
for (final ListBox legTypeBox : legTypeBoxes) {
legTypeBox.setSelectedIndex(commonLegTypeBox.getSelectedIndex());
updateAfterLegTypeChange(zeroBasedLegNumber++);
}
validateAndUpdate();
});
fetchTrackingBasedDistanceAndTwa();
}
private void adjustEnablednessOfSpreadButton() {
spreadTotalDistanceProportionallyAcrossLegsButton.setEnabled(desiredTotalCourseDistanceInNauticalMilesBox.getValue() != null);
}
private void updateAfterLegTypeChange(final int zeroBasedLegNumber) {
twaBoxes[zeroBasedLegNumber].setEnabled(getSelectedLegType(zeroBasedLegNumber)==ORCPerformanceCurveLegTypes.TWA);
distanceInNauticalMilesBoxes[zeroBasedLegNumber].setEnabled(getSelectedLegType(zeroBasedLegNumber)!=null);
}
private void updateTotalDistanceLabel() {
final Distance totalDistance = getEffectiveTotalDistance(getResult());
totalDistanceInNauticalMilesLabel.setText(Util.padPositiveValue(totalDistance.getNauticalMiles(), 1, 3, /* round */ true));
}
@Override
protected boolean validateAndUpdate() {
updateTotalDistanceLabel();
return super.validateAndUpdate();
}
private Distance getEffectiveTotalDistance(ORCPerformanceCurveLegImpl[] explicitLegSpecs) {
Distance totalDistance = Distance.NULL;
for (int i=0; i<explicitLegSpecs.length; i++) {
final Distance legDistance = getEffectiveLegDistance(explicitLegSpecs, i);
totalDistance = totalDistance.add(legDistance);
}
return totalDistance;
}
protected Distance getEffectiveLegDistance(final ORCPerformanceCurveLegImpl[] explicitLegSpecs, int zeroBasedLegIndex) {
final Distance legDistance;
if (explicitLegSpecs[zeroBasedLegIndex] != null && explicitLegSpecs[zeroBasedLegIndex].getLength() != null) {
legDistance = explicitLegSpecs[zeroBasedLegIndex].getLength();
} else if (trackingBasedCourseGeometry != null && trackingBasedCourseGeometry.length > zeroBasedLegIndex && trackingBasedCourseGeometry[zeroBasedLegIndex] != null) {
legDistance = trackingBasedCourseGeometry[zeroBasedLegIndex].getLength();
} else {
legDistance = Distance.NULL;
}
return legDistance;
}
private ListBox createLegTypeBox(ORCPerformanceCurveLegImpl orcLegParametersSoFar) {
final ListBox legTypeBox = createListBox(/* isMultipleSelect */ false);
legTypeBox.addItem("", (String) null);
int i=1;
for (final ORCPerformanceCurveLegTypes t : ORCPerformanceCurveLegTypes.values()) {
legTypeBox.addItem(t.name(), t.name());
if (orcLegParametersSoFar != null && orcLegParametersSoFar.getType() == t) {
legTypeBox.setSelectedIndex(i);
}
i++;
}
return legTypeBox;
}
private void fetchTrackingBasedDistanceAndTwa() {
legGeometrySupplier.getLegGeometry(IntStream.range(0, waypointList.getList().size()-1).toArray(),
new AsyncCallback<ORCPerformanceCurveLegImpl[]>() {
@Override
public void onFailure(Throwable caught) {
GWT.log(caught.getMessage());
Notification.notify(caught.getMessage(), NotificationType.WARNING);
}
@Override
public void onSuccess(ORCPerformanceCurveLegImpl[] legGeometries) {
trackingBasedCourseGeometry = legGeometries;
for (int i=0; i<legGeometries.length; i++) {
if (legGeometries[i] != null && legGeometries[i].getTwa() != null) {
final double twaInDegrees = legGeometries[i].getTwa().getDegrees();
trackedTwaInDegreesLabels[i].setText((twaInDegrees<0?"-":"")+Util.padPositiveValue(Math.abs(twaInDegrees), 1, 3, /* round */ true));
} else {
trackedTwaInDegreesLabels[i].setText("");
}
if (legGeometries[i] != null && legGeometries[i].getLength() != null) {
trackedDistanceInNauticalMilesLabels[i].setText(Util.padPositiveValue(legGeometries[i].getLength().getNauticalMiles(), 1, 3, /* round */ true));
} else {
trackedDistanceInNauticalMilesLabels[i].setText("");
}
}
validateAndUpdate();
}
});
}
private ORCPerformanceCurveLegTypes getSelectedLegType(int zeroBasedLegNumber) {
final String selectedValue = legTypeBoxes[zeroBasedLegNumber].getSelectedValue();
return selectedValue == null || selectedValue.equals("null") ? null : ORCPerformanceCurveLegTypes.valueOf(selectedValue);
}
@Override
protected Widget getAdditionalWidget() {
final Grid result = new Grid(waypointList.getList().size()+1, 7);
int row = 0;
result.setWidget(row, 0, new Label(stringMessages.setAllLegsToType()));
result.setWidget(row, 1, commonLegTypeBox);
result.setWidget(row, 2, new Label(stringMessages.totalDistance()));
result.setWidget(row, 3, totalDistanceInNauticalMilesLabel);
result.setWidget(row, 4, new Label(stringMessages.desiredTotalDistanceInNauticalMiles()));
result.setWidget(row, 5, desiredTotalCourseDistanceInNauticalMilesBox);
result.setWidget(row, 6, spreadTotalDistanceProportionallyAcrossLegsButton);
row++;
// column headers:
result.setWidget(row, 1, new Label(stringMessages.legType()));
result.setWidget(row, 2, new Label(stringMessages.distanceInNauticalMiles()));
result.setWidget(row, 3, new Label(stringMessages.legTwaInDegrees()));
result.setWidget(row, 4, new Label(stringMessages.trackedDistanceInNauticalMiles()));
result.setWidget(row, 5, new Label(stringMessages.trackedTwaInDegrees()));
row++;
for (int i=0; i<waypointList.getList().size()-1; i++) {
final int index = i;
result.setWidget(row, 0, new Label(waypointList.getList().get(i).getName()+" - "+waypointList.getList().get(i+1).getName()));
result.setWidget(row, 1, legTypeBoxes[i]);
result.setWidget(row, 2, distanceInNauticalMilesBoxes[i]);
result.setWidget(row, 3, twaBoxes[i]);
result.setWidget(row, 4, trackedDistanceInNauticalMilesLabels[i]);
result.setWidget(row, 5, trackedTwaInDegreesLabels[i]);
final Button useTrackedDataButton = new Button(stringMessages.useTrackedData());
useTrackedDataButton.addClickHandler(e->{
twaBoxes[index].setValue(
trackingBasedCourseGeometry.length <= index || trackingBasedCourseGeometry[index] == null ? null
: trackingBasedCourseGeometry[index].getTwa().getDegrees());
distanceInNauticalMilesBoxes[index].setValue(
trackingBasedCourseGeometry.length <= index || trackingBasedCourseGeometry[index] == null ? null
: trackingBasedCourseGeometry[index].getLength().getNauticalMiles());
validateAndUpdate();
});
result.setWidget(row, 6, useTrackedDataButton);
row++;
}
return result;
}
private void spreadTotalDistance() {
final Double desiredTotalDistanceInNauticalMiles = desiredTotalCourseDistanceInNauticalMilesBox.getValue();
if (desiredTotalDistanceInNauticalMiles != null) {
final Distance desiredTotalDistance = new NauticalMileDistance(desiredTotalDistanceInNauticalMiles);
final ORCPerformanceCurveLegImpl[] legData = getResult();
final Distance currentTotalDistance = getEffectiveTotalDistance(legData);
Distance checkSum = Distance.NULL;
for (int zeroBasedLegIndex=0; zeroBasedLegIndex<waypointList.getList().size()-1; zeroBasedLegIndex++) {
final Distance effectiveLegDistance = getEffectiveLegDistance(legData, zeroBasedLegIndex);
final Distance newExplicitLegDistance = desiredTotalDistance.scale(effectiveLegDistance.divide(currentTotalDistance));
distanceInNauticalMilesBoxes[zeroBasedLegIndex].setValue(newExplicitLegDistance.getNauticalMiles());
checkSum = checkSum.add(effectiveLegDistance);
}
updateTotalDistanceLabel();
validateAndUpdate();
}
}
@Override
public FocusWidget getInitialFocusWidget() {
return desiredTotalCourseDistanceInNauticalMilesBox;
}
@Override
protected ORCPerformanceCurveLegImpl[] getResult() {
final ORCPerformanceCurveLegImpl[] result = new ORCPerformanceCurveLegImpl[waypointList.getList().size()-1];
for (int i=0; i<result.length; i++) {
final ORCPerformanceCurveLegTypes selectedLegType = getSelectedLegType(i);
if (selectedLegType == null) {
result[i] = null;
} else if (selectedLegType == ORCPerformanceCurveLegTypes.TWA) {
result[i] = new ORCPerformanceCurveLegImpl(
distanceInNauticalMilesBoxes[i].getValue() == null ? null
: new NauticalMileDistance(distanceInNauticalMilesBoxes[i].getValue()),
twaBoxes[i].getValue() == null ? null : new DegreeBearingImpl(twaBoxes[i].getValue()));
} else {
result[i] = new ORCPerformanceCurveLegImpl(distanceInNauticalMilesBoxes[i].getValue() == null ? null
: new NauticalMileDistance(distanceInNauticalMilesBoxes[i].getValue()), selectedLegType);
}
}
return result;
}
}
@@ -3,7 +3,6 @@ package com.sap.sailing.gwt.ui.adminconsole;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
@@ -20,6 +19,7 @@ import com.sap.sse.common.impl.DegreeBearingImpl;
import com.sap.sse.gwt.client.Notification;
import com.sap.sse.gwt.client.Notification.NotificationType;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DoubleBox;
/**
* An editor allowing users to specify the ORC Performance Curve leg type and distance, and in case of a
@@ -70,6 +70,9 @@ public class ORCPerformanceCurveLegDialog extends DataEntryDialog<ORCPerformance
twaBox = createDoubleBox(/* visibleLength */ 5);
if (orcLegParametersSoFar != null) {
distanceInNauticalMilesBox.setValue(orcLegParametersSoFar.getLength().getNauticalMiles());
if (orcLegParametersSoFar.getTwa() != null) {
twaBox.setValue(orcLegParametersSoFar.getTwa().getDegrees());
}
}
legTypeBox.addChangeHandler(e->updateFetchTrackingBasedDistanceAndTwaButtonEnabledState());
updateFetchTrackingBasedDistanceAndTwaButtonEnabledState();
@@ -77,8 +80,8 @@ public class ORCPerformanceCurveLegDialog extends DataEntryDialog<ORCPerformance
private void fetchTrackingBasedDistanceAndTwa() {
final int zeroBasedLegIndex = waypointList.getList().indexOf(forLegEndingAt)-1;
legGeometrySupplier.getLegGeometry(zeroBasedLegIndex,
new AsyncCallback<ORCPerformanceCurveLegImpl>() {
legGeometrySupplier.getLegGeometry(new int[] { zeroBasedLegIndex },
new AsyncCallback<ORCPerformanceCurveLegImpl[]>() {
@Override
public void onFailure(Throwable caught) {
GWT.log(caught.getMessage());
@@ -86,9 +89,9 @@ public class ORCPerformanceCurveLegDialog extends DataEntryDialog<ORCPerformance
}
@Override
public void onSuccess(ORCPerformanceCurveLegImpl legGeometry) {
twaBox.setValue(legGeometry.getTwa().getDegrees());
distanceInNauticalMilesBox.setValue(legGeometry.getLength().getNauticalMiles());
public void onSuccess(ORCPerformanceCurveLegImpl[] legGeometries) {
twaBox.setValue(legGeometries == null ? null : legGeometries[0].getTwa().getDegrees());
distanceInNauticalMilesBox.setValue(legGeometries == null ? null : legGeometries[0].getLength().getNauticalMiles());
validateAndUpdate();
}
});
@@ -125,16 +128,17 @@ public class ORCPerformanceCurveLegDialog extends DataEntryDialog<ORCPerformance
@Override
protected ORCPerformanceCurveLegImpl getResult() {
final ORCPerformanceCurveLegImpl result;
if (getSelectedLegType() == null) {
final ORCPerformanceCurveLegTypes selectedLegType = getSelectedLegType();
if (selectedLegType == null) {
result = null;
} else if (getSelectedLegType() == ORCPerformanceCurveLegTypes.TWA) {
} else if (selectedLegType == ORCPerformanceCurveLegTypes.TWA) {
result = new ORCPerformanceCurveLegImpl(
distanceInNauticalMilesBox.getValue() == null ? null
: new NauticalMileDistance(distanceInNauticalMilesBox.getValue()),
twaBox.getValue() == null ? null : new DegreeBearingImpl(twaBox.getValue()));
} else {
result = new ORCPerformanceCurveLegImpl(distanceInNauticalMilesBox.getValue() == null ? null
: new NauticalMileDistance(distanceInNauticalMilesBox.getValue()), getSelectedLegType());
: new NauticalMileDistance(distanceInNauticalMilesBox.getValue()), selectedLegType);
}
return result;
}
@@ -2,7 +2,6 @@ package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Date;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
@@ -16,6 +15,7 @@ import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.gwt.client.controls.datetime.DateAndTimeInput;
import com.sap.sse.gwt.client.controls.datetime.DateTimeInput.Accuracy;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DoubleBox;
public class PositionEntryDialog extends DataEntryDialogWithDateTimeBox<Pair<Position, TimePoint>> {
private final DoubleBox lat;
@@ -1,7 +1,6 @@
package com.sap.sailing.gwt.ui.adminconsole;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
@@ -12,6 +11,7 @@ import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DoubleBox;
/**
* Fills a {@link RaceColumnDTO} object by setting its {@link RaceColumnDTO#setMedalRace(boolean) medal race} property,
@@ -47,7 +47,6 @@ public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
@Override
public void onSuccess(Void result) {
Notification.notify(stringMessages.successfullyUpdatedCourse(), NotificationType.INFO);
refreshSelectedRaceData();
sailingService.setORCPerformanceCurveLegInfo(singleSelectedRace, getORCPerformanceCurveLegInfoByOneBasedWaypointIndex(), new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
@@ -56,6 +55,7 @@ public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
@Override
public void onSuccess(Void result) {
refreshSelectedRaceData();
}
});
}
@@ -64,7 +64,7 @@ public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
@Override
protected LegGeometrySupplier getLegGeometrySupplier() {
return (zeroBasedLegIndex, callback)->sailingService.getLegGeometry(singleSelectedRace, zeroBasedLegIndex, callback);
return (zeroBasedLegIndices, callback)->sailingService.getLegGeometry(singleSelectedRace, zeroBasedLegIndices, callback);
}
@Override
@@ -31,11 +31,9 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget {
final StringMessages stringMessages, final String leaderboardName, final String raceColumnName,
final String fleetName, final UserService userService) {
super(sailingService, errorReporter, stringMessages, userService);
this.leaderboardName = leaderboardName;
this.raceColumnName = raceColumnName;
this.fleetName = fleetName;
Button addMark = new Button(stringMessages.addMarkToRegatta());
addMark.addClickHandler(new ClickHandler() {
@Override
@@ -123,24 +121,6 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget {
marks.getTable().addColumn(actionColumn);
}
/**
* We cannot update the course here really, but we can at least try to update the ORC PCS leg data.
*/
@Override
protected void save() {
sailingService.setORCPerformanceCurveLegInfo(leaderboardName, raceColumnName, fleetName,
getORCPerformanceCurveLegInfoByOneBasedWaypointIndex(), new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(stringMessages.errorUpdatingRaceCourse(caught.getMessage()));
}
@Override
public void onSuccess(Void result) {
}
});
}
@Override
protected void markSelectionChanged() {
Set<MarkDTO> marksToRemove = marks.getSelectionModel().getSelectedSet();
@@ -222,6 +202,6 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget {
@Override
protected LegGeometrySupplier getLegGeometrySupplier() {
return (zeroBasedLegIndex, callback)->sailingService.getLegGeometry(leaderboardName, raceColumnName, fleetName, zeroBasedLegIndex, callback);
return (zeroBasedLegIndices, callback)->sailingService.getLegGeometry(leaderboardName, raceColumnName, fleetName, zeroBasedLegIndices, callback);
}
}
@@ -1,6 +1,7 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.List;
import java.util.Map;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
@@ -10,6 +11,7 @@ import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sailing.domain.common.orc.impl.ORCPerformanceCurveLegImpl;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.ControlPointDTO;
@@ -29,10 +31,12 @@ public class RaceLogTrackingCourseDefinitionDialog extends
public static class Result {
private final List<com.sap.sse.common.Util.Pair<ControlPointDTO, PassingInstruction>> waypoints;
private final Map<Integer, ORCPerformanceCurveLegImpl> orcLegData;
private final Integer priority;
public Result(List<Pair<ControlPointDTO, PassingInstruction>> waypoints, Integer priority) {
public Result(List<Pair<ControlPointDTO, PassingInstruction>> waypoints, Map<Integer, ORCPerformanceCurveLegImpl> orcLegData, Integer priority) {
super();
this.waypoints = waypoints;
this.orcLegData = orcLegData;
this.priority = priority;
}
public List<com.sap.sse.common.Util.Pair<ControlPointDTO, PassingInstruction>> getWaypoints() {
@@ -41,6 +45,9 @@ public class RaceLogTrackingCourseDefinitionDialog extends
public Integer getPriority() {
return priority;
}
public Map<Integer, ORCPerformanceCurveLegImpl> getORCLegData() {
return orcLegData;
}
}
public RaceLogTrackingCourseDefinitionDialog(final SailingServiceAsync sailingService,
@@ -90,6 +97,7 @@ public class RaceLogTrackingCourseDefinitionDialog extends
@Override
protected Result getResult() {
return new Result(courseManagementWidget.createWaypointPairs(), priorityBox.getValue());
return new Result(courseManagementWidget.createWaypointPairs(),
courseManagementWidget.getORCPerformanceCurveLegInfoByOneBasedWaypointIndex(), priorityBox.getValue());
}
}
@@ -373,7 +373,18 @@ public class SmartphoneTrackingEventManagementPanel
waypointPairs.getWaypoints(), waypointPairs.getPriority(), new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
loadAndRefreshLeaderboard(leaderboardName);
sailingService.setORCPerformanceCurveLegInfo(leaderboardName, raceColumnName, fleetName,
waypointPairs.getORCLegData(), new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(stringMessages.errorUpdatingRaceCourse(caught.getMessage()));
}
@Override
public void onSuccess(Void result) {
loadAndRefreshLeaderboard(leaderboardName);
}
});
}
@Override
@@ -11,6 +11,7 @@ import com.sap.sse.security.ui.client.component.DefaultActionsImagesBarCell;
public class WaypointImagesBarCell extends DefaultActionsImagesBarCell {
public static final String ACTION_ORC_PCS_DEFINE_LEG = "ACTION_DEFINE_LEG";
public static final String ACTION_ORC_PCS_DEFINE_ALL_LEGS = "ACTION_DEFINE_ALL_LEGS";
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
private final StringMessages stringMessages;
private final ListDataProvider<WaypointDTO> waypointList;
@@ -28,6 +29,8 @@ public class WaypointImagesBarCell extends DefaultActionsImagesBarCell {
imageSpecs.add(getDeleteImageSpec());
if (waypoint != waypointList.getList().get(0)) {
imageSpecs.add(new ImageSpec(ACTION_ORC_PCS_DEFINE_LEG, stringMessages.actionDefineLegForOrcPcs(), resources.orcPcsDefineLegIcon()));
} else {
imageSpecs.add(new ImageSpec(ACTION_ORC_PCS_DEFINE_ALL_LEGS, stringMessages.actionDefineAllLegsForOrcPcs(), resources.orcPcsDefineAllLegsIcon()));
}
return imageSpecs;
}
@@ -1190,10 +1190,10 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
boolean getTrackedRaceIsUsingMarkPassingCalculator(RegattaAndRaceIdentifier regattaNameAndRaceName);
ORCPerformanceCurveLegImpl getLegGeometry(String leaderboardName, String raceColumnName, String fleetName,
int zeroBasedLegIndex);
ORCPerformanceCurveLegImpl[] getLegGeometry(String leaderboardName, String raceColumnName, String fleetName,
int[] zeroBasedLegIndices);
ORCPerformanceCurveLegImpl getLegGeometry(RegattaAndRaceIdentifier singleSelectedRace, int zeroBasedLegIndex);
ORCPerformanceCurveLegImpl[] getLegGeometry(RegattaAndRaceIdentifier singleSelectedRace, int[] zeroBasedLegIndices);
/**
* @throws NotFoundException
@@ -1126,11 +1126,11 @@ public interface SailingServiceAsync extends FileStorageManagementGwtServiceAsyn
void getTrackedRaceIsUsingMarkPassingCalculator(RegattaAndRaceIdentifier regattaNameAndRaceName, AsyncCallback<Boolean> callback);
void getLegGeometry(String leaderboardName, String raceColumnName, String fleetName, int zeroBasedLegIndex,
AsyncCallback<ORCPerformanceCurveLegImpl> callback);
void getLegGeometry(String leaderboardName, String raceColumnName, String fleetName, int[] zeroBasedLegIndices,
AsyncCallback<ORCPerformanceCurveLegImpl[]> callback);
void getLegGeometry(RegattaAndRaceIdentifier singleSelectedRace, int zeroBasedLegIndex,
AsyncCallback<ORCPerformanceCurveLegImpl> callback);
void getLegGeometry(RegattaAndRaceIdentifier singleSelectedRace, int[] zeroBasedLegIndices,
AsyncCallback<ORCPerformanceCurveLegImpl[]> callback);
void getORCPerformanceCurveLegInfo(String leaderboardName, String raceColumnName, String fleetName,
AsyncCallback<Map<Integer, ORCPerformanceCurveLegImpl>> asyncCallback);
@@ -2270,9 +2270,11 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String protestTimeInMinutes();
String updateCertificates();
String actionDefineLegForOrcPcs();
String actionDefineAllLegsForOrcPcs();
String importCertificates();
String assignCertificates();
String orcPerformanceCurveLeg();
String orcPerformanceCurveLegs();
String orcPerformanceCurveLegName(int i, String name);
String orcPerformanceCurveFetchTrackedLegGeometry();
String distanceInNauticalMiles();
@@ -2289,4 +2291,11 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String certificateIssuingDate();
String errorAssigningCertificates(String message);
String insertedAndReplacedAndRemovedCertificateAssignments(int inserted, int replaced, int removed);
String spreadTotalDistanceProportionallyAcrossLegs();
String trackedTwaInDegrees();
String trackedDistanceInNauticalMiles();
String useTrackedData();
String totalDistance();
String setAllLegsToType();
String desiredTotalDistanceInNauticalMiles();
}
@@ -2274,9 +2274,11 @@ gateOpeningTime=Gate opening time
protestTimeInMinutes=Protest time in minutes
updateCertificates=Modify ORC certificates associated with competitors/boats
actionDefineLegForOrcPcs=Define leg for ORC Performance-Curve Scoring
actionDefineAllLegsForOrcPcs=Define all legs for ORC Performance-Curve Scoring to be of same type
importCertificates=Import Certificates
assignCertificates=Assign Certificates
orcPerformanceCurveLeg=ORC Performance Curve Leg
orcPerformanceCurveLegs=ORC Performance Curve Legs
orcPerformanceCurveLegName=Leg #{0} ending at waypoint {1}
orcPerformanceCurveFetchTrackedLegGeometry=Use tracked leg geometry
distanceInNauticalMiles=Distance in Nautical Miles
@@ -2292,4 +2294,11 @@ filterCertificates=Filter certificates by boat name, sail number, ...
errorUnableToGetBoatsForRegatta=Error trying to obtain the boats for regatta {0}: {1}
certificateIssuingDate=Issued
errorAssigningCertificates=Error assigning certificates to boats: {0}
insertedAndReplacedAndRemovedCertificateAssignments=New certificate assignments: {0}. Assignments replaced: {1}. Assignments removed: {2}
insertedAndReplacedAndRemovedCertificateAssignments=New certificate assignments: {0}. Assignments replaced: {1}. Assignments removed: {2}
spreadTotalDistanceProportionallyAcrossLegs=Spread total distance proportionally across legs
trackedTwaInDegrees=Tracked TWA (°)
trackedDistanceInNauticalMiles=Tracked leg distance (NM)
useTrackedData=Use tracked leg data
totalDistance=Total Distance (NM)
setAllLegsToType=Set all legs to type
desiredTotalDistanceInNauticalMiles=Desired Total Distance (NM)
@@ -2266,9 +2266,11 @@ gateOpeningTime=Torstart Öffnungsdauer
protestTimeInMinutes=Protestzeit in Minuten
updateCertificates=Bearbeiten der ORC Zertifikate für Teilnehmer/Boote
actionDefineLegForOrcPcs=Bahnschenkel-Eigenschaften für ORC Performance Curve-Wertung festlegen
actionDefineAllLegsForOrcPcs=Eigenschaften für alle Bahnschenkel für ORC Performance Curve-Wertung gemeinsam festlegen
importCertificates=Zertifikate importieren
assignCertificates=Zertikate zuweisen
orcPerformanceCurveLeg=ORC Performance Curve Bahnschenkel
orcPerformanceCurveLeg=ORC Performance Curve Bahnschenkel
orcPerformanceCurveLegName=Bahnschenkel Nr. {0} zum Wegpunkt {1}
orcPerformanceCurveFetchTrackedLegGeometry=Getrackte Leg-Geometrie verwenden
distanceInNauticalMiles=Distanz in Seemeilen
@@ -2284,4 +2286,11 @@ filterCertificates=Zertifikate filtern nach Segelnummer, Bootsname, ...
errorUnableToGetBoatsForRegatta=Fehler beim Laden der Boote für Regatta {0}: {1}
certificateIssuingDate=Ausgestellt
errorAssigningCertificates: Fehler beim Zuweisen von Zertifikaten zu Booten: {0}
insertedAndReplacedAndRemovedCertificateAssignments=Neue Zertifikatszuweisungen: {0}. Geänderte Zuweisungen: {1}. Gelöschte Zuweisungen: {2}.
insertedAndReplacedAndRemovedCertificateAssignments=Neue Zertifikatszuweisungen: {0}. Geänderte Zuweisungen: {1}. Gelöschte Zuweisungen: {2}.
spreadTotalDistanceProportionallyAcrossLegs=Gesamtdistanz proportional auf Bahnschenkel verteilen
trackedTwaInDegrees=Getrackter TWA (°)
trackedDistanceInNauticalMiles=Getrackte Schenkel-Distanz (NM)
useTrackedData=Tracking-Werte verwenden
totalDistance=Gesamtdistanz (NM)
setAllLegsToType=Typ für alle Bahnschenkel setzen
desiredTotalDistanceInNauticalMiles=Gewünschte Gesamtdistanz (NM)
@@ -1,6 +1,5 @@
package com.sap.sailing.gwt.ui.client;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Label;
@@ -9,6 +8,7 @@ import com.sap.sailing.domain.common.security.SecuredDomainType;
import com.sap.sailing.gwt.ui.shared.RaceWithCompetitorsAndBoatsDTO;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.dialog.DoubleBox;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
import com.sap.sse.security.ui.client.UserService;
@@ -1,6 +1,5 @@
package com.sap.sailing.gwt.ui.client.shared.charts;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
@@ -8,6 +7,7 @@ import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.dialog.DoubleBox;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
public abstract class AbstractChartSettingsComponent<SettingsType extends ChartSettings> implements SettingsDialogComponent<SettingsType> {
@@ -9,7 +9,6 @@ import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
@@ -29,6 +28,7 @@ import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.controls.IntegerBox;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.dialog.DoubleBox;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
/**
@@ -1,7 +1,6 @@
package com.sap.sailing.gwt.ui.datamining.presentation;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
@@ -14,6 +13,7 @@ import com.sap.sse.common.Duration;
import com.sap.sse.common.impl.MillisecondsDurationImpl;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.dialog.DoubleBox;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
/**
@@ -1,12 +1,12 @@
package com.sap.sailing.gwt.ui.leaderboardedit;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DoubleBox;
public class EditCarryValueDialog extends DataEntryDialog<Double> {
private final DoubleBox carriedPointsBox;
@@ -2,7 +2,6 @@ package com.sap.sailing.gwt.ui.leaderboardedit;
import java.util.Arrays;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
@@ -12,6 +11,7 @@ import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DoubleBox;
public class EditScoreDialog extends DataEntryDialog<Util.Pair<MaxPointsReason, Double>> {
private final ListBox maxPointsBox;
@@ -1,6 +1,5 @@
package com.sap.sailing.gwt.ui.polarmining;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
@@ -14,6 +13,7 @@ import com.sap.sailing.polars.datamining.shared.PolarDataMiningSettings;
import com.sap.sse.common.impl.MillisecondsDurationImpl;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.dialog.DoubleBox;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
/**
@@ -1,7 +1,6 @@
package com.sap.sailing.gwt.ui.polarmining;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
@@ -13,6 +12,7 @@ import com.sap.sailing.polars.datamining.shared.PolarDataMiningSettingsImpl;
import com.sap.sse.gwt.client.controls.IntegerBox;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.dialog.DoubleBox;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
/**
@@ -9345,8 +9345,8 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
}
@Override
public ORCPerformanceCurveLegImpl getLegGeometry(String leaderboardName, String raceColumnName, String fleetName, int zeroBasedLegIndex) {
ORCPerformanceCurveLegImpl result = null;
public ORCPerformanceCurveLegImpl[] getLegGeometry(String leaderboardName, String raceColumnName, String fleetName, int[] zeroBasedLegIndices) {
ORCPerformanceCurveLegImpl[] result = null;
final Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
if (leaderboard != null) {
final RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
@@ -9355,7 +9355,10 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
if (fleet != null) {
final TrackedRace trackedRace = raceColumn.getTrackedRace(fleet);
if (trackedRace != null) {
result = getLegGeometry(zeroBasedLegIndex, trackedRace);
result = new ORCPerformanceCurveLegImpl[zeroBasedLegIndices.length];
for (int i=0; i<zeroBasedLegIndices.length; i++) {
result[i] = getLegGeometry(zeroBasedLegIndices[i], trackedRace);
}
}
}
}
@@ -9364,9 +9367,13 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
}
@Override
public ORCPerformanceCurveLegImpl getLegGeometry(RegattaAndRaceIdentifier regattaNameAndRaceName, int zeroBasedLegIndex) {
public ORCPerformanceCurveLegImpl[] getLegGeometry(RegattaAndRaceIdentifier regattaNameAndRaceName, int[] zeroBasedLegIndices) {
final TrackedRace trackedRace = getExistingTrackedRace(regattaNameAndRaceName);
return getLegGeometry(zeroBasedLegIndex, trackedRace);
final ORCPerformanceCurveLegImpl[] result = new ORCPerformanceCurveLegImpl[zeroBasedLegIndices.length];
for (int i=0; i<zeroBasedLegIndices.length; i++) {
result[i] = getLegGeometry(zeroBasedLegIndices[i], trackedRace);
}
return result;
}
private ORCPerformanceCurveLegImpl getLegGeometry(int zeroBasedLegIndex, final TrackedRace trackedRace) {
Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

@@ -23,7 +23,6 @@ import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.DoubleBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
@@ -377,7 +376,7 @@ public abstract class DataEntryDialog<T> {
}
private DoubleBox createDoubleBoxInternal(Double initialValue, int visibleLength) {
DoubleBox doubleBox = new DoubleBox();
final DoubleBox doubleBox = new DoubleBox();
doubleBox.setVisibleLength(visibleLength);
doubleBox.setValue(initialValue);
DialogUtils.addFocusUponKeyUpToggler(doubleBox);
@@ -0,0 +1,50 @@
package com.sap.sse.gwt.client.dialog;
import java.text.ParseException;
import com.google.gwt.dom.client.Document;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.text.shared.AbstractRenderer;
import com.google.gwt.text.shared.Parser;
import com.google.gwt.user.client.ui.ValueBox;
public class DoubleBox extends ValueBox<Double> {
private static class PreciseDoubleRenderer extends AbstractRenderer<Double> {
private final NumberFormat format;
public PreciseDoubleRenderer(NumberFormat format) {
this.format = format;
}
@Override
public String render(Double object) {
final String result;
if (object == null) {
result = "";
} else {
result = format.format(object);
}
return result;
}
}
public DoubleBox() {
this(NumberFormat.getDecimalFormat().overrideFractionDigits(0, 1000));
}
private DoubleBox(NumberFormat format) {
super(Document.get().createTextInputElement(), new PreciseDoubleRenderer(format), new Parser<Double>() {
@Override
public Double parse(CharSequence text) throws ParseException {
final String s = text.toString();
final Double result;
if (s.trim().equals("")) {
result = null;
} else {
result = format.parse(text.toString());
}
return result;
}
});
}
}