diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java index e9857ef7587..e1b65cc6a10 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/DetailType.java @@ -21,10 +21,8 @@ public enum DetailType implements Serializable { RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS(2, DESCENDING), RACE_GAP_TO_LEADER_IN_SECONDS(0, ASCENDING), RACE_DISTANCE_TO_LEADER_IN_METERS(0, ASCENDING), RACE_AVERAGE_CROSS_TRACK_ERROR_IN_METERS(0, ASCENDING), WINDWARD_DISTANCE_TO_OVERALL_LEADER(0, ASCENDING), - HEAD_UP(0, ASCENDING), BEAR_AWAY(0, ASCENDING), TACK(0, ASCENDING), JIBE(0, ASCENDING), PENALTY_CIRCLE(0, ASCENDING), AVERAGE_MANEUVER_LOSS_IN_METERS(1, ASCENDING), - AVERAGE_TACK_LOSS_IN_METERS(1, ASCENDING), AVERAGE_JIBE_LOSS_IN_METERS(1, ASCENDING), - MARK_PASSING(0, ASCENDING), CURRENT_LEG(0, ASCENDING), + AVERAGE_TACK_LOSS_IN_METERS(1, ASCENDING), AVERAGE_JIBE_LOSS_IN_METERS(1, ASCENDING), CURRENT_LEG(0, ASCENDING), DISPLAY_LEGS(0, NONE), TIME_TRAVELED(0, ASCENDING), TOTAL_TIME_SAILED_DOWNWIND_IN_SECONDS(1, ASCENDING), TOTAL_TIME_SAILED_UPWIND_IN_SECONDS(1, ASCENDING), diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SafeHtmlHeaderWithTooltipTest.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SafeHtmlHeaderWithTooltipTest.java new file mode 100644 index 00000000000..92a2bcf1c58 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SafeHtmlHeaderWithTooltipTest.java @@ -0,0 +1,27 @@ +package com.sap.sailing.gwt.ui.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.sap.sailing.gwt.ui.leaderboard.SafeHtmlHeaderWithTooltip; + +public class SafeHtmlHeaderWithTooltipTest { + + @Test + public void textCreation() { + SafeHtmlBuilder titleBuilder = new SafeHtmlBuilder().appendEscaped("Title Text"); + SafeHtmlHeaderWithTooltip header = new SafeHtmlHeaderWithTooltip(titleBuilder.toSafeHtml(), "Tooltip"); + assertEquals("Title Text", header.getValue().asString()); + + titleBuilder = new SafeHtmlBuilder().appendEscapedLines("Title\nText"); + header = new SafeHtmlHeaderWithTooltip(titleBuilder.toSafeHtml(), "Tooltip"); + assertEquals("Title
Text", header.getValue().asString()); + + titleBuilder = new SafeHtmlBuilder().appendEscaped("Title Text"); + header = new SafeHtmlHeaderWithTooltip(titleBuilder.toSafeHtml(), "Tooltip with\nline break."); + assertEquals("Title Text", header.getValue().asString()); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractTrackedRacesListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractTrackedRacesListComposite.java new file mode 100644 index 00000000000..30bd49c7519 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractTrackedRacesListComposite.java @@ -0,0 +1,562 @@ +package com.sap.sailing.gwt.ui.adminconsole; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.KeyUpEvent; +import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; +import com.google.gwt.safehtml.client.SafeHtmlTemplates; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; +import com.google.gwt.text.client.DateTimeFormatRenderer; +import com.google.gwt.user.cellview.client.CellTable; +import com.google.gwt.user.cellview.client.Column; +import com.google.gwt.user.cellview.client.ColumnSortEvent; +import com.google.gwt.user.cellview.client.ColumnSortList; +import com.google.gwt.user.cellview.client.TextColumn; +import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.view.client.ListDataProvider; +import com.google.gwt.view.client.MultiSelectionModel; +import com.google.gwt.view.client.SelectionChangeEvent; +import com.google.gwt.view.client.SelectionModel; +import com.google.gwt.view.client.SingleSelectionModel; +import com.google.gwt.view.client.SelectionChangeEvent.Handler; +import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; +import com.sap.sailing.domain.common.RegattaNameAndRaceName; +import com.sap.sailing.gwt.ui.client.ErrorReporter; +import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener; +import com.sap.sailing.gwt.ui.client.RaceSelectionProvider; +import com.sap.sailing.gwt.ui.client.RegattaDisplayer; +import com.sap.sailing.gwt.ui.client.RegattaRefresher; +import com.sap.sailing.gwt.ui.client.SailingServiceAsync; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.client.URLFactory; +import com.sap.sailing.gwt.ui.shared.RaceDTO; +import com.sap.sailing.gwt.ui.shared.RegattaDTO; +import com.sap.sailing.gwt.ui.shared.components.Component; +import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; + +public abstract class AbstractTrackedRacesListComposite extends SimplePanel implements Component, + RegattaDisplayer, RaceSelectionChangeListener { + + protected final long DEFAULT_LIVE_DELAY_IN_MILLISECONDS = 5000; + + private final boolean multiSelection; + + private boolean dontFireNextSelectionChangeEvent; + + private final SelectionModel selectionModel; + + private final CellTable raceTable; + + private ListDataProvider raceList; + + private Iterable allRaces; + + private final VerticalPanel panel; + + private DateTimeFormatRenderer dateFormatter = new DateTimeFormatRenderer( + DateTimeFormat.getFormat(PredefinedFormat.DATE_SHORT)); + private DateTimeFormatRenderer timeFormatter = new DateTimeFormatRenderer( + DateTimeFormat.getFormat(PredefinedFormat.TIME_LONG)); + + private final Label noTrackedRacesLabel; + + protected final SailingServiceAsync sailingService; + protected final ErrorReporter errorReporter; + protected final RegattaRefresher regattaRefresher; + private final RaceSelectionProvider raceSelectionProvider; + protected final StringMessages stringMessages; + + private final Button btnRefresh; + + private final TextBox filterRacesTextbox; + + protected final TrackedRacesSettings settings; + + public static class AnchorCell extends AbstractCell { + + @Override + public void render(com.google.gwt.cell.client.Cell.Context context, SafeHtml safeHtml, SafeHtmlBuilder sb) { + sb.append(safeHtml); + } + } + + interface AnchorTemplates extends SafeHtmlTemplates { + @SafeHtmlTemplates.Template("{1}") + SafeHtml cell(String url, String displayName); + } + + private static AnchorTemplates ANCHORTEMPLATE = GWT.create(AnchorTemplates.class); + + public AbstractTrackedRacesListComposite(final SailingServiceAsync sailingService, + final ErrorReporter errorReporter, final RegattaRefresher regattaRefresher, + RaceSelectionProvider raceSelectionProvider, final StringMessages stringMessages, boolean hasMultiSelection) { + this.sailingService = sailingService; + this.errorReporter = errorReporter; + this.regattaRefresher = regattaRefresher; + this.multiSelection = hasMultiSelection; + this.raceSelectionProvider = raceSelectionProvider; + this.stringMessages = stringMessages; + + raceList = new ListDataProvider(); + selectionModel = multiSelection ? new MultiSelectionModel() : new SingleSelectionModel(); + settings = new TrackedRacesSettings(); + settings.setDelayToLiveInSeconds(DEFAULT_LIVE_DELAY_IN_MILLISECONDS / 1000l); + + panel = new VerticalPanel(); + setWidget(panel); + + HorizontalPanel filterPanel = new HorizontalPanel(); + panel.add(filterPanel); + Label lblFilterRaces = new Label(stringMessages.filterRacesByName() + ":"); + lblFilterRaces.setWordWrap(false); + filterPanel.setSpacing(5); + filterPanel.add(lblFilterRaces); + filterPanel.setCellVerticalAlignment(lblFilterRaces, HasVerticalAlignment.ALIGN_MIDDLE); + filterRacesTextbox = new TextBox(); + filterRacesTextbox.addKeyUpHandler(new KeyUpHandler() { + @Override + public void onKeyUp(KeyUpEvent event) { + fillRaceListFromAvailableRacesApplyingFilter(); + } + }); + filterPanel.add(filterRacesTextbox); + + noTrackedRacesLabel = new Label(stringMessages.noRacesYet()); + noTrackedRacesLabel.setWordWrap(false); + panel.add(noTrackedRacesLabel); + + AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class); + raceTable = new CellTable(/* pageSize */10000, tableRes); + raceTable.ensureDebugId("TrackedRaces"); + ListHandler columnSortHandler = setupTableColumns(stringMessages); + raceTable.setWidth("300px"); + raceTable.setSelectionModel(selectionModel); + raceTable.setVisible(false); + panel.add(raceTable); + raceList.addDataDisplay(raceTable); + raceTable.addColumnSortHandler(columnSortHandler); + raceTable.getSelectionModel().addSelectionChangeHandler(new Handler() { + @Override + public void onSelectionChange(SelectionChangeEvent event) { + List selectedRaces = getSelectedRaces(); + makeControlsReactToSelectionChange(selectedRaces); + if (dontFireNextSelectionChangeEvent) { + dontFireNextSelectionChangeEvent = false; + } else { + List selectedRaceIdentifiers = new ArrayList(); + for (RaceDTO selectedRace : selectedRaces) { + selectedRaceIdentifiers.add(selectedRace.getRaceIdentifier()); + } + AbstractTrackedRacesListComposite.this.raceSelectionProvider.setSelection(selectedRaceIdentifiers, + AbstractTrackedRacesListComposite.this); + } + } + }); + HorizontalPanel trackedRacesButtonPanel = new HorizontalPanel(); + trackedRacesButtonPanel.setSpacing(10); + panel.add(trackedRacesButtonPanel); + + btnRefresh = new Button(stringMessages.refresh()); + btnRefresh.ensureDebugId("Refresh"); + btnRefresh.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + regattaRefresher.fillRegattas(); + } + }); + trackedRacesButtonPanel.add(btnRefresh); + + addControlButtons(trackedRacesButtonPanel); + + } + + abstract protected void makeControlsReactToSelectionChange(List selectedRaces); + + abstract protected void addControlButtons(HorizontalPanel trackedRacesButtonPanel); + + private ListHandler setupTableColumns(final StringMessages stringMessages) { + ListHandler columnSortHandler = new ListHandler(raceList.getList()); + TextColumn regattaNameColumn = new TextColumn() { + @Override + public String getValue(RaceDTO raceDTO) { + return raceDTO.getRegattaName(); + } + }; + regattaNameColumn.setSortable(true); + + columnSortHandler.setComparator(regattaNameColumn, new Comparator() { + @Override + public int compare(RaceDTO t1, RaceDTO t2) { + String regatta1Name = t1.getRegattaName(); + String regatta2Name = t2.getRegattaName(); + boolean ascending = isSortedAscending(); + if (regatta1Name.equals(regatta2Name)) { + return 0; + } + int val = ascending ? regatta1Name.compareTo(regatta2Name) : -(regatta2Name.compareTo(regatta1Name)); + return val; + } + + private boolean isSortedAscending() { + ColumnSortList sortList = raceTable.getColumnSortList(); + return sortList.size() > 0 & sortList.get(0).isAscending(); + } + }); + + TextColumn boatClassNameColumn = new TextColumn() { + @Override + public String getValue(RaceDTO raceDTO) { + return raceDTO.boatClass == null ? "" : raceDTO.boatClass; + } + }; + boatClassNameColumn.setSortable(true); + + columnSortHandler.setComparator(boatClassNameColumn, new Comparator() { + @Override + public int compare(RaceDTO t1, RaceDTO t2) { + String boatClass1 = t1.boatClass; + String boatClass2 = t2.boatClass; + boolean ascending = isSortedAscending(); + if (boatClass1.equals(boatClass2)) { + return 0; + } + int val = ascending ? boatClass1.compareTo(boatClass2) : -(boatClass2.compareTo(boatClass1)); + return val; + } + + private boolean isSortedAscending() { + ColumnSortList sortList = raceTable.getColumnSortList(); + return sortList.size() > 0 & sortList.get(0).isAscending(); + } + }); + + AnchorCell anchorCell = new AnchorCell(); + Column raceNameColumn = new Column(anchorCell) { + @Override + public SafeHtml getValue(RaceDTO raceDTO) { + if (raceDTO.isTracked == true) { + RegattaNameAndRaceName raceIdentifier = (RegattaNameAndRaceName) raceDTO.getRaceIdentifier(); + String debugParam = Window.Location.getParameter("gwt.codesvr"); + String link = URLFactory.INSTANCE.encode("/gwt/RaceBoard.html?raceName=" + + raceIdentifier.getRaceName() + "®attaName=" + raceIdentifier.getRegattaName() + + ((debugParam != null && !debugParam.isEmpty()) ? "&gwt.codesvr=" + debugParam : "")); + return ANCHORTEMPLATE.cell(link, raceDTO.name); + } else { + return SafeHtmlUtils.fromString(raceDTO.name); + } + } + }; + + raceNameColumn.setSortable(true); + + columnSortHandler.setComparator(raceNameColumn, new Comparator() { + @Override + public int compare(RaceDTO t1, RaceDTO t2) { + boolean ascending = isSortedAscending(); + if (t1.name.equals(t2.name)) { + return 0; + } + int val = -1; + val = (t1 != null && t2 != null && ascending) ? (t1.name.compareTo(t2.name)) : -(t2.name + .compareTo(t1.name)); + return val; + } + + private boolean isSortedAscending() { + ColumnSortList sortList = raceTable.getColumnSortList(); + return sortList.size() > 0 & sortList.get(0).isAscending(); + } + }); + + TextColumn raceStartColumn = new TextColumn() { + @Override + public String getValue(RaceDTO raceDTO) { + if (raceDTO.startOfRace != null) { + return dateFormatter.render(raceDTO.startOfRace) + " " + timeFormatter.render(raceDTO.startOfRace); + } + + return ""; + } + }; + raceStartColumn.setSortable(true); + + columnSortHandler.setComparator(raceStartColumn, new Comparator() { + @Override + public int compare(RaceDTO t1, RaceDTO t2) { + if (t1.startOfRace != null && t2.startOfRace != null) { + boolean ascending = isSortedAscending(); + int val = -1; + val = (t1.startOfRace.after(t2.startOfRace) && ascending) ? 1 : -1; + return val; + } + return 0; + } + + private boolean isSortedAscending() { + ColumnSortList sortList = raceTable.getColumnSortList(); + return sortList.size() > 0 & sortList.get(0).isAscending(); + } + }); + + TextColumn raceTrackedColumn = new TextColumn() { + @Override + public String getValue(RaceDTO raceDTO) { + if (raceDTO.isTracked == true) + return stringMessages.tracked(); + + return ""; + } + }; + + TextColumn hasWindDataColumn = new TextColumn() { + @Override + public String getValue(RaceDTO raceDTO) { + if (raceDTO.trackedRace != null && raceDTO.trackedRace.hasWindData == true) + return stringMessages.yes(); + else + return stringMessages.no(); + } + }; + + TextColumn hasGPSDataColumn = new TextColumn() { + @Override + public String getValue(RaceDTO raceDTO) { + if (raceDTO.trackedRace != null && raceDTO.trackedRace.hasGPSData == true) { + return stringMessages.yes(); + } else { + return stringMessages.no(); + } + } + }; + + TextColumn raceLiveDelayColumn = new TextColumn() { + @Override + public String getValue(RaceDTO raceDTO) { + if (raceDTO.isTracked && raceDTO.trackedRace != null && raceDTO.trackedRace.delayToLiveInMs > 0) { + return "" + raceDTO.trackedRace.delayToLiveInMs / 1000; + } + return ""; + } + }; + + raceTable.addColumn(regattaNameColumn, stringMessages.regatta()); + raceTable.addColumn(boatClassNameColumn, stringMessages.boatClass()); + raceTable.addColumn(raceNameColumn, stringMessages.race()); + raceTable.addColumn(raceStartColumn, stringMessages.startTime()); + raceTable.addColumn(raceTrackedColumn, stringMessages.tracked()); + raceTable.addColumn(hasWindDataColumn, "Wind data"); + raceTable.addColumn(hasGPSDataColumn, "GPS data"); + + raceTable.addColumn(raceLiveDelayColumn, stringMessages.delayInSeconds()); + return columnSortHandler; + } + + private void fillRaceListFromAvailableRacesApplyingFilter() { + String text = filterRacesTextbox.getText(); + List wordsToFilter = Arrays.asList(text.split(" ")); + raceList.getList().clear(); + if (text != null && !text.isEmpty()) { + for (RaceDTO raceDTO : getAllRaces()) { + boolean failed = false; + for (String word : wordsToFilter) { + String textAsUppercase = word.toUpperCase().trim(); + if (!raceDTO.getRegattaName().toUpperCase().contains(textAsUppercase) + && !raceDTO.boatClass.toUpperCase().contains(textAsUppercase) + && !raceDTO.name.toUpperCase().contains(textAsUppercase)) { + failed = true; + break; + } + } + if (!failed) { + raceList.getList().add(raceDTO); + } + } + } else { + for (RaceDTO raceFromAllRaces : getAllRaces()) { + raceList.getList().add(raceFromAllRaces); + } + } + // now sort again according to selected criterion + ColumnSortEvent.fire(raceTable, raceTable.getColumnSortList()); + onRaceSelectionChange(raceSelectionProvider.getSelectedRaces()); // update selection based on underlying domain + // race selection model + } + + @Override + public void onRaceSelectionChange(List selectedRaces) { + for (RaceDTO raceFromAllRaces : raceList.getList()) { + selectionModel.setSelected(raceFromAllRaces, selectedRaces.contains(raceFromAllRaces.getRaceIdentifier())); + } + } + + private Iterable getAllRaces() { + return allRaces; + } + + @Override + public boolean hasSettings() { + return true; + } + + @Override + public SettingsDialogComponent getSettingsDialogComponent() { + return new TrackedRacesSettingsDialogComponent(settings, stringMessages); + } + + @Override + public void updateSettings(TrackedRacesSettings newSettings) { + settings.setDelayToLiveInSeconds(newSettings.getDelayToLiveInSeconds()); + + // set the new delay to all selected races + List raceIdentifiersToUpdate = new ArrayList(); + for (RaceDTO raceDTO : getSelectedRaces()) { + raceIdentifiersToUpdate.add(raceDTO.getRaceIdentifier()); + } + + if (raceIdentifiersToUpdate != null && !raceIdentifiersToUpdate.isEmpty()) { + sailingService.updateRacesDelayToLive(raceIdentifiersToUpdate, settings.getDelayToLiveInSeconds() * 1000l, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter + .reportError("Exception trying to set the delay to live for the selected tracked races: " + + caught.getMessage()); + } + + @Override + public void onSuccess(Void result) { + regattaRefresher.fillRegattas(); + } + }); + } + } + + @Override + public String getLocalizedShortName() { + return "Tracked races"; + } + + @Override + public Widget getEntryWidget() { + return this; + } + + public void addRaceSelectionChangeListener(RaceSelectionChangeListener listener) { + this.raceSelectionProvider.addRaceSelectionChangeListener(listener); + } + + public RaceDTO getRaceByIdentifier(RaceIdentifier raceIdentifier) { + RaceDTO result = null; + if (raceList != null) { + for (RaceDTO race : raceList.getList()) { + if (race.getRaceIdentifier().equals(raceIdentifier)) { + result = race; + break; + } + } + } + return result; + } + + List getSelectedRaces() { + List result = new ArrayList(); + if (raceList != null) { + for (RaceDTO race : raceList.getList()) { + if (selectionModel.isSelected(race)) { + result.add(race); + } + } + } + return result; + } + + public void selectRaceByIdentifier(RegattaAndRaceIdentifier raceIdentifier) { + if (raceList != null) { + for (RaceDTO race : raceList.getList()) { + String regattaName = race.getRegattaName(); + if (regattaName.equals(raceIdentifier.getRegattaName()) + && race.name.equals(raceIdentifier.getRaceName())) { + dontFireNextSelectionChangeEvent = true; + selectionModel.setSelected(race, true); + break; + } + } + } + } + + public void clearSelection() { + List emptySelection = Collections.emptyList(); + raceSelectionProvider.setSelection(emptySelection, /* listenersNotToNotify */this); + if (raceList != null) { + for (RaceDTO race : raceList.getList()) { + selectionModel.setSelected(race, false); + } + } + } + + @Override + public void fillRegattas(List regattas) { + makeControlsReactToFillRegattas(regattas); + if (regattas.isEmpty()) { + raceTable.setVisible(false); + noTrackedRacesLabel.setVisible(true); + } else { + raceTable.setVisible(true); + noTrackedRacesLabel.setVisible(false); + } + List newAllRaces = new ArrayList(); + List newAllRegattas = new ArrayList(); + List newAllRaceIdentifiers = new ArrayList(); + for (RegattaDTO regatta : regattas) { + newAllRegattas.add(regatta); + for (RaceDTO race : regatta.races) { + if (race != null) { + if (raceIsToBeAddedToList(race)) { + newAllRaces.add(race); + newAllRaceIdentifiers.add(race.getRaceIdentifier()); + } + } + } + } + allRaces = newAllRaces; + fillRaceListFromAvailableRacesApplyingFilter(); + raceSelectionProvider.setAllRaces(newAllRaceIdentifiers); // have this object be notified; triggers + // onRaceSelectionChange + } + + /** + * Allows applying some sort of filter to the process of adding races. + * Defaults to true in standard implementation. Override for custom behavior + * @param race + * @return + */ + protected boolean raceIsToBeAddedToList(RaceDTO race) { + return true; + } + + abstract protected void makeControlsReactToFillRegattas(List regattas); + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java index 2c4aceda426..6c32f850a08 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/TrackedRacesListComposite.java @@ -1,419 +1,44 @@ package com.sap.sailing.gwt.ui.adminconsole; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; -import com.google.gwt.cell.client.AbstractCell; -import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.event.dom.client.KeyUpEvent; -import com.google.gwt.event.dom.client.KeyUpHandler; -import com.google.gwt.i18n.client.DateTimeFormat; -import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; -import com.google.gwt.safehtml.client.SafeHtmlTemplates; -import com.google.gwt.safehtml.shared.SafeHtml; -import com.google.gwt.safehtml.shared.SafeHtmlBuilder; -import com.google.gwt.safehtml.shared.SafeHtmlUtils; -import com.google.gwt.text.client.DateTimeFormatRenderer; -import com.google.gwt.user.cellview.client.CellTable; -import com.google.gwt.user.cellview.client.Column; -import com.google.gwt.user.cellview.client.ColumnSortEvent; -import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler; -import com.google.gwt.user.cellview.client.ColumnSortList; -import com.google.gwt.user.cellview.client.TextColumn; -import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.SimplePanel; -import com.google.gwt.user.client.ui.TextBox; -import com.google.gwt.user.client.ui.VerticalPanel; -import com.google.gwt.user.client.ui.Widget; -import com.google.gwt.view.client.ListDataProvider; -import com.google.gwt.view.client.MultiSelectionModel; -import com.google.gwt.view.client.SelectionChangeEvent; -import com.google.gwt.view.client.SelectionChangeEvent.Handler; -import com.google.gwt.view.client.SelectionModel; -import com.google.gwt.view.client.SingleSelectionModel; -import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.RegattaNameAndRaceName; import com.sap.sailing.gwt.ui.client.ErrorReporter; -import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener; import com.sap.sailing.gwt.ui.client.RaceSelectionProvider; import com.sap.sailing.gwt.ui.client.RegattaDisplayer; import com.sap.sailing.gwt.ui.client.RegattaRefresher; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.client.URLFactory; import com.sap.sailing.gwt.ui.shared.RaceDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO; -import com.sap.sailing.gwt.ui.shared.components.Component; import com.sap.sailing.gwt.ui.shared.components.SettingsDialog; -import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; /** * Shows the currently tracked events/races in a table. Updated if subscribed as an {@link RegattaDisplayer}, e.g., with * the {@link AdminConsoleEntryPoint}. */ -public class TrackedRacesListComposite extends SimplePanel implements Component, RegattaDisplayer, RaceSelectionChangeListener { - private final long DEFAULT_LIVE_DELAY_IN_MILLISECONDS = 5000; - +public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite { + private final Set raceIsTrackedRaceChangeListener; - private final boolean multiSelection; + private Button btnUntrack; + private Button btnRemoveRace; - private boolean dontFireNextSelectionChangeEvent; - - private final SelectionModel selectionModel; - - private final CellTable raceTable; - - private ListDataProvider raceList; - - private Iterable allRaces; - - private final VerticalPanel panel; - - private DateTimeFormatRenderer dateFormatter = new DateTimeFormatRenderer( - DateTimeFormat.getFormat(PredefinedFormat.DATE_SHORT)); - private DateTimeFormatRenderer timeFormatter = new DateTimeFormatRenderer( - DateTimeFormat.getFormat(PredefinedFormat.TIME_LONG)); - - private final Label noTrackedRacesLabel; - - private final SailingServiceAsync sailingService; - private final ErrorReporter errorReporter; - private final RegattaRefresher regattaRefresher; - private final RaceSelectionProvider raceSelectionProvider; - private final StringMessages stringMessages; - - private final Button btnUntrack; - private final Button btnRefresh; - private final Button btnRemoveRace; - private final Button btnSetDelayToLive; - - private final TextBox filterRacesTextbox; - - private final TrackedRacesSettings settings; - - public static class AnchorCell extends AbstractCell { - - @Override - public void render(com.google.gwt.cell.client.Cell.Context context, SafeHtml safeHtml, SafeHtmlBuilder sb) { - sb.append(safeHtml); - } - } - - interface AnchorTemplates extends SafeHtmlTemplates { - @SafeHtmlTemplates.Template("{1}") - SafeHtml cell(String url, String displayName); - } - - private static AnchorTemplates ANCHORTEMPLATE = GWT.create(AnchorTemplates.class); + private Button btnSetDelayToLive; public TrackedRacesListComposite(final SailingServiceAsync sailingService, final ErrorReporter errorReporter, final RegattaRefresher regattaRefresher, RaceSelectionProvider raceSelectionProvider, final StringMessages stringMessages, boolean hasMultiSelection) { - this.sailingService = sailingService; - this.errorReporter = errorReporter; - this.regattaRefresher = regattaRefresher; - this.multiSelection = hasMultiSelection; - this.raceSelectionProvider = raceSelectionProvider; - this.stringMessages = stringMessages; + super(sailingService, errorReporter, regattaRefresher, raceSelectionProvider, stringMessages, hasMultiSelection); this.raceIsTrackedRaceChangeListener = new HashSet(); - - raceList = new ListDataProvider(); - selectionModel = multiSelection ? new MultiSelectionModel() : new SingleSelectionModel(); - settings = new TrackedRacesSettings(); - settings.setDelayToLiveInSeconds(DEFAULT_LIVE_DELAY_IN_MILLISECONDS / 1000l); - - panel = new VerticalPanel(); - setWidget(panel); - - HorizontalPanel filterPanel = new HorizontalPanel(); - panel.add(filterPanel); - Label lblFilterRaces = new Label(stringMessages.filterRacesByName() + ":"); - lblFilterRaces.setWordWrap(false); - filterPanel.setSpacing(5); - filterPanel.add(lblFilterRaces); - filterPanel.setCellVerticalAlignment(lblFilterRaces, HasVerticalAlignment.ALIGN_MIDDLE); - filterRacesTextbox = new TextBox(); - filterRacesTextbox.addKeyUpHandler(new KeyUpHandler() { - @Override - public void onKeyUp(KeyUpEvent event) { - fillRaceListFromAvailableRacesApplyingFilter(); - } - }); - filterPanel.add(filterRacesTextbox); - - noTrackedRacesLabel = new Label(stringMessages.noRacesYet()); - noTrackedRacesLabel.setWordWrap(false); - panel.add(noTrackedRacesLabel); - - AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class); - raceTable = new CellTable(/* pageSize */10000, tableRes); - raceTable.ensureDebugId("TrackedRaces"); - ListHandler columnSortHandler = new ListHandler( - raceList.getList()); - TextColumn regattaNameColumn = new TextColumn() { - @Override - public String getValue(RaceDTO raceDTO) { - return raceDTO.getRegattaName(); - } - }; - regattaNameColumn.setSortable(true); - - columnSortHandler.setComparator(regattaNameColumn, new Comparator() { - @Override - public int compare(RaceDTO t1, RaceDTO t2) { - String regatta1Name = t1.getRegattaName(); - String regatta2Name = t2.getRegattaName(); - boolean ascending = isSortedAscending(); - if (regatta1Name.equals(regatta2Name)) { - return 0; - } - int val = ascending ? regatta1Name.compareTo(regatta2Name) : -(regatta2Name.compareTo(regatta1Name)); - return val; - } - - private boolean isSortedAscending() { - ColumnSortList sortList = raceTable.getColumnSortList(); - return sortList.size() > 0 & sortList.get(0).isAscending(); - } - }); - - TextColumn boatClassNameColumn = new TextColumn() { - @Override - public String getValue(RaceDTO raceDTO) { - return raceDTO.boatClass == null ? "" : raceDTO.boatClass; - } - }; - boatClassNameColumn.setSortable(true); - - columnSortHandler.setComparator(boatClassNameColumn, new Comparator() { - @Override - public int compare(RaceDTO t1, RaceDTO t2) { - String boatClass1 = t1.boatClass; - String boatClass2 = t2.boatClass; - boolean ascending = isSortedAscending(); - if (boatClass1.equals(boatClass2)) { - return 0; - } - int val = ascending ? boatClass1.compareTo(boatClass2) : -(boatClass2.compareTo(boatClass1)); - return val; - } - - private boolean isSortedAscending() { - ColumnSortList sortList = raceTable.getColumnSortList(); - return sortList.size() > 0 & sortList.get(0).isAscending(); - } - }); - - AnchorCell anchorCell = new AnchorCell(); - Column raceNameColumn = new Column(anchorCell) { - @Override - public SafeHtml getValue(RaceDTO raceDTO) { - if (raceDTO.isTracked == true) { - RegattaNameAndRaceName raceIdentifier = (RegattaNameAndRaceName) raceDTO.getRaceIdentifier(); - String debugParam = Window.Location.getParameter("gwt.codesvr"); - String link = URLFactory.INSTANCE.encode("/gwt/RaceBoard.html?raceName=" - + raceIdentifier.getRaceName() + "®attaName=" + raceIdentifier.getRegattaName() - + ((debugParam != null && !debugParam.isEmpty()) ? "&gwt.codesvr=" + debugParam : "")); - return ANCHORTEMPLATE.cell(link, raceDTO.name); - } else { - return SafeHtmlUtils.fromString(raceDTO.name); - } - } - }; - - raceNameColumn.setSortable(true); - - columnSortHandler.setComparator(raceNameColumn, new Comparator() { - @Override - public int compare(RaceDTO t1, RaceDTO t2) { - boolean ascending = isSortedAscending(); - if (t1.name.equals(t2.name)) { - return 0; - } - int val = -1; - val = (t1 != null && t2 != null && ascending) ? (t1.name.compareTo(t2.name)) : -(t2.name.compareTo(t1.name)); - return val; - } - - private boolean isSortedAscending() { - ColumnSortList sortList = raceTable.getColumnSortList(); - return sortList.size() > 0 & sortList.get(0).isAscending(); - } - }); - - TextColumn raceStartColumn = new TextColumn() { - @Override - public String getValue(RaceDTO raceDTO) { - if (raceDTO.startOfRace != null) { - return dateFormatter.render(raceDTO.startOfRace) + " " - + timeFormatter.render(raceDTO.startOfRace); - } - - return ""; - } - }; - raceStartColumn.setSortable(true); - - columnSortHandler.setComparator(raceStartColumn, new Comparator() { - @Override - public int compare(RaceDTO t1, RaceDTO t2) { - if (t1.startOfRace != null && t2.startOfRace != null) { - boolean ascending = isSortedAscending(); - int val = -1; - val = (t1.startOfRace.after(t2.startOfRace) && ascending) ? 1 : -1; - return val; - } - return 0; - } - - private boolean isSortedAscending() { - ColumnSortList sortList = raceTable.getColumnSortList(); - return sortList.size() > 0 & sortList.get(0).isAscending(); - } - }); - - TextColumn raceTrackedColumn = new TextColumn() { - @Override - public String getValue(RaceDTO raceDTO) { - if (raceDTO.isTracked == true) { - return stringMessages.tracked(); - } - return ""; - } - }; - - TextColumn hasWindDataColumn = new TextColumn() { - @Override - public String getValue(RaceDTO raceDTO) { - if (raceDTO.trackedRace != null && raceDTO.trackedRace.hasWindData == true) { - return stringMessages.yes(); - } else { - return stringMessages.no(); - } - } - }; - - TextColumn hasGPSDataColumn = new TextColumn() { - @Override - public String getValue(RaceDTO raceDTO) { - if (raceDTO.trackedRace != null && raceDTO.trackedRace.hasGPSData == true) { - return stringMessages.yes(); - } else { - return stringMessages.no(); - } - } - }; - - TextColumn raceLiveDelayColumn = new TextColumn() { - @Override - public String getValue(RaceDTO raceDTO) { - if (raceDTO.isTracked && raceDTO.trackedRace != null && raceDTO.trackedRace.delayToLiveInMs > 0) { - return "" + raceDTO.trackedRace.delayToLiveInMs / 1000; - } - return ""; - } - }; - - raceTable.addColumn(regattaNameColumn, stringMessages.regatta()); - raceTable.addColumn(boatClassNameColumn, stringMessages.boatClass()); - raceTable.addColumn(raceNameColumn, stringMessages.race()); - raceTable.addColumn(raceStartColumn, stringMessages.startTime()); - raceTable.addColumn(raceTrackedColumn, stringMessages.tracked()); - raceTable.addColumn(hasWindDataColumn, "Wind data"); - raceTable.addColumn(hasGPSDataColumn, "GPS data"); - - raceTable.addColumn(raceLiveDelayColumn, stringMessages.delayInSeconds()); - raceTable.setWidth("300px"); - raceTable.setSelectionModel(selectionModel); - raceTable.setVisible(false); - panel.add(raceTable); - raceList.addDataDisplay(raceTable); - raceTable.addColumnSortHandler(columnSortHandler); - raceTable.getSelectionModel().addSelectionChangeHandler(new Handler() { - @Override - public void onSelectionChange(SelectionChangeEvent event) { - List selectedRaces = getSelectedRaces(); - if (selectedRaces.isEmpty()) { - btnRemoveRace.setEnabled(false); - btnUntrack.setEnabled(false); - } else { - btnRemoveRace.setEnabled(true); - btnUntrack.setEnabled(true); - } - if (dontFireNextSelectionChangeEvent) { - dontFireNextSelectionChangeEvent = false; - } else { - List selectedRaceIdentifiers = new ArrayList(); - for (RaceDTO selectedRace : selectedRaces) { - selectedRaceIdentifiers.add(selectedRace.getRaceIdentifier()); - } - TrackedRacesListComposite.this.raceSelectionProvider.setSelection(selectedRaceIdentifiers, TrackedRacesListComposite.this); - } - } - }); - HorizontalPanel trackedRacesButtonPanel = new HorizontalPanel(); - trackedRacesButtonPanel.setSpacing(10); - panel.add(trackedRacesButtonPanel); - btnRemoveRace = new Button(stringMessages.remove()); - btnRemoveRace.ensureDebugId("RemoveRave"); - btnRemoveRace.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - for (RaceDTO selectedRace : getSelectedRaces()) { - removeAndUntrackRace(selectedRace); - } - } - }); - btnRemoveRace.setEnabled(false); - trackedRacesButtonPanel.add(btnRemoveRace); - btnUntrack = new Button(stringMessages.stopTracking()); - btnUntrack.ensureDebugId("UntrackRace"); - btnUntrack.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent click) { - for (RaceDTO selectedRace : getSelectedRaces()) { - if (selectedRace.isTracked) { - stopTrackingRace(selectedRace); - } - } - } - }); - btnUntrack.setEnabled(false); - trackedRacesButtonPanel.add(btnUntrack); - - btnRefresh = new Button(stringMessages.refresh()); - btnRefresh.ensureDebugId("Refresh"); - btnRefresh.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - regattaRefresher.fillRegattas(); - } - }); - trackedRacesButtonPanel.add(btnRefresh); - - btnSetDelayToLive = new Button(stringMessages.setDelayToLive() + "..."); - btnSetDelayToLive.ensureDebugId("SetDelayToLive"); - btnSetDelayToLive.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - showSetDelayToLiveDialog(); - } - }); - trackedRacesButtonPanel.add(btnSetDelayToLive); } private void showSetDelayToLiveDialog() { @@ -424,91 +49,9 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< settingsDialog.show(); } - public RaceDTO getRaceByIdentifier(RaceIdentifier raceIdentifier) { - RaceDTO result = null; - if (raceList != null) { - for (RaceDTO race : raceList.getList()) { - if(race.getRaceIdentifier().equals(raceIdentifier)) { - result = race; - break; - } - } - } - return result; - } - private List getSelectedRaces() { - List result = new ArrayList(); - if (raceList != null) { - for (RaceDTO race : raceList.getList()) { - if (selectionModel.isSelected(race)) { - result.add(race); - } - } - } - return result; - } - public void selectRaceByIdentifier(RegattaAndRaceIdentifier raceIdentifier) { - if (raceList != null) { - for (RaceDTO race : raceList.getList()) { - String regattaName = race.getRegattaName(); - if (regattaName.equals(raceIdentifier.getRegattaName()) && race.name.equals(raceIdentifier.getRaceName())) { - dontFireNextSelectionChangeEvent = true; - selectionModel.setSelected(race, true); - break; - } - } - } - } - public void clearSelection() { - List emptySelection = Collections.emptyList(); - raceSelectionProvider.setSelection(emptySelection, /* listenersNotToNotify */ this); - if (raceList != null) { - for (RaceDTO race : raceList.getList()) { - selectionModel.setSelected(race, false); - } - } - } - - @Override - public void fillRegattas(List regattas) { - if (regattas.isEmpty()) { - raceTable.setVisible(false); - btnUntrack.setVisible(false); - btnRemoveRace.setVisible(false); - btnSetDelayToLive.setVisible(false); - noTrackedRacesLabel.setVisible(true); - } else { - raceTable.setVisible(true); - btnUntrack.setVisible(true); - btnUntrack.setEnabled(false); - btnRemoveRace.setVisible(true); - btnRemoveRace.setEnabled(false); - noTrackedRacesLabel.setVisible(false); - btnSetDelayToLive.setVisible(true); - } - List newAllRaces = new ArrayList(); - List newAllRegattas = new ArrayList(); - List newAllRaceIdentifiers = new ArrayList(); - for (RegattaDTO regatta : regattas) { - newAllRegattas.add(regatta); - for (RaceDTO race : regatta.races) { - if (race != null) { - newAllRaces.add(race); - newAllRaceIdentifiers.add(race.getRaceIdentifier()); - } - } - } - allRaces = newAllRaces; - fillRaceListFromAvailableRacesApplyingFilter(); - raceSelectionProvider.setAllRaces(newAllRaceIdentifiers); // have this object be notified; triggers onRaceSelectionChange - } - - public void addRaceSelectionChangeListener(RaceSelectionChangeListener listener) { - this.raceSelectionProvider.addRaceSelectionChangeListener(listener); - } public void addTrackedRaceChangeListener(TrackedRaceChangedListener listener) { this.raceIsTrackedRaceChangeListener.add(listener); @@ -541,6 +84,7 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< public void onFailure(Throwable caught) { errorReporter.reportError("Exception trying to stop tracking race " + race.name + "in regatta " + race.getRegattaName() + ": " + caught.getMessage()); + } } @Override @@ -553,92 +97,72 @@ public class TrackedRacesListComposite extends SimplePanel implements Component< }); } - private void fillRaceListFromAvailableRacesApplyingFilter() { - String text = filterRacesTextbox.getText(); - List wordsToFilter = Arrays.asList(text.split(" ")); - raceList.getList().clear(); - if (text != null && !text.isEmpty()) { - for (RaceDTO raceDTO : getAllRaces()) { - boolean failed = false; - for (String word : wordsToFilter) { - String textAsUppercase = word.toUpperCase().trim(); - if (!raceDTO.getRegattaName().toUpperCase().contains(textAsUppercase) - && !raceDTO.boatClass.toUpperCase().contains(textAsUppercase) - && !raceDTO.name.toUpperCase().contains(textAsUppercase)) { - failed = true; - break; + @Override + protected void addControlButtons(HorizontalPanel trackedRacesButtonPanel) { + btnRemoveRace = new Button(stringMessages.remove()); + btnRemoveRace.ensureDebugId("RemoveRave"); + btnRemoveRace.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + for (RaceDTO selectedRace : getSelectedRaces()) { + removeAndUntrackRace(selectedRace); + } + } + }); + btnRemoveRace.setEnabled(false); + trackedRacesButtonPanel.add(btnRemoveRace); + btnUntrack = new Button(stringMessages.stopTracking()); + btnUntrack.ensureDebugId("UntrackRace"); + btnUntrack.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent click) { + for (RaceDTO selectedRace : getSelectedRaces()) { + if (selectedRace.isTracked) { + stopTrackingRace(selectedRace); } } - if (!failed) { - raceList.getList().add(raceDTO); - } } + }); + btnUntrack.setEnabled(false); + trackedRacesButtonPanel.add(btnUntrack); + + + btnSetDelayToLive = new Button(stringMessages.setDelayToLive() + "..."); + btnSetDelayToLive.ensureDebugId("SetDelayToLive"); + btnSetDelayToLive.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + showSetDelayToLiveDialog(); + } + }); + trackedRacesButtonPanel.add(btnSetDelayToLive); + } + + @Override + protected void makeControlsReactToSelectionChange(List selectedRaces) { + if (selectedRaces.isEmpty()) { + btnRemoveRace.setEnabled(false); + btnUntrack.setEnabled(false); } else { - for (RaceDTO raceFromAllRaces : getAllRaces()) { - raceList.getList().add(raceFromAllRaces); - } - } - // now sort again according to selected criterion - ColumnSortEvent.fire(raceTable, raceTable.getColumnSortList()); - onRaceSelectionChange(raceSelectionProvider.getSelectedRaces()); // update selection based on underlying domain race selection model - } - - @Override - public void onRaceSelectionChange(List selectedRaces) { - for (RaceDTO raceFromAllRaces : raceList.getList()) { - selectionModel.setSelected(raceFromAllRaces, selectedRaces.contains(raceFromAllRaces.getRaceIdentifier())); + btnRemoveRace.setEnabled(true); + btnUntrack.setEnabled(true); } } - private Iterable getAllRaces() { - return allRaces; + @Override + protected void makeControlsReactToFillRegattas(List regattas) { + if (regattas.isEmpty()) { + btnUntrack.setVisible(false); + btnRemoveRace.setVisible(false); + btnSetDelayToLive.setVisible(false); + } else { + btnUntrack.setVisible(true); + btnUntrack.setEnabled(false); + btnRemoveRace.setVisible(true); + btnRemoveRace.setEnabled(false); + btnSetDelayToLive.setVisible(true); + } } - @Override - public boolean hasSettings() { - return true; - } - - @Override - public SettingsDialogComponent getSettingsDialogComponent() { - return new TrackedRacesSettingsDialogComponent(settings, stringMessages); - } - @Override - public void updateSettings(TrackedRacesSettings newSettings) { - settings.setDelayToLiveInSeconds(newSettings.getDelayToLiveInSeconds()); - - // set the new delay to all selected races - List raceIdentifiersToUpdate = new ArrayList(); - for (RaceDTO raceDTO : getSelectedRaces()) { - raceIdentifiersToUpdate.add(raceDTO.getRaceIdentifier()); - } - - if (raceIdentifiersToUpdate != null && !raceIdentifiersToUpdate.isEmpty()) { - sailingService.updateRacesDelayToLive(raceIdentifiersToUpdate, settings.getDelayToLiveInSeconds() * 1000l, - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - errorReporter - .reportError("Exception trying to set the delay to live for the selected tracked races: " - + caught.getMessage()); - } - - @Override - public void onSuccess(Void result) { - regattaRefresher.fillRegattas(); - } - }); - } - } - - @Override - public String getLocalizedShortName() { - return "Tracked races"; - } - - @Override - public Widget getEntryWidget() { - return this; - } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DetailTypeFormatter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DetailTypeFormatter.java index 7fd61f58c36..471e04315d7 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DetailTypeFormatter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DetailTypeFormatter.java @@ -5,8 +5,10 @@ import com.google.gwt.i18n.client.NumberFormat; import com.sap.sailing.domain.common.DetailType; public class DetailTypeFormatter { + + private DetailTypeFormatter() { } - private static final StringMessages stringMessages = GWT.create(StringMessages.class); + private static final StringMessages stringMessages = GWT.create(StringMessages.class); public static String format(DetailType detailType) { switch (detailType) { @@ -46,19 +48,13 @@ public class DetailTypeFormatter { case RACE_AVERAGE_CROSS_TRACK_ERROR_IN_METERS: return stringMessages.averageCrossTrackErrorInMeters(); case WINDWARD_DISTANCE_TO_OVERALL_LEADER: - return stringMessages.windwardDistanceToLeader(); - case HEAD_UP: - return stringMessages.headUp(); - case BEAR_AWAY: - return stringMessages.bearAway(); + return stringMessages.windwardDistanceToLeaderInMeters(); case TACK: return stringMessages.tack(); case JIBE: return stringMessages.jibe(); case PENALTY_CIRCLE: return stringMessages.penaltyCircle(); - case MARK_PASSING: - return stringMessages.markPassing(); case DISPLAY_LEGS: return stringMessages.legs(); case CURRENT_LEG: @@ -90,35 +86,7 @@ public class DetailTypeFormatter { /** * Returns the unit of the given {@link DetailType}, like 'm', 'kts' or an empty string, if the detail type has no * unit.
- * Throws an UnsupportedOperationException if the given detail type isn't supported.
- * Currently supported are:
- *
    - *
  • CURRENT_SPEED_OVER_GROUND_IN_KNOTS
  • - *
  • MAXIMUM_SPEED_OVER_GROUND_IN_KNOTS
  • - *
  • DISTANCE_TRAVELED
  • - *
  • GAP_TO_LEADER_IN_SECONDS
  • - *
  • VELOCITY_MADE_GOOD_IN_KNOTS
  • - *
  • WINDWARD_DISTANCE_TO_OVERALL_LEADER
  • - *
  • AVERAGE_SPEED_OVER_GROUND_IN_KNOTS
  • - *
  • ESTIMATED_TIME_TO_NEXT_WAYPOINT_IN_SECONDS
  • - *
  • GAP_CHANGE_SINCE_LEG_START_IN_SECONDS
  • - *
  • AVERAGE_CROSS_TRACK_ERROR_IN_METERS
  • - *
  • RACE_DISTANCE_TRAVELED
  • - *
  • RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS
  • - *
  • RACE_GAP_TO_LEADER_IN_SECONDS
  • - *
  • RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS
  • - *
  • RACE_DISTANCE_TO_LEADER_IN_METERS
  • - *
  • RACE_AVERAGE_CROSS_TRACK_ERROR_IN_METERS
  • - *
  • AVERAGE_TACK_LOSS_IN_METERS
  • - *
  • AVERAGE_JIBE_LOSS_IN_METERS
  • - *
  • TOTAL_TIME_SAILED_IN_SECONDS
  • - * - *
  • RACE_RANK (no unit)
  • - *
  • CURRENT_LEG (no unit)
  • - *
  • TACK (no unit)
  • - *
  • JIBE (no unit)
  • - *
  • PENALTY_CIRCLE (no unit)
  • - *
+ * Throws an UnsupportedOperationException if the given detail type isn't supported. * * @param detailType * @return The unit of the detail type as string. @@ -128,55 +96,48 @@ public class DetailTypeFormatter { case CURRENT_SPEED_OVER_GROUND_IN_KNOTS: case RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS: case MAXIMUM_SPEED_OVER_GROUND_IN_KNOTS: - return stringMessages.currentSpeedOverGroundInKnotsUnit(); - + case RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS: + case VELOCITY_MADE_GOOD_IN_KNOTS: + case AVERAGE_SPEED_OVER_GROUND_IN_KNOTS: + return stringMessages.knotsUnit(); + + case WINDWARD_DISTANCE_TO_OVERALL_LEADER: + case WINDWARD_DISTANCE_TO_GO_IN_METERS: case DISTANCE_TRAVELED: case RACE_DISTANCE_TO_LEADER_IN_METERS: case RACE_DISTANCE_TRAVELED: case AVERAGE_TACK_LOSS_IN_METERS: case AVERAGE_JIBE_LOSS_IN_METERS: case AVERAGE_MANEUVER_LOSS_IN_METERS: - return stringMessages.distanceInMetersUnit(); - - case GAP_TO_LEADER_IN_SECONDS: - case GAP_CHANGE_SINCE_LEG_START_IN_SECONDS: - case RACE_GAP_TO_LEADER_IN_SECONDS: - return stringMessages.gapToLeaderInSecondsUnit(); - - case VELOCITY_MADE_GOOD_IN_KNOTS: - return stringMessages.velocityMadeGoodInKnotsUnit(); - - case WINDWARD_DISTANCE_TO_OVERALL_LEADER: - case WINDWARD_DISTANCE_TO_GO_IN_METERS: - return stringMessages.windwardDistanceToGoInMetersUnit(); - - case AVERAGE_SPEED_OVER_GROUND_IN_KNOTS: - return stringMessages.averageSpeedInKnotsUnit(); - - case ESTIMATED_TIME_TO_NEXT_WAYPOINT_IN_SECONDS: - return stringMessages.estimatedTimeToNextWaypointInSecondsUnit(); - case AVERAGE_CROSS_TRACK_ERROR_IN_METERS: case RACE_AVERAGE_CROSS_TRACK_ERROR_IN_METERS: return stringMessages.metersUnit(); - + + case GAP_TO_LEADER_IN_SECONDS: + case GAP_CHANGE_SINCE_LEG_START_IN_SECONDS: + case RACE_GAP_TO_LEADER_IN_SECONDS: + case ESTIMATED_TIME_TO_NEXT_WAYPOINT_IN_SECONDS: case TIME_TRAVELED: return stringMessages.secondsUnit(); - + case TOTAL_TIME_SAILED_IN_SECONDS: + case TOTAL_TIME_SAILED_DOWNWIND_IN_SECONDS: + case TOTAL_TIME_SAILED_UPWIND_IN_SECONDS: + case TOTAL_TIME_SAILED_REACHING_IN_SECONDS: return stringMessages.hhmmssUnit(); - - case RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS: - return stringMessages.averageSpeedInKnotsUnit(); - - // Case for detail types without unit, so that an empty string is returned. + + // Cases for detail types without unit, so that an empty string is returned. case RACE_RANK: case CURRENT_LEG: case TACK: case JIBE: case PENALTY_CIRCLE: + case RANK_GAIN: + case NUMBER_OF_MANEUVERS: + case DISPLAY_LEGS: + case SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED: return ""; - + default: // Throwing an exception to get notificated if an implementation of // an detail type is missing. @@ -184,6 +145,86 @@ public class DetailTypeFormatter { + "' in this method."); } } + + /** + * Returns a tooltip text for the given detail type or an empty string, if there's none. + * @param detailType + * @return A tooltip string for the given detail type. + */ + public static String getTooltip(DetailType detailType) { + switch (detailType) { + case AVERAGE_CROSS_TRACK_ERROR_IN_METERS: + return stringMessages.averageCrossTrackErrorInMetersTooltip(); + case GAP_CHANGE_SINCE_LEG_START_IN_SECONDS: + return stringMessages.gapChangeSinceLegStartInSecondsTooltip(); + case RACE_AVERAGE_CROSS_TRACK_ERROR_IN_METERS: + return stringMessages.raceAverageCrossTrackErrorInMetersTooltip(); + case SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED: + return stringMessages.sideToWhichMarkAtLegStartWasRoundedTooltip(); + case VELOCITY_MADE_GOOD_IN_KNOTS: + return stringMessages.velocityMadeGoodInKnotsTooltip(); + case AVERAGE_JIBE_LOSS_IN_METERS: + return stringMessages.averageJibeLossInMetersTooltip(); + case AVERAGE_MANEUVER_LOSS_IN_METERS: + return stringMessages.averageManeuverLossInMetersTooltip(); + case AVERAGE_TACK_LOSS_IN_METERS: + return stringMessages.averageTackLossInMetersTooltip(); + case CURRENT_LEG: + return stringMessages.currentLegTooltip(); + case DISPLAY_LEGS: + return ""; + case DISTANCE_TRAVELED: + return stringMessages.distanceTraveledTooltip(); + case AVERAGE_SPEED_OVER_GROUND_IN_KNOTS: + return stringMessages.averageSpeedInKnotsTooltip(); + case ESTIMATED_TIME_TO_NEXT_WAYPOINT_IN_SECONDS: + return stringMessages.estimatedTimeToNextWaypointInSecondsTooltip(); + case GAP_TO_LEADER_IN_SECONDS: + return stringMessages.gapToLeaderInSecondsTooltip(); + case JIBE: + return stringMessages.jibeTooltip(); + case MAXIMUM_SPEED_OVER_GROUND_IN_KNOTS: + return stringMessages.maximumSpeedOverGroundInKnotsTooltip(); + case NUMBER_OF_MANEUVERS: + return stringMessages.numberOfManeuversTooltip(); + case PENALTY_CIRCLE: + return stringMessages.penaltyCircleTooltip(); + case RACE_AVERAGE_SPEED_OVER_GROUND_IN_KNOTS: + return stringMessages.raceAverageSpeedInKnotsTooltip(); + case CURRENT_SPEED_OVER_GROUND_IN_KNOTS: + return stringMessages.currentSpeedOverGroundInKnotsTooltip(); + case RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS: + return stringMessages.currentSpeedOverGroundInKnotsTooltip(); + case RACE_DISTANCE_TO_LEADER_IN_METERS: + return stringMessages.windwardDistanceToLeaderInMetersTooltip(); + case WINDWARD_DISTANCE_TO_OVERALL_LEADER: + return stringMessages.windwardDistanceToLeaderInMetersTooltip(); + case RACE_DISTANCE_TRAVELED: + return stringMessages.raceDistanceTraveledTooltip(); + case RACE_GAP_TO_LEADER_IN_SECONDS: + return stringMessages.gapToLeaderInSecondsTooltip(); + case RACE_RANK: + return stringMessages.rankTooltip(); + case RANK_GAIN: + return stringMessages.rankGainTooltip(); + case TACK: + return stringMessages.tackTooltip(); + case TIME_TRAVELED: + return stringMessages.timeTooltip(); + case TOTAL_TIME_SAILED_DOWNWIND_IN_SECONDS: + return stringMessages.totalTimeSailedDownwindInSecondsTooltip(); + case TOTAL_TIME_SAILED_IN_SECONDS: + return stringMessages.totalTimeSailedInSecondsTooltip(); + case TOTAL_TIME_SAILED_REACHING_IN_SECONDS: + return stringMessages.totalTimeSailedReachingInSecondsTooltip(); + case TOTAL_TIME_SAILED_UPWIND_IN_SECONDS: + return stringMessages.totalTimeSailedUpwindInSecondsTooltip(); + case WINDWARD_DISTANCE_TO_GO_IN_METERS: + return stringMessages.windwardDistanceToGoInMetersTooltip(); + } + + return ""; + } public static NumberFormat getNumberFormat(DetailType detailType) { String decimalPlaces = ""; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index a6a1dcd3adf..6c5146580bd 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -1,462 +1,485 @@ -package com.sap.sailing.gwt.ui.client; - -import com.google.gwt.i18n.client.Messages; - -public interface StringMessages extends Messages { - String helloWorld(); - String kielWeel2011(); - String stgAccount(); - String tracTracEvents(); - String swissTimingEvents(); - String trackedBefore(); - String listRaces(); - String wind(); - String windPanelLabel(); - String refresh(); - String remove(); - String windSource(); - String dampeningInterval(); - String map(); - String race(); - String races(); - String tracked(); - String time(); - String playSpeed(); - String playSpeedHelp(); - String playModeLive(); - String playModeReplay(); - String timeDelay(); - String timeDelayHelp(); - String speedInKnots(); - String fromDeg(); - String noRacesYet(); - String total(); - String carry(); - String competitor(); - String competitors(); - String defaultLeaderboard(); - String noSuchLeaderboard(); - String leaderboardConfiguration(); - String newDotDotDot(); - String editScores(); - String columnNamesInSelectedLeaderboard(); - String addDotDotDot(); - String renameDotDotDot(); - String trackedRaceConnectedToSelectedRaceName(); - String linkToColumn(); - String unlink(); - String leaderboardName(); - String cancel(); - String pleaseEnterAName(); - String discardRacesFromHowManyStartedRacesOn(); - String leaderboardWithThisNameAlreadyExists(); - String discardThresholdsMustBeNumeric(); - String discardThresholdsMustBeAscending(); - String discarding(); - String startingFromNumberOfRaces(); - String renameLeaderboard(); - String addColumnToLeaderboard(); - String pleaseEnterNameForNewRaceColumn(); - String ok(); - String medalRace(); - String renameRace(); - String openSelectedLeaderboard(); - String rank(); - String totalRank(); - String collapse(); - String expand(); - String leg(); - String distanceInMeters(); - String distanceInMetersUnit(); - String averageSpeedInKnots(); - String averageSpeedInKnotsUnit(); - String rankGain(); - String sapSailingAnalytics(); - String leaderboard(); - String leaderboards(); - String leaderboardSettings(); - String settings(); - String selectAtLeastOneLegDetail(); - String currentSpeedOverGroundInKnots(); - String currentSpeedOverGroundInKnotsUnit(); - String estimatedTimeToNextWaypointInSeconds(); - String estimatedTimeToNextWaypointInSecondsUnit(); - String gapToLeaderInSeconds(); - String gapToLeaderInSecondsUnit(); - String velocityMadeGoodInKnots(); - String velocityMadeGoodInKnotsUnit(); - String windwardDistanceToGoInMeters(); - String windwardDistanceToLeaderInMeters(); - String windwardDistanceToGoInMetersUnit(); - String name(); - String leaveEmptyForDefault(); - String trackNewEvent(); - String trackableRaces(); - String trackWind(); - String regattaName(); - String eventName(); - String event(); - String startTime(); - String regatta(); - String regattas(); - String startTracking(); - String stopTracking(); - String connections(); - String historyOfConnections(); - String defineNewConnection(); - String trackedRaces(); - String canSendRequests(); - String connectAndReadRaces(); - String trackSettings(); - String ports(); - String liveData(); - String storedData(); - String uris(); - String jsonUrl(); - String livePort(); - String storedPort(); - String liveUri(); - String storedUri(); - String eventsConnectedTo(); - String hostname(); - String declinationCheckbox(); - String raceStartTrackingColumn(); - String pauseAutomaticRefresh(); - String autoRefresh(); - String delayInSeconds(); - String delayBetweenAutoAdvances(); - String delayMustBeNonNegative(); - String chooseUpdateIntervalOfAtLeastOneSecond(); - String errorSettingWindForRace(); - String errorFetchingWindInformationForRace(); - String errorWhileTryingToSetWindSourceForRace(); - String inEvent(); - String to(); - String showEstimatedWind(); - String timing(); - String raceDetailsToShow(); - String legDetailsToShow(); - String columnMoveUp(); - String columnMoveDown(); - String port(); - String raceStartTimeColumn(); - String showOnlySelectedCompetitors(); - String showSelectedCompetitorsInfo(); - String lengthInSeconds(); - String selectedRaces(); - String stressTest(); - String numberOfManeuvers(); - String tacks(); - String jibes(); - String penaltyCircles(); - String medalRaceIsNull(); - String maneuverTypes(); - String configuration(); - String chooseChart(); - String distanceTraveled(); - String velocityMadeGoodLong(); - String speedOverGroundLong(); - String gapToLeaderLong(); - String pointsToLoad(); - String speed(); - String distance(); - String in(); - String secondsUnit(); - String metersUnit(); - String failedToLoadRaceData(); - String close(); - String compareCompetitors(); - String description(); - String sailNumber(); - String country(); - String no3LetterCodes(); - String add(); - String delete(); - String showCharts(); - String raceWithThisNameAlreadyExists(); - String raceWithThisNameAlreadyExistsInRegatta(); - String headUp(); - String bearAway(); - String tack(); - String jibe(); - String penaltyCircle(); - String markPassing(); - String mark(); - String otherManeuver(); - String douglasPeuckerPoints(); - String filterRacesByName(); - String actionEdit(); - String actionEditScores(); - String actionOpenBrowser(); - String actionRemove(); - String actionEditRaces(); - String actionRaceEdit(); - String actionRaceUnlink(); - String actionRaceRemove(); - String filterLeaderboardsByName(); - String windwardDistanceToLeader(); - String actions(); - String islinked(); - String yes(); - String no(); - String hoverOverAPoint(); - String noSelection(); - String raceIsKnownToStartUpwind(); - String events(); - String settingsForComponent(String localizedComponentName); - String noEventsFound(); - String noEventSelected(); - String noLeaderboardsFound(); - String searchEvents(); - String location(); - String from(); - String until(); - String onlyLiveEvents(); - String locationNotAvailable(); - String startDateNotAvailable(); - String startDate(); - String unknownManeuver(); - String tailLengthMustBePositive(); - String failedToLoadRaceInformation(String message); - String competitorPassedMarkAtDate(String competitorName, String markName, String dateTime); - String valueForCompetitorAt(String competitorName, String dateTime, String valueWithUnit); - String reallyRemoveRace(String string); - String showDetails(); - String hideLeaderboard(); - String hideLeaderboards(); - String showLeaderboard(); - String hideRaces(); - String showMap(); - String hideMap(); - String noLeaderboardSelected(); - String leaderboardGroups(); - String filterLeaderboardGroupsByName(); - String createNewLeaderboardGroup(); - String leaderboardGroupConfiguration(); - String legs(); - String currentLeg(); - String leaderboardGroup(); - String pleaseEnterNonEmptyDescription(); - String groupWithThisNameAlreadyExists(); - String detailsOfLeaderboardGroup(); - String edit(); - String save(); - String abort(); - String noLeaderboardGroupWithNameFound(String groupName); - String overview(); - String welcomeToSailingAnalytics(); - String welcomeToSailingAnalyticsBody(); - String home(); - String clickAndDragToZoomIn(); - String windSpeed(); - String allTimesInUTC(); - String autoZoomTo(); - String autoZoomToBoats(); - String autoZoomToBuoys(); - String autoZoomOff(); - String autoZoomToTails(); - String autoZoomToWindSensors(); - String autoZoomSelectedCompetitors(); - String bearing(); - String zoom(); - String stepSizeMustBeGreaterThanNull(); - String stepSizeInSeconds(); - String refreshInterval(); - String refreshIntervalMustBeGreaterThanXSeconds(String seconds); - String competitorCharts(); - String selectAtLeastOneCompetitor(); - String directionChange(); - String speedChange(); - String degreesShort(); - String untracked(); - String delayForLiveMode(); - String notAvailable(); - String details(); - String noGroupSelected(); - String combinedWindSourceTypeName(); - String courseBasedWindSourceTypeName(); - String trackBasedEstimationWindSourceTypeName(); - String expeditionWindSourceTypeName(); - String webWindSourceTypeName(); - String clickChartToSetTime(); - String position(); - String windSourcesUsed(); - String errorTryingToUpdateWindSourcesToExclude(String raceName, String message); - String feedback(); - String startStopPlaying(); - String backToLive(); - String slowPlaySpeedDown(); - String speedPlaySpeedUp(); - String showHideComponent(String localizedShortName); - String degreesBoatToTheWind(); - String racesInLeaderboard(); - String leaderboardsInGroup(); - String replication(); - String errorFetchingReplicaData(String message); - String averageCrossTrackErrorInMeters(); - String enterMaster(); - String errorStartingReplication(String hostname, String exchangeName, String message); - String helpLines(); - String startLine(); - String finishLine(); - String advantageLine(); - String courseMiddleLine(); - String messagingPortNumber(); - String servletPortNumber(); - String registeredAt(String string); - String replicatingFromMaster(String hostname, int jmsPort, int servletPort); - String showWindSpeedSeries(); - String showWindDirectionSeries(); - String fleet(); - String boatClass(); - String setDelayToLive(); - String pleaseEnterNonEmptyVenue(); - String eventWithThisNameAlreadyExists(); - String venue(); - String pleaseSelectABoatClass(); - String regattaWithThisNameAlreadyExists(); - String seriesWithThisNameAlreadyExists(); - String fleetWithThisNameAlreadyExists(); - String fleets(); - String series(); - String splitFleet(); - String color(); - String medalSeries(); - String noColor(); - String pleaseSelectARegatta(); - String addFleet(); - String doYouReallyWantToRemoveRegatta(String name); - String errorLoadingScoreCorrectionProviders(String message); - String selectResultListToImportFrom(); - String of(); - String errorObtainingScoreCorrections(String scoreCorrectionProviderName, String eventName, String boatClassName, - String string, String message); - String assignRaceNumbersToRaceColumns(); - String importOfficialResults(); - String selectAll(); - String apply(); - String successfullyUpdatedScores(); - String errorUpdatingScoresForLeaderboard(String leaderboardName, String message); - String maneuverTypesToShowWhenCompetitorIsClicked(); - String simulateWithStartTimeNow(); - String boatClassDoesNotMatchSelectedRegatta(String boatClass, String regattaName); - String regattaExistForSelectedBoatClass(); - String reload(); - String addRegatta(); - String exchangeName(); - String course(); - String courseLayout(); - String buoy(); - String gate(); - String buoys(); - String waypoint(); - String showAllCompetitors(); - String boatTails(); - String maximalCount(); - String maxVisibleCompetitorsCountMustBePositive(); - String fregResultImportUrls(); - String errorRefreshingFregUrlList(String message); - String successfullyUpdatedFregUrls(); - String errorRemovingFregUrls(String message); - String pleaseEnterNonEmptyUrl(); - String addFragUrl(); - String errorAddingFragUrl(String message); - String errorTryingToObtainLeaderboardContents(String message); - String lastScoreUpdate(); - String warningBrowserUnsupported(); - String newMark(); - String controlPoint(); - String errorUpdatingRaceCourse(String message); - String successfullyUpdatedCourse(); - String selectOneMarkOrTwoMarksForGate(); - String errorTryingToObtainTheMarksOfTheRace(String message); - String errorTryingToObtainRaceCourse(String message); - String insertWaypointBeforeSelected(); - String insertWaypointAfterSelected(); - String scoringSchemeLowPointSystem(); - String scoringSchemeHighPointSystem(); - String scoringSystem(); - String createFlexibleLeaderboard(); - String createRegattaLeaderboard(); - String editFlexibleLeaderboard(); - String editRegattaLeaderboard(); - String noRegatta(); - String useOverallLeaderboard(); - String overallStandings(); - String scoringSchemeHighPointEssOverall(); - String scoringSchemeHighPointLastBreaksTie(); - String type(); - String actionAddRaces(); - String racesWithNamePrefix(); - String maximumSpeedOverGroundInKnots(); - String totalTimeSailedDownwindInSeconds(); - String totalTimeSailedUpwindInSeconds(); - String totalTimeSailedReachingInSeconds(); - String totalTimeSailedInSeconds(); - String overallDetailsToShow(); - String hhmmssUnit(); - String actionAddWindData(); - String valueMustBeBetweenMinMax(String name, String minValue, String maxValue); - String optional(); - String pleaseEnterAValue(); - String latitude(); - String longitude(); - String actionAddEvent(); - String publicationUrl(); - String suppress(); - String isPublic(); - String unsuppress(); - String suppressedCompetitors(); - String pleaseSelectASeries(); - String pleaseSelectARace(); - String displayGroupsInReverseOrder(); - String actionConfigureUrl(); - String configureLeaderboardUrlDescription(); - String embedded(); - String mediaPanel(); - String url(); - String mimeType(); - String title(); - String reallyRemoveMediaTrack(String mediaTrackTitle); - String duration(); - String addMediaTrack(); - String addYoutubeTrack(); - String youtubeId(); - String additionalUrlSettings(); - String restrictToSingleSelectedRace(); - String expandSelectedRace(); - String showRaceDetails(); - String numberOfRaces(); - String numberOfRacesMustBeNonNegativeNumber(); - String chooseTheWayYouSelectRaces(); - String selectFromAllRaces(); - String selectANumberOfRaces(); - String numberOfLastNRaces(); - String expandLastRace(); - String factor(); - String errorUpdatingIsMedalRace(String message); - String maneuverLoss(); - String averageManeuverLossInMeters(); - String averageTackLossInMeters(); - String averageJibeLossInMeters(); - String shape(); - String pattern(); - String legend(); - String live(); - String swissTimingArchiveConnector(); - String errorFetchingRankingChartData(String message); - String loadingCompetitorData(); - String rankNAfterRace(long l, String string); - String afterRace(); - String showRankChart(); - String overallLeaderboardSelection(); - String showOverallLeaderboardOnSamePage(); - String errorTryingToObtainOverallLeaderboards(String message); - String finished(); - String passedTo(String name); - String gapChangeSinceLegStartInSeconds(); - String sideToWhichMarkAtLegStartWasRounded(); - String raceIsLive(String raceName); - String racesAreLive(String raceNames); - String scoringSchemeHighPointFirstGetsTen(); -} +package com.sap.sailing.gwt.ui.client; + +import com.google.gwt.i18n.client.Messages; + +public interface StringMessages extends Messages { + String helloWorld(); + String kielWeel2011(); + String stgAccount(); + String tracTracEvents(); + String swissTimingEvents(); + String trackedBefore(); + String listRaces(); + String wind(); + String windPanelLabel(); + String refresh(); + String remove(); + String windSource(); + String dampeningInterval(); + String map(); + String race(); + String races(); + String tracked(); + String time(); + String playSpeed(); + String playSpeedHelp(); + String playModeLive(); + String playModeReplay(); + String timeDelay(); + String timeDelayHelp(); + String speedInKnots(); + String fromDeg(); + String noRacesYet(); + String total(); + String carry(); + String competitor(); + String competitors(); + String defaultLeaderboard(); + String noSuchLeaderboard(); + String leaderboardConfiguration(); + String newDotDotDot(); + String editScores(); + String columnNamesInSelectedLeaderboard(); + String addDotDotDot(); + String renameDotDotDot(); + String trackedRaceConnectedToSelectedRaceName(); + String linkToColumn(); + String unlink(); + String leaderboardName(); + String cancel(); + String pleaseEnterAName(); + String discardRacesFromHowManyStartedRacesOn(); + String leaderboardWithThisNameAlreadyExists(); + String discardThresholdsMustBeNumeric(); + String discardThresholdsMustBeAscending(); + String discarding(); + String startingFromNumberOfRaces(); + String renameLeaderboard(); + String addColumnToLeaderboard(); + String pleaseEnterNameForNewRaceColumn(); + String ok(); + String medalRace(); + String renameRace(); + String openSelectedLeaderboard(); + String rank(); + String totalRank(); + String collapse(); + String expand(); + String leg(); + String distanceInMeters(); + String averageSpeedInKnots(); + String rankGain(); + String sapSailingAnalytics(); + String leaderboard(); + String leaderboards(); + String leaderboardSettings(); + String settings(); + String selectAtLeastOneLegDetail(); + String currentSpeedOverGroundInKnots(); + String estimatedTimeToNextWaypointInSeconds(); + String gapToLeaderInSeconds(); + String velocityMadeGoodInKnots(); + String windwardDistanceToGoInMeters(); + String windwardDistanceToLeaderInMeters(); + String name(); + String leaveEmptyForDefault(); + String trackNewEvent(); + String trackableRaces(); + String trackWind(); + String regattaName(); + String eventName(); + String event(); + String startTime(); + String regatta(); + String regattas(); + String startTracking(); + String stopTracking(); + String connections(); + String historyOfConnections(); + String defineNewConnection(); + String trackedRaces(); + String canSendRequests(); + String connectAndReadRaces(); + String trackSettings(); + String ports(); + String liveData(); + String storedData(); + String uris(); + String jsonUrl(); + String livePort(); + String storedPort(); + String liveUri(); + String storedUri(); + String eventsConnectedTo(); + String hostname(); + String declinationCheckbox(); + String raceStartTrackingColumn(); + String pauseAutomaticRefresh(); + String autoRefresh(); + String delayInSeconds(); + String delayBetweenAutoAdvances(); + String delayMustBeNonNegative(); + String chooseUpdateIntervalOfAtLeastOneSecond(); + String errorSettingWindForRace(); + String errorFetchingWindInformationForRace(); + String errorWhileTryingToSetWindSourceForRace(); + String inEvent(); + String to(); + String showEstimatedWind(); + String timing(); + String raceDetailsToShow(); + String legDetailsToShow(); + String columnMoveUp(); + String columnMoveDown(); + String port(); + String raceStartTimeColumn(); + String showOnlySelectedCompetitors(); + String showSelectedCompetitorsInfo(); + String lengthInSeconds(); + String selectedRaces(); + String stressTest(); + String numberOfManeuvers(); + String tacks(); + String jibes(); + String penaltyCircles(); + String medalRaceIsNull(); + String maneuverTypes(); + String configuration(); + String chooseChart(); + String distanceTraveled(); + String velocityMadeGoodLong(); + String speedOverGroundLong(); + String gapToLeaderLong(); + String pointsToLoad(); + String speed(); + String distance(); + String in(); + String secondsUnit(); + String metersUnit(); + String failedToLoadRaceData(); + String close(); + String compareCompetitors(); + String description(); + String sailNumber(); + String country(); + String no3LetterCodes(); + String add(); + String delete(); + String showCharts(); + String raceWithThisNameAlreadyExists(); + String raceWithThisNameAlreadyExistsInRegatta(); + String headUp(); + String bearAway(); + String tack(); + String jibe(); + String penaltyCircle(); + String markPassing(); + String mark(); + String otherManeuver(); + String douglasPeuckerPoints(); + String filterRacesByName(); + String actionEdit(); + String actionEditScores(); + String actionOpenBrowser(); + String actionRemove(); + String actionEditRaces(); + String actionRaceEdit(); + String actionRaceUnlink(); + String actionRaceRemove(); + String filterLeaderboardsByName(); + String actions(); + String islinked(); + String yes(); + String no(); + String hoverOverAPoint(); + String noSelection(); + String raceIsKnownToStartUpwind(); + String events(); + String settingsForComponent(String localizedComponentName); + String noEventsFound(); + String noEventSelected(); + String noLeaderboardsFound(); + String searchEvents(); + String location(); + String from(); + String until(); + String onlyLiveEvents(); + String locationNotAvailable(); + String startDateNotAvailable(); + String startDate(); + String unknownManeuver(); + String tailLengthMustBePositive(); + String failedToLoadRaceInformation(String message); + String competitorPassedMarkAtDate(String competitorName, String markName, String dateTime); + String valueForCompetitorAt(String competitorName, String dateTime, String valueWithUnit); + String reallyRemoveRace(String string); + String showDetails(); + String hideLeaderboard(); + String hideLeaderboards(); + String showLeaderboard(); + String hideRaces(); + String showMap(); + String hideMap(); + String noLeaderboardSelected(); + String leaderboardGroups(); + String filterLeaderboardGroupsByName(); + String createNewLeaderboardGroup(); + String leaderboardGroupConfiguration(); + String legs(); + String currentLeg(); + String leaderboardGroup(); + String pleaseEnterNonEmptyDescription(); + String groupWithThisNameAlreadyExists(); + String detailsOfLeaderboardGroup(); + String edit(); + String save(); + String abort(); + String noLeaderboardGroupWithNameFound(String groupName); + String overview(); + String welcomeToSailingAnalytics(); + String welcomeToSailingAnalyticsBody(); + String home(); + String clickAndDragToZoomIn(); + String windSpeed(); + String allTimesInUTC(); + String autoZoomTo(); + String autoZoomToBoats(); + String autoZoomToBuoys(); + String autoZoomOff(); + String autoZoomToTails(); + String autoZoomToWindSensors(); + String autoZoomSelectedCompetitors(); + String bearing(); + String zoom(); + String stepSizeMustBeGreaterThanNull(); + String stepSizeInSeconds(); + String refreshInterval(); + String refreshIntervalMustBeGreaterThanXSeconds(String seconds); + String competitorCharts(); + String selectAtLeastOneCompetitor(); + String directionChange(); + String speedChange(); + String degreesShort(); + String untracked(); + String delayForLiveMode(); + String notAvailable(); + String details(); + String noGroupSelected(); + String combinedWindSourceTypeName(); + String courseBasedWindSourceTypeName(); + String trackBasedEstimationWindSourceTypeName(); + String expeditionWindSourceTypeName(); + String webWindSourceTypeName(); + String clickChartToSetTime(); + String position(); + String windSourcesUsed(); + String errorTryingToUpdateWindSourcesToExclude(String raceName, String message); + String feedback(); + String startStopPlaying(); + String backToLive(); + String slowPlaySpeedDown(); + String speedPlaySpeedUp(); + String showHideComponent(String localizedShortName); + String degreesBoatToTheWind(); + String racesInLeaderboard(); + String leaderboardsInGroup(); + String replication(); + String errorFetchingReplicaData(String message); + String averageCrossTrackErrorInMeters(); + String enterMaster(); + String errorStartingReplication(String hostname, String exchangeName, String message); + String helpLines(); + String startLine(); + String finishLine(); + String advantageLine(); + String courseMiddleLine(); + String messagingPortNumber(); + String servletPortNumber(); + String registeredAt(String string); + String replicatingFromMaster(String hostname, int jmsPort, int servletPort); + String showWindSpeedSeries(); + String showWindDirectionSeries(); + String fleet(); + String boatClass(); + String setDelayToLive(); + String pleaseEnterNonEmptyVenue(); + String eventWithThisNameAlreadyExists(); + String venue(); + String pleaseSelectABoatClass(); + String regattaWithThisNameAlreadyExists(); + String seriesWithThisNameAlreadyExists(); + String fleetWithThisNameAlreadyExists(); + String fleets(); + String series(); + String splitFleet(); + String color(); + String medalSeries(); + String noColor(); + String pleaseSelectARegatta(); + String addFleet(); + String doYouReallyWantToRemoveRegatta(String name); + String errorLoadingScoreCorrectionProviders(String message); + String selectResultListToImportFrom(); + String of(); + String errorObtainingScoreCorrections(String scoreCorrectionProviderName, String eventName, String boatClassName, + String string, String message); + String assignRaceNumbersToRaceColumns(); + String importOfficialResults(); + String selectAll(); + String apply(); + String successfullyUpdatedScores(); + String errorUpdatingScoresForLeaderboard(String leaderboardName, String message); + String maneuverTypesToShowWhenCompetitorIsClicked(); + String simulateWithStartTimeNow(); + String boatClassDoesNotMatchSelectedRegatta(String boatClass, String regattaName); + String regattaExistForSelectedBoatClass(); + String reload(); + String addRegatta(); + String exchangeName(); + String course(); + String courseLayout(); + String buoy(); + String gate(); + String buoys(); + String waypoint(); + String showAllCompetitors(); + String boatTails(); + String maximalCount(); + String maxVisibleCompetitorsCountMustBePositive(); + String fregResultImportUrls(); + String errorRefreshingFregUrlList(String message); + String successfullyUpdatedFregUrls(); + String errorRemovingFregUrls(String message); + String pleaseEnterNonEmptyUrl(); + String addFragUrl(); + String errorAddingFragUrl(String message); + String errorTryingToObtainLeaderboardContents(String message); + String lastScoreUpdate(); + String warningBrowserUnsupported(); + String newMark(); + String controlPoint(); + String errorUpdatingRaceCourse(String message); + String successfullyUpdatedCourse(); + String selectOneMarkOrTwoMarksForGate(); + String errorTryingToObtainTheMarksOfTheRace(String message); + String errorTryingToObtainRaceCourse(String message); + String insertWaypointBeforeSelected(); + String insertWaypointAfterSelected(); + String scoringSchemeLowPointSystem(); + String scoringSchemeHighPointSystem(); + String scoringSystem(); + String createFlexibleLeaderboard(); + String createRegattaLeaderboard(); + String editFlexibleLeaderboard(); + String editRegattaLeaderboard(); + String noRegatta(); + String useOverallLeaderboard(); + String overallStandings(); + String scoringSchemeHighPointEssOverall(); + String scoringSchemeHighPointLastBreaksTie(); + String type(); + String actionAddRaces(); + String racesWithNamePrefix(); + String maximumSpeedOverGroundInKnots(); + String totalTimeSailedDownwindInSeconds(); + String totalTimeSailedUpwindInSeconds(); + String totalTimeSailedReachingInSeconds(); + String totalTimeSailedInSeconds(); + String overallDetailsToShow(); + String hhmmssUnit(); + String actionAddWindData(); + String valueMustBeBetweenMinMax(String name, String minValue, String maxValue); + String optional(); + String pleaseEnterAValue(); + String latitude(); + String longitude(); + String actionAddEvent(); + String publicationUrl(); + String suppress(); + String isPublic(); + String unsuppress(); + String suppressedCompetitors(); + String pleaseSelectASeries(); + String pleaseSelectARace(); + String displayGroupsInReverseOrder(); + String actionConfigureUrl(); + String configureLeaderboardUrlDescription(); + String embedded(); + String mediaPanel(); + String url(); + String mimeType(); + String title(); + String reallyRemoveMediaTrack(String mediaTrackTitle); + String duration(); + String addMediaTrack(); + String addYoutubeTrack(); + String youtubeId(); + String additionalUrlSettings(); + String restrictToSingleSelectedRace(); + String expandSelectedRace(); + String showRaceDetails(); + String numberOfRaces(); + String numberOfRacesMustBeNonNegativeNumber(); + String chooseTheWayYouSelectRaces(); + String selectFromAllRaces(); + String selectANumberOfRaces(); + String numberOfLastNRaces(); + String expandLastRace(); + String factor(); + String errorUpdatingIsMedalRace(String message); + String maneuverLoss(); + String averageManeuverLossInMeters(); + String averageTackLossInMeters(); + String averageJibeLossInMeters(); + String shape(); + String pattern(); + String legend(); + String live(); + String swissTimingArchiveConnector(); + String errorFetchingRankingChartData(String message); + String loadingCompetitorData(); + String rankNAfterRace(long l, String string); + String afterRace(); + String showRankChart(); + String overallLeaderboardSelection(); + String showOverallLeaderboardOnSamePage(); + String errorTryingToObtainOverallLeaderboards(String message); + String finished(); + String passedTo(String name); + String gapChangeSinceLegStartInSeconds(); + String sideToWhichMarkAtLegStartWasRounded(); + String raceIsLive(String raceName); + String racesAreLive(String raceNames); + String scoringSchemeHighPointFirstGetsTen(); + String knotsUnit(); + String averageJibeLossInMetersTooltip(); + String averageManeuverLossInMetersTooltip(); + String averageTackLossInMetersTooltip(); + String currentLegTooltip(); + String distanceTraveledTooltip(); + String estimatedTimeToNextWaypointInSecondsTooltip(); + String gapToLeaderInSecondsTooltip(); + String averageSpeedInKnotsTooltip(); + String jibeTooltip(); + String maximumSpeedOverGroundInKnotsTooltip(); + String numberOfManeuversTooltip(); + String penaltyCircleTooltip(); + String raceAverageSpeedInKnotsTooltip(); + String currentSpeedOverGroundInKnotsTooltip(); + String windwardDistanceToLeaderInMetersTooltip(); + String raceDistanceTraveledTooltip(); + String rankTooltip(); + String rankGainTooltip(); + String tackTooltip(); + String timeTooltip(); + String totalTimeSailedDownwindInSecondsTooltip(); + String totalTimeSailedInSecondsTooltip(); + String totalTimeSailedReachingInSecondsTooltip(); + String totalTimeSailedUpwindInSecondsTooltip(); + String windwardDistanceToGoInMetersTooltip(); + String averageCrossTrackErrorInMetersTooltip(); + String raceAverageCrossTrackErrorInMetersTooltip(); + String gapChangeSinceLegStartInSecondsTooltip(); + String velocityMadeGoodInKnotsTooltip(); + String sideToWhichMarkAtLegStartWasRoundedTooltip(); +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index ddcee72fb66..dcd1a9e2b73 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -1,462 +1,486 @@ -helloWorld=Hello World -kielWeel2011=Kiel Week 2011 -stgAccount=STG Account -tracTracEvents=TracTrac Events -swissTimingEvents=SwissTiming Events -trackedBefore=History of tracked events -listRaces=List Races -wind=Wind -windPanelLabel=This is the Wind Panel which so far is completely empty. -refresh=Refresh -remove=Remove -windSource=Wind Source -dampeningInterval=Dampening Interval -map=Map -race=Race -races=Races -tracked=tracked -time=Time -playSpeed=Play speed -playSpeedHelp=Use "1" for regular play-back speed, "2" for double-speed playback and so on -playModeLive=Live -playModeReplay=Replay Mode -timeDelay=Delay -timeDelayHelp=Leave empty to replay at arbitrary times; enter seconds (e.g., "60" for one minute or "0" for none) of delay before live data feed -speedInKnots=Speed (kn) -fromDeg=From (deg) -noRacesYet=No Races Yet -total=\u03A3 -carry=Accumulated -competitor=Competitor -competitors=Competitors -defaultLeaderboard=Default Leaderboard -noSuchLeaderboard=No such leaderboard -leaderboardConfiguration=Leaderboard Configuration -newDotDotDot=New... -editScores=Edit Scores... -columnNamesInSelectedLeaderboard=Race Names in Selected Leaderboard -addDotDotDot=Add... -renameDotDotDot=Rename... -trackedRaceConnectedToSelectedRaceName=Tracked Race Connected to Selected Race Name -linkToColumn=Link to Column -unlink=Unlink -leaderboardName=Leaderboard Name -cancel=Cancel -pleaseEnterAName=Please enter a name -discardRacesFromHowManyStartedRacesOn=Discard one more race starting with how many started races -leaderboardWithThisNameAlreadyExists=Leaderboard with this name already exists -discardThresholdsMustBeNumeric=Discard thresholds must be numeric -discardThresholdsMustBeAscending=Discard thresholds must be ascending -discarding=Discarding -startingFromNumberOfRaces=Starting from how many races -renameLeaderboard=Rename Leaderboard -addColumnToLeaderboard=Add Column to Leaderboard -pleaseEnterNameForNewRaceColumn=Please enter a name for new race column -ok=OK -medalRace=Medal Race -renameRace=Rename Race -openSelectedLeaderboard=Open Selected Leaderboard -rank=Rank -totalRank=Total rank -collapse=- -expand=+ -leg=L -distanceInMeters=Distance -distanceInMetersUnit=m -averageSpeedInKnots=\u2205 Speed -averageSpeedInKnotsUnit=kts -rankGain=Rank Gain -sapSailingAnalytics=Sailing Analytics -leaderboard=Leaderboard -leaderboards=Leaderboards -leaderboardSettings=Leaderboard Settings -settings=Settings (e.g., leg detail selection) -selectAtLeastOneLegDetail=Select at least one leg detail -currentSpeedOverGroundInKnots=SOG -currentSpeedOverGroundInKnotsUnit=kts -estimatedTimeToNextWaypointInSeconds=ETA -estimatedTimeToNextWaypointInSecondsUnit=s -gapToLeaderInSeconds=Gap to leader -gapToLeaderInSecondsUnit=s -velocityMadeGoodInKnots=VMG -velocityMadeGoodInKnotsUnit=kts -windwardDistanceToGoInMeters=Windward distance to go -windwardDistanceToLeaderInMeters=Windward Distance To Leader -windwardDistanceToGoInMetersUnit=m -name=Name -leaveEmptyForDefault=Leave empty for default -trackNewEvent=Track New event -trackableRaces=Trackable Races -trackWind=Track Wind -regattaName=Regatta name -eventName=Event name -event=Event -startTime=Start time -regatta=Regatta -regattas=Regattas -startTracking=Start tracking -stopTracking=Stop tracking -connections=Connections -historyOfConnections=History of connections -defineNewConnection=Define a new connection -trackedRaces=Tracked races -canSendRequests=Can send requests -connectAndReadRaces=Connect and read races -ports=Ports -liveData=Live data -storedData=Stored data -uris=URIs -jsonUrl=JSON URL -livePort=Port Live Data -storedPort=Port Stored Data -liveUri=Live URI -storedUri=Stored URI -eventsConnectedTo=Events Currently Tracked -hostname=Hostname -declinationCheckbox=Correct Wind Bearing by Declination -raceStartTrackingColumn=Tracking Started -pauseAutomaticRefresh=Pause automatic refresh -autoRefresh=Refresh automatically -delayInSeconds=Delay (s) -delayBetweenAutoAdvances=Delay between auto-updates in seconds: -delayMustBeNonNegative=The delay must be greater than zero -chooseUpdateIntervalOfAtLeastOneSecond=Choose update interval of at least one second -errorSettingWindForRace=Error setting wind for race -errorFetchingWindInformationForRace=Error fetching wind information for race -errorWhileTryingToSetWindSourceForRace=Error while trying to set "wind starts upwind" flag -inEvent=in event -to=to -showEstimatedWind=Show estimated wind -timing=Timing -raceDetailsToShow=Race Details -overallDetailsToShow=Overall Details -legDetailsToShow=Leg Details -columnMoveUp=Up -columnMoveDown=Down -port=Port -raceStartTimeColumn=Race Started -showOnlySelectedCompetitors=Show only selected competitors -showSelectedCompetitorsInfo=Show info box for selected competitors -tailLength=Tail length (s) -selectedRaces=Which races would you like to display? -lengthInSeconds=Length (s) -stressTest=Stress Test -numberOfManeuvers=Maneuvers -tacks=Tacks -jibes=Jibes -penaltyCircles=Penalty Circles -medalRaceIsNull=Medalrace value not allowed -configuration=Configuration -maneuverTypes=Maneuvers -chooseChart=Choose chart -distanceTraveled=Distance Traveled -velocityMadeGoodLong=Velocity Made Good -speedOverGroundLong=Speed Over Ground -gapToLeaderLong=Gap To Leader -pointsToLoad=Points to load -speed=Speed -distance=Distance -in=in -secondsUnit=s -metersUnit=m -failedToLoadRaceData=Failed to laod race data. -close=Close -compareCompetitors=Compare competitors -description=Description -sailNumber=Sail number -country=Country -no3LetterCodes=Unable to find the IOC 3-letter-codes. -add=Add -delete=Delete -showCharts=Show charts -raceWithThisNameAlreadyExists=A race with that name already exists. -raceWithThisNameAlreadyExistsInRegatta=A race with that name already exists in this regatta. -headUp=Head up -bearAway=Bear away -tack=Tack -jibe=Jibe -penaltyCircle=Penalty circle -markPassing=Mark passing -mark=Mark -otherManeuver=Unknown maneuver -douglasPeuckerPoints=Douglas peucker points -filterRacesByName=Filter races by name -trackSettings=Track settings -actionEdit=Edit -actionEditScores=Edit scores -actionOpenBrowser=Open in Browser -actionRemove=Remove -actionEditRaces=Edit races -actionRaceEdit=Edit or rename race -actionRaceUnlink=Unlink race -actionRaceRemove=Remove race -filterLeaderboardsByName=Filter leaderboards by name -windwardDistanceToLeader=Windward distance to leader -actions=Actions -islinked=Is linked -yes=Yes -no=No -hoverOverAPoint=Hover over a point for details -noSelection=No selection -raceIsKnownToStartUpwind=Race starts with upwind leg -events=Events -settingsForComponent=Settings for {0} -noEventsFound=No events were found -noEventSelected=No event selected -noLeaderboardsFound=No leaderboards were found -searchEvents=Search for events -location=Location -from=From -until=Until -onlyLiveEvents=Only live events -locationNotAvailable=Location not available -startDateNotAvailable=Start date not available -startDate=Start date -unknownManeuver=Unknown maneuver -tailLengthMustBePositive=the tail length must be a number greater than zero. -failedToLoadRaceInformation=Failed to load race information: {0} -competitorPassedMarkAtDate={0} passed {1} at {2} -valueForCompetitorAt={0} at {1}: {2} -reallyRemoveRace=Do you really want to remove the race ''{0}''? -showDetails=Show details -hideLeaderboard=Hide leaderboard -hideLeaderboards=Hide leaderboards -showLeaderboard=Show leaderboard -hideRaces=Hide races -showMap=Show map -hideMap=Hide map -noLeaderboardSelected=No leaderboard selected -leaderboardGroups=Leaderboard groups -filterLeaderboardGroupsByName=Filter leaderboard groups by name -createNewLeaderboardGroup=Create leaderboard group -leaderboardGroupConfiguration=Leaderboard Group Configuration -legs=Legs -currentLeg=On Leg -leaderboardGroup=Leaderboard Group -pleaseEnterNonEmptyDescription=Please enter a non-empty description -groupWithThisNameAlreadyExists=A leaderboard group with this name already exists. -detailsOfLeaderboardGroup=Details of leaderboard group -edit=Edit -save=Save -abort=Abort -noLeaderboardGroupWithNameFound=No leaderboard group with the name {0} found -overview=Overview -welcomeToSailingAnalytics=Welcome to SAP Sailing Analytics -welcomeToSailingAnalyticsBody=Understanding what happens out on the race course isn''t always easy. To help solve this challenge and bring the excitement of sailing to the fans, we have developed a leader board based on SAP analytics.\ -Through analyzing GPS data together with integrated wind measurements from sensors out on the race course, the leader board displays information such as in-race ranking, average speeds, distance travelled, ETA (estimated time of arrival at the next mark rounding), gaps to leader, gains and losses per leg.\ -\ -Check out the results for yourself to see who triumphed - and how they did it. -home=Home -clickAndDragToZoomIn=Click and drag in the plot area to zoom in -windSpeed=Wind speed (kts) -allTimesInUTC=All times in UTC -autoZoomTo=Auto zoom to -autoZoomToBoats=Boats -autoZoomToBuoys=Buoys -autoZoomToWindSensors=Wind sensors -autoZoomOff=Off -autoZoomToTails=Tails -autoZoomSelectedCompetitors=Zoom only to selected competitors -bearing=Bearing -zoom=Zoom -stepSizeMustBeGreaterThanNull=Step size must be greater than 0 -stepSizeInSeconds=Step size in seconds -refreshInterval=Refresh interval (s) -refreshIntervalMustBeGreaterThanXSeconds=Refresh interval must be greater than {0} seconds -competitorCharts=Competitor charts -selectAtLeastOneCompetitor=To show the competitor charts, select at least one competitor -directionChange=Direction change -speedChange=Speed change -degreesShort=deg -untracked=Untracked -delayForLiveMode=Delay for live mode: -notAvailable=Not available -details=Details -noGroupSelected=No group selected -combinedWindSourceTypeName=Combined -courseBasedWindSourceTypeName=Course Layout -trackBasedEstimationWindSourceTypeName=Estimation -expeditionWindSourceTypeName=Measured -webWindSourceTypeName=Manual -clickChartToSetTime=Click on the chart to set the time -position=Position -windSourcesUsed=Wind Sources Used -errorTryingToUpdateWindSourcesToExclude=Error trying to update wind sources to exclude for race {0}: {1} -feedback=Feedback -startStopPlaying=Start/Stop playing -backToLive=Jump back to live time point -slowPlaySpeedDown=Slow play speed down -speedPlaySpeedUp=Speed play speed up -showHideComponent=Show/Hide {0} -degreesBoatToTheWind=Angle to wind -racesInLeaderboard=Races in leaderboard -leaderboardsInGroup=Leaderboards in group -replication=Replication -errorFetchingReplicaData=Error fetching replica data: {0} -averageCrossTrackErrorInMeters=\u2205 XTE -enterMaster=Hostname of Master Instance -errorStartingReplication=Error starting replication from host {0} / exchange {1}: {2} -helpLines=Help lines -startLine=Start line -finishLine=Finish line -advantageLine=Advantage line -courseMiddleLine=Course middle line -messagingPortNumber=Messaging port number (0 for default) -servletPortNumber=Servlet port number -registeredAt=Registered at {0} -replicatingFromMaster=Replicating from master {0}, messaging port {1}, servlet port {2} -showWindSpeedSeries=Show wind speed data -showWindDirectionSeries=Show wind directions data -fleet=Fleet -boatClass=Boat Class -setDelayToLive=Set delay to live -pleaseEnterNonEmptyVenue=Please enter a venue. -eventWithThisNameAlreadyExists=An event with this name already exists. -venue=Venue -pleaseSelectABoatClass=Please select a boat class. -regattaWithThisNameAlreadyExists=A regatta with this name already exists. -seriesWithThisNameAlreadyExists=A series with this name already exists. -fleetWithThisNameAlreadyExists=A fleet with this name already exists. -fleets=Fleets -series=Series -splitFleet=Split fleet -color=Color -medalSeries=Medal Series -noColor=No color -pleaseSelectARegatta=Please select a regatta. -addFleet=Add fleet -doYouReallyWantToRemoveRegatta=Do you really want to remove the regatta "{0}"? -errorLoadingScoreCorrectionProviders=Error loading score correction providers: {0} -selectResultListToImportFrom=Select result list to import from -of=of -errorObtainingScoreCorrections=Error obtaining score corrections from provider {0} and event {1} for boat class {2} published on {3}: {4} -assignRaceNumbersToRaceColumns=Assign race numbers of official results to leaderboard race columns -importOfficialResults=Import official results... -selectAll=Select all -apply=Apply -successfullyUpdatedScores=Successfully updated scores -errorUpdatingScoresForLeaderboard=Error updating scores for leaderboard {0}: {1} -maneuverTypesToShowWhenCompetitorIsClicked=Maneuver types to show when competitor is clicked -simulateWithStartTimeNow=Simulate with "now" as start time -boatClassDoesNotMatchSelectedRegatta=The selected races contain boat classes which are not the same as the boat class ''{0}'' of the selected regatta.\ -Do you really want to use the regatta ''{1}''? -regattaExistForSelectedBoatClass=There is at least one regatta for the selected boat classes.\ -Do you really want to use the ''no regatta'' selection? -reload=Reload -addRegatta=Add Regatta... -exchangeName=Exchange Name -course=Course -courseLayout=Course layout -buoy=Buoy -gate=Gate -buoys=Buoys -waypoint=Waypoint -showAllCompetitors=Show all competitors -boatTails=Boat tails -maximalCount=Maximal count -maxVisibleCompetitorsCountMustBePositive=The maximal amount of visible competitors must be greater than zero. -fregResultImportUrls=FREG URLs -errorRefreshingFregUrlList=Error refreshing FREG URL list: {0} -successfullyUpdatedFregUrls=Successfully updated FREG URL list -errorRemovingFregUrls=Error removing FREG URLs: {0} -pleaseEnterNonEmptyUrl=Please enter a non-empty URL -addFragUrl=Add FRAG Result URL -errorAddingFragUrl=Error adding FRAG URL: {0} -errorTryingToObtainLeaderboardContents=Error trying to obtain leaderboard contents: {0} -lastScoreUpdate=Last Score Update -warningBrowserUnsupported=This website is not optimized for your browser. Please switch to a newer one like Firefox or Chrome. -newMark=New Mark -controlPoint=Mark/Gate -errorUpdatingRaceCourse=Error updating race course: {0} -successfullyUpdatedCourse=Successfully updated race course -selectOneMarkOrTwoMarksForGate=Select a single mark or two marks to create a gate -errorTryingToObtainTheMarksOfTheRace=Error trying to obtain the marks of the race course: {0} -errorTryingToObtainRaceCourse=Error trying to obtain the race course: {0} -insertWaypointBeforeSelected=Insert waypoint before selected -insertWaypointAfterSelected=Insert waypoint after selected -scoringSchemeLowPointSystem=Low Point System -scoringSchemeHighPointSystem=High Point System -scoringSchemeHighPointEssOverall=High Point System ESS Overall -scoringSchemeHighPointLastBreaksTie=High Point System, Last Race Breaks Tie -scoringSystem=Scoring system -createFlexibleLeaderboard=Create flexible leaderboard -createRegattaLeaderboard=Create regatta leaderboard -editFlexibleLeaderboard=Edit flexible leaderboard -editRegattaLeaderboard=Edit regatta leaderboard -noRegatta=No regatta -useOverallLeaderboard=Use Overall leaderboard -overallStandings=Overall Standings -type=Type -actionAddRaces=Add races -racesWithNamePrefix=races with name prefix -maximumSpeedOverGroundInKnots=Max SOG -totalTimeSailedDownwindInSeconds=Total time downwind -totalTimeSailedUpwindInSeconds=Total time upwind -totalTimeSailedReachingInSeconds=Total time reaching -totalTimeSailedInSeconds=Total time -hhmmssUnit=hh:mm:ss -actionAddWindData=Add wind data -valueMustBeBetweenMinMax=The value of ''{0}'' must be between {1} and {2}. -optional=optional -pleaseEnterAValue=Please enter a value. -latitude=Latitude -longitude=Longitude -actionAddEvent=Add Event -publicationUrl=Publication URL -suppress=Suppress -isPublic=Is public -suppress=Suppress -unsuppress=Unsuppress -suppressedCompetitors=Suppressed Competitors -mediaPanel=Audio & Video -url=URL -mimeType=MIME Type -title=Title -duration=Duration (h:mm:ss.ms) -addMediaTrack=Add Audio/Video -addYoutubeTrack=Add Youtube -youtubeId=Youtube Id -reallyRemoveMediaTrack=Do you really want to remove media track ''{0}''? -pleaseSelectASeries=Please select a series -pleaseSelectARace=Please select a race -displayGroupsInReverseOrder=Display groups in reverse order -actionConfigureUrl=Configure URL -configureLeaderboardUrlDescription=Configure a leaderboard and obtain the resulting URL from the link -embedded=Embedded -additionalUrlSettings=Additional URL Settings -restrictToSingleSelectedRace=Restrict to single selected race -expandSelectedRace=Expand selected race -showRaceDetails=Allow for race details -numberOfRaces=Number of races -numberOfRacesMustBeNonNegativeNumber=Please enter the number of last races to be displayed -chooseTheWayYouSelectRaces=Choose the way you select races -selectFromAllRaces=Select from all races -selectANumberOfRaces=Select a number of races -numberOfLastNRaces=Number of most current races to show -expandLastRace=Always expand last race shown -factor=Factor -errorUpdatingIsMedalRace=Error updating the medal race setting: {0} -maneuverLoss=Maneuver loss -averageManeuverLossInMeters=\u2205 Maneuver Loss -averageTackLossInMeters=\u2205 Tack Loss -averageJibeLossInMeters=\u2205 Jibe Loss -shape=Shape -pattern=Pattern -legend=Legend -live=live -swissTimingArchiveConnector=SwissTiming Archived Events -errorFetchingRankingChartData=Error fetching ranking chart data: {0} -loadingCompetitorData=Loading competitor data... -rankNAfterRace=Rank {0} after race {1} -afterRace=after race -showRankChart=Show rank chart -overallLeaderboardSelection=Overall Leaderboard -showOverallLeaderboardOnSamePage=Show overall leaderboard on same page -errorTryingToObtainOverallLeaderboards=Error trying to obtain overall leaderboards: {0} -finished=finished -passedTo=passed to {0} -gapChangeSinceLegStartInSeconds=Gap Change -sideToWhichMarkAtLegStartWasRounded=Mark rounded to -raceIsLive=Race {0} is live +helloWorld=Hello World +kielWeel2011=Kiel Week 2011 +stgAccount=STG Account +tracTracEvents=TracTrac Events +swissTimingEvents=SwissTiming Events +trackedBefore=History of tracked events +listRaces=List Races +wind=Wind +windPanelLabel=This is the Wind Panel which so far is completely empty. +refresh=Refresh +remove=Remove +windSource=Wind Source +dampeningInterval=Dampening Interval +map=Map +race=Race +races=Races +tracked=tracked +time=Time +timeTooltip=Time the competitor sailed on this leg. +playSpeed=Play speed +playSpeedHelp=Use "1" for regular play-back speed, "2" for double-speed playback and so on +playModeLive=Live +playModeReplay=Replay Mode +timeDelay=Delay +timeDelayHelp=Leave empty to replay at arbitrary times; enter seconds (e.g., "60" for one minute or "0" for none) of delay before live data feed +speedInKnots=Speed (kn) +fromDeg=From (deg) +noRacesYet=No Races Yet +total=\u03A3 +carry=Accumulated +competitor=Competitor +competitors=Competitors +defaultLeaderboard=Default Leaderboard +noSuchLeaderboard=No such leaderboard +leaderboardConfiguration=Leaderboard Configuration +newDotDotDot=New... +editScores=Edit Scores... +columnNamesInSelectedLeaderboard=Race Names in Selected Leaderboard +addDotDotDot=Add... +renameDotDotDot=Rename... +trackedRaceConnectedToSelectedRaceName=Tracked Race Connected to Selected Race Name +linkToColumn=Link to Column +unlink=Unlink +leaderboardName=Leaderboard Name +cancel=Cancel +pleaseEnterAName=Please enter a name +discardRacesFromHowManyStartedRacesOn=Discard one more race starting with how many started races +leaderboardWithThisNameAlreadyExists=Leaderboard with this name already exists +discardThresholdsMustBeNumeric=Discard thresholds must be numeric +discardThresholdsMustBeAscending=Discard thresholds must be ascending +discarding=Discarding +startingFromNumberOfRaces=Starting from how many races +renameLeaderboard=Rename Leaderboard +addColumnToLeaderboard=Add Column to Leaderboard +pleaseEnterNameForNewRaceColumn=Please enter a name for new race column +ok=OK +medalRace=Medal Race +renameRace=Rename Race +openSelectedLeaderboard=Open Selected Leaderboard +rank=Rank +rankTooltip=The position of the competitor. +totalRank=Total rank +collapse=- +expand=+ +leg=L +distanceInMeters=Distance +averageSpeedInKnots=\u2205 Speed +averageSpeedInKnotsTooltip=The average speed over ground during this leg,\ncalculated with the division of the traveled distance and the needed time. +raceAverageSpeedInKnotsTooltip=The average speed over ground during this race,\ncalculated with the division of the traveled distance and the needed time. +rankGain=Rank Gain +rankGainTooltip=The difference of the position from the current and the past leg. +sapSailingAnalytics=Sailing Analytics +leaderboard=Leaderboard +leaderboards=Leaderboards +leaderboardSettings=Leaderboard Settings +settings=Settings (e.g., leg detail selection) +selectAtLeastOneLegDetail=Select at least one leg detail +currentSpeedOverGroundInKnots=SOG +currentSpeedOverGroundInKnotsTooltip=The current speed over ground. +estimatedTimeToNextWaypointInSeconds=ETA +estimatedTimeToNextWaypointInSecondsTooltip=The estimated time that the competitor needs to reach the next waypoint. +gapToLeaderInSeconds=Gap to leader +gapToLeaderInSecondsTooltip=The time a competitor would need to reach the leader. +velocityMadeGoodInKnots=VMG +velocityMadeGoodInKnotsTooltip=The velocity made good, which is the speed towards the rhumb line. +windwardDistanceToGoInMeters=Windward distance to go +windwardDistanceToGoInMetersTooltip=Windward distance from the positon of the competitor, to the end of the leg. +windwardDistanceToLeaderInMeters=Windward Distance To Leader +windwardDistanceToLeaderInMetersTooltip=Windward distance of the competitor to the leader. +name=Name +leaveEmptyForDefault=Leave empty for default +trackNewEvent=Track New event +trackableRaces=Trackable Races +trackWind=Track Wind +regattaName=Regatta name +eventName=Event name +event=Event +startTime=Start time +regatta=Regatta +regattas=Regattas +startTracking=Start tracking +stopTracking=Stop tracking +connections=Connections +historyOfConnections=History of connections +defineNewConnection=Define a new connection +trackedRaces=Tracked races +canSendRequests=Can send requests +connectAndReadRaces=Connect and read races +ports=Ports +liveData=Live data +storedData=Stored data +uris=URIs +jsonUrl=JSON URL +livePort=Port Live Data +storedPort=Port Stored Data +liveUri=Live URI +storedUri=Stored URI +eventsConnectedTo=Events Currently Tracked +hostname=Hostname +declinationCheckbox=Correct Wind Bearing by Declination +raceStartTrackingColumn=Tracking Started +pauseAutomaticRefresh=Pause automatic refresh +autoRefresh=Refresh automatically +delayInSeconds=Delay (s) +delayBetweenAutoAdvances=Delay between auto-updates in seconds: +delayMustBeNonNegative=The delay must be greater than zero +chooseUpdateIntervalOfAtLeastOneSecond=Choose update interval of at least one second +errorSettingWindForRace=Error setting wind for race +errorFetchingWindInformationForRace=Error fetching wind information for race +errorWhileTryingToSetWindSourceForRace=Error while trying to set "wind starts upwind" flag +inEvent=in event +to=to +showEstimatedWind=Show estimated wind +timing=Timing +raceDetailsToShow=Race Details +overallDetailsToShow=Overall Details +legDetailsToShow=Leg Details +columnMoveUp=Up +columnMoveDown=Down +port=Port +raceStartTimeColumn=Race Started +showOnlySelectedCompetitors=Show only selected competitors +showSelectedCompetitorsInfo=Show info box for selected competitors +tailLength=Tail length (s) +selectedRaces=Which races would you like to display? +lengthInSeconds=Length (s) +stressTest=Stress Test +numberOfManeuvers=Maneuvers +numberOfManeuversTooltip=The amount of the sailed maneuvers in this leg. +tacks=Tacks +jibes=Jibes +penaltyCircles=Penalty Circles +medalRaceIsNull=Medalrace value not allowed +configuration=Configuration +maneuverTypes=Maneuvers +chooseChart=Choose chart +distanceTraveled=Distance Traveled +distanceTraveledTooltip=The distance traveled from the leg start to the end\nor to the current time point, if the leg isn''t finished. +raceDistanceTraveledTooltip=The distance traveled from the race start to the end\nor to the current time point, if the race isn''t finished. +velocityMadeGoodLong=Velocity Made Good +speedOverGroundLong=Speed Over Ground +gapToLeaderLong=Gap To Leader +pointsToLoad=Points to load +speed=Speed +distance=Distance +in=in +secondsUnit=s +metersUnit=m +failedToLoadRaceData=Failed to laod race data. +close=Close +compareCompetitors=Compare competitors +description=Description +sailNumber=Sail number +country=Country +no3LetterCodes=Unable to find the IOC 3-letter-codes. +add=Add +delete=Delete +showCharts=Show charts +raceWithThisNameAlreadyExists=A race with that name already exists. +raceWithThisNameAlreadyExistsInRegatta=A race with that name already exists in this regatta. +headUp=Head up +bearAway=Bear away +tack=Tack +tackTooltip=The amount of the sailed tacks in this race. +jibe=Jibe +jibeTooltip=The amount of the sailed jibes in this race. +penaltyCircle=Penalty circle +penaltyCircleTooltip=The amount of the sailed penalty circles in this race. +markPassing=Mark passing +mark=Mark +otherManeuver=Unknown maneuver +douglasPeuckerPoints=Douglas peucker points +filterRacesByName=Filter races by name +trackSettings=Track settings +actionEdit=Edit +actionEditScores=Edit scores +actionOpenBrowser=Open in Browser +actionRemove=Remove +actionEditRaces=Edit races +actionRaceEdit=Edit or rename race +actionRaceUnlink=Unlink race +actionRaceRemove=Remove race +filterLeaderboardsByName=Filter leaderboards by name +actions=Actions +islinked=Is linked +yes=Yes +no=No +hoverOverAPoint=Hover over a point for details +noSelection=No selection +raceIsKnownToStartUpwind=Race starts with upwind leg +events=Events +settingsForComponent=Settings for {0} +noEventsFound=No events were found +noEventSelected=No event selected +noLeaderboardsFound=No leaderboards were found +searchEvents=Search for events +location=Location +from=From +until=Until +onlyLiveEvents=Only live events +locationNotAvailable=Location not available +startDateNotAvailable=Start date not available +startDate=Start date +unknownManeuver=Unknown maneuver +tailLengthMustBePositive=the tail length must be a number greater than zero. +failedToLoadRaceInformation=Failed to load race information: {0} +competitorPassedMarkAtDate={0} passed {1} at {2} +valueForCompetitorAt={0} at {1}: {2} +reallyRemoveRace=Do you really want to remove the race ''{0}''? +showDetails=Show details +hideLeaderboard=Hide leaderboard +hideLeaderboards=Hide leaderboards +showLeaderboard=Show leaderboard +hideRaces=Hide races +showMap=Show map +hideMap=Hide map +noLeaderboardSelected=No leaderboard selected +leaderboardGroups=Leaderboard groups +filterLeaderboardGroupsByName=Filter leaderboard groups by name +createNewLeaderboardGroup=Create leaderboard group +leaderboardGroupConfiguration=Leaderboard Group Configuration +legs=Legs +currentLeg=On Leg +currentLegTooltip=The leg, on which the competitor currently is. +leaderboardGroup=Leaderboard Group +pleaseEnterNonEmptyDescription=Please enter a non-empty description +groupWithThisNameAlreadyExists=A leaderboard group with this name already exists. +detailsOfLeaderboardGroup=Details of leaderboard group +edit=Edit +save=Save +abort=Abort +noLeaderboardGroupWithNameFound=No leaderboard group with the name {0} found +overview=Overview +welcomeToSailingAnalytics=Welcome to SAP Sailing Analytics +welcomeToSailingAnalyticsBody=Understanding what happens out on the race course isn''t always easy. To help solve this challenge and bring the excitement of sailing to the fans, we have developed a leader board based on SAP analytics.\ +Through analyzing GPS data together with integrated wind measurements from sensors out on the race course, the leader board displays information such as in-race ranking, average speeds, distance travelled, ETA (estimated time of arrival at the next mark rounding), gaps to leader, gains and losses per leg.\ +\ +Check out the results for yourself to see who triumphed - and how they did it. +home=Home +clickAndDragToZoomIn=Click and drag in the plot area to zoom in +windSpeed=Wind speed (kts) +allTimesInUTC=All times in UTC +autoZoomTo=Auto zoom to +autoZoomToBoats=Boats +autoZoomToBuoys=Buoys +autoZoomToWindSensors=Wind sensors +autoZoomOff=Off +autoZoomToTails=Tails +autoZoomSelectedCompetitors=Zoom only to selected competitors +bearing=Bearing +zoom=Zoom +stepSizeMustBeGreaterThanNull=Step size must be greater than 0 +stepSizeInSeconds=Step size in seconds +refreshInterval=Refresh interval (s) +refreshIntervalMustBeGreaterThanXSeconds=Refresh interval must be greater than {0} seconds +competitorCharts=Competitor charts +selectAtLeastOneCompetitor=To show the competitor charts, select at least one competitor +directionChange=Direction change +speedChange=Speed change +degreesShort=deg +untracked=Untracked +delayForLiveMode=Delay for live mode: +notAvailable=Not available +details=Details +noGroupSelected=No group selected +combinedWindSourceTypeName=Combined +courseBasedWindSourceTypeName=Course Layout +trackBasedEstimationWindSourceTypeName=Estimation +expeditionWindSourceTypeName=Measured +webWindSourceTypeName=Manual +clickChartToSetTime=Click on the chart to set the time +position=Position +windSourcesUsed=Wind Sources Used +errorTryingToUpdateWindSourcesToExclude=Error trying to update wind sources to exclude for race {0}: {1} +feedback=Feedback +startStopPlaying=Start/Stop playing +backToLive=Jump back to live time point +slowPlaySpeedDown=Slow play speed down +speedPlaySpeedUp=Speed play speed up +showHideComponent=Show/Hide {0} +degreesBoatToTheWind=Angle to wind +racesInLeaderboard=Races in leaderboard +leaderboardsInGroup=Leaderboards in group +replication=Replication +errorFetchingReplicaData=Error fetching replica data: {0} +averageCrossTrackErrorInMeters=\u2205 XTE +averageCrossTrackErrorInMetersTooltip=The average cross track error to the rhumb line during this leg. +raceAverageCrossTrackErrorInMetersTooltip=The average cross track error to the rhumb line during this race. +enterMaster=Hostname of Master Instance +errorStartingReplication=Error starting replication from host {0} / exchange {1}: {2} +helpLines=Help lines +startLine=Start line +finishLine=Finish line +advantageLine=Advantage line +courseMiddleLine=Course middle line +messagingPortNumber=Messaging port number (0 for default) +servletPortNumber=Servlet port number +registeredAt=Registered at {0} +replicatingFromMaster=Replicating from master {0}, messaging port {1}, servlet port {2} +showWindSpeedSeries=Show wind speed data +showWindDirectionSeries=Show wind directions data +fleet=Fleet +boatClass=Boat Class +setDelayToLive=Set delay to live +pleaseEnterNonEmptyVenue=Please enter a venue. +eventWithThisNameAlreadyExists=An event with this name already exists. +venue=Venue +pleaseSelectABoatClass=Please select a boat class. +regattaWithThisNameAlreadyExists=A regatta with this name already exists. +seriesWithThisNameAlreadyExists=A series with this name already exists. +fleetWithThisNameAlreadyExists=A fleet with this name already exists. +fleets=Fleets +series=Series +splitFleet=Split fleet +color=Color +medalSeries=Medal Series +noColor=No color +pleaseSelectARegatta=Please select a regatta. +addFleet=Add fleet +doYouReallyWantToRemoveRegatta=Do you really want to remove the regatta "{0}"? +errorLoadingScoreCorrectionProviders=Error loading score correction providers: {0} +selectResultListToImportFrom=Select result list to import from +of=of +errorObtainingScoreCorrections=Error obtaining score corrections from provider {0} and event {1} for boat class {2} published on {3}: {4} +assignRaceNumbersToRaceColumns=Assign race numbers of official results to leaderboard race columns +importOfficialResults=Import official results... +selectAll=Select all +apply=Apply +successfullyUpdatedScores=Successfully updated scores +errorUpdatingScoresForLeaderboard=Error updating scores for leaderboard {0}: {1} +maneuverTypesToShowWhenCompetitorIsClicked=Maneuver types to show when competitor is clicked +simulateWithStartTimeNow=Simulate with "now" as start time +boatClassDoesNotMatchSelectedRegatta=The selected races contain boat classes which are not the same as the boat class ''{0}'' of the selected regatta.\ +Do you really want to use the regatta ''{1}''? +regattaExistForSelectedBoatClass=There is at least one regatta for the selected boat classes.\ +Do you really want to use the ''no regatta'' selection? +reload=Reload +addRegatta=Add Regatta... +exchangeName=Exchange Name +course=Course +courseLayout=Course layout +buoy=Buoy +gate=Gate +buoys=Buoys +waypoint=Waypoint +showAllCompetitors=Show all competitors +boatTails=Boat tails +maximalCount=Maximal count +maxVisibleCompetitorsCountMustBePositive=The maximal amount of visible competitors must be greater than zero. +fregResultImportUrls=FREG URLs +errorRefreshingFregUrlList=Error refreshing FREG URL list: {0} +successfullyUpdatedFregUrls=Successfully updated FREG URL list +errorRemovingFregUrls=Error removing FREG URLs: {0} +pleaseEnterNonEmptyUrl=Please enter a non-empty URL +addFragUrl=Add FRAG Result URL +errorAddingFragUrl=Error adding FRAG URL: {0} +errorTryingToObtainLeaderboardContents=Error trying to obtain leaderboard contents: {0} +lastScoreUpdate=Last Score Update +warningBrowserUnsupported=This website is not optimized for your browser. Please switch to a newer one like Firefox or Chrome. +newMark=New Mark +controlPoint=Mark/Gate +errorUpdatingRaceCourse=Error updating race course: {0} +successfullyUpdatedCourse=Successfully updated race course +selectOneMarkOrTwoMarksForGate=Select a single mark or two marks to create a gate +errorTryingToObtainTheMarksOfTheRace=Error trying to obtain the marks of the race course: {0} +errorTryingToObtainRaceCourse=Error trying to obtain the race course: {0} +insertWaypointBeforeSelected=Insert waypoint before selected +insertWaypointAfterSelected=Insert waypoint after selected +scoringSchemeLowPointSystem=Low Point System +scoringSchemeHighPointSystem=High Point System +scoringSchemeHighPointEssOverall=High Point System ESS Overall +scoringSchemeHighPointLastBreaksTie=High Point System, Last Race Breaks Tie +scoringSystem=Scoring system +createFlexibleLeaderboard=Create flexible leaderboard +createRegattaLeaderboard=Create regatta leaderboard +editFlexibleLeaderboard=Edit flexible leaderboard +editRegattaLeaderboard=Edit regatta leaderboard +noRegatta=No regatta +useOverallLeaderboard=Use Overall leaderboard +overallStandings=Overall Standings +type=Type +actionAddRaces=Add races +racesWithNamePrefix=races with name prefix +maximumSpeedOverGroundInKnots=Max SOG +maximumSpeedOverGroundInKnotsTooltip=The biggest speed over ground measured in the regatta. +totalTimeSailedDownwindInSeconds=Total time downwind +totalTimeSailedDownwindInSecondsTooltip=The total time, the competitor sailed on downwind in the regatta. +totalTimeSailedUpwindInSeconds=Total time upwind +totalTimeSailedUpwindInSecondsTooltip=The total time, the competitor sailed on upwind in the regatta. +totalTimeSailedReachingInSeconds=Total time reaching +totalTimeSailedReachingInSecondsTooltip=The total time, the competitor sailed on reaching in the regatta. +totalTimeSailedInSeconds=Total time +totalTimeSailedInSecondsTooltip=The total time, the competitor needed for the regatta. +hhmmssUnit=hh:mm:ss +actionAddWindData=Add wind data +valueMustBeBetweenMinMax=The value of ''{0}'' must be between {1} and {2}. +optional=optional +pleaseEnterAValue=Please enter a value. +latitude=Latitude +longitude=Longitude +actionAddEvent=Add Event +publicationUrl=Publication URL +suppress=Suppress +isPublic=Is public +suppress=Suppress +unsuppress=Unsuppress +suppressedCompetitors=Suppressed Competitors +mediaPanel=Audio & Video +url=URL +mimeType=MIME Type +title=Title +duration=Duration (h:mm:ss.ms) +addMediaTrack=Add Audio/Video +addYoutubeTrack=Add Youtube +youtubeId=Youtube Id +reallyRemoveMediaTrack=Do you really want to remove media track ''{0}''? +pleaseSelectASeries=Please select a series +pleaseSelectARace=Please select a race +displayGroupsInReverseOrder=Display groups in reverse order +actionConfigureUrl=Configure URL +configureLeaderboardUrlDescription=Configure a leaderboard and obtain the resulting URL from the link +embedded=Embedded +additionalUrlSettings=Additional URL Settings +restrictToSingleSelectedRace=Restrict to single selected race +expandSelectedRace=Expand selected race +showRaceDetails=Allow for race details +numberOfRaces=Number of races +numberOfRacesMustBeNonNegativeNumber=Please enter the number of last races to be displayed +chooseTheWayYouSelectRaces=Choose the way you select races +selectFromAllRaces=Select from all races +selectANumberOfRaces=Select a number of races +numberOfLastNRaces=Number of most current races to show +expandLastRace=Always expand last race shown +factor=Factor +errorUpdatingIsMedalRace=Error updating the medal race setting: {0} +maneuverLoss=Maneuver loss +averageManeuverLossInMeters=\u2205 Maneuver Loss +averageManeuverLossInMetersTooltip=The average distance loss during any meneuver. +averageTackLossInMeters=\u2205 Tack Loss +averageTackLossInMetersTooltip=The average distance loss during tacks. +averageJibeLossInMeters=\u2205 Jibe Loss +averageJibeLossInMetersTooltip=The average distance loss during jibes. +shape=Shape +pattern=Pattern +legend=Legend +live=live +swissTimingArchiveConnector=SwissTiming Archived Events +errorFetchingRankingChartData=Error fetching ranking chart data: {0} +loadingCompetitorData=Loading competitor data... +rankNAfterRace=Rank {0} after race {1} +afterRace=after race +showRankChart=Show rank chart +overallLeaderboardSelection=Overall Leaderboard +showOverallLeaderboardOnSamePage=Show overall leaderboard on same page +errorTryingToObtainOverallLeaderboards=Error trying to obtain overall leaderboards: {0} +finished=finished +passedTo=passed to {0} +gapChangeSinceLegStartInSeconds=Gap Change +gapChangeSinceLegStartInSecondsTooltip=The change of the gap to the leader since the last leg start.\nA negative number means, that the gap was decreased and \ + a positive number means, that it was increased. +sideToWhichMarkAtLegStartWasRounded=Mark rounded to +sideToWhichMarkAtLegStartWasRoundedTooltip=Side to which the mark at leg start was rounded. +raceIsLive=Race {0} is live racesAreLive=Races {0} are live -scoringSchemeHighPointFirstGetsTen=High Point, winner gets 10 points \ No newline at end of file +scoringSchemeHighPointFirstGetsTen=High Point, winner gets 10 points +knotsUnit=kts \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index bdc49384ec4..3814de9a78b 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -1,463 +1,487 @@ -helloWorld=Hello World -kielWeel2011=Kiel Week 2011 -stgAccount=STG Account -tracTracEvents=TracTrac Events -swissTimingEvents=SwissTiming Events -trackedBefore=Historie verfolgter Events -listRaces=Rennen anzeigen -wind=Wind -windPanelLabel=This is the Wind Panel which so far is completely empty. -refresh=Aktualisieren -remove=Löschen -windSource=Windquelle -dampeningInterval=Mittelungsintervall -map=Karte -race=Wettfahrt -races=Wettfahrten -tracked=verfolgt -time=Zeit -playSpeed=Abspielgeschwindigkeit -playSpeedHelp="1" für normale Abspielgeschwindigkeit, "2" für doppelte Geschwindigkeit usw. -playModeLive=Live -playModeReplay=Wiederholung -timeDelay=Verzögerung -timeDelayHelp=Leer für Wiedergabe zu beliebigen Zeitpunkten; Verzögerung des Datenstroms in Sekunden eingeben (z.B. "60" für eine Minute oder "0" für keine) -speedInKnots=Geschwindigkeit (sm/h) -fromDeg=aus (Grad) -noRacesYet=Bisher keine Wettfahrten -total=Gesamt -carry=übertr. -competitor=Wettkampfteilnehmner -competitors=Wettkampfteilnehmner -defaultLeaderboard=Alle Ergebnisse -noSuchLeaderboard=Rangliste nicht gefunden -leaderboardConfiguration=Ranglisten-Konfiguration -newDotDotDot=Neu... -editScores=Punktestand bearbeiten... -columnNamesInSelectedLeaderboard=Wettfahrten-Namen in der selektierten Rangliste -addDotDotDot=Hinzufügen... -renameDotDotDot=Umbenennen... -trackedRaceConnectedToSelectedRaceName=Wettfahrt verbunden mit dem selektierten Wettfahrt-Namen -linkToColumn=Verbindung mit Spalte -unlink=Unlink -leaderboardName=Name Rangliste -cancel=Abbrechen -pleaseEnterAName=Bitte geben Sie einen Namen ein. -discardRacesFromHowManyStartedRacesOn=Discard one more race starting with how many started races -leaderboardWithThisNameAlreadyExists=Eine Rangliste mit diesem Namen existiert bereits. -discardThresholdsMustBeNumeric=Discard thresholds must be numeric -discardThresholdsMustBeAscending=Discard thresholds must be ascending -discarding=Discarding -startingFromNumberOfRaces=Ab wievielen Rennen -renameLeaderboard=Rangliste umbenennen -addColumnToLeaderboard=Spalte zu Rangliste hinzufügen -pleaseEnterNameForNewRaceColumn=Namen für Renn-Spalten eingeben -ok=OK -medalRace=Medal Race -renameRace=Rennen umbenennen -openSelectedLeaderboard=Ausgewählte Rangliste öffnen -rank=Platz -totalRank=Gesamtplatz -collapse=- -expand=+ -leg=L -distanceInMeters=Distanz -distanceInMetersUnit=m -averageSpeedInKnots=\u2205 FüG -averageSpeedInKnotsUnit=kn -rankGain=Platz +/- -sapSailingAnalytics=Sailing Analytics -leaderboard=Ergebnisse -leaderboards=Ranglistenlisten -leaderboardSettings=Einstellungen Rangliste -settings=Einstellungen (z.B. Abschnittdetails auswählen) -selectAtLeastOneLegDetail=Mindestens ein Detail auswählen -currentSpeedOverGroundInKnots=FüG -currentSpeedOverGroundInKnotsUnit=kn -estimatedTimeToNextWaypointInSeconds=ETA -estimatedTimeToNextWaypointInSecondsUnit=s -gapToLeaderInSeconds=Abstand zum Führenden -gapToLeaderInSecondsUnit=s -velocityMadeGoodInKnots=VMG -velocityMadeGoodInKnotsUnit=kn -windwardDistanceToGoInMeters=Abstand in Windrichtung zur nächsten Tonne -windwardDistanceToLeaderInMeters=Abstand zum führenden Boot -windwardDistanceToGoInMetersUnit=m -name=Name -leaveEmptyForDefault=Leer für Standardeinstellung -trackNewEvent=Track New event -trackableRaces=Trackable Races -trackWind=Track Wind -regattaName=Name der Regatta -eventName=Event-Name -event=Rennen -startTime=Startzeit -regatta=Regatta -regattas=Regatten -startTracking=Tracking starten -stopTracking=Tracking stoppen -connections=Verbindungen -historyOfConnections=History of connections -defineNewConnection=Definiere eine neue Verbindung -trackedRaces=Tracked races -canSendRequests=Kann Anfragen senden -connectAndReadRaces=Verbinde und hole Wettfahrten -trackSettings=Track Einstellungen -ports=Ports -liveData=Live data -storedData=Stored data -uris=URIs -jsonUrl=JSON URL -livePort=Port Live Data -storedPort=Port Stored Data -liveUri=Live URI -storedUri=Stored URI -eventsConnectedTo=Momentan verfolgte Events -hostname=Hostname -declinationCheckbox=Windrichtung mit Missweisung korrigieren -raceStartTrackingColumn=Tracking Started -pauseAutomaticRefresh=Keine automatische Aktualisierung -autoRefresh=Automatisch aktualisieren -delayInSeconds=Verzögerung (s) -delayMustBeNonNegative=Die Verzögerung muß größer als 0 sein -delayBetweenAutoAdvances=Intervall zwischen Auto-Updates in Sekunden: -chooseUpdateIntervalOfAtLeastOneSecond=Update-Intervall mindestens eine Sekunde -errorSettingWindForRace=Error setting wind for race -errorFetchingWindInformationForRace=Error fetching wind information for race -errorWhileTryingToSetWindSourceForRace=Error while trying to set "wind starts upwind" flag -inEvent=in event -to=to -showEstimatedWind=Zeige den geschätzten Wind -timing=Timing -raceDetailsToShow=Renndetails -overallDetailsToShow=Regatta-Details -legDetailsToShow=Schenkeldetails -columnMoveUp=Hoch -columnMoveDown=Runter -port=Port -raceStartTimeColumn=Rennstart -showOnlySelectedCompetitors=Nur ausgewählte Segler anzeigen -showSelectedCompetitorsInfo=Infobox für ausgewählte Segler anzeigen -tailLength=Schweiflänge (s) -selectedRaces=Welche Rennen möchten Sie angezeigt bekommen? -lengthInSeconds=Länge (s) -stressTest=Stresstest -numberOfManeuvers=Manöver -tacks=Wenden -jibes=Halsen -penaltyCircles=Strafkreise -medalRaceIsNull=Medaillenrennen nicht erlaubt -maneuverTypes=Manöver -configuration=Konfiguration -chooseChart=Diagramm wählen -raceNameEmpty=Rennname leer -distanceTraveled=Zurückgelegte Strecke -velocityMadeGoodLong=Velocity Made Good -speedOverGroundLong=Speed Over Ground -gapToLeaderLong=Abstand zum führenden Boot -pointsToLoad=Zu ladende Punkte -speed=Geschwindigkeit -distance=Strecke -in=in -secondsUnit=s -metersUnit=m -failedToLoadRaceData=Renndaten konnten nicht geladen werden. -close=Schließen -compareCompetitors=Segler vergleichen -description=Beschreibung -sailNumber=Segelnummer -country=Land -no3LetterCodes=IOC 3-Buchstaben-Codes können nicht gefunden werden. -add=Hinzufügen -delete=Löschen -showCharts=Grafische Ansicht -raceWithThisNameAlreadyExists=Ein Rennen mit diesem Namen existiert schon. -raceWithThisNameAlreadyExistsInRegatta=Ein Rennen mit diesem Namen existiert schon in der Regatta. -headUp=anluven -bearAway=abfallen -tack=Wende -jibe=Halse -penaltyCircle=Strafkreis -markPassing=Tonnenpassierung -mark=Tonne -otherManeuver=Manövertyp unbekannt -douglasPeuckerPoints=Douglas-Peucker-Punkte -filterRacesByName=Rennen nach Name filtern -actionEdit=Ändern -actionEditScores=Punkte ändern -actionOpenBrowser=Im Browser öffnen -actionRemove=Entfernen -actionEditRaces=Rennen ändern -actionRaceEdit=Rennen ändern oder umbenennen -actionRaceUnlink=Rennverknüpfung entfernen -actionRaceRemove=Rennen entfernen -filterLeaderboardsByName=Ranglisten nach Name filtern -windwardDistanceToLeader=Windward distance to leader -actions=Aktionen -islinked=Verknüpft -yes=Ja -no=Nein -hoverOverAPoint=Für Details Maus über dem Graph positionieren -noSelection=Keine Selektion -raceIsKnownToStartUpwind=Rennen beginnt mit Kreuz -events=Rennen -settingsForComponent=Einstellungen für {0} -noEventsFound=Es wurden keine Rennen gefunden -noEventSelected=Kein Rennen ausgewählt -noLeaderboardsFound=Es wurden keine Ranglisten gefunden -searchEvents=Suche nach Rennen -location=Ort -from=Von -until=Bis -onlyLiveEvents=Nur Live-Rennen -locationNotAvailable=Ort nicht verfügbar -startDateNotAvailable=Startdatum nicht verfügbar -startDate=Startdatum -unknownManeuver=Unbekanntes Manöver -tailLengthMustBePositive=Die Schweiflänge muss größer als Null sein. -failedToLoadRaceInformation=Daten zur Wettfahrt konnten nicht geladen werden: {0} -competitorPassedMarkAtDate={0} passierte {1} um {2} -valueForCompetitorAt={0} um {1}: {2} -reallyRemoveRace=Möchten Sie das Rennen ''{0}'' wirklich entfernen? -showDetails=Details zeigen -hideLeaderboard=Rangliste ausblenden -hideLeaderboards=Ranglisten ausblenden -showLeaderboard=Rangliste zeigen -hideRaces=Rennen ausblenden -showMap=Karte zeigen -hideMap=Karte ausblenden -noLeaderboardSelected=Keine Rangliste ausgewählt -leaderboardGroups=Ranglisten-Gruppen -filterLeaderboardGroupsByName=Ranglisten-Gruppen nach Name filtern -createNewLeaderboardGroup=Neue Ranglisten-Gruppe erstellen -leaderboardGroupConfiguration=Ranglistengruppen-Konfiguration -legs=Schenkel -currentLeg=Aktueller Schenkel -leaderboardGroup=Ranglisten-Gruppe -pleaseEnterNonEmptyDescription=Bitte eine nicht-leere Beschreibung eingeben -groupWithThisNameAlreadyExists=Ranglisten-Gruppe mit diesem Namen existiert bereits -detailsOfLeaderboardGroup=Details der Ranglisten-Gruppe -edit=Bearbeiten -save=Speichern -abort=Abbrechen -noLeaderboardGroupWithNameFound=Keine Ranglisten-Gruppe mit dem Namen {0} gefunden -overview=Übersicht -welcomeToSailingAnalytics=Willkommen bei SAP Sailing Analytics -welcomeToSailingAnalyticsBody=Understanding what happens out on the race course isn''t always easy. To help solve this challenge and bring the excitement of sailing to the fans, we have developed a leader board based on SAP analytics.\ -Through analyzing GPS data together with integrated wind measurements from sensors out on the race course, the leader board displays information such as in-race ranking, average speeds, distance travelled, ETA (estimated time of arrival at the next mark rounding), gaps to leader, gains and losses per leg.\ -\ -Check out the results for yourself to see who triumphed - and how they did it. -home=Startseite -clickAndDragToZoomIn=Anklicken und ziehen zum Hineinzoomen -windSpeed=Wind speed (sm/h) -allTimesInUTC=Alle Zeiten in UTC -autoZoomTo=Auto-Zoom nach -autoZoomToBoats=Booten -autoZoomToBuoys=Tonnen -autoZoomToWindSensors=Windsensoren -autoZoomOff=Aus -autoZoomToTails=Schweife -autoZoomSelectedCompetitors=Nur zu ausgewählten Seglern zoomen -bearing=Kurs über Grund -zoom=Zoom -stepSizeMustBeGreaterThanNull=Die Schrittweite muss größer als 0 sein -stepSizeInSeconds=Schrittweite in Sekunden -refreshInterval=Aktualisierungs-Interval (s) -refreshIntervalMustBeGreaterThanXSeconds=Aktualisierungs-Interval muss größer als {0} Sekunden sein -competitorCharts=Competitor charts -selectAtLeastOneCompetitor=Um die Segler-Diagramme anzeigen zu lassen, wähle mindestens einen Segler aus -directionChange=Richtungsänderung -speedChange=Geschwindigkeitsänderung -degreesShort=deg -untracked=Nicht verfolgt -delayForLiveMode=Verzögerung im Live-Modus: -notAvailable=Nicht verfügbar -details=Details -noGroupSelected=Keine Gruppe ausgewählt -combinedWindSourceTypeName=Kombiniert -courseBasedWindSourceTypeName=Kurslayout -trackBasedEstimationWindSourceTypeName=Schätzung -expeditionWindSourceTypeName=Messung -webWindSourceTypeName=Manuell -clickChartToSetTime=Klicke auf das Diagramm um die Zeit zu setzen -position=Position -windSourcesUsed=Benutzte Windquellen -errorTryingToUpdateWindSourcesToExclude=Fehler beim Aktualisieren der auszuschließenden Windquellen für Rennen {0}: {1} -feedback=Feedback -startStopPlaying=Starten/Stoppen des abspielens -backToLive=Zum Live-Zeitpunkte springen -slowPlaySpeedDown=Abspielgeschwindigkeit verlangsamen -speedPlaySpeedUp=Abspielgeschwindigkeit erhöhen -showHideComponent={0} anzeigen/verstecken -degreesBoatToTheWind=Winkel zum Wind -racesInLeaderboard=Rennen im Leaderboard -leaderboardsInGroup=Leaderboards in der Gruppe -replication=Replikation -errorFetchingReplicaData=Fehler beim Beschaffen der Replikationsdaten: {0} -averageCrossTrackErrorInMeters=\u2205 XTE -enterMaster=Hostname der Master-Instanz -errorStartingReplication=Fehler beim Starten der Replikation von Host {0} / Exchange {1}: {2} -helpLines=Hilfslinien -startLine=Startlinie -finishLine=Ziellinie -advantageLine=Führungslinie -courseMiddleLine=Kursmittellinie -messagingPortNumber=Messaging-Portnummer (0 für Default) -servletPortNumber=Servlet Portnummer -registeredAt=Registriert {0} -replicatingFromMaster=Repliziert von master {0}, Messaging Port {1}, Servlet Port {2} -showWindSpeedSeries=Daten für Windgeschwindigkeit zeigen -showWindDirectionSeries=Daten für Windrichtung zeigen -fleet=Flotte -boatClass=Bootsklasse -setDelayToLive=Verzögerung zu 'Live' setzen -pleaseEnterNonEmptyVenue=Bitte geben sie einen Veranstaltungsort ein. -eventWithThisNameAlreadyExists=Eine Veranstaltung mit diesem Namen existiert bereits. -venue=Veranstaltungsort -pleaseSelectABoatClass=Bitte wählen Sie eine Bootsklasse aus. -regattaWithThisNameAlreadyExists=Eine Regatta mit diesem Namen existiert bereits. -seriesWithThisNameAlreadyExists=Eine Serie mit diesem Namen existiert bereits. -series=Serie -fleetWithThisNameAlreadyExists=Eine Flotte mit diesem Namen existiert bereits. -fleets=Flotten -splitFleet=Aufteilung in Gruppen -color=Farbe -medalSeries=Medal Series -noColor=Keine Farbe -pleaseSelectARegatta=Bitte wählen Sie eine Regatta aus. -addFleet=Gruppe hinzufügen -doYouReallyWantToRemoveRegatta=Möchten Sie wirklich Regatta "{0}" löschen? -errorLoadingScoreCorrectionProviders=Fehler beim Laden der offiziellen Ergebnis-Dienste: {0} -selectResultListToImportFrom=Ergebnisliste auswählen -of=von -errorObtainingScoreCorrections=Fehler beim Laden der offiziellen Ergebnisse von Dienst {0} zu Veranstaltung {1} und Bootsklasse {2} veröffentlicht {3}: {4} -assignRaceNumbersToRaceColumns=Renn-Nummern den Ergebnisspalten zuordnen -importOfficialResults=Offizielle Ergebnisse importieren... -selectAll=Alle auswählen -apply=Übernehmen -successfullyUpdatedScores=Ergebnisse erfolgreich aktualisiert -errorUpdatingScoresForLeaderboard=Fehler beim Aktualisieren der Ergebnisse für {0}: {1} -maneuverTypesToShowWhenCompetitorIsClicked=Anzuzeigende Manövertypen für angeklickte Segler -simulateWithStartTimeNow=Simulieren mit "jetzt" als Startzeit -boatClassDoesNotMatchSelectedRegatta=Die ausgewählten Rennen enthalten eine Bootsklasse, die nicht der Bootsklasse der ausgewählten Regatta ''{0}'' entspricht.\n\ -Willst du wirklich diese Regatta benutzen ''{1}''? -regattaExistForSelectedBoatClass=Es gibt mindestens eine Regatta zu den ausgewählten Bootsklassen.\ -Willst du wirklich die Auswahl ''keine Regatta'' benutzen? -reload=Neu laden -addRegatta=Regatta hinzufügen... -exchangeName=Exchange Name -course=Kurs -courseLayout=Kursdefinition -buoy=Boje -gate=Tor -buoys=Bojen -waypoint=Wegpunkt -showAllCompetitors=Zeige alle Wettkampfteilnehmer -boatTails=Bootsschweif -maximalCount=Maximale Anzahl -maxVisibleCompetitorsCountMustBePositive=Die maximale Anzahl der sichtbaren Wettkampfteilnehmer muß größer als Null sein. -fregResultImportUrls=FREG URLs -errorRefreshingFregUrlList=Fehler beim Aktualisieren derFREG URL-Liste: {0} -successfullyUpdatedFregUrls=FREG URL-Liste erfolgreich aktualisiert -errorRemovingFregUrls=Fehler beim Löschen von FREG URLs: {0} -pleaseEnterNonEmptyUrl=Bitte eine nicht-leere URL eingeben -addFragUrl=FRAG Ergebnis-URL hinzufügen -errorAddingFragUrl=Fehler beim Hinzufügen einer FREG URL: {0} -errorTryingToObtainLeaderboardContents=Fehler beim Berechnen der Ergebnisliste: {0} -lastScoreUpdate=Letzte Ergebnisänderung -warningBrowserUnsupported=Diese Webseite ist für Ihren Browser nicht optimiert. Wir empfehlen den Firefox oder Chrome in der neuesten Version. -newMark=Neue Marke -controlPoint=Einzelmarke/Gate -errorUpdatingRaceCourse=Fehler beim Aktualisieren des neuen Kurses: {0} -successfullyUpdatedCourse=Kurs erfolgreich aktualisiert -selectOneMarkOrTwoMarksForGate=Eine einzelne Marke auswählen oder zwei Marken, um ein Gate zu erstellen -errorTryingToObtainTheMarksOfTheRace=Fehler beim Ermitteln der Marken des Regattakurses: {0} -errorTryingToObtainRaceCourse=Fehler beim Ermitteln des Rennkurses: {0} -insertWaypointBeforeSelected=Wegpunkt nach dem selektierten einfügen -insertWaypointAfterSelected=Wegpunkt vor dem selektierten einfügen -scoringSchemeLowPointSystem=Low Point System -scoringSchemeHighPointSystem=High Point System -scoringSchemeHighPointEssOverall=High Point System ESS Gesamtwertung -scoringSchemeHighPointLastBreaksTie=High Point System, letztes Rennen entscheidet bei Gleichstand -scoringSystem=Bepunktungssystem -createFlexibleLeaderboard=Flexible Rangliste anlegen -createRegattaLeaderboard=Rangliste für Regatta anlegen -editFlexibleLeaderboard=Flexible Rangliste ändern -editRegattaLeaderboard=Rangliste für Regatta ändern -noRegatta=Keine Regatta -useOverallLeaderboard=Overall-Ergebnisse anzeigen -overallStandings=Gesamtstand -type=Typ -actionAddRaces=Rennen hinzuf�gen -racesWithNamePrefix=Rennen mit Namens-Pr�fix -maximumSpeedOverGroundInKnots=Max FüG -totalTimeSailedDownwindInSeconds=Gesamtzeit Vorwind -totalTimeSailedUpwindInSeconds=Gesamtzeit Kreuz -totalTimeSailedReachingInSeconds=Gesamtzeit Holeschlag -totalTimeSailedInSeconds=Gesamtzeit -hhmmssUnit=hh:mm:ss -actionAddWindData=Winddaten hinzufügen -valueMustBeBetweenMinMax=Der Wert von ''{0}'' muß zwischen {1} und {2} sein. -optional=optional -pleaseEnterAValue=Bitte geben Sie einen Wert ein. -latitude=Breite -longitude=Länge -actionAddEvent=Veranstaltung hinzufügen -publicationUrl=URL für die Veröffentlichung -suppress=Entfernen -isPublic=Öffentlich zugänglich -suppress=Entfernen -unsuppress=Wieder hinzufügen -suppressedCompetitors=Unterdrückte Wettkampfteilnehmer -mediaPanel=Audio & Video -url=URL -mimeType=MIME Type -title=Titel -duration=Dauer (h:mm:ss.ms) -addMediaTrack=Audio/Video hinzufügen -addYoutubeTrack=Youtube hinzufügen -youtubeId=Youtube Id -reallyRemoveMediaTrack=Möchten Sie ''{0}'' wirklich entfernen? -pleaseSelectASeries=Bitte wählen Sie eine Serie aus -pleaseSelectARace=Bitte wählen Sie ein Rennen aus -displayGroupsInReverseOrder=Zeige die Gruppen in umgekehrter Reihenfolge -actionConfigureUrl=URL konfigurieren -configureLeaderboardUrlDescription=Ergebnisansicht konfigurieren. Die fertige URL kann dem Link entnommen werden. -embedded=Eingebettet -additionalUrlSettings=Weitere URL-relevante Einstellungen -restrictToSingleSelectedRace=Nur einzelnes ausgewähltes Rennen zeigen -expandSelectedRace=Details des ausgewähltes Rennens zeigen -showRaceDetails=Details anbieten -numberOfRaces=Anzahl Rennen -numberOfRacesMustBeNonNegativeNumber=Bitte Anzahl der anzuzeigenden letzten Rennen eingeben -chooseTheWayYouSelectRaces=Wie wollen die anzuzeigenden Rennen ausgewählt werden? -selectFromAllRaces=Aus allen Rennen auswählen -selectANumberOfRaces=Eine Anzahl anzuzeigender Rennen auswählen -numberOfLastNRaces=Anzahl der zu zeigenden aktuellsten Rennen -expandLastRace=Immer letztes gezeigtes Rennen expandieren -factor=Faktor -errorUpdatingIsMedalRace=Fehler beim Ändern der Medaillenrennen-Einstellung: {0} -maneuverLoss=Manöververlust -averageManeuverLossInMeters=\u2205 Manöververlust -averageTackLossInMeters=\u2205 Wendeverlust -averageJibeLossInMeters=\u2205 Halseverlust -shape=Form -pattern=Muster -legend=Legende -live=live -swissTimingArchiveConnector=SwissTiming Historische Veranstaltungen -errorFetchingRankingChartData=Fehler beim Laden der Daten für das Ranglisten-Chart: {0} -loadingCompetitorData=Lade Teilnehmer-Daten -rankNAfterRace=Rang {0} nach Rennen {1} -afterRace=nach Rennen -showRankChart=Rang-Diagramm anzeigen -overallLeaderboardSelection=Gesamtergebnisse -showOverallLeaderboardOnSamePage=Gesamtergebnisse auf derselben Seite anzeigen -errorTryingToObtainOverallLeaderboards=Fehler beim Laden der Gesamtergebnisse: {0} -finished=beendet -passedTo=an {0} gerundet -gapChangeSinceLegStartInSeconds=Gap Änderung -sideToWhichMarkAtLegStartWasRounded=Tonne gerundet an -raceIsLive=Rennen {0} ist live +helloWorld=Hello World +kielWeel2011=Kiel Week 2011 +stgAccount=STG Account +tracTracEvents=TracTrac Events +swissTimingEvents=SwissTiming Events +trackedBefore=Historie verfolgter Events +listRaces=Rennen anzeigen +wind=Wind +windPanelLabel=This is the Wind Panel which so far is completely empty. +refresh=Aktualisieren +remove=Löschen +windSource=Windquelle +dampeningInterval=Mittelungsintervall +map=Karte +race=Wettfahrt +races=Wettfahrten +tracked=verfolgt +time=Zeit +timeTooltip=Zeit die der Teilnehmer auf diesem Schenkel gesegelt ist. +playSpeed=Abspielgeschwindigkeit +playSpeedHelp="1" für normale Abspielgeschwindigkeit, "2" für doppelte Geschwindigkeit usw. +playModeLive=Live +playModeReplay=Wiederholung +timeDelay=Verzögerung +timeDelayHelp=Leer für Wiedergabe zu beliebigen Zeitpunkten; Verzögerung des Datenstroms in Sekunden eingeben (z.B. "60" für eine Minute oder "0" für keine) +speedInKnots=Geschwindigkeit (sm/h) +fromDeg=aus (Grad) +noRacesYet=Bisher keine Wettfahrten +total=Gesamt +carry=übertr. +competitor=Wettkampfteilnehmner +competitors=Wettkampfteilnehmner +defaultLeaderboard=Alle Ergebnisse +noSuchLeaderboard=Rangliste nicht gefunden +leaderboardConfiguration=Ranglisten-Konfiguration +newDotDotDot=Neu... +editScores=Punktestand bearbeiten... +columnNamesInSelectedLeaderboard=Wettfahrten-Namen in der selektierten Rangliste +addDotDotDot=Hinzufügen... +renameDotDotDot=Umbenennen... +trackedRaceConnectedToSelectedRaceName=Wettfahrt verbunden mit dem selektierten Wettfahrt-Namen +linkToColumn=Verbindung mit Spalte +unlink=Unlink +leaderboardName=Name Rangliste +cancel=Abbrechen +pleaseEnterAName=Bitte geben Sie einen Namen ein. +discardRacesFromHowManyStartedRacesOn=Discard one more race starting with how many started races +leaderboardWithThisNameAlreadyExists=Eine Rangliste mit diesem Namen existiert bereits. +discardThresholdsMustBeNumeric=Discard thresholds must be numeric +discardThresholdsMustBeAscending=Discard thresholds must be ascending +discarding=Discarding +startingFromNumberOfRaces=Ab wievielen Rennen +renameLeaderboard=Rangliste umbenennen +addColumnToLeaderboard=Spalte zu Rangliste hinzufügen +pleaseEnterNameForNewRaceColumn=Namen für Renn-Spalten eingeben +ok=OK +medalRace=Medal Race +renameRace=Rennen umbenennen +openSelectedLeaderboard=Ausgewählte Rangliste öffnen +rank=Platz +rankTooltip=Platzierung des Teilnehmers. +totalRank=Gesamtplatz +collapse=- +expand=+ +leg=L +distanceInMeters=Distanz +averageSpeedInKnots=\u2205 FüG +averageSpeedInKnotsTooltip=Die durchschnittliche Fahrt über Grund in diesem Schenkel,\berechnet durch die Division der gefahren Distanz und der benötigten Zeit. +raceAverageSpeedInKnotsTooltip=Die durchschnittliche Fahrt über Grund in diesem Rennen,\berechnet durch die Division der gefahren Distanz und der benötigten Zeit. +rankGain=Platz +/- +rankGainTooltip=Die Differenz zwischen der Platzierung des aktuellen und des letzten Schenkels. +sapSailingAnalytics=Sailing Analytics +leaderboard=Ergebnisse +leaderboards=Ranglistenlisten +leaderboardSettings=Einstellungen Rangliste +settings=Einstellungen (z.B. Abschnittdetails auswählen) +selectAtLeastOneLegDetail=Mindestens ein Detail auswählen +currentSpeedOverGroundInKnots=FüG +currentSpeedOverGroundInKnotsTooltip=Die aktuelle Fahrt über Grund. +estimatedTimeToNextWaypointInSeconds=ETA +estimatedTimeToNextWaypointInSecondsTooltip=Die vorraussichtliche Zeit, die der Teilnehmer benötigt,\num den nächsten Wegpunkt zu erreichen. +gapToLeaderInSeconds=Abstand zum Führenden +gapToLeaderInSecondsTooltip=Die Zeit die ein Teilnehmer bräuchte, um de Führenden zu erreichen. +velocityMadeGoodInKnots=VMG +velocityMadeGoodInKnotsTooltip=Die effektive Geschwindigkeit zum Ziel. +windwardDistanceToGoInMeters=Abstand in Windrichtung zur nächsten Tonne +windwardDistanceToGoInMetersTooltip=Windwärtige Distanz des Teilnehmerns zum Ende des Schenkels. +windwardDistanceToLeaderInMeters=Abstand zum führenden Boot +windwardDistanceToLeaderInMetersTooltip=Windwärtige Distanz des Teilnehmers zum Führenden. +name=Name +leaveEmptyForDefault=Leer für Standardeinstellung +trackNewEvent=Track New event +trackableRaces=Trackable Races +trackWind=Track Wind +regattaName=Name der Regatta +eventName=Event-Name +event=Rennen +startTime=Startzeit +regatta=Regatta +regattas=Regatten +startTracking=Tracking starten +stopTracking=Tracking stoppen +connections=Verbindungen +historyOfConnections=History of connections +defineNewConnection=Definiere eine neue Verbindung +trackedRaces=Tracked races +canSendRequests=Kann Anfragen senden +connectAndReadRaces=Verbinde und hole Wettfahrten +trackSettings=Track Einstellungen +ports=Ports +liveData=Live data +storedData=Stored data +uris=URIs +jsonUrl=JSON URL +livePort=Port Live Data +storedPort=Port Stored Data +liveUri=Live URI +storedUri=Stored URI +eventsConnectedTo=Momentan verfolgte Events +hostname=Hostname +declinationCheckbox=Windrichtung mit Missweisung korrigieren +raceStartTrackingColumn=Tracking Started +pauseAutomaticRefresh=Keine automatische Aktualisierung +autoRefresh=Automatisch aktualisieren +delayInSeconds=Verzögerung (s) +delayMustBeNonNegative=Die Verzögerung muß größer als 0 sein +delayBetweenAutoAdvances=Intervall zwischen Auto-Updates in Sekunden: +chooseUpdateIntervalOfAtLeastOneSecond=Update-Intervall mindestens eine Sekunde +errorSettingWindForRace=Error setting wind for race +errorFetchingWindInformationForRace=Error fetching wind information for race +errorWhileTryingToSetWindSourceForRace=Error while trying to set "wind starts upwind" flag +inEvent=in event +to=to +showEstimatedWind=Zeige den geschätzten Wind +timing=Timing +raceDetailsToShow=Renndetails +overallDetailsToShow=Regatta-Details +legDetailsToShow=Schenkeldetails +columnMoveUp=Hoch +columnMoveDown=Runter +port=Port +raceStartTimeColumn=Rennstart +showOnlySelectedCompetitors=Nur ausgewählte Teilnehmer anzeigen +showSelectedCompetitorsInfo=Infobox für ausgewählte Teilnehmer anzeigen +tailLength=Schweiflänge (s) +selectedRaces=Welche Rennen möchten Sie angezeigt bekommen? +lengthInSeconds=Länge (s) +stressTest=Stresstest +numberOfManeuvers=Manöver +numberOfManeuversTooltip=Die Anzahl der gesegelten Manöver in diesem Schenkel. +tacks=Wenden +jibes=Halsen +penaltyCircles=Strafkreise +medalRaceIsNull=Medaillenrennen nicht erlaubt +maneuverTypes=Manöver +configuration=Konfiguration +chooseChart=Diagramm wählen +raceNameEmpty=Rennname leer +distanceTraveled=Zurückgelegte Strecke +distanceTraveledTooltip=Die zurückgelegt Strecke vom Start des Schenkel, bis zum Ende\noder bis zum aktuellen Zeitpunkt, falls der Schenkel noch nicht beendet ist. +raceDistanceTraveledTooltip=Die zurückgelegt Strecke vom Start des Rennens, bis zum Ende\noder bis zum aktuellen Zeitpunkt, falls das Rennen noch nicht beendet ist. +velocityMadeGoodLong=Velocity Made Good +speedOverGroundLong=Speed Over Ground +gapToLeaderLong=Abstand zum führenden Boot +pointsToLoad=Zu ladende Punkte +speed=Geschwindigkeit +distance=Strecke +in=in +secondsUnit=s +metersUnit=m +failedToLoadRaceData=Renndaten konnten nicht geladen werden. +close=Schließen +compareCompetitors=Teilnehmer vergleichen +description=Beschreibung +sailNumber=Segelnummer +country=Land +no3LetterCodes=IOC 3-Buchstaben-Codes können nicht gefunden werden. +add=Hinzufügen +delete=Löschen +showCharts=Grafische Ansicht +raceWithThisNameAlreadyExists=Ein Rennen mit diesem Namen existiert schon. +raceWithThisNameAlreadyExistsInRegatta=Ein Rennen mit diesem Namen existiert schon in der Regatta. +headUp=anluven +bearAway=abfallen +tack=Wende +tackTooltip=Die Anzahl der gesegelten Wenden in diesem Rennen. +jibe=Halse +jibeTooltip=Die Anzahl der gesegelten Halsen in diesem Rennen. +penaltyCircle=Strafkreis +penaltyCircleTooltip=Die Anzahl der zu fahrenden Strafkreise in diesem Rennen. +markPassing=Tonnenpassierung +mark=Tonne +otherManeuver=Manövertyp unbekannt +douglasPeuckerPoints=Douglas-Peucker-Punkte +filterRacesByName=Rennen nach Name filtern +actionEdit=Ändern +actionEditScores=Punkte ändern +actionOpenBrowser=Im Browser öffnen +actionRemove=Entfernen +actionEditRaces=Rennen ändern +actionRaceEdit=Rennen ändern oder umbenennen +actionRaceUnlink=Rennverknüpfung entfernen +actionRaceRemove=Rennen entfernen +filterLeaderboardsByName=Ranglisten nach Name filtern +actions=Aktionen +islinked=Verknüpft +yes=Ja +no=Nein +hoverOverAPoint=Für Details Maus über dem Graph positionieren +noSelection=Keine Selektion +raceIsKnownToStartUpwind=Rennen beginnt mit Kreuz +events=Rennen +settingsForComponent=Einstellungen für {0} +noEventsFound=Es wurden keine Rennen gefunden +noEventSelected=Kein Rennen ausgewählt +noLeaderboardsFound=Es wurden keine Ranglisten gefunden +searchEvents=Suche nach Rennen +location=Ort +from=Von +until=Bis +onlyLiveEvents=Nur Live-Rennen +locationNotAvailable=Ort nicht verfügbar +startDateNotAvailable=Startdatum nicht verfügbar +startDate=Startdatum +unknownManeuver=Unbekanntes Manöver +tailLengthMustBePositive=Die Schweiflänge muss größer als Null sein. +failedToLoadRaceInformation=Daten zur Wettfahrt konnten nicht geladen werden: {0} +competitorPassedMarkAtDate={0} passierte {1} um {2} +valueForCompetitorAt={0} um {1}: {2} +reallyRemoveRace=Möchten Sie das Rennen ''{0}'' wirklich entfernen? +showDetails=Details zeigen +hideLeaderboard=Rangliste ausblenden +hideLeaderboards=Ranglisten ausblenden +showLeaderboard=Rangliste zeigen +hideRaces=Rennen ausblenden +showMap=Karte zeigen +hideMap=Karte ausblenden +noLeaderboardSelected=Keine Rangliste ausgewählt +leaderboardGroups=Ranglisten-Gruppen +filterLeaderboardGroupsByName=Ranglisten-Gruppen nach Name filtern +createNewLeaderboardGroup=Neue Ranglisten-Gruppe erstellen +leaderboardGroupConfiguration=Ranglistengruppen-Konfiguration +legs=Schenkel +currentLeg=Aktueller Schenkel +currentLegTooltip=Schenkel auf dem sich der Teilnehmer aktuell befindet. +leaderboardGroup=Ranglisten-Gruppe +pleaseEnterNonEmptyDescription=Bitte eine nicht-leere Beschreibung eingeben +groupWithThisNameAlreadyExists=Ranglisten-Gruppe mit diesem Namen existiert bereits +detailsOfLeaderboardGroup=Details der Ranglisten-Gruppe +edit=Bearbeiten +save=Speichern +abort=Abbrechen +noLeaderboardGroupWithNameFound=Keine Ranglisten-Gruppe mit dem Namen {0} gefunden +overview=Übersicht +welcomeToSailingAnalytics=Willkommen bei SAP Sailing Analytics +welcomeToSailingAnalyticsBody=Understanding what happens out on the race course isn''t always easy. To help solve this challenge and bring the excitement of sailing to the fans, we have developed a leader board based on SAP analytics.\ +Through analyzing GPS data together with integrated wind measurements from sensors out on the race course, the leader board displays information such as in-race ranking, average speeds, distance travelled, ETA (estimated time of arrival at the next mark rounding), gaps to leader, gains and losses per leg.\ +\ +Check out the results for yourself to see who triumphed - and how they did it. +home=Startseite +clickAndDragToZoomIn=Anklicken und ziehen zum Hineinzoomen +windSpeed=Wind speed (sm/h) +allTimesInUTC=Alle Zeiten in UTC +autoZoomTo=Auto-Zoom nach +autoZoomToBoats=Booten +autoZoomToBuoys=Tonnen +autoZoomToWindSensors=Windsensoren +autoZoomOff=Aus +autoZoomToTails=Schweife +autoZoomSelectedCompetitors=Nur zu ausgewählten Teilnehmern zoomen +bearing=Kurs über Grund +zoom=Zoom +stepSizeMustBeGreaterThanNull=Die Schrittweite muss größer als 0 sein +stepSizeInSeconds=Schrittweite in Sekunden +refreshInterval=Aktualisierungs-Interval (s) +refreshIntervalMustBeGreaterThanXSeconds=Aktualisierungs-Interval muss größer als {0} Sekunden sein +competitorCharts=Competitor charts +selectAtLeastOneCompetitor=Um die Teilnehmer-Diagramme anzeigen zu lassen, wähle mindestens einen Teilnehmer aus +directionChange=Richtungsänderung +speedChange=Geschwindigkeitsänderung +degreesShort=deg +untracked=Nicht verfolgt +delayForLiveMode=Verzögerung im Live-Modus: +notAvailable=Nicht verfügbar +details=Details +noGroupSelected=Keine Gruppe ausgewählt +combinedWindSourceTypeName=Kombiniert +courseBasedWindSourceTypeName=Kurslayout +trackBasedEstimationWindSourceTypeName=Schätzung +expeditionWindSourceTypeName=Messung +webWindSourceTypeName=Manuell +clickChartToSetTime=Klicke auf das Diagramm um die Zeit zu setzen +position=Position +windSourcesUsed=Benutzte Windquellen +errorTryingToUpdateWindSourcesToExclude=Fehler beim Aktualisieren der auszuschließenden Windquellen für Rennen {0}: {1} +feedback=Feedback +startStopPlaying=Starten/Stoppen des abspielens +backToLive=Zum Live-Zeitpunkte springen +slowPlaySpeedDown=Abspielgeschwindigkeit verlangsamen +speedPlaySpeedUp=Abspielgeschwindigkeit erhöhen +showHideComponent={0} anzeigen/verstecken +degreesBoatToTheWind=Winkel zum Wind +racesInLeaderboard=Rennen im Leaderboard +leaderboardsInGroup=Leaderboards in der Gruppe +replication=Replikation +errorFetchingReplicaData=Fehler beim Beschaffen der Replikationsdaten: {0} +averageCrossTrackErrorInMeters=\u2205 XTE +averageCrossTrackErrorInMetersTooltip=Die durchschnittliche Querabweichung zur Kursmittellinie in diesem Schenkel. +raceAverageCrossTrackErrorInMetersTooltip=Die durchschnittliche Querabweichung zur Kursmittellinie in diesem Rennen. +enterMaster=Hostname der Master-Instanz +errorStartingReplication=Fehler beim Starten der Replikation von Host {0} / Exchange {1}: {2} +helpLines=Hilfslinien +startLine=Startlinie +finishLine=Ziellinie +advantageLine=Führungslinie +courseMiddleLine=Kursmittellinie +messagingPortNumber=Messaging-Portnummer (0 für Default) +servletPortNumber=Servlet Portnummer +registeredAt=Registriert {0} +replicatingFromMaster=Repliziert von master {0}, Messaging Port {1}, Servlet Port {2} +showWindSpeedSeries=Daten für Windgeschwindigkeit zeigen +showWindDirectionSeries=Daten für Windrichtung zeigen +fleet=Flotte +boatClass=Bootsklasse +setDelayToLive=Verzögerung zu 'Live' setzen +pleaseEnterNonEmptyVenue=Bitte geben sie einen Veranstaltungsort ein. +eventWithThisNameAlreadyExists=Eine Veranstaltung mit diesem Namen existiert bereits. +venue=Veranstaltungsort +pleaseSelectABoatClass=Bitte wählen Sie eine Bootsklasse aus. +regattaWithThisNameAlreadyExists=Eine Regatta mit diesem Namen existiert bereits. +seriesWithThisNameAlreadyExists=Eine Serie mit diesem Namen existiert bereits. +series=Serie +fleetWithThisNameAlreadyExists=Eine Flotte mit diesem Namen existiert bereits. +fleets=Flotten +splitFleet=Aufteilung in Gruppen +color=Farbe +medalSeries=Medal Series +noColor=Keine Farbe +pleaseSelectARegatta=Bitte wählen Sie eine Regatta aus. +addFleet=Gruppe hinzufügen +doYouReallyWantToRemoveRegatta=Möchten Sie wirklich Regatta "{0}" löschen? +errorLoadingScoreCorrectionProviders=Fehler beim Laden der offiziellen Ergebnis-Dienste: {0} +selectResultListToImportFrom=Ergebnisliste auswählen +of=von +errorObtainingScoreCorrections=Fehler beim Laden der offiziellen Ergebnisse von Dienst {0} zu Veranstaltung {1} und Bootsklasse {2} veröffentlicht {3}: {4} +assignRaceNumbersToRaceColumns=Renn-Nummern den Ergebnisspalten zuordnen +importOfficialResults=Offizielle Ergebnisse importieren... +selectAll=Alle auswählen +apply=Übernehmen +successfullyUpdatedScores=Ergebnisse erfolgreich aktualisiert +errorUpdatingScoresForLeaderboard=Fehler beim Aktualisieren der Ergebnisse für {0}: {1} +maneuverTypesToShowWhenCompetitorIsClicked=Anzuzeigende Manövertypen für angeklickte Teilnehmer +simulateWithStartTimeNow=Simulieren mit "jetzt" als Startzeit +boatClassDoesNotMatchSelectedRegatta=Die ausgewählten Rennen enthalten eine Bootsklasse, die nicht der Bootsklasse der ausgewählten Regatta ''{0}'' entspricht.\n\ +Willst du wirklich diese Regatta benutzen ''{1}''? +regattaExistForSelectedBoatClass=Es gibt mindestens eine Regatta zu den ausgewählten Bootsklassen.\ +Willst du wirklich die Auswahl ''keine Regatta'' benutzen? +reload=Neu laden +addRegatta=Regatta hinzufügen... +exchangeName=Exchange Name +course=Kurs +courseLayout=Kursdefinition +buoy=Boje +gate=Tor +buoys=Bojen +waypoint=Wegpunkt +showAllCompetitors=Zeige alle Wettkampfteilnehmer +boatTails=Bootsschweif +maximalCount=Maximale Anzahl +maxVisibleCompetitorsCountMustBePositive=Die maximale Anzahl der sichtbaren Wettkampfteilnehmer muß größer als Null sein. +fregResultImportUrls=FREG URLs +errorRefreshingFregUrlList=Fehler beim Aktualisieren derFREG URL-Liste: {0} +successfullyUpdatedFregUrls=FREG URL-Liste erfolgreich aktualisiert +errorRemovingFregUrls=Fehler beim Löschen von FREG URLs: {0} +pleaseEnterNonEmptyUrl=Bitte eine nicht-leere URL eingeben +addFragUrl=FRAG Ergebnis-URL hinzufügen +errorAddingFragUrl=Fehler beim Hinzufügen einer FREG URL: {0} +errorTryingToObtainLeaderboardContents=Fehler beim Berechnen der Ergebnisliste: {0} +lastScoreUpdate=Letzte Ergebnisänderung +warningBrowserUnsupported=Diese Webseite ist für Ihren Browser nicht optimiert. Wir empfehlen den Firefox oder Chrome in der neuesten Version. +newMark=Neue Marke +controlPoint=Einzelmarke/Gate +errorUpdatingRaceCourse=Fehler beim Aktualisieren des neuen Kurses: {0} +successfullyUpdatedCourse=Kurs erfolgreich aktualisiert +selectOneMarkOrTwoMarksForGate=Eine einzelne Marke auswählen oder zwei Marken, um ein Gate zu erstellen +errorTryingToObtainTheMarksOfTheRace=Fehler beim Ermitteln der Marken des Regattakurses: {0} +errorTryingToObtainRaceCourse=Fehler beim Ermitteln des Rennkurses: {0} +insertWaypointBeforeSelected=Wegpunkt nach dem selektierten einfügen +insertWaypointAfterSelected=Wegpunkt vor dem selektierten einfügen +scoringSchemeLowPointSystem=Low Point System +scoringSchemeHighPointSystem=High Point System +scoringSchemeHighPointEssOverall=High Point System ESS Gesamtwertung +scoringSchemeHighPointLastBreaksTie=High Point System, letztes Rennen entscheidet bei Gleichstand +scoringSystem=Bepunktungssystem +createFlexibleLeaderboard=Flexible Rangliste anlegen +createRegattaLeaderboard=Rangliste für Regatta anlegen +editFlexibleLeaderboard=Flexible Rangliste ändern +editRegattaLeaderboard=Rangliste für Regatta ändern +noRegatta=Keine Regatta +useOverallLeaderboard=Overall-Ergebnisse anzeigen +overallStandings=Gesamtstand +type=Typ +actionAddRaces=Rennen hinzuf�gen +racesWithNamePrefix=Rennen mit Namens-Pr�fix +maximumSpeedOverGroundInKnots=Max FüG +maximumSpeedOverGroundInKnotsTooltip=Die größte Fahrt über Grund, die in der Regatta gemessen wurde. +totalTimeSailedDownwindInSeconds=Gesamtzeit Vorwind +totalTimeSailedDownwindInSecondsTooltip=Gesamtzeit, die der Teilnehmer in der Regatta auf Vorwind gesegelt ist. +totalTimeSailedUpwindInSeconds=Gesamtzeit Kreuz +totalTimeSailedUpwindInSecondsTooltip=Gesamtzeit, die der Teilnehmer in der Regatta auf Kreuz gesegelt ist. +totalTimeSailedReachingInSeconds=Gesamtzeit Holeschlag +totalTimeSailedReachingInSecondsTooltip=Gesamtzeit, die der Teilnehmer in der Regatta auf Hohlschlägen gesegelt ist. +totalTimeSailedInSeconds=Gesamtzeit +totalTimeSailedInSecondsTooltip=Gesamtzeit, die der Teilnehmer für die Regatta gebraucht hat. +hhmmssUnit=hh:mm:ss +actionAddWindData=Winddaten hinzufügen +valueMustBeBetweenMinMax=Der Wert von ''{0}'' muß zwischen {1} und {2} sein. +optional=optional +pleaseEnterAValue=Bitte geben Sie einen Wert ein. +latitude=Breite +longitude=Länge +actionAddEvent=Veranstaltung hinzufügen +publicationUrl=URL für die Veröffentlichung +suppress=Entfernen +isPublic=Öffentlich zugänglich +suppress=Entfernen +unsuppress=Wieder hinzufügen +suppressedCompetitors=Unterdrückte Wettkampfteilnehmer +mediaPanel=Audio & Video +url=URL +mimeType=MIME Type +title=Titel +duration=Dauer (h:mm:ss.ms) +addMediaTrack=Audio/Video hinzufügen +addYoutubeTrack=Youtube hinzufügen +youtubeId=Youtube Id +reallyRemoveMediaTrack=Möchten Sie ''{0}'' wirklich entfernen? +pleaseSelectASeries=Bitte wählen Sie eine Serie aus +pleaseSelectARace=Bitte wählen Sie ein Rennen aus +displayGroupsInReverseOrder=Zeige die Gruppen in umgekehrter Reihenfolge +actionConfigureUrl=URL konfigurieren +configureLeaderboardUrlDescription=Ergebnisansicht konfigurieren. Die fertige URL kann dem Link entnommen werden. +embedded=Eingebettet +additionalUrlSettings=Weitere URL-relevante Einstellungen +restrictToSingleSelectedRace=Nur einzelnes ausgewähltes Rennen zeigen +expandSelectedRace=Details des ausgewähltes Rennens zeigen +showRaceDetails=Details anbieten +numberOfRaces=Anzahl Rennen +numberOfRacesMustBeNonNegativeNumber=Bitte Anzahl der anzuzeigenden letzten Rennen eingeben +chooseTheWayYouSelectRaces=Wie wollen die anzuzeigenden Rennen ausgewählt werden? +selectFromAllRaces=Aus allen Rennen auswählen +selectANumberOfRaces=Eine Anzahl anzuzeigender Rennen auswählen +numberOfLastNRaces=Anzahl der zu zeigenden aktuellsten Rennen +expandLastRace=Immer letztes gezeigtes Rennen expandieren +factor=Faktor +errorUpdatingIsMedalRace=Fehler beim Ändern der Medaillenrennen-Einstellung: {0} +maneuverLoss=Manöververlust +averageManeuverLossInMeters=\u2205 Manöververlust +averageManeuverLossInMetersTooltip=Der durchschnittliche Distanzverlust durch Manöver. +averageTackLossInMeters=\u2205 Wendeverlust +averageTackLossInMetersTooltip=Der durchschnittliche Distanzverlust durch Wenden. +averageJibeLossInMeters=\u2205 Halseverlust +averageJibeLossInMetersTooltip=Der durchschnittliche Distanzverlust durch Halsen. +shape=Form +pattern=Muster +legend=Legende +live=live +swissTimingArchiveConnector=SwissTiming Historische Veranstaltungen +errorFetchingRankingChartData=Fehler beim Laden der Daten für das Ranglisten-Chart: {0} +loadingCompetitorData=Lade Teilnehmer-Daten +rankNAfterRace=Rang {0} nach Rennen {1} +afterRace=nach Rennen +showRankChart=Rang-Diagramm anzeigen +overallLeaderboardSelection=Gesamtergebnisse +showOverallLeaderboardOnSamePage=Gesamtergebnisse auf derselben Seite anzeigen +errorTryingToObtainOverallLeaderboards=Fehler beim Laden der Gesamtergebnisse: {0} +finished=beendet +passedTo=an {0} gerundet +gapChangeSinceLegStartInSeconds=Gap Änderung +gapChangeSinceLegStartInSecondsTooltip=Die Änderung des Abstands zum Führenden seit dem letzten Schenkelstart.\nEine negative Zahl bedeutet, \ + dass sich der Abstand verringert hat und eine positive Zahl bedeutet, dass er sich vergrößert hat. +sideToWhichMarkAtLegStartWasRounded=Tonne gerundet an +sideToWhichMarkAtLegStartWasRoundedTooltip=Seite zu der die Tonne am Schenkelsart gerundet wurde. +raceIsLive=Rennen {0} ist live racesAreLive=Rennen {0} sind live -scoringSchemeHighPointFirstGetsTen=High Point System, Gewinner erhält 10 Punkte \ No newline at end of file +scoringSchemeHighPointFirstGetsTen=High Point System, Gewinner erhält 10 Punkte +knotsUnit=kn \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/AbstractTimeInHoursMinutesSecondsColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/AbstractTimeInHoursMinutesSecondsColumn.java index ab661c0e9b7..9836479730e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/AbstractTimeInHoursMinutesSecondsColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/AbstractTimeInHoursMinutesSecondsColumn.java @@ -1,16 +1,14 @@ package com.sap.sailing.gwt.ui.leaderboard; import com.google.gwt.i18n.client.NumberFormat; -import com.sap.sailing.domain.common.SortingOrder; +import com.sap.sailing.domain.common.DetailType; import com.sap.sailing.gwt.ui.client.NumberFormatterFactory; import com.sap.sailing.gwt.ui.shared.LeaderboardRowDTO; -public class AbstractTimeInHoursMinutesSecondsColumn extends FormattedDoubleLegDetailColumn { +public abstract class AbstractTimeInHoursMinutesSecondsColumn extends FormattedDoubleLegDetailColumn { - public AbstractTimeInHoursMinutesSecondsColumn(String title, String unit, - com.sap.sailing.gwt.ui.leaderboard.LegDetailColumn.LegDetailField field, int decimals, SortingOrder preferredSortingOrder, - String headerStyle, String columnStyle) { - super(title, unit, field, decimals, preferredSortingOrder, headerStyle, columnStyle); + protected AbstractTimeInHoursMinutesSecondsColumn(DetailType detailType, LegDetailField field, String headerStyle, String columnStyle) { + super(detailType, field, headerStyle, columnStyle); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/FormattedDoubleLegDetailColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/FormattedDoubleLegDetailColumn.java index 17bd506d5c9..7f1c1292c0c 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/FormattedDoubleLegDetailColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/FormattedDoubleLegDetailColumn.java @@ -5,7 +5,6 @@ import com.google.gwt.cell.client.TextCell; import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.sap.sailing.domain.common.DetailType; -import com.sap.sailing.domain.common.SortingOrder; import com.sap.sailing.gwt.ui.client.DetailTypeFormatter; import com.sap.sailing.gwt.ui.client.NumberFormatterFactory; import com.sap.sailing.gwt.ui.shared.LeaderboardDTO; @@ -25,15 +24,8 @@ public class FormattedDoubleLegDetailColumn extends LegDetailColumn field, String headerStyle, String columnStyle) { - this(DetailTypeFormatter.format(detailType), DetailTypeFormatter.getUnit(detailType).isEmpty() ? "" : "[" + DetailTypeFormatter.getUnit(detailType) + "]", - field, detailType.getPrecision(), detailType.getDefaultSortingOrder(), headerStyle, columnStyle); - } - - public FormattedDoubleLegDetailColumn(String title, String unit, - com.sap.sailing.gwt.ui.leaderboard.LegDetailColumn.LegDetailField field, int decimals, SortingOrder preferredSortingOrder, - String headerStyle, String columnStyle) { - super(title, unit, field, new TextCell(), preferredSortingOrder, headerStyle, columnStyle); - formatter = NumberFormatterFactory.getDecimalFormat(decimals); + super(detailType, field, new TextCell(), headerStyle, columnStyle); + formatter = NumberFormatterFactory.getDecimalFormat(detailType.getPrecision()); this.minMaxRenderer = new MinMaxRenderer(this, getComparator()); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/KingOfTheDownwindColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/KingOfTheDownwindColumn.java index 71c2b3e9b32..144caaec31b 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/KingOfTheDownwindColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/KingOfTheDownwindColumn.java @@ -20,11 +20,7 @@ public class KingOfTheDownwindColumn extends AbstractTimeInHoursMinutesSecondsCo } public KingOfTheDownwindColumn(StringMessages stringMessages, String headerStyle, String columnStyle) { - super(stringMessages.totalTimeSailedDownwindInSeconds(), "[" + stringMessages.hhmmssUnit() + "]", - new KingOfTheDownwindField(), - DetailType.TOTAL_TIME_SAILED_DOWNWIND_IN_SECONDS.getPrecision(), - DetailType.TOTAL_TIME_SAILED_DOWNWIND_IN_SECONDS.getDefaultSortingOrder(), - headerStyle, columnStyle); + super(DetailType.TOTAL_TIME_SAILED_DOWNWIND_IN_SECONDS, new KingOfTheDownwindField(), headerStyle, columnStyle); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/KingOfTheReachingColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/KingOfTheReachingColumn.java index 9db75b114b0..9024ea4f73a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/KingOfTheReachingColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/KingOfTheReachingColumn.java @@ -20,10 +20,6 @@ public class KingOfTheReachingColumn extends AbstractTimeInHoursMinutesSecondsCo } public KingOfTheReachingColumn(StringMessages stringMessages, String headerStyle, String columnStyle) { - super(stringMessages.totalTimeSailedReachingInSeconds(), "[" + stringMessages.hhmmssUnit() + "]", - new KingOfTheReachingField(), - DetailType.TOTAL_TIME_SAILED_REACHING_IN_SECONDS.getPrecision(), - DetailType.TOTAL_TIME_SAILED_REACHING_IN_SECONDS.getDefaultSortingOrder(), - headerStyle, columnStyle); + super(DetailType.TOTAL_TIME_SAILED_REACHING_IN_SECONDS, new KingOfTheReachingField(), headerStyle, columnStyle); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/KingOfTheUpwindColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/KingOfTheUpwindColumn.java index 146e1f26512..7bbc8076dd8 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/KingOfTheUpwindColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/KingOfTheUpwindColumn.java @@ -20,11 +20,7 @@ public class KingOfTheUpwindColumn extends AbstractTimeInHoursMinutesSecondsColu } public KingOfTheUpwindColumn(StringMessages stringMessages, String headerStyle, String columnStyle) { - super(stringMessages.totalTimeSailedUpwindInSeconds(), "[" + stringMessages.hhmmssUnit() + "]", - new KingOfTheUpwindField(), - DetailType.TOTAL_TIME_SAILED_UPWIND_IN_SECONDS.getPrecision(), - DetailType.TOTAL_TIME_SAILED_UPWIND_IN_SECONDS.getDefaultSortingOrder(), - headerStyle, columnStyle); + super(DetailType.TOTAL_TIME_SAILED_UPWIND_IN_SECONDS, new KingOfTheUpwindField(), headerStyle, columnStyle); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegColumn.java index e11bb8bf3e7..df0a31b9516 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegColumn.java @@ -138,9 +138,8 @@ public class LegColumn extends ExpandableSortableColumn { } private class ManeuverCountLegDetailsColumn extends FormattedDoubleLegDetailColumn { - public ManeuverCountLegDetailsColumn(String title, String headerStyle, String columnStyle) { - super(title, /*unit*/null, /* field */ null, /* decimals */ 0, DetailType.NUMBER_OF_MANEUVERS.getDefaultSortingOrder(), - headerStyle, columnStyle); + public ManeuverCountLegDetailsColumn(String headerStyle, String columnStyle) { + super(DetailType.NUMBER_OF_MANEUVERS, null, headerStyle, columnStyle); } @Override @@ -272,7 +271,7 @@ public class LegColumn extends ExpandableSortableColumn { result.put(DetailType.RANK_GAIN, new RankGainColumn(stringMessages.rankGain(), new RankGain(), detailHeaderStyle, detailColumnStyle)); - result.put(DetailType.NUMBER_OF_MANEUVERS, new ManeuverCountLegDetailsColumn(stringMessages.numberOfManeuvers(), detailHeaderStyle, detailColumnStyle)); + result.put(DetailType.NUMBER_OF_MANEUVERS, new ManeuverCountLegDetailsColumn(detailHeaderStyle, detailColumnStyle)); result.put(DetailType.TIME_TRAVELED, new FormattedDoubleLegDetailColumn(DetailType.TIME_TRAVELED, new TimeTraveledInSeconds(), detailHeaderStyle, detailColumnStyle)); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegDetailColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegDetailColumn.java index 2e958c5f37d..02855108724 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegDetailColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LegDetailColumn.java @@ -4,18 +4,23 @@ import com.google.gwt.cell.client.Cell; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.cellview.client.Header; import com.google.gwt.user.cellview.client.SafeHtmlHeader; +import com.sap.sailing.domain.common.DetailType; import com.sap.sailing.domain.common.InvertibleComparator; -import com.sap.sailing.domain.common.SortingOrder; import com.sap.sailing.domain.common.impl.InvertibleComparatorAdapter; +import com.sap.sailing.gwt.ui.client.DetailTypeFormatter; import com.sap.sailing.gwt.ui.shared.LeaderboardRowDTO; public abstract class LegDetailColumn, RenderingType> extends SortableColumn { + + private static final String HtmlConstantToInlineHeadersWithAndWithoutUnit = " "; + private final String title; private final LegDetailField field; private final String headerStyle; private final String columnStyle; private final String unit; + private final String tooltip; private SafeHtmlHeader header; @@ -23,12 +28,12 @@ public abstract class LegDetailColumn, Rendering T get(LeaderboardRowDTO row); } - protected LegDetailColumn(String title, String unit, LegDetailField field, Cell cell, - SortingOrder preferredSortingOrder, String headerStyle, String columnStyle) { - super(cell, preferredSortingOrder); + protected LegDetailColumn(DetailType detailType, LegDetailField field, Cell cell, String headerStyle, String columnStyle) { + super(cell, detailType.getDefaultSortingOrder()); setHorizontalAlignment(ALIGN_CENTER); - this.title = title; - this.unit = unit; + this.title = DetailTypeFormatter.format(detailType); + this.unit = DetailTypeFormatter.getUnit(detailType).isEmpty() ? "" : "[" + DetailTypeFormatter.getUnit(detailType) + "]"; + tooltip = DetailTypeFormatter.getTooltip(detailType); this.field = field; this.headerStyle = headerStyle; this.columnStyle = columnStyle; @@ -36,21 +41,16 @@ public abstract class LegDetailColumn, Rendering } private void InitializeHeader() { - //Code to add a tooltip to the title. Do NOT delete. This is saved to use it, after some refactorings are done. -// SafeHtmlBuilder builder = new SafeHtmlBuilder().appendHtmlConstant("
"); -// builder.appendEscaped(title).appendHtmlConstant("
"); - - SafeHtmlBuilder builder = new SafeHtmlBuilder().appendEscaped(title).appendHtmlConstant("
"); - if (unit == null) { - builder.appendHtmlConstant(" "); + SafeHtmlBuilder titleBuilder = new SafeHtmlBuilder().appendEscaped(title).appendHtmlConstant("
"); + if (unit == null || unit.isEmpty()) { + titleBuilder.appendHtmlConstant(HtmlConstantToInlineHeadersWithAndWithoutUnit); } else { - builder.appendEscaped(unit); + titleBuilder.appendEscaped(unit); } - - header = new SafeHtmlHeader(builder.toSafeHtml()); - } + header = new SafeHtmlHeaderWithTooltip(titleBuilder.toSafeHtml(), tooltip); + } - protected String getTitle() { + protected String getTitle() { return title; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/RankGainColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/RankGainColumn.java index a3ee96a6b16..90046411e6e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/RankGainColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/RankGainColumn.java @@ -13,7 +13,7 @@ public class RankGainColumn extends LegDetailColumn { private static final LeaderboardResources leaderboardResources = GWT.create(LeaderboardResources.class); public RankGainColumn(String title, LegDetailField field, String headerStyle, String columnStyle) { - super(title, null, field, new RankGainCell(), DetailType.RANK_GAIN.getDefaultSortingOrder(), headerStyle, columnStyle); + super(DetailType.RANK_GAIN, field, new RankGainCell(), headerStyle, columnStyle); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/SafeHtmlHeaderWithTooltip.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/SafeHtmlHeaderWithTooltip.java new file mode 100644 index 00000000000..93f586a15ee --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/SafeHtmlHeaderWithTooltip.java @@ -0,0 +1,27 @@ +package com.sap.sailing.gwt.ui.leaderboard; + +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.user.cellview.client.SafeHtmlHeader; + +public class SafeHtmlHeaderWithTooltip extends SafeHtmlHeader { + + private static SafeHtml buildHeader(SafeHtml title, String tooltip) { + //Escaping the tooltip to be able, to add it in the div safely with standard string concatenation. + //If you try to append it with the SafeHtmlBuilder methods, an exception will be thrown (because of the unclosed div). + String safeTooltip = new SafeHtmlBuilder().appendEscaped(tooltip).toSafeHtml().asString(); + return new SafeHtmlBuilder().appendHtmlConstant("") + .append(title).appendHtmlConstant("").toSafeHtml(); + } + + /** + * Creates a new html header with the given title and tooltip.
+ * Use '\n', if you want a line break in the tooltip. + * @param title + * @param tooltip + */ + public SafeHtmlHeaderWithTooltip(SafeHtml title, String tooltip) { + super(buildHeader(title, tooltip)); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/SideToWhichMarkAtLegStartWasRoundedColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/SideToWhichMarkAtLegStartWasRoundedColumn.java index df523a55364..4f97f19879e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/SideToWhichMarkAtLegStartWasRoundedColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/SideToWhichMarkAtLegStartWasRoundedColumn.java @@ -7,8 +7,7 @@ import com.sap.sailing.gwt.ui.shared.LeaderboardRowDTO; public class SideToWhichMarkAtLegStartWasRoundedColumn extends LegDetailColumn { public SideToWhichMarkAtLegStartWasRoundedColumn(String title, LegDetailField field, String headerStyle, String columnStyle) { - super(title, null, field, new TextCell(), DetailType.SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED.getDefaultSortingOrder(), - headerStyle, columnStyle); + super(DetailType.SIDE_TO_WHICH_MARK_AT_LEG_START_WAS_ROUNDED, field, new TextCell(), headerStyle, columnStyle); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/ManeuverDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/ManeuverDTO.java index fd4004d4a7a..6a9a86c4839 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/ManeuverDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/ManeuverDTO.java @@ -52,9 +52,9 @@ public class ManeuverDTO implements IsSerializable { + ((int) this.directionChangeInDegrees) + " "+stringMessages.degreesShort()+" (" + ((int) before.bearingInDegrees) + " deg -> " + ((int) after.bearingInDegrees) + " "+stringMessages.degreesShort()+")"; String speedChange = stringMessages.speedChange() + ": " - + NumberFormat.getDecimalFormat().format(after.speedInKnots - before.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit()+" (" - + NumberFormat.getDecimalFormat().format(before.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit()+" -> " - + NumberFormat.getDecimalFormat().format(after.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit()+")"; + + NumberFormat.getDecimalFormat().format(after.speedInKnots - before.speedInKnots) + " "+stringMessages.knotsUnit()+" (" + + NumberFormat.getDecimalFormat().format(before.speedInKnots) + " "+stringMessages.knotsUnit()+" -> " + + NumberFormat.getDecimalFormat().format(after.speedInKnots) + " "+stringMessages.knotsUnit()+")"; String maneuverLoss = this.maneuverLossInMeters == null ? "" : ("; "+stringMessages.maneuverLoss()+": "+ NumberFormat.getDecimalFormat().format(this.maneuverLossInMeters)+"m"); String maneuverTitle = timeAndManeuver + "; " + directionChange + "; " + speedChange + maneuverLoss; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/WindChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/WindChart.java index d292b2f5f97..2af1e3e8f62 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/WindChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/WindChart.java @@ -134,7 +134,7 @@ public class WindChart extends RaceChart implements Component return "" + seriesName + (toolTipData.getPointName() != null ? " "+toolTipData.getPointName() : "") + "
" + dateFormat.format(new Date(toolTipData.getXAsLong())) + ": " + - numberFormat.format(toolTipData.getYAsDouble()) + stringMessages.averageSpeedInKnotsUnit(); + numberFormat.format(toolTipData.getYAsDouble()) + stringMessages.knotsUnit(); } } })); @@ -172,7 +172,7 @@ public class WindChart extends RaceChart implements Component } })); - chart.getYAxis(1).setOpposite(true).setAxisTitleText(stringMessages.speed()+" ("+stringMessages.averageSpeedInKnotsUnit()+")") + chart.getYAxis(1).setOpposite(true).setAxisTitleText(stringMessages.speed()+" ("+stringMessages.knotsUnit()+")") .setStartOnTick(false).setShowFirstLabel(false).setGridLineWidth(0).setMinorGridLineWidth(0); if (compactChart) { @@ -341,7 +341,7 @@ public class WindChart extends RaceChart implements Component timeOfLatestRequestInMillis == null || wind.requestTimepoint > timeOfLatestRequestInMillis) { Point newDirectionPoint = new Point(wind.requestTimepoint, wind.dampenedTrueWindFromDeg); if (wind.dampenedTrueWindSpeedInKnots != null) { - String name = numberFormat.format(wind.dampenedTrueWindSpeedInKnots)+ stringMessages.averageSpeedInKnotsUnit(); + String name = numberFormat.format(wind.dampenedTrueWindSpeedInKnots)+ stringMessages.knotsUnit(); // name += " Confidence:" + wind.confidence; newDirectionPoint.setName(name); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/CombinedWindPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/CombinedWindPanel.java index 5b09fef8f29..40d4a1e073e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/CombinedWindPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/CombinedWindPanel.java @@ -54,7 +54,7 @@ public class CombinedWindPanel extends FlowPanel { String title = stringMessages.wind() + ": " + Math.round(windFromDeg) + " " + stringMessages.degreesShort() + " (" + WindSourceTypeFormatter.format(windSource, stringMessages) + ")"; canvas.setTitle(title); - textLabel.setText(numberFormat.format(speedInKnots) + " " + stringMessages.averageSpeedInKnotsUnit()); + textLabel.setText(numberFormat.format(speedInKnots) + " " + stringMessages.knotsUnit()); if (!isVisible()) { setVisible(true); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/RaceMap.java index ded8bafb5e2..40f444211c9 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/RaceMap.java @@ -1096,7 +1096,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe vPanel.add(createInfoWindowLabelAndValue(stringMessages.rank(), String.valueOf(rank))); } vPanel.add(createInfoWindowLabelAndValue(stringMessages.speed(), - NumberFormatterFactory.getDecimalFormat(1).format(lastFix.speedWithBearing.speedInKnots) + " "+stringMessages.averageSpeedInKnotsUnit())); + NumberFormatterFactory.getDecimalFormat(1).format(lastFix.speedWithBearing.speedInKnots) + " "+stringMessages.knotsUnit())); vPanel.add(createInfoWindowLabelAndValue(stringMessages.bearing(), (int) lastFix.speedWithBearing.bearingInDegrees + " "+stringMessages.degreesShort())); if (lastFix.wind != null) { vPanel.add(createInfoWindowLabelAndValue(stringMessages.degreesBoatToTheWind(), (int) Math.abs( diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/WindSensorOverlay.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/WindSensorOverlay.java index d38da0788df..1111e543754 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/WindSensorOverlay.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/racemap/WindSensorOverlay.java @@ -73,7 +73,7 @@ public class WindSensorOverlay extends CanvasOverlay { getPane().setWidgetPosition(getCanvas(), sensorPositionInPx.getX() - canvasWidth / 2, sensorPositionInPx.getY() - canvasHeight / 2); String title = stringMessages.wind() + " ("+ WindSourceTypeFormatter.format(windSource, stringMessages) + "): "; title += Math.round(windDTO.dampenedTrueWindFromDeg) + " " + stringMessages.degreesShort()+ ", "; - title += numberFormat.format(windDTO.dampenedTrueWindSpeedInKnots) + " " + stringMessages.averageSpeedInKnotsUnit(); + title += numberFormat.format(windDTO.dampenedTrueWindSpeedInKnots) + " " + stringMessages.knotsUnit(); getCanvas().setTitle(title); hasValidWind = true; diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/AbstractEntryPoint.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/HostPage.java similarity index 91% rename from java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/AbstractEntryPoint.java rename to java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/HostPage.java index 816c4f2b46c..197e549ef60 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/AbstractEntryPoint.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/HostPage.java @@ -9,7 +9,7 @@ import org.openqa.selenium.WebDriver; * @author * D049941 */ -public class AbstractEntryPoint extends PageObject { +public class HostPage extends PageObject { /** *

Creates a new page object with the given web driver. In GWT an entry point is connected to a HTML page in * which the code for the application is executed, whereby the page is represented by the web driver.

@@ -17,7 +17,7 @@ public class AbstractEntryPoint extends PageObject { * @param driver * The web driver to use. */ - public AbstractEntryPoint(WebDriver driver) { + public HostPage(WebDriver driver) { super(driver); } diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/PageObject.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/PageObject.java index 993ffa9b381..95b53843ff1 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/PageObject.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/PageObject.java @@ -59,22 +59,22 @@ public class PageObject { /** *

Creates a new page object with the given web driver. This constructor is equivalent to the two argument - * constructor whereby the web driver is also used as the search context for the page object.

+ * constructor whereby the web driver is also used as the context for the page object.

* * @param driver - * The web driver which also acts as the search context to use. + * The web driver which also acts as the context to use. */ public PageObject(WebDriver driver) { this(driver, driver); } /** - *

Creates a new page object with the given web driver and search context.

+ *

Creates a new page object with the given web driver and context.

* * @param driver * The web driver to use. * @param context - * The search context to use. + * The context to use. */ public PageObject(WebDriver driver, SearchContext context) { this.driver = driver; @@ -86,14 +86,14 @@ public class PageObject { /** *

Verifies the page object. This method can be overwritten to check that the browser is on the correct page or - * that the provided search context represents the right element. The default implementation does nothing.

+ * that the provided context represents the right element. The default implementation does nothing.

*/ protected void verify() { } /** *

Initialize the page object. The default implementation use a factory to lazily initialize the elements - * (annotated fields) of the page object using the timeout duration returned by {@link #initElements}. To get a + * (annotated fields) of the page object using the timeout duration returned by {@link #getTimeOut()}. To get a * field lazily initialized you have to annotate the field either with {@link FindBy} or with {@link FindBys}. * If the element never changes (that is, that the same instance in the DOM can always be used) it is also * possible to use a cache for the lookup by using the annotation {@code CacheLookup} in addition.

diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/XMLHttpRequest.js b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/XMLHttpRequest.js deleted file mode 100644 index a6654e25974..00000000000 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/XMLHttpRequest.js +++ /dev/null @@ -1,41 +0,0 @@ -(function() { - function createNamespace(namespace) { - parts = namespace.split('.'); - var base = window; - - for(var i = 0; i < namespace.length; i++) { - base[parts[i]] = base[parts[i]] || {}; - base = base[parts[i]]; - } - - return base; //return resulting namespace object - } - - var namespace = createNamespace("org.openqa.selenium"); - - if(namespace.pendingCalls) - return; - - namespace.pendingCalls = 0; - - XMLHttpRequest.prototype.oldSend = XMLHttpRequest.prototype.send; - - var newSend = function(data) { - var xhr = this; - - namespace.pendingCalls++; - - var callFinished = function() { - namespace.pendingCalls--; - }; - - xhr.addEventListener("abort", callFinished, false); - xhr.addEventListener("load", callFinished, false); - xhr.addEventListener("error", callFinished, false); - xhr.addEventListener("timeout", callFinished, false); - - xhr.oldSend(data); - } - - XMLHttpRequest.prototype.send = newSend; -}()); \ No newline at end of file diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/pages/AdminConsolePage.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/pages/AdminConsolePage.java index 7c3e0976379..41b4ad21dd0 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/pages/AdminConsolePage.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/pages/AdminConsolePage.java @@ -14,7 +14,7 @@ import com.sap.sailing.selenium.core.BySeleniumId; import com.sap.sailing.selenium.core.ElementSearchConditions; import com.sap.sailing.selenium.core.FindBy; -import com.sap.sailing.selenium.test.AbstractEntryPoint; +import com.sap.sailing.selenium.test.HostPage; /** *

The page object representing the administration console. The console consists of multiple tabs with its content @@ -23,7 +23,7 @@ import com.sap.sailing.selenium.test.AbstractEntryPoint; * @author * D049941 */ -public class AdminConsolePage extends AbstractEntryPoint { +public class AdminConsolePage extends HostPage { private static final String PAGE_TITLE = "SAP Sailing Analytics Administration Console"; //$NON-NLS-1$ private static final MessageFormat TAB_EXPRESSION = new MessageFormat(