mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-25 06:58:39 +00:00
provide an overall ORC PCS course / legs details editor
Change-Id: I397aa8dc35b9eab25bcfc35975e2259b06b2955a
This commit is contained in:
+1
-1
@@ -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> {
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+4
-1
@@ -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();
|
||||
}
|
||||
+1
-1
@@ -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>
|
||||
|
||||
+84
-19
@@ -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() {
|
||||
}
|
||||
|
||||
+278
@@ -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;
|
||||
}
|
||||
}
|
||||
+13
-9
@@ -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;
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
-1
@@ -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,
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
+1
-21
@@ -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);
|
||||
}
|
||||
}
|
||||
+10
-2
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
+12
-1
@@ -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
|
||||
|
||||
+3
@@ -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;
|
||||
}
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
+4
-4
@@ -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);
|
||||
|
||||
+9
@@ -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();
|
||||
}
|
||||
|
||||
+10
-1
@@ -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)
|
||||
+10
-1
@@ -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
-1
@@ -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
-1
@@ -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> {
|
||||
|
||||
+1
-1
@@ -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
-1
@@ -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
-1
@@ -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;
|
||||
|
||||
+1
-1
@@ -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
-1
@@ -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
-1
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
+12
-5
@@ -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) {
|
||||
|
||||
BIN
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;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user