From bdf63b6689add91efdfb40a9a7130390033ff281 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 25 Jun 2015 13:41:06 +0200 Subject: [PATCH 001/219] Races lists - Refactored abstract race list implementation for easier reuse --- .../partials/racelist/AbstractRaceList.java | 334 +------------- .../event/partials/racelist/RaceList.java | 174 +------ .../racelist/RaceListColumnFactory.java | 427 ++++++++++++++++++ .../racelist/SortableRaceListColumn.java | 44 ++ 4 files changed, 510 insertions(+), 469 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java index 98c4ff5ee97..0b1c1ad5786 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java @@ -1,231 +1,39 @@ package com.sap.sailing.gwt.home.client.place.event.partials.racelist; -import java.util.Date; import java.util.List; -import com.google.gwt.cell.client.AbstractCell; -import com.google.gwt.cell.client.Cell; -import com.google.gwt.cell.client.DateCell; -import com.google.gwt.cell.client.TextCell; -import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.Style.TextTransform; -import com.google.gwt.dom.client.Style.Unit; -import com.google.gwt.i18n.client.DateTimeFormat; -import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; -import com.google.gwt.safecss.shared.SafeStyles; -import com.google.gwt.safecss.shared.SafeStylesBuilder; -import com.google.gwt.safecss.shared.SafeStylesUtils; -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.user.cellview.client.Column; import com.google.gwt.user.cellview.client.Header; import com.google.gwt.user.cellview.client.RowStyles; -import com.google.gwt.user.cellview.client.TextHeader; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.SimplePanel; -import com.sap.sailing.domain.common.InvertibleComparator; -import com.sap.sailing.domain.common.SortingOrder; -import com.sap.sailing.domain.common.impl.NaturalComparator; -import com.sap.sailing.gwt.common.client.SharedResources; -import com.sap.sailing.gwt.common.client.SharedResources.MainCss; -import com.sap.sailing.gwt.common.client.SharedResources.MediaCss; -import com.sap.sailing.gwt.common.client.i18n.TextMessages; import com.sap.sailing.gwt.home.client.place.event.EventView; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources.LocalCss; -import com.sap.sailing.gwt.regattaoverview.client.FlagsMeaningExplanator; -import com.sap.sailing.gwt.regattaoverview.client.SailingFlagsBuilder; -import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.client.shared.controls.SortableColumn; import com.sap.sailing.gwt.ui.leaderboard.SortedCellTable; -import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; -import com.sap.sailing.gwt.ui.shared.race.FlagStateDTO; -import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; -import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceTrackingState; -import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; -import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO; -import com.sap.sailing.gwt.ui.shared.race.SimpleWindDTO; -import com.sap.sailing.gwt.ui.shared.util.NullSafeComparableComparator; -import com.sap.sse.common.Util; -import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.gwt.theme.client.component.celltable.CleanCellTableResources; import com.sap.sse.gwt.theme.client.component.celltable.StyledHeaderOrFooterBuilder; public abstract class AbstractRaceList extends Composite { private static final LocalCss CSS = RacesListLiveResources.INSTANCE.css(); - private static final MediaCss MEDIA_CSS = SharedResources.INSTANCE.mediaCss(); - private static final StringMessages I18N = StringMessages.INSTANCE; - private static final CellTemplates TEMPLATE = GWT.create(CellTemplates.class); - - interface CellTemplates extends SafeHtmlTemplates { - @Template("
") - SafeHtml fleetCorner(String styleNames, SafeStyles color); - - @Template("
{3}
") - SafeHtml viewStateRunning(String styleNamesBar, String styleNamesProgress, SafeStyles width, String text); - - @Template("") - SafeHtml windDirection(SafeStyles rotation); - - @Template("
{1}
") - SafeHtml raceNotTracked(SafeStyles styles, String text); - - @Template("{1}") - SafeHtml raceViewerLinkButton(String styleNames, String text, String link); - } private final SimplePanel cellTableContainer = new SimplePanel(); - private final EventView.Presenter presenter; - protected final SortableRaceListColumn fleetCornerColumn = new RaceListColumn("", - new FleetCornerCell()) { - @Override - public String getColumnStyle() { - return CSS.race_fleetcorner(); - } - - @Override - public FleetMetadataDTO getValue(T object) { - return object.getFleet(); - } - }; - protected final SortableRaceListColumn raceNameColumn = new SortableRaceListColumn(I18N.race(), - new TextCell(), new InvertibleComparatorWrapper(new NaturalComparator(false)) { - @Override - protected String getComparisonValue(T object) { - return object.getRaceName(); - } - }) { - @Override - public String getHeaderStyle() { - return CSS.raceslist_head_item(); - } - - @Override - public String getColumnStyle() { - return getStyleNamesString(CSS.race_item(), CSS.race_itemname()); - } - - @Override - public String getValue(T object) { - return object.getRaceName(); - } - }; - protected final SortableRaceListColumn fleetNameColumn = new SortableRaceListColumn(I18N.fleet(), - new TextCell(), new InvertibleComparatorWrapper(new NaturalComparator(false)) { - @Override - protected String getComparisonValue(T object) { - return object.getFleet() != null ? object.getFleet().getFleetName() : null; - } - }) { - @Override - public String getHeaderStyle() { - return getStyleNamesString(CSS.raceslist_head_item(), MEDIA_CSS.showonlarge()); - } - - @Override - public String getColumnStyle() { - return getStyleNamesString(CSS.race_item(), MEDIA_CSS.showonlarge()); - } - - @Override - public String getValue(T object) { - return object.getFleet() != null ? object.getFleet().getFleetName() : null; - } - }; - protected final SortableRaceListColumn startTimeColumn = new SortableRaceListColumn(I18N.start(), - new DateCell(DateTimeFormat.getFormat(PredefinedFormat.HOUR24_MINUTE)), - new InvertibleComparatorWrapper(new NullSafeComparableComparator()) { - @Override - protected Date getComparisonValue(T object) { - return object.getStart(); - } - }) { - @Override - public String getHeaderStyle() { - return CSS.raceslist_head_item(); - } - - @Override - public String getColumnStyle() { - return CSS.race_item(); - } - - @Override - public Date getValue(T object) { - return object.getStart(); - } - }; - protected final SortableRaceListColumn courseAreaColumn = new SortableRaceListColumn(I18N.courseArea(), - new TextCell(), new InvertibleComparatorWrapper(new NaturalComparator(false)) { - @Override - protected String getComparisonValue(T object) { - return object.getCourseArea(); - } - }) { - @Override - public String getHeaderStyle() { - return getStyleNamesString(CSS.raceslist_head_item(), MEDIA_CSS.showonlarge()); - } - - @Override - public String getColumnStyle() { - return getStyleNamesString(CSS.race_item(), MEDIA_CSS.showonlarge()); - } - - @Override - public String getValue(T object) { - return object.getCourseArea(); - } - }; - protected final SortableRaceListColumn courseColumn = new SortableRaceListColumn(I18N.course(), - new TextCell(), new InvertibleComparatorWrapper(new NaturalComparator(false)) { - @Override - protected String getComparisonValue(T object) { - return object.getCourse(); - } - }) { - @Override - public String getHeaderStyle() { - return getStyleNamesString(CSS.raceslist_head_item(), MEDIA_CSS.showonlarge()); - } - - @Override - public String getColumnStyle() { - return getStyleNamesString(CSS.race_item(), MEDIA_CSS.showonlarge()); - } - - @Override - public String getValue(T object) { - return object.getCourse(); - } - }; - protected final SortableRaceListColumn raceViewerButtonColumn = new RaceListColumn("", - new RaceViewerButtonCell()) { - @Override - public String getHeaderStyle() { - return getStyleNamesString(CSS.raceslist_head_item(), CSS.raceslist_head_itembutton()); - } - - @Override - public String getColumnStyle() { - return getStyleNamesString(CSS.race_item(), CSS.race_itemright()); - } - - @Override - public T getValue(T object) { - return object; - } - }; + protected final SortableRaceListColumn fleetCornerColumn = RaceListColumnFactory.getFleetCornerColumn(); + protected final SortableRaceListColumn raceNameColumn = RaceListColumnFactory.getRaceNameColumn(); + protected final SortableRaceListColumn fleetNameColumn = RaceListColumnFactory.getFleetNameColumn(); + protected final SortableRaceListColumn startTimeColumn = RaceListColumnFactory.getStartTimeColumn(); + protected final SortableRaceListColumn courseAreaColumn = RaceListColumnFactory.getCourseAreaColumn(); + protected final SortableRaceListColumn courseColumn = RaceListColumnFactory.getCourseColumn(); + protected final SortableRaceListColumn raceViewerButtonColumn; private SortedCellTable cellTable; protected AbstractRaceList(EventView.Presenter presenter) { CSS.ensureInjected(); - this.presenter = presenter; + this.raceViewerButtonColumn = RaceListColumnFactory.getRaceViewerButtonColumn(presenter); this.initWidget(cellTableContainer); } @@ -254,124 +62,18 @@ public abstract class AbstractRaceList extends Compos protected abstract void initTableColumns(); - protected void add(SortableRaceListColumn column) { - if (column.getColumnStyle() != null) { - column.setCellStyleNames(column.getColumnStyle()); - } - Header header = column.getHeader(); - if (header != null && column.getHeaderStyle() != null) { - header.setHeaderStyleNames(column.getHeaderStyle()); - } - boolean ascending = column.getPreferredSortingOrder().isAscending(); - this.cellTable.addColumn(column, header, column.getComparator(), ascending); - } - - protected abstract class SortableRaceListColumn extends SortableColumn { - private final String headerText; - private final InvertibleComparator comparator; - - protected SortableRaceListColumn(String headerText, Cell cell, InvertibleComparator comparator) { - super(cell, SortingOrder.ASCENDING); - this.headerText = headerText; - this.comparator = comparator; - } - - @Override - public final InvertibleComparator getComparator() { - return comparator; - } - - @Override - public final Header getHeader() { - return new TextHeader(headerText); - } - - protected final String getStyleNamesString(String... styleNames) { - return Util.join(" ", styleNames); - } - } - - protected abstract class RaceListColumn extends SortableRaceListColumn { - protected RaceListColumn(String headerText, Cell cell) { - super(headerText, cell, null); - } - } - - private class FleetCornerCell extends AbstractCell { - @Override - public void render(Context context, FleetMetadataDTO value, SafeHtmlBuilder sb) { - if (value != null) { - sb.append(TEMPLATE.fleetCorner(CSS.race_fleetcorner_icon(), - SafeStylesUtils.fromTrustedNameAndValue("border-top-color", value.getFleetColor()))); + protected void add(SortableRaceListColumn column) { + if (column.isShowDetails()) { + if (column.getColumnStyle() != null) { + column.setCellStyleNames(column.getColumnStyle()); } - } - } - - protected class FlagsCell extends AbstractCell { - @Override - public void render(Context context, FlagStateDTO value, SafeHtmlBuilder sb) { - if (value != null) { - sb.append(SailingFlagsBuilder.render(value, 0.55, FlagsMeaningExplanator.getFlagsMeaning(I18N, - value.getLastUpperFlag(), value.getLastLowerFlag(), value.isLastFlagsAreDisplayed()))); + Header header = column.getHeader(); + if (header != null && column.getHeaderStyle() != null) { + header.setHeaderStyleNames(column.getHeaderStyle()); } + boolean ascending = column.getPreferredSortingOrder().isAscending(); + this.cellTable.addColumn(column, header, column.getComparator(), ascending); } } - - protected class WindDirectionCell extends AbstractCell { - @Override - public void render(Context context, SimpleWindDTO value, SafeHtmlBuilder sb) { - if (value != null) { - SafeStylesBuilder safeStyles = new SafeStylesBuilder(); - safeStyles.trustedNameAndValue("-webkit-transform", "rotate(" + value.getTrueWindFromDeg() + "deg)"); - safeStyles.trustedNameAndValue("transform", "rotate(" + value.getTrueWindFromDeg() + "deg)"); - safeStyles.width(2.75, Unit.EM).height(2.75, Unit.EM); - sb.append(TEMPLATE.windDirection(safeStyles.toSafeStyles())); - } - } - } - - protected class RaceViewStateCell extends AbstractCell { - @Override - public void render(Context context, LiveRaceDTO value, SafeHtmlBuilder sb) { - RaceViewState state = value.getViewState(); - RaceProgressDTO progress = value.getProgress(); - if (state == RaceViewState.SCHEDULED) { - double min = MillisecondsTimePoint.now().until(new MillisecondsTimePoint(value.getStart())).asMinutes(); - sb.appendEscaped(I18N.startingInMinutes((int) min)); - } else if (state == RaceViewState.RUNNING && progress != null) { - SafeStyles width = SafeStylesUtils.forWidth(progress.getPercentageProgress(), Unit.PCT); - String text = I18N.currentOfTotalLegs(progress.getCurrentLeg(), progress.getTotalLegs()); - sb.append(TEMPLATE.viewStateRunning(CSS.race_itemstatus_progressbar(), - CSS.race_itemstatus_progressbar_progress(), width, text)); - } else { - sb.appendEscaped(state.getLabel()); - } - } - } - - private class RaceViewerButtonCell extends AbstractCell { - private final TextMessages I18N_UBI = TextMessages.INSTANCE; - private final MainCss css = SharedResources.INSTANCE.mainCss(); - private final String watchNowStyle = getButtonStyleNames(css.buttonred()); - private final String analyseRaceStyle = getButtonStyleNames(css.buttonprimary()); - - @Override - public void render(Context context, T data, SafeHtmlBuilder sb) { - if (data.getTrackingState() != RaceTrackingState.TRACKED_VALID_DATA) { - SafeStylesBuilder styles = new SafeStylesBuilder().textTransform(TextTransform.UPPERCASE); - styles.trustedColor("#666").trustedNameAndValue("font-size", "0.933333333333333rem").toSafeStyles(); - styles.trustedNameAndValue("padding", "0.714285714285714em 1.071428571428571em"); - sb.append(TEMPLATE.raceNotTracked(styles.toSafeStyles(), I18N_UBI.eventRegattaRaceNotTracked())); - } else { - String styleNames = data.getViewState() == RaceViewState.FINISHED ? analyseRaceStyle : watchNowStyle; - String text = data.getViewState() == RaceViewState.FINISHED ? I18N.analyseRace() : I18N_UBI.watchNow(); - String raceViewerURL = presenter.getRaceViewerURL(data.getRegattaName(), data.getTrackedRaceName()); - sb.append(TEMPLATE.raceViewerLinkButton(styleNames, text, raceViewerURL)); - } - } - - private final String getButtonStyleNames(String buttonColor) { - return Util.join(" ", css.button(), css.buttonstrong(), buttonColor, css.buttonarrowrightwhite()); - } - } + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceList.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceList.java index b4125a82ed6..77a9c50808a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceList.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceList.java @@ -1,178 +1,46 @@ package com.sap.sailing.gwt.home.client.place.event.partials.racelist; -import com.google.gwt.cell.client.TextCell; -import com.sap.sailing.domain.common.impl.NaturalComparator; -import com.sap.sailing.gwt.common.client.SharedResources; -import com.sap.sailing.gwt.common.client.SharedResources.MediaCss; import com.sap.sailing.gwt.home.client.place.event.EventView; -import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources; -import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources.LocalCss; -import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRacesDTO; -import com.sap.sailing.gwt.ui.shared.race.FlagStateDTO; -import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; -import com.sap.sailing.gwt.ui.shared.race.SimpleWindDTO; -import com.sap.sailing.gwt.ui.shared.util.NullSafeComparableComparator; public class RaceList extends AbstractRaceList { - private static final LocalCss CSS = RacesListLiveResources.INSTANCE.css(); - private static final MediaCss MEDIA_CSS = SharedResources.INSTANCE.mediaCss(); - private static final StringMessages I18N = StringMessages.INSTANCE; - - private final boolean showRegattaDetails; - private boolean showFleetDetails; - private boolean showCourseAreaDetails; - private boolean showCourseDetails; - private boolean showWindDetails; - - private final SortableRaceListColumn regattaNameColumn = new SortableRaceListColumn(I18N.regatta(), - new TextCell(), new InvertibleComparatorWrapper(new NaturalComparator(false)) { - @Override - protected String getComparisonValue(LiveRaceDTO object) { - return object.getRegattaDisplayName(); - } - }) { - @Override - public String getHeaderStyle() { - return CSS.raceslist_head_item(); - } - - @Override - public String getColumnStyle() { - return getStyleNamesString(CSS.race_item(), CSS.race_itemname()); - } - - @Override - public String getValue(LiveRaceDTO object) { - return object.getRegattaDisplayName(); - } - }; - private final SortableRaceListColumn flagsColumn = new RaceListColumn(I18N.flags(), - new FlagsCell()) { - @Override - public String getHeaderStyle() { - return CSS.raceslist_head_item(); - } - - @Override - public String getColumnStyle() { - return getStyleNamesString(CSS.race_item(), CSS.racesListIcon()); - } - - @Override - public FlagStateDTO getValue(LiveRaceDTO object) { - return object.getFlagState(); - } - }; - private final SortableRaceListColumn windSpeedColumn = new SortableRaceListColumn(I18N.wind(), - new TextCell(), new InvertibleComparatorWrapper( - new NullSafeComparableComparator()) { - @Override - protected Double getComparisonValue(LiveRaceDTO object) { - return object.getWind() != null ? object.getWind().getTrueWindSpeedInKnots() : null; - } - }) { - @Override - public String getHeaderStyle() { - return CSS.raceslist_head_item(); - } - - @Override - public String getColumnStyle() { - return CSS.race_item(); - } - - @Override - public String getValue(LiveRaceDTO object) { - return object.getWind() != null ? I18N.knotsValue(object.getWind().getTrueWindSpeedInKnots()) : null; - } - }; - private final SortableRaceListColumn windDirectionColumn = new SortableRaceListColumn( - I18N.from(), new WindDirectionCell(), new InvertibleComparatorWrapper( - new NullSafeComparableComparator()) { - @Override - protected Double getComparisonValue(LiveRaceDTO object) { - return object.getWind() != null ? object.getWind().getTrueWindFromDeg() : null; - } - }) { - @Override - public String getHeaderStyle() { - return getStyleNamesString(CSS.raceslist_head_item(), MEDIA_CSS.hideonsmall()); - } - - @Override - public String getColumnStyle() { - return getStyleNamesString(CSS.race_item(), CSS.racesListIcon(), MEDIA_CSS.hideonsmall()); - } - - @Override - public SimpleWindDTO getValue(LiveRaceDTO object) { - return object.getWind(); - } - }; - private final SortableRaceListColumn raceViewStateColumn = new SortableRaceListColumn( - I18N.status(), new RaceViewStateCell(), new InvertibleComparatorWrapper( - new NullSafeComparableComparator()) { - @Override - protected RaceViewState getComparisonValue(LiveRaceDTO object) { - return object.getViewState(); - } - }) { - @Override - public String getHeaderStyle() { - return CSS.raceslist_head_item(); - } - - @Override - public String getColumnStyle() { - return CSS.race_item(); - } - - @Override - public LiveRaceDTO getValue(LiveRaceDTO object) { - return object; - } - }; + private final SortableRaceListColumn regattaNameColumn = RaceListColumnFactory.getRegattaNameColumn(); + private final SortableRaceListColumn flagsColumn = RaceListColumnFactory.getFlagsColumn(); + private final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory.getWindSpeedColumn(); + private final SortableRaceListColumn windDirectionColumn = RaceListColumnFactory.getWindDirectionColumn(); + private final SortableRaceListColumn raceViewStateColumn = RaceListColumnFactory.getRaceViewStateColumn(); public RaceList(EventView.Presenter presenter, boolean showRegattaDetails) { super(presenter); - this.showRegattaDetails = showRegattaDetails; + this.regattaNameColumn.setShowDetails(showRegattaDetails); } public void setListData(LiveRacesDTO data) { - this.showFleetDetails = data.hasFleets(); - this.showCourseAreaDetails = data.hasCourseAreas(); - this.showCourseDetails = data.hasCourses(); - this.showWindDetails = data.hasWind(); + boolean hasFleets = data.hasFleets(); + this.fleetCornerColumn.setShowDetails(hasFleets); + this.fleetNameColumn.setShowDetails(hasFleets); + this.courseAreaColumn.setShowDetails(data.hasCourseAreas()); + this.courseColumn.setShowDetails(data.hasCourses()); + boolean hasWind = data.hasWind(); + this.windSpeedColumn.setShowDetails(hasWind); + this.windDirectionColumn.setShowDetails(hasWind); setTableData(data.getRaces()); } @Override protected void initTableColumns() { - if (showFleetDetails) { - add(fleetCornerColumn); - } - if (showRegattaDetails) { - add(regattaNameColumn); - } + add(fleetCornerColumn); + add(regattaNameColumn); add(raceNameColumn); - if (showFleetDetails) { - add(fleetNameColumn); - } + add(fleetNameColumn); add(startTimeColumn); add(flagsColumn); - if(showWindDetails) { - add(windSpeedColumn); - add(windDirectionColumn); - } - if (showCourseAreaDetails) { - add(courseAreaColumn); - } - if(showCourseDetails) { - add(courseColumn); - } + add(windSpeedColumn); + add(windDirectionColumn); + add(courseAreaColumn); + add(courseColumn); add(raceViewStateColumn); add(raceViewerButtonColumn); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java new file mode 100644 index 00000000000..eccdec4050d --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -0,0 +1,427 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.racelist; + +import java.util.Date; + +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.cell.client.Cell; +import com.google.gwt.cell.client.DateCell; +import com.google.gwt.cell.client.TextCell; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.TextTransform; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.i18n.client.DateTimeFormat; +import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; +import com.google.gwt.safecss.shared.SafeStyles; +import com.google.gwt.safecss.shared.SafeStylesBuilder; +import com.google.gwt.safecss.shared.SafeStylesUtils; +import com.google.gwt.safehtml.client.SafeHtmlTemplates; +import com.google.gwt.safehtml.shared.SafeHtml; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.sap.sailing.domain.common.InvertibleComparator; +import com.sap.sailing.domain.common.impl.NaturalComparator; +import com.sap.sailing.gwt.common.client.SharedResources; +import com.sap.sailing.gwt.common.client.SharedResources.MainCss; +import com.sap.sailing.gwt.common.client.SharedResources.MediaCss; +import com.sap.sailing.gwt.common.client.i18n.TextMessages; +import com.sap.sailing.gwt.home.client.place.event.EventView; +import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources; +import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources.LocalCss; +import com.sap.sailing.gwt.regattaoverview.client.FlagsMeaningExplanator; +import com.sap.sailing.gwt.regattaoverview.client.SailingFlagsBuilder; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; +import com.sap.sailing.gwt.ui.shared.race.FlagStateDTO; +import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; +import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; +import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceTrackingState; +import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; +import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO; +import com.sap.sailing.gwt.ui.shared.race.SimpleWindDTO; +import com.sap.sailing.gwt.ui.shared.util.NullSafeComparableComparator; +import com.sap.sse.common.Util; +import com.sap.sse.common.impl.MillisecondsTimePoint; + +public class RaceListColumnFactory { + + private static final LocalCss CSS = RacesListLiveResources.INSTANCE.css(); + private static final MainCss MAIN_CSS = SharedResources.INSTANCE.mainCss(); + private static final MediaCss MEDIA_CSS = SharedResources.INSTANCE.mediaCss(); + private static final StringMessages I18N = StringMessages.INSTANCE; + private static final TextMessages I18N_UBI = TextMessages.INSTANCE; + private static final CellTemplates TEMPLATE = GWT.create(CellTemplates.class); + + interface CellTemplates extends SafeHtmlTemplates { + @Template("
") + SafeHtml fleetCorner(String styleNames, SafeStyles color); + + @Template("
{3}
") + SafeHtml viewStateRunning(String styleNamesBar, String styleNamesProgress, SafeStyles width, String text); + + @Template("") + SafeHtml windDirection(SafeStyles rotation); + + @Template("
{1}
") + SafeHtml raceNotTracked(SafeStyles styles, String text); + + @Template("{1}") + SafeHtml raceViewerLinkButton(String styleNames, String text, String link); + } + + public static SortableRaceListColumn getFleetCornerColumn() { + Cell cell = new AbstractCell() { + @Override + public void render(Context context, FleetMetadataDTO value, SafeHtmlBuilder sb) { + if (value != null) { + SafeStyles style = SafeStylesUtils.fromTrustedNameAndValue("border-top-color", value.getFleetColor()); + sb.append(TEMPLATE.fleetCorner(CSS.race_fleetcorner_icon(), style)); + } + } + }; + InvertibleComparator comparator = null; + return new SortableRaceListColumn("", cell, comparator) { + @Override + public String getColumnStyle() { + return CSS.race_fleetcorner(); + } + + @Override + public FleetMetadataDTO getValue(T object) { + return object.getFleet(); + } + }; + } + + public static SortableRaceListColumn getRegattaNameColumn() { + Cell cell = new TextCell(); + InvertibleComparator comparator = new InvertibleComparatorWrapper(new NaturalComparator(false)) { + @Override + protected String getComparisonValue(T object) { + return object.getRegattaDisplayName(); + } + }; + return new SortableRaceListColumn(I18N.regatta(), cell, comparator) { + @Override + public String getHeaderStyle() { + return CSS.raceslist_head_item(); + } + + @Override + public String getColumnStyle() { + return getStyleNamesString(CSS.race_item(), CSS.race_itemname()); + } + + @Override + public String getValue(T object) { + return object.getRegattaDisplayName(); + } + }; + } + + public static SortableRaceListColumn getRaceNameColumn() { + Cell cell = new TextCell(); + InvertibleComparator comparator = new InvertibleComparatorWrapper(new NaturalComparator(false)) { + @Override + protected String getComparisonValue(T object) { + return object.getRaceName(); + } + }; + return new SortableRaceListColumn(I18N.race(), cell, comparator) { + @Override + public String getHeaderStyle() { + return CSS.raceslist_head_item(); + } + + @Override + public String getColumnStyle() { + return getStyleNamesString(CSS.race_item(), CSS.race_itemname()); + } + + @Override + public String getValue(T object) { + return object.getRaceName(); + } + }; + } + + public static SortableRaceListColumn getFleetNameColumn() { + Cell cell = new TextCell(); + InvertibleComparator comparator = new InvertibleComparatorWrapper(new NaturalComparator(false)) { + @Override + protected String getComparisonValue(T object) { + return object.getFleet() != null ? object.getFleet().getFleetName() : null; + } + }; + return new SortableRaceListColumn(I18N.fleet(), cell, comparator) { + @Override + public String getHeaderStyle() { + return getStyleNamesString(CSS.raceslist_head_item(), MEDIA_CSS.showonlarge()); + } + + @Override + public String getColumnStyle() { + return getStyleNamesString(CSS.race_item(), MEDIA_CSS.showonlarge()); + } + + @Override + public String getValue(T object) { + return object.getFleet() != null ? object.getFleet().getFleetName() : null; + } + }; + } + + public static SortableRaceListColumn getStartTimeColumn() { + Cell cell = new DateCell(DateTimeFormat.getFormat(PredefinedFormat.HOUR24_MINUTE)); + InvertibleComparator comparator = new InvertibleComparatorWrapper( new NullSafeComparableComparator()) { + @Override + protected Date getComparisonValue(T object) { + return object.getStart(); + } + }; + return new SortableRaceListColumn(I18N.start(), cell, comparator) { + @Override + public String getHeaderStyle() { + return CSS.raceslist_head_item(); + } + + @Override + public String getColumnStyle() { + return CSS.race_item(); + } + + @Override + public Date getValue(T object) { + return object.getStart(); + } + }; + } + + public static SortableRaceListColumn getFlagsColumn() { + Cell cell = new AbstractCell() { + @Override + public void render(Context context, FlagStateDTO value, SafeHtmlBuilder sb) { + if (value != null) { + sb.append(SailingFlagsBuilder.render(value, 0.55, FlagsMeaningExplanator.getFlagsMeaning(I18N, + value.getLastUpperFlag(), value.getLastLowerFlag(), value.isLastFlagsAreDisplayed()))); + } + } + }; + InvertibleComparator comparator = null; + return new SortableRaceListColumn(I18N.flags(), cell, comparator) { + @Override + public String getHeaderStyle() { + return CSS.raceslist_head_item(); + } + + @Override + public String getColumnStyle() { + return getStyleNamesString(CSS.race_item(), CSS.racesListIcon()); + } + + @Override + public FlagStateDTO getValue(T object) { + return object.getFlagState(); + } + }; + } + + public static SortableRaceListColumn getWindSpeedColumn() { + Cell cell = new TextCell(); + InvertibleComparator comparator = new InvertibleComparatorWrapper( new NullSafeComparableComparator()) { + @Override + protected Double getComparisonValue(T object) { + return object.getWind() != null ? object.getWind().getTrueWindSpeedInKnots() : null; + } + }; + return new SortableRaceListColumn(I18N.wind(), cell, comparator) { + @Override + public String getHeaderStyle() { + return CSS.raceslist_head_item(); + } + + @Override + public String getColumnStyle() { + return CSS.race_item(); + } + + @Override + public String getValue(T object) { + return object.getWind() != null ? I18N.knotsValue(object.getWind().getTrueWindSpeedInKnots()) : null; + } + }; + } + + public static SortableRaceListColumn getWindDirectionColumn() { + Cell cell = new AbstractCell() { + @Override + public void render(Context context, SimpleWindDTO value, SafeHtmlBuilder sb) { + if (value != null) { + SafeStylesBuilder safeStyles = new SafeStylesBuilder(); + safeStyles.trustedNameAndValue("-webkit-transform", "rotate(" + value.getTrueWindFromDeg() + "deg)"); + safeStyles.trustedNameAndValue("transform", "rotate(" + value.getTrueWindFromDeg() + "deg)"); + safeStyles.width(2.75, Unit.EM).height(2.75, Unit.EM); + sb.append(TEMPLATE.windDirection(safeStyles.toSafeStyles())); + } + } + }; + InvertibleComparator comparator = new InvertibleComparatorWrapper( new NullSafeComparableComparator()) { + @Override + protected Double getComparisonValue(T object) { + return object.getWind() != null ? object.getWind().getTrueWindFromDeg() : null; + } + }; + return new SortableRaceListColumn(I18N.from(), cell, comparator) { + @Override + public String getHeaderStyle() { + return getStyleNamesString(CSS.raceslist_head_item(), MEDIA_CSS.hideonsmall()); + } + + @Override + public String getColumnStyle() { + return getStyleNamesString(CSS.race_item(), CSS.racesListIcon(), MEDIA_CSS.hideonsmall()); + } + + @Override + public SimpleWindDTO getValue(T object) { + return object.getWind(); + } + }; + } + + public static SortableRaceListColumn getCourseAreaColumn() { + Cell cell = new TextCell(); + InvertibleComparator comparator = new InvertibleComparatorWrapper(new NaturalComparator(false)) { + @Override + protected String getComparisonValue(T object) { + return object.getCourseArea(); + } + }; + return new SortableRaceListColumn(I18N.courseArea(), cell, comparator) { + @Override + public String getHeaderStyle() { + return getStyleNamesString(CSS.raceslist_head_item(), MEDIA_CSS.showonlarge()); + } + + @Override + public String getColumnStyle() { + return getStyleNamesString(CSS.race_item(), MEDIA_CSS.showonlarge()); + } + + @Override + public String getValue(T object) { + return object.getCourseArea(); + } + }; + } + + public static SortableRaceListColumn getCourseColumn() { + Cell cell = new TextCell(); + InvertibleComparator comparator = new InvertibleComparatorWrapper(new NaturalComparator(false)) { + @Override + protected String getComparisonValue(T object) { + return object.getCourse(); + } + }; + return new SortableRaceListColumn(I18N.course(), cell, comparator) { + @Override + public String getHeaderStyle() { + return getStyleNamesString(CSS.raceslist_head_item(), MEDIA_CSS.showonlarge()); + } + + @Override + public String getColumnStyle() { + return getStyleNamesString(CSS.race_item(), MEDIA_CSS.showonlarge()); + } + + @Override + public String getValue(T object) { + return object.getCourse(); + } + }; + } + + public static SortableRaceListColumn getRaceViewStateColumn() { + Cell cell = new AbstractCell() { + @Override + public void render(Context context, T value, SafeHtmlBuilder sb) { + RaceViewState state = value.getViewState(); + RaceProgressDTO progress = value.getProgress(); + if (state == RaceViewState.SCHEDULED) { + double min = MillisecondsTimePoint.now().until(new MillisecondsTimePoint(value.getStart())).asMinutes(); + sb.appendEscaped(I18N.startingInMinutes((int) min)); + } else if (state == RaceViewState.RUNNING && progress != null) { + SafeStyles width = SafeStylesUtils.forWidth(progress.getPercentageProgress(), Unit.PCT); + String text = I18N.currentOfTotalLegs(progress.getCurrentLeg(), progress.getTotalLegs()); + sb.append(TEMPLATE.viewStateRunning(CSS.race_itemstatus_progressbar(), + CSS.race_itemstatus_progressbar_progress(), width, text)); + } else { + sb.appendEscaped(state.getLabel()); + } + } + }; + InvertibleComparator comparator = new InvertibleComparatorWrapper(new NullSafeComparableComparator()) { + @Override + protected RaceViewState getComparisonValue(T object) { + return object.getViewState(); + } + }; + return new SortableRaceListColumn(I18N.status(), cell, comparator) { + @Override + public String getHeaderStyle() { + return CSS.raceslist_head_item(); + } + + @Override + public String getColumnStyle() { + return CSS.race_item(); + } + + @Override + public T getValue(T object) { + return object; + } + }; + } + + public static SortableRaceListColumn getRaceViewerButtonColumn(final EventView.Presenter presenter) { + Cell cell = new AbstractCell() { + private final String watchNowStyle = getButtonStyleNames(MAIN_CSS.buttonred()); + private final String analyseRaceStyle = getButtonStyleNames(MAIN_CSS.buttonprimary()); + + @Override + public void render(Context context, T data, SafeHtmlBuilder sb) { + if (data.getTrackingState() != RaceTrackingState.TRACKED_VALID_DATA) { + SafeStylesBuilder styles = new SafeStylesBuilder().textTransform(TextTransform.UPPERCASE); + styles.trustedColor("#666").trustedNameAndValue("font-size", "0.933333333333333rem").toSafeStyles(); + styles.trustedNameAndValue("padding", "0.714285714285714em 1.071428571428571em"); + sb.append(TEMPLATE.raceNotTracked(styles.toSafeStyles(), I18N_UBI.eventRegattaRaceNotTracked())); + } else { + String styleNames = data.getViewState() == RaceViewState.FINISHED ? analyseRaceStyle : watchNowStyle; + String text = data.getViewState() == RaceViewState.FINISHED ? I18N.analyseRace() : I18N_UBI.watchNow(); + String raceViewerURL = presenter.getRaceViewerURL(data.getRegattaName(), data.getTrackedRaceName()); + sb.append(TEMPLATE.raceViewerLinkButton(styleNames, text, raceViewerURL)); + } + } + + private final String getButtonStyleNames(String buttonColor) { + return Util.join(" ", MAIN_CSS.button(), MAIN_CSS.buttonstrong(), buttonColor, MAIN_CSS.buttonarrowrightwhite()); + } + }; + InvertibleComparator comparator = null; + return new SortableRaceListColumn("", cell, comparator) { + @Override + public String getHeaderStyle() { + return getStyleNamesString(CSS.raceslist_head_item(), CSS.raceslist_head_itembutton()); + } + + @Override + public String getColumnStyle() { + return getStyleNamesString(CSS.race_item(), CSS.race_itemright()); + } + + @Override + public T getValue(T object) { + return object; + } + }; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java new file mode 100644 index 00000000000..50e1632e76f --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java @@ -0,0 +1,44 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.racelist; + +import com.google.gwt.cell.client.Cell; +import com.google.gwt.user.cellview.client.Header; +import com.google.gwt.user.cellview.client.TextHeader; +import com.sap.sailing.domain.common.InvertibleComparator; +import com.sap.sailing.domain.common.SortingOrder; +import com.sap.sailing.gwt.ui.client.shared.controls.SortableColumn; +import com.sap.sse.common.Util; + +public abstract class SortableRaceListColumn extends SortableColumn { + private final String headerText; + private final InvertibleComparator comparator; + + private boolean showDetails = true; + + protected SortableRaceListColumn(String headerText, Cell cell, InvertibleComparator comparator) { + super(cell, SortingOrder.ASCENDING); + this.headerText = headerText; + this.comparator = comparator; + } + + @Override + public final InvertibleComparator getComparator() { + return comparator; + } + + @Override + public final Header getHeader() { + return new TextHeader(headerText); + } + + public void setShowDetails(boolean showDetails) { + this.showDetails = showDetails; + } + + public boolean isShowDetails() { + return showDetails; + } + + protected final String getStyleNamesString(String... styleNames) { + return Util.join(" ", styleNames); + } +} From 41efb83fbba489856a007ba421c983ab0ccb7d52 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 25 Jun 2015 15:54:48 +0200 Subject: [PATCH 002/219] Races lists - Refactored race list structure for easier reuse --- .../partials/raceListLive/RacesListLive.java | 66 ++++++++++++++----- .../raceListLive/RacesListLive.ui.xml | 14 ---- .../event/partials/racelist/RaceList.java | 47 ------------- .../partials/racelist/RaceListContainer.java | 43 ++++++++++++ .../racelist/RaceListContainer.ui.xml | 13 ++++ 5 files changed, 107 insertions(+), 76 deletions(-) delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.ui.xml delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceList.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.ui.xml diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java index 2638e39a5eb..e6a23231d85 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java @@ -1,29 +1,24 @@ package com.sap.sailing.gwt.home.client.place.event.partials.raceListLive; -import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Display; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.home.client.place.event.EventView; -import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceList; +import com.sap.sailing.gwt.home.client.place.event.partials.racelist.AbstractRaceList; +import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListColumnFactory; +import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListContainer; +import com.sap.sailing.gwt.home.client.place.event.partials.racelist.SortableRaceListColumn; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRacesDTO; public class RacesListLive extends Composite implements RefreshableWidget { - private static RacesListLiveUiBinder uiBinder = GWT.create(RacesListLiveUiBinder.class); - - interface RacesListLiveUiBinder extends UiBinder { - } - - @UiField(provided = true) RaceList raceList; + private final RaceListLiveRaces raceList; public RacesListLive(EventView.Presenter presenter, boolean showRegattaDetails) { - RacesListLiveResources.INSTANCE.css().ensureInjected(); - raceList = new RaceList(presenter, showRegattaDetails); - initWidget(uiBinder.createAndBindUi(this)); + raceList = new RaceListLiveRaces(presenter, showRegattaDetails); + initWidget(new RaceListContainer(StringMessages.INSTANCE.liveNow(), raceList)); getElement().getStyle().setDisplay(Display.NONE); } @@ -33,8 +28,49 @@ public class RacesListLive extends Composite implements RefreshableWidget { + private final SortableRaceListColumn regattaNameColumn = RaceListColumnFactory.getRegattaNameColumn(); + private final SortableRaceListColumn flagsColumn = RaceListColumnFactory.getFlagsColumn(); + private final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory.getWindSpeedColumn(); + private final SortableRaceListColumn windDirectionColumn = RaceListColumnFactory.getWindDirectionColumn(); + private final SortableRaceListColumn raceViewStateColumn = RaceListColumnFactory.getRaceViewStateColumn(); + + public RaceListLiveRaces(EventView.Presenter presenter, boolean showRegattaDetails) { + super(presenter); + this.regattaNameColumn.setShowDetails(showRegattaDetails); + } + + public void setListData(LiveRacesDTO data) { + boolean hasFleets = data.hasFleets(); + this.fleetCornerColumn.setShowDetails(hasFleets); + this.fleetNameColumn.setShowDetails(hasFleets); + this.courseAreaColumn.setShowDetails(data.hasCourseAreas()); + this.courseColumn.setShowDetails(data.hasCourses()); + boolean hasWind = data.hasWind(); + this.windSpeedColumn.setShowDetails(hasWind); + this.windDirectionColumn.setShowDetails(hasWind); + setTableData(data.getRaces()); + } + + @Override + protected void initTableColumns() { + add(fleetCornerColumn); + add(regattaNameColumn); + add(raceNameColumn); + add(fleetNameColumn); + add(startTimeColumn); + add(flagsColumn); + add(windSpeedColumn); + add(windDirectionColumn); + add(courseAreaColumn); + add(courseColumn); + add(raceViewStateColumn); + add(raceViewerButtonColumn); + } + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.ui.xml deleted file mode 100644 index cf0b0b5e149..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.ui.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - -

- -

- -
-
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceList.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceList.java deleted file mode 100644 index 77a9c50808a..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceList.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.sap.sailing.gwt.home.client.place.event.partials.racelist; - -import com.sap.sailing.gwt.home.client.place.event.EventView; -import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; -import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRacesDTO; - -public class RaceList extends AbstractRaceList { - - private final SortableRaceListColumn regattaNameColumn = RaceListColumnFactory.getRegattaNameColumn(); - private final SortableRaceListColumn flagsColumn = RaceListColumnFactory.getFlagsColumn(); - private final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory.getWindSpeedColumn(); - private final SortableRaceListColumn windDirectionColumn = RaceListColumnFactory.getWindDirectionColumn(); - private final SortableRaceListColumn raceViewStateColumn = RaceListColumnFactory.getRaceViewStateColumn(); - - public RaceList(EventView.Presenter presenter, boolean showRegattaDetails) { - super(presenter); - this.regattaNameColumn.setShowDetails(showRegattaDetails); - } - - public void setListData(LiveRacesDTO data) { - boolean hasFleets = data.hasFleets(); - this.fleetCornerColumn.setShowDetails(hasFleets); - this.fleetNameColumn.setShowDetails(hasFleets); - this.courseAreaColumn.setShowDetails(data.hasCourseAreas()); - this.courseColumn.setShowDetails(data.hasCourses()); - boolean hasWind = data.hasWind(); - this.windSpeedColumn.setShowDetails(hasWind); - this.windDirectionColumn.setShowDetails(hasWind); - setTableData(data.getRaces()); - } - - @Override - protected void initTableColumns() { - add(fleetCornerColumn); - add(regattaNameColumn); - add(raceNameColumn); - add(fleetNameColumn); - add(startTimeColumn); - add(flagsColumn); - add(windSpeedColumn); - add(windDirectionColumn); - add(courseAreaColumn); - add(courseColumn); - add(raceViewStateColumn); - add(raceViewerButtonColumn); - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.java new file mode 100644 index 00000000000..ac0ab199dc1 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.java @@ -0,0 +1,43 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.racelist; + + +import java.util.List; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.dom.client.HeadingElement; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources; +import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; + +public class RaceListContainer extends Composite { + + private static RaceListContainerUiBinder uiBinder = GWT.create(RaceListContainerUiBinder.class); + + interface RaceListContainerUiBinder extends UiBinder> { + } + + @UiField HeadingElement titleUi; + @UiField DivElement infoUi; + @UiField(provided = true) AbstractRaceList raceListUi; + + public RaceListContainer(String title, AbstractRaceList raceList) { + RacesListLiveResources.INSTANCE.css().ensureInjected(); + this.raceListUi = raceList; + initWidget(uiBinder.createAndBindUi(this)); + this.titleUi.setInnerText(title); + } + + public void setRaceListData(List data) { + this.raceListUi.setTableData(data); + } + + public void setInfoText(String infoText) { + this.infoUi.setInnerText(infoText); + this.infoUi.getStyle().clearDisplay(); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.ui.xml new file mode 100644 index 00000000000..77005d61bff --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.ui.xml @@ -0,0 +1,13 @@ + + + + + + +

+
+ +
+
\ No newline at end of file From f2754c64502a288f6d1d8be69b0fed65912a554a Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 25 Jun 2015 16:45:10 +0200 Subject: [PATCH 003/219] Races lists - Refactored field in race list DTO hierachy --- .../partials/raceListLive/RacesListLive.java | 4 +-- .../partials/racelist/AbstractRaceList.java | 4 +-- .../racelist/RaceListColumnFactory.java | 4 +-- .../ui/shared/dispatch/event/LiveRaceDTO.java | 11 ------- .../dispatch/event/RaceListRaceDTO.java | 32 +++++++++---------- .../gwt/ui/shared/race/RaceMetadataDTO.java | 9 ++++++ 6 files changed, 30 insertions(+), 34 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java index e6a23231d85..7cbcd14b74a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java @@ -36,8 +36,8 @@ public class RacesListLive extends Composite implements RefreshableWidget regattaNameColumn = RaceListColumnFactory.getRegattaNameColumn(); private final SortableRaceListColumn flagsColumn = RaceListColumnFactory.getFlagsColumn(); - private final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory.getWindSpeedColumn(); - private final SortableRaceListColumn windDirectionColumn = RaceListColumnFactory.getWindDirectionColumn(); + private final SortableRaceListColumn courseAreaColumn = RaceListColumnFactory.getCourseAreaColumn(); + private final SortableRaceListColumn courseColumn = RaceListColumnFactory.getCourseColumn(); private final SortableRaceListColumn raceViewStateColumn = RaceListColumnFactory.getRaceViewStateColumn(); public RaceListLiveRaces(EventView.Presenter presenter, boolean showRegattaDetails) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java index 0b1c1ad5786..5864c363e6e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java @@ -25,8 +25,8 @@ public abstract class AbstractRaceList extends Compos protected final SortableRaceListColumn raceNameColumn = RaceListColumnFactory.getRaceNameColumn(); protected final SortableRaceListColumn fleetNameColumn = RaceListColumnFactory.getFleetNameColumn(); protected final SortableRaceListColumn startTimeColumn = RaceListColumnFactory.getStartTimeColumn(); - protected final SortableRaceListColumn courseAreaColumn = RaceListColumnFactory.getCourseAreaColumn(); - protected final SortableRaceListColumn courseColumn = RaceListColumnFactory.getCourseColumn(); + protected final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory.getWindSpeedColumn(); + protected final SortableRaceListColumn windDirectionColumn = RaceListColumnFactory.getWindDirectionColumn(); protected final SortableRaceListColumn raceViewerButtonColumn; private SortedCellTable cellTable; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index eccdec4050d..5ea62140f35 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -224,7 +224,7 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getWindSpeedColumn() { + public static SortableRaceListColumn getWindSpeedColumn() { Cell cell = new TextCell(); InvertibleComparator comparator = new InvertibleComparatorWrapper( new NullSafeComparableComparator()) { @Override @@ -250,7 +250,7 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getWindDirectionColumn() { + public static SortableRaceListColumn getWindDirectionColumn() { Cell cell = new AbstractCell() { @Override public void render(Context context, SimpleWindDTO value, SafeHtmlBuilder sb) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceDTO.java index 587f10b0734..a17dd10637b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceDTO.java @@ -3,14 +3,11 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; import com.sap.sailing.gwt.ui.shared.race.FlagStateDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO; -import com.sap.sailing.gwt.ui.shared.race.SimpleWindDTO; public class LiveRaceDTO extends RaceMetadataDTO { private FlagStateDTO flagState; - private SimpleWindDTO wind; - private RaceProgressDTO progress; @SuppressWarnings("unused") @@ -21,14 +18,6 @@ public class LiveRaceDTO extends RaceMetadataDTO { super(regattaName, raceName); } - public SimpleWindDTO getWind() { - return wind; - } - - public void setWind(SimpleWindDTO wind) { - this.wind = wind; - } - public FlagStateDTO getFlagState() { return flagState; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java index 9270e530aad..cdf37c36f52 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java @@ -1,15 +1,15 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; -import com.sap.sailing.gwt.ui.shared.race.FlagStateDTO; +import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; -import com.sap.sailing.gwt.ui.shared.race.WindStatisticsDTO; +import com.sap.sse.common.Duration; public class RaceListRaceDTO extends RaceMetadataDTO { - private FlagStateDTO flagState; - - private WindStatisticsDTO wind; - + private Duration duration; + private CompetitorDTO winner; + // TODO: fields for wind(!?), video and audio counters + @SuppressWarnings("unused") private RaceListRaceDTO() { } @@ -18,19 +18,17 @@ public class RaceListRaceDTO extends RaceMetadataDTO { super(regattaName, raceName); } - public WindStatisticsDTO getWind() { - return wind; + public Duration getDuration() { + return duration; } - - public void setWind(WindStatisticsDTO wind) { - this.wind = wind; + public void setDuration(Duration duration) { + this.duration = duration; } - - public FlagStateDTO getFlagState() { - return flagState; + public CompetitorDTO getWinner() { + return winner; } - - public void setFlagState(FlagStateDTO flagState) { - this.flagState = flagState; + public void setWinner(CompetitorDTO winner) { + this.winner = winner; } + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/RaceMetadataDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/RaceMetadataDTO.java index 41c49440dc7..af7e6fdd296 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/RaceMetadataDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/RaceMetadataDTO.java @@ -65,6 +65,7 @@ public class RaceMetadataDTO implements IsSerializable { private String boatClass; private RaceViewState state; private RaceTrackingState trackingState; + private SimpleWindDTO wind; protected RaceMetadataDTO() { } @@ -145,6 +146,14 @@ public class RaceMetadataDTO implements IsSerializable { public void setTrackedRaceName(String trackedRaceName) { this.trackedRaceName = trackedRaceName; } + + public SimpleWindDTO getWind() { + return wind; + } + + public void setWind(SimpleWindDTO wind) { + this.wind = wind; + } public String getRegattaDisplayName() { return regattaDisplayName; From e952de538a8b819c578dd0f67dbcbefeca8e82fc Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 25 Jun 2015 17:56:56 +0200 Subject: [PATCH 004/219] Races lists - Added first content to RegattaRacesTabView --- .../regatta/tabs/RegattaRacesTabView.java | 116 +++++++++++------- .../regatta/tabs/RegattaRacesTabView.ui.xml | 13 +- 2 files changed, 81 insertions(+), 48 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 33cec046313..69f291c7955 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -10,15 +10,26 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.SimplePanel; import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; +import com.sap.sailing.gwt.home.client.place.event.EventView; +import com.sap.sailing.gwt.home.client.place.event.partials.racelist.AbstractRaceList; +import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListContainer; import com.sap.sailing.gwt.home.client.place.event.partials.regattaraces.EventRegattaRaces; import com.sap.sailing.gwt.home.client.place.event.regatta.EventRegattaView.Presenter; import com.sap.sailing.gwt.home.client.place.event.regatta.RegattaTabView; +import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.RaceGroupDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; +import com.sap.sailing.gwt.ui.shared.dispatch.event.GetLiveRacesForRegattaAction; +import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRacesDTO; import com.sap.sse.common.Util.Triple; +import com.sap.sse.common.impl.MillisecondsTimePoint; /** * Created by pgtaboada on 25.11.14. @@ -32,17 +43,16 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView>() { + @Override + public void onFailure(Throwable caught) { + } + + @Override + public void onSuccess(ResultWithTTL result) { + String date = DateAndTimeFormatterUtil.longDateFormatter.render(MillisecondsTimePoint.now().asDate()); + RaceListFinishedRaces raceList = new RaceListFinishedRaces(currentPresenter); + latestUpdateContainer.add(new RaceListContainer(date, raceList));; + raceList.setListData(result.getDto()); + } + }); + currentPresenter.ensureRegattaStructure(new AsyncCallback>() { - @Override - public void onSuccess(List raceGroups) { - if (raceGroups.size() > 0) { - Map> regattaStructure = getRegattaStructure(); + @Override + public void onSuccess(List raceGroups) { + if (raceGroups.size() > 0) { + Map> rs = getRegattaStructure(); + Triple selectedRegatta = rs .get(selectedRegattaId); + EventRegattaRaces regattaRaces = new EventRegattaRaces(currentPresenter); + oldContentContainer.setWidget(regattaRaces); + regattaRaces.setRaces(selectedRegatta.getC(), false, selectedRegatta.getB(), selectedRegatta.getA()); + contentArea.setWidget(RegattaRacesTabView.this); + } else { + + } + } - Triple selectedRegatta = regattaStructure - .get(selectedRegattaId); - - regattaRaces = new EventRegattaRaces(currentPresenter); - - regattaRaces.setRaces(selectedRegatta.getC(), false, selectedRegatta.getB(), - selectedRegatta.getA()); - - // if (eventDTO.isRunning()) { - // // create update time for race states only for running events - // serverUpdateTimer.addTimeListener(new TimeListener() { - // @Override - // public void timeChanged(Date newTime, Date oldTime) { - // loadAndUpdateEventRaceStatesLog(); - // } - // }); - // } - initWidget(ourUiBinder.createAndBindUi(RegattaRacesTabView.this)); - contentArea.setWidget(RegattaRacesTabView.this); - } else { - // createEventWithoutRegattasView(event, panel); - } - } - - @Override - public void onFailure(Throwable caught) { - // createErrorView( - // "Error while loading the regatta structure with service getRegattaStructureOfEvent()", - // caught, panel); - } - }); + @Override + public void onFailure(Throwable caught) { + } + }); } @Override public void stop() { - } @Override @@ -126,5 +130,33 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView { + + public RaceListFinishedRaces(EventView.Presenter presenter) { + super(presenter); + } + + public void setListData(LiveRacesDTO data) { +// boolean hasFleets = data.hasFleets(); +// this.fleetCornerColumn.setShowDetails(hasFleets); +// this.fleetNameColumn.setShowDetails(hasFleets); +// boolean hasWind = data.hasWind(); +// this.windSpeedColumn.setShowDetails(hasWind); +// this.windDirectionColumn.setShowDetails(hasWind); + setTableData(data.getRaces()); + } + + @Override + protected void initTableColumns() { + add(fleetCornerColumn); + add(raceNameColumn); + add(fleetNameColumn); + add(startTimeColumn); + add(windSpeedColumn); + add(windDirectionColumn); + add(raceViewerButtonColumn); + } + } } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml index aa3273ec11a..29f1afcd233 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml @@ -1,8 +1,9 @@ - - - + + + + +
+
\ No newline at end of file From dd06aaf02c1e6640b03f90b047ff3195328cd169 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 1 Jul 2015 17:32:06 +0200 Subject: [PATCH 005/219] Races lists - Added widget for race state legend --- .../listNavigation/RaceStateLegend.java | 19 +++ .../listNavigation/RaceStateLegend.ui.xml | 21 +++ .../listNavigation/RegattaNavigation.gss | 145 ++++++++++++++++++ .../RegattaNavigationResources.java | 35 +++++ 4 files changed, 220 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RaceStateLegend.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RaceStateLegend.ui.xml create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigation.gss create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigationResources.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RaceStateLegend.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RaceStateLegend.java new file mode 100644 index 00000000000..50cae03813c --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RaceStateLegend.java @@ -0,0 +1,19 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.listNavigation; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.user.client.ui.Widget; + +public class RaceStateLegend extends Widget { + + private static RaceStateLegendUiBinder uiBinder = GWT.create(RaceStateLegendUiBinder.class); + + interface RaceStateLegendUiBinder extends UiBinder { + } + + public RaceStateLegend() { + setElement(uiBinder.createAndBindUi(this)); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RaceStateLegend.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RaceStateLegend.ui.xml new file mode 100644 index 00000000000..e5449e23890 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RaceStateLegend.ui.xml @@ -0,0 +1,21 @@ + + + + + + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigation.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigation.gss new file mode 100644 index 00000000000..fd25305a6af --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigation.gss @@ -0,0 +1,145 @@ +/** + * A toggle buttons and legend for regatta races views + */ +.jsdropdown { + position: relative; +} +.jsdropdown_head { + padding-right: 2em; +} +.jsdropdown_head, +.jsdropdown_content { + text-indent: 0; +} +.regattanavigation { + font-size: 1rem; + margin-top: 1em; + margin-bottom: 1em; +} +.regattanavigation_text { + font-size: 0.866666666666667rem; + line-height: 2.307692307692307em; + margin-right: 0.769230769230769em; + display: inline-block; + color: #999; +} +.regattanavigation_button { + display: inline-block; + font-weight: 600; + padding: 0.333333333333333em 0.666666666666667em; + line-height: 1.333333333333333em; + margin-right: 0.666666666666667em; + color: #666; + background-color: #f2f2f2; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + transition: all 0.2s; + cursor: pointer; +} +.regattanavigation_button:hover { + text-decoration: none; + color: #fff; + background-color: #efaa00; +} +.regattanavigation_buttonactive { + color: #fff; + background-color: #efaa00; +} +.regattanavigation_filter { + font-size: 0.866666666666667rem; + text-align: right; + margin-top: 0; + background: transparent url("../images/home/arrow-down-filled-black.png") no-repeat; + background-position: 96%; + background-size: 0.923076923076923em 0.538461538461538em; + border: 1px solid transparent; + border-radius: 0.333333333333333em 0.333333333333333em 0 0; + position: relative; + float: right; + cursor: pointer; + padding-left: 0.5em; +} +.regattanavigation_filter:hover, +.regattanavigation_filter.jsdropdownactive { + border-color: #dedede; + background-color: #f2f2f2; +} +.regattanavigation_filter.jsdropdownactive { + background-image: url("../images/home/arrow-down-filled-yellow.png"); +} +.regattanavigation_filter.jsdropdownactive .regattanavigation_filter_dropdown { + display: block; +} +.regattanavigation_filter_text, +.regattanavigation_filter_current { + display: inline-block; + line-height: 2.307692307692307em; +} +.regattanavigation_filter_text { + color: #999; +} +.regattanavigation_filter_dropdown { + display: none; + position: absolute; + right: -1px; + background: #fff; + border: 1px solid #dedede; + line-height: 2.307692307692307em; + z-index: 10; + width: 110%; +} +.regattanavigation_filter_dropdown_link { + display: block; + color: #999; + text-align: left; + padding: 0 2.307692307692307em 0 0.769230769230769em; +} +.regattanavigation_filter_dropdown_linkactive { + background: url("../images/home/dropdown__check@2x.png") no-repeat; + background-position: 95%; + background-size: 1.2em 0.933333333333333em; +} +.regattanavigation_legend { + font-size: 1rem; + width: 100%; + margin-top: 1.333333333333333em; +} +@media (min-width: 61em) { + .regattanavigation_legend { + text-align: right; + margin-top: 0; + } + .regattanavigation_legend_item { + margin-right: 0; + margin-left: 0.666666666666667em; + } +} +.regattanavigation_legend_item { + display: inline-block; + padding: 0.4em 0.666666666666667em; + margin: 0.333333333333333em 0.666666666666667em 0.333333333333333em 0; + font-size: 0.666em; + font-weight: 700; + line-height: 0.666666666666667em; + border: 1px solid #008fcc; +} +.regattanavigation_legend_itemtracked { + color: #fff; + border-color: #008fcc; + background-color: #008fcc; +} +.regattanavigation_legend_itemuntracked { + color: #fff; + border-color: #ccc; + background-color: #666; +} +.regattanavigation_legend_itemlive { + color: #fff; + border-color: #e94a1b; + background-color: #e94a1b; +} +.regattanavigation_legend_itemplanned { + color: #ccc; + border-color: #ccc; + background-color: #fff; +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigationResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigationResources.java new file mode 100644 index 00000000000..f4aa7eb4748 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigationResources.java @@ -0,0 +1,35 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.listNavigation; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; + +public interface RegattaNavigationResources extends ClientBundle { + public static final RegattaNavigationResources INSTANCE = GWT.create(RegattaNavigationResources.class); + + @Source("RegattaNavigation.gss") + LocalCss css(); + + public interface LocalCss extends CssResource { + String jsdropdown(); + String jsdropdown_head(); + String jsdropdown_content(); + String regattanavigation(); + String regattanavigation_text(); + String regattanavigation_button(); + String regattanavigation_buttonactive(); + String regattanavigation_filter(); + String jsdropdownactive(); + String regattanavigation_filter_dropdown(); + String regattanavigation_filter_text(); + String regattanavigation_filter_current(); + String regattanavigation_filter_dropdown_link(); + String regattanavigation_filter_dropdown_linkactive(); + String regattanavigation_legend(); + String regattanavigation_legend_item(); + String regattanavigation_legend_itemtracked(); + String regattanavigation_legend_itemuntracked(); + String regattanavigation_legend_itemlive(); + String regattanavigation_legend_itemplanned(); + } +} From 1a0675d495adfe007368b28c0e577cd69f4d7db9 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 1 Jul 2015 17:33:24 +0200 Subject: [PATCH 006/219] Races lists - Added widget for navigation in race/regatta lists --- .../listNavigation/ListNavigationPanel.java | 85 +++++++++++++++++++ .../listNavigation/ListNavigationPanel.ui.xml | 15 ++++ 2 files changed, 100 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListNavigationPanel.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListNavigationPanel.ui.xml diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListNavigationPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListNavigationPanel.java new file mode 100644 index 00000000000..db818343b55 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListNavigationPanel.java @@ -0,0 +1,85 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.listNavigation; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Display; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.ListNavigationAction; +import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.RegattaNavigationResources.LocalCss; + +public class ListNavigationPanel extends Composite { + + private static final LocalCss CSS = RegattaNavigationResources.INSTANCE.css(); + + private static ListNavigationPanelUiBinder uiBinder = GWT.create(ListNavigationPanelUiBinder.class); + + interface ListNavigationPanelUiBinder extends UiBinder> { + } + + @UiField FlowPanel actionContainerUi; + @UiField SimplePanel additionalWidgetContainerUi; + + private SelectionCallback selectionCallback; + + public ListNavigationPanel(SelectionCallback selectionCallback) { + this.selectionCallback = selectionCallback; + CSS.ensureInjected(); + initWidget(uiBinder.createAndBindUi(this)); + } + + public void addAction(final T action, boolean select) { + ActionWidget actionWidget = new ActionWidget(action); + actionContainerUi.add(actionWidget); + if (select) { + actionWidget.select(); + } + } + + public void setAdditionalWidget(Widget additionalWidget) { + this.additionalWidgetContainerUi.setWidget(additionalWidget); + } + + public interface SelectionCallback { + void onSelectAction(T action); + } + + public interface ListNavigationAction { + String getDisplayName(); + boolean isShowAdditionalWidget(); + } + + private class ActionWidget extends Label { + private final T action; + private final Display displayStyle; + + private ActionWidget(T action) { + super(action.getDisplayName()); + this.action = action; + this.displayStyle = action.isShowAdditionalWidget() ? Display.BLOCK : Display.NONE; + this.addStyleName(CSS.regattanavigation_button()); + this.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + ActionWidget.this.select(); + } + }); + } + + private void select() { + additionalWidgetContainerUi.getElement().getStyle().setDisplay(displayStyle); + for (int i=0; i < actionContainerUi.getWidgetCount(); i++) { + actionContainerUi.getWidget(i).removeStyleName(CSS.regattanavigation_buttonactive()); + } + this.addStyleName(CSS.regattanavigation_buttonactive()); + selectionCallback.onSelectAction(action); + } + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListNavigationPanel.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListNavigationPanel.ui.xml new file mode 100644 index 00000000000..b9c111a77e6 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListNavigationPanel.ui.xml @@ -0,0 +1,15 @@ + + + + + + + + + + : + + + + + \ No newline at end of file From d9375cc025f3180290a9481f55f2a37b9bd4f3fb Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 1 Jul 2015 17:35:34 +0200 Subject: [PATCH 007/219] Races lists - First dummy usage of navigation widget in races list --- .../regatta/tabs/RegattaRacesTabView.java | 40 +++++++++++++++++++ .../regatta/tabs/RegattaRacesTabView.ui.xml | 11 +++-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 69f291c7955..c50f4091ee7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Display; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -15,6 +16,10 @@ import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.home.client.place.event.EventView; +import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel; +import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.ListNavigationAction; +import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.SelectionCallback; +import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.RaceStateLegend; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.AbstractRaceList; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListContainer; import com.sap.sailing.gwt.home.client.place.event.partials.regattaraces.EventRegattaRaces; @@ -35,6 +40,27 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; * Created by pgtaboada on 25.11.14. */ public class RegattaRacesTabView extends Composite implements RegattaTabView { + + private enum Navigation implements ListNavigationAction { + LATEST_UPDATE("Latest update TODO", false), + CHRONOLOGICALLY("Chronologically TODO", false), + COMPETITION_FORMAT("Competition Format TODO", true); + private final String displayName; + private final boolean showAdditionalWidget; + private Navigation(String displayName, boolean showAdditionalWidget) { + this.displayName = displayName; + this.showAdditionalWidget = showAdditionalWidget; + } + @Override + public String getDisplayName() { + return displayName; + } + + @Override + public boolean isShowAdditionalWidget() { + return showAdditionalWidget; + } + } interface MyBinder extends UiBinder { } @@ -43,11 +69,17 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView listNavigationPanelUi; @UiField FlowPanel latestUpdateContainer; @UiField SimplePanel oldContentContainer; public RegattaRacesTabView() { + listNavigationPanelUi = new ListNavigationPanel(new RegattaRacesTabViewNavigationSelectionCallback()); initWidget(ourUiBinder.createAndBindUi(RegattaRacesTabView.this)); + listNavigationPanelUi.setAdditionalWidget(new RaceStateLegend()); + listNavigationPanelUi.addAction(Navigation.LATEST_UPDATE, true); + listNavigationPanelUi.addAction(Navigation.CHRONOLOGICALLY, false); + listNavigationPanelUi.addAction(Navigation.COMPETITION_FORMAT, false); } @Override @@ -131,6 +163,14 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView { + @Override + public void onSelectAction(Navigation action) { + Display displayStyle = action == Navigation.LATEST_UPDATE ? Display.BLOCK : Display.NONE; + latestUpdateContainer.getElement().getStyle().setDisplay(displayStyle); + } + } + private class RaceListFinishedRaces extends AbstractRaceList { public RaceListFinishedRaces(EventView.Presenter presenter) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml index 29f1afcd233..c518846d488 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml @@ -1,9 +1,12 @@ - - -
- + + +
+ +
+ +
\ No newline at end of file From 593f70861258969023e179160787a0618b2bfd19 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 2 Jul 2015 09:51:17 +0200 Subject: [PATCH 008/219] Races lists - Adjusted RegattaRacesTabView structure --- .../regatta/tabs/RegattaRacesTabView.java | 110 ++++++------------ .../regatta/tabs/RegattaRacesTabView.ui.xml | 14 ++- 2 files changed, 49 insertions(+), 75 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index c50f4091ee7..cece7117492 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -1,9 +1,5 @@ package com.sap.sailing.gwt.home.client.place.event.regatta.tabs; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Display; import com.google.gwt.uibinder.client.UiBinder; @@ -13,28 +9,23 @@ import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTMLPanel; -import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.home.client.place.event.EventView; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.ListNavigationAction; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.SelectionCallback; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.RaceStateLegend; +import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.AbstractRaceList; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListContainer; -import com.sap.sailing.gwt.home.client.place.event.partials.regattaraces.EventRegattaRaces; import com.sap.sailing.gwt.home.client.place.event.regatta.EventRegattaView.Presenter; import com.sap.sailing.gwt.home.client.place.event.regatta.RegattaTabView; -import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil; -import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; -import com.sap.sailing.gwt.ui.shared.RaceGroupDTO; -import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; -import com.sap.sailing.gwt.ui.shared.dispatch.event.GetLiveRacesForRegattaAction; +import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRaceListViewAction; import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRacesDTO; -import com.sap.sse.common.Util.Triple; -import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListViewDTO; /** * Created by pgtaboada on 25.11.14. @@ -42,15 +33,17 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; public class RegattaRacesTabView extends Composite implements RegattaTabView { private enum Navigation implements ListNavigationAction { - LATEST_UPDATE("Latest update TODO", false), - CHRONOLOGICALLY("Chronologically TODO", false), + SORT_LIST_FORMAT("Sortable list Format TODO", false), COMPETITION_FORMAT("Competition Format TODO", true); + private final String displayName; private final boolean showAdditionalWidget; + private Navigation(String displayName, boolean showAdditionalWidget) { this.displayName = displayName; this.showAdditionalWidget = showAdditionalWidget; } + @Override public String getDisplayName() { return displayName; @@ -70,21 +63,25 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView listNavigationPanelUi; - @UiField FlowPanel latestUpdateContainer; - @UiField SimplePanel oldContentContainer; + @UiField FlowPanel listFormatContainerUi; + @UiField FlowPanel compFormatContainerUi; + + private RacesListLive liveRacesList; + private RaceListFinishedRaces finishedRacesList; public RegattaRacesTabView() { listNavigationPanelUi = new ListNavigationPanel(new RegattaRacesTabViewNavigationSelectionCallback()); - initWidget(ourUiBinder.createAndBindUi(RegattaRacesTabView.this)); listNavigationPanelUi.setAdditionalWidget(new RaceStateLegend()); - listNavigationPanelUi.addAction(Navigation.LATEST_UPDATE, true); - listNavigationPanelUi.addAction(Navigation.CHRONOLOGICALLY, false); - listNavigationPanelUi.addAction(Navigation.COMPETITION_FORMAT, false); + initWidget(ourUiBinder.createAndBindUi(RegattaRacesTabView.this)); } - + @Override public void setPresenter(Presenter currentPresenter) { this.currentPresenter = currentPresenter; + listFormatContainerUi.add(liveRacesList = new RacesListLive(currentPresenter, false)); + RaceListContainer container = new RaceListContainer("Finished Races TODO", finishedRacesList = new RaceListFinishedRaces(currentPresenter)); + container.setInfoText("Das ist eine Info!!"); + listFormatContainerUi.add(container); } @Override @@ -94,40 +91,23 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView>() { + GetRaceListViewAction action = new GetRaceListViewAction(myPlace.getCtx().getEventDTO().getId()); + currentPresenter.getDispatch().execute(action, new AsyncCallback>() { @Override public void onFailure(Throwable caught) { } - @Override - public void onSuccess(ResultWithTTL result) { - String date = DateAndTimeFormatterUtil.longDateFormatter.render(MillisecondsTimePoint.now().asDate()); - RaceListFinishedRaces raceList = new RaceListFinishedRaces(currentPresenter); - latestUpdateContainer.add(new RaceListContainer(date, raceList));; - raceList.setListData(result.getDto()); - } - }); - - currentPresenter.ensureRegattaStructure(new AsyncCallback>() { - @Override - public void onSuccess(List raceGroups) { - if (raceGroups.size() > 0) { - Map> rs = getRegattaStructure(); - Triple selectedRegatta = rs .get(selectedRegattaId); - EventRegattaRaces regattaRaces = new EventRegattaRaces(currentPresenter); - oldContentContainer.setWidget(regattaRaces); - regattaRaces.setRaces(selectedRegatta.getC(), false, selectedRegatta.getB(), selectedRegatta.getA()); - contentArea.setWidget(RegattaRacesTabView.this); - } else { - - } - } - - @Override - public void onFailure(Throwable caught) { + public void onSuccess(ResultWithTTL result) { + LiveRacesDTO dummy = new LiveRacesDTO(); + dummy.addRace(result.getDto().getLiveRaces().getRaces().get(0)); + dummy.addRace(result.getDto().getLiveRaces().getRaces().get(1)); + dummy.addRace(result.getDto().getLiveRaces().getRaces().get(2)); + liveRacesList.setData(dummy, 0, 0); + finishedRacesList.setListData(result.getDto().getLiveRaces()); + contentArea.setWidget(RegattaRacesTabView.this); } }); } @@ -146,33 +126,19 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView> getRegattaStructure() { - Map> result = new HashMap<>(); - Map raceGroupsMap = new HashMap<>(); - for (RaceGroupDTO raceGroup : currentPresenter.getCtx().getRaceGroups()) { - raceGroupsMap.put(raceGroup.getName(), raceGroup); - } - - for (LeaderboardGroupDTO leaderboardGroup : currentPresenter.getCtx().getLeaderboardGroups()) { - for (StrippedLeaderboardDTO leaderboard : leaderboardGroup.getLeaderboards()) { - String leaderboardName = leaderboard.name; - result.put(leaderboardName, new Triple( - raceGroupsMap.get(leaderboardName), leaderboard, leaderboardGroup)); - } - } - return result; - } - private class RegattaRacesTabViewNavigationSelectionCallback implements SelectionCallback { @Override public void onSelectAction(Navigation action) { - Display displayStyle = action == Navigation.LATEST_UPDATE ? Display.BLOCK : Display.NONE; - latestUpdateContainer.getElement().getStyle().setDisplay(displayStyle); - } + showWidget(listFormatContainerUi, action == Navigation.SORT_LIST_FORMAT); + showWidget(compFormatContainerUi, action == Navigation.COMPETITION_FORMAT); + } + + private void showWidget(Widget widget, boolean show) { + widget.getElement().getStyle().setDisplay(show ? Display.BLOCK : Display.NONE); + } } private class RaceListFinishedRaces extends AbstractRaceList { - public RaceListFinishedRaces(EventView.Presenter presenter) { super(presenter); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml index c518846d488..f1a374e3d3b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml @@ -1,12 +1,20 @@ + + + + .listContainer > div { + margin-bottom: 2em; + } +
- -
- + + + COMPETITION FORMAT +
\ No newline at end of file From d74245df75e19f6a87903e4fd98d5ad4fb248322 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 2 Jul 2015 12:32:59 +0200 Subject: [PATCH 009/219] Races lists - Temporary adjustements to RaceView action and DTO --- .../gwt/ui/shared/dispatch/event/GetRaceListViewAction.java | 5 +++++ .../gwt/ui/shared/dispatch/event/RaceListViewDTO.java | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java index 4241a2576ff..068980759af 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java @@ -8,16 +8,21 @@ import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContext; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; public class GetRaceListViewAction implements Action> { + + private UUID eventId; + public GetRaceListViewAction() { } public GetRaceListViewAction(UUID eventId) { + this.eventId = eventId; } @Override @GwtIncompatible public ResultWithTTL execute(DispatchContext context) { final RaceListViewDTO result = new RaceListViewDTO(); + result.setLiveRaces(new GetLiveRacesForEventAction(eventId).execute(context).getDto()); // RacesActionUtil.forRacesOfEvent(context, eventId, new RaceCallback() { // @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java index 225f99a66fa..ddf72f8cdfe 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java @@ -15,6 +15,10 @@ public class RaceListViewDTO implements DTO { // TODO implement based on race.getStart(); } + public void setLiveRaces(LiveRacesDTO liveRaces) { + this.liveRaces = liveRaces; + } + public LiveRacesDTO getLiveRaces() { return liveRaces; } From 49c7660a5d840a5f64a4349688ca80aaf73bdc57 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 2 Jul 2015 14:40:14 +0200 Subject: [PATCH 010/219] Races lists - Temporary adjustements to RaceView action and DTO --- .../place/event/regatta/tabs/RegattaRacesTabView.java | 8 ++------ .../gwt/ui/shared/dispatch/event/RaceListViewDTO.java | 9 +++++++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index cece7117492..50414ce608b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -101,12 +101,8 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView result) { - LiveRacesDTO dummy = new LiveRacesDTO(); - dummy.addRace(result.getDto().getLiveRaces().getRaces().get(0)); - dummy.addRace(result.getDto().getLiveRaces().getRaces().get(1)); - dummy.addRace(result.getDto().getLiveRaces().getRaces().get(2)); - liveRacesList.setData(dummy, 0, 0); - finishedRacesList.setListData(result.getDto().getLiveRaces()); + liveRacesList.setData(result.getDto().getLiveRaces(), 0, 0); + finishedRacesList.setListData(result.getDto().getAllRaces()); contentArea.setWidget(RegattaRacesTabView.this); } }); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java index ddf72f8cdfe..8fa48de5964 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java @@ -20,6 +20,15 @@ public class RaceListViewDTO implements DTO { } public LiveRacesDTO getLiveRaces() { + LiveRacesDTO liveRaces = new LiveRacesDTO(); + for (int i = 0; i < this.liveRaces.getRaces().size(); i++) { + if (i == 3) break; + liveRaces.addRace(this.liveRaces.getRaces().get(i)); + } + return liveRaces ; + } + + public LiveRacesDTO getAllRaces() { return liveRaces; } From 05cdb4d2cb8bd383d3aef9f52c95706a28eb5f48 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 2 Jul 2015 17:33:16 +0200 Subject: [PATCH 011/219] Races lists - Add races compentition format partial --- .../raceCompetition/RegattaCompetition.gss | 174 ++++++++++++++++++ .../RegattaCompetitionFleet.java | 38 ++++ .../RegattaCompetitionFleet.ui.xml | 14 ++ .../RegattaCompetitionFleetRace.java | 48 +++++ .../RegattaCompetitionFleetRace.ui.xml | 10 + .../RegattaCompetitionResources.java | 33 ++++ .../RegattaCompetitionSeries.java | 47 +++++ .../RegattaCompetitionSeries.ui.xml | 15 ++ 8 files changed, 379 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetition.gss create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleet.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleet.ui.xml create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleetRace.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleetRace.ui.xml create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionResources.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionSeries.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionSeries.ui.xml diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetition.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetition.gss new file mode 100644 index 00000000000..89b924d9f8f --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetition.gss @@ -0,0 +1,174 @@ +/** + * Competitions View Component for regatta races + */ +.phase { + font-size: 1rem; + margin-top: 2em; +} +.phase_head { + padding: 1.333333333333333em 1.333333333333333em 2.666666666666667em 2em; + background-color: #f2f2f2; + border: 1px solid #dedede; + border-radius: 0.333333333333333em 0.333333333333333em 0 0; + font-weight: 600; + color: #666; +} +.phase_head_title { + text-transform: uppercase; + float: left; +} +.phase_head_info { + font-size: 0.866666666666667em; + text-align: right; + float: right; +} +.phase_head_info_item { + display: inline-block; + padding-left: 0.769230769230769em; + margin-left: 0.769230769230769em; + border-left: 1px solid #dedede; +} +.phase_head_info_item:first-child { + border: none; + padding-left: 0; + margin-left: 0; +} +.regattalistitem .phase { + margin: 0; +} +.regattalistitem .phase_head { + background-color: transparent; + border: none; + border-radius: 0; + border-bottom: 1px solid #dedede; +} +.fleet { + font-size: 1rem; + border: 1px solid #dedede; + border-top: none; + position: relative; +} +.fleet:last-child { + border-radius: 0 0 0.333333333333333em 0.333333333333333em; +} +.fleet_corner { + position: absolute; + content: ''; + display: block; + top: 1px; + left: 1px; + border-style: solid; + border-width: 1em 1em 0 0; + border-color: transparent; +} +.fleet_details { + color: #333; + position: absolute; + top: 1.333333333333333em; + left: 2em; + width: 20%; +} +@media (min-width: 61em) { + .fleet_details { + width: 13%; + } +} +.fleet_details_name { + font-weight: 600; +} +.fleet_details_competitors { + font-size: 0.866666666666667em; + color: #666; +} +.fleet_races { + padding: 0 1.333333333333333em 1% 25%; +} +@media (min-width: 61em) { + .fleet_races { + padding-left: 17%; + } +} +.fleet_races_race { + display: inline-block; + width: 19%; + margin: 1% 0 0 1%; + height: 4em; + line-height: 3.333333333333333em; + background-color: #008fcc; + border-radius: 0.2em; + -webkit-transition: background 0.2s; + -moz-transition: background 0.2s; + transition: background 0.2s; + text-decoration: none; + text-align: center; + color: #fff; + padding: 0.333333333333333em 0.333333333333333em; +} +@media (min-width: 45em) { + .fleet_races_race { + width: 15.66%; + line-height: inherit; + } +} +@media (min-width: 61em) { + .fleet_races_race { + width: 9%; + } +} +.fleet_races_race:hover { + background-color: #0081b8; + text-decoration: none; +} +.fleet_races_race_name, +.fleet_races_race_date { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.fleet_races_race_name { + font-size: 1.466666666666667em; + font-weight: 700; +} +.fleet_races_race_name:after { + content: ''; + display: inline-block; + width: 0.466666666666667em; + height: 0.466666666666667em; + background: url("../images/home/skip-forward.png") no-repeat center center; + margin: 0 0 0.133333333333333em 0.133333333333333em; +} +.fleet_races_race_date { + width: 100%; + font-size: 0.666666666666667em; + font-weight: 600; +} +.fleet_races_raceuntracked { + background-color: #999; +} +.fleet_races_raceuntracked:hover { + background-color: #8a8a8a; +} +.fleet_races_racelive { + background-color: #e94a1b; +} +.fleet_races_racelive:hover { + background-color: #d54115; +} +.fleet_races_raceplanned { + color: #999; + background-color: #fff; + border: 1px solid #999; +} +.fleet_races_raceplanned:hover { + background-color: #e6e6e6; +} +.fleet_races_raceplanned .fleet_races_race_name:after { + display: none; +} +.regattalistitem .fleet { + border: none; + border-bottom: 1px solid #dedede; +} +.regattalistitem .fleet:last-of-type { + border-radius: 0; +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleet.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleet.java new file mode 100644 index 00000000000..f33e9247121 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleet.java @@ -0,0 +1,38 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.raceCompetition; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.dom.client.Element; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListFleetDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; + +public class RegattaCompetitionFleet extends Widget { + + private static RegattaCompetitionFleetUiBinder uiBinder = GWT.create(RegattaCompetitionFleetUiBinder.class); + + interface RegattaCompetitionFleetUiBinder extends UiBinder { + } + + @UiField DivElement fleetCornerUi; + @UiField DivElement fleetNameUi; + @UiField DivElement competitorCountUi; + @UiField DivElement racesContainerUi; + + public RegattaCompetitionFleet(RaceListFleetDTO fleet) { + setElement(uiBinder.createAndBindUi(this)); + this.competitorCountUi.setInnerText(fleet.getCompetitorCount() + " Comp. TODO"); + if (fleet.getFleet() != null) { + fleetNameUi.setInnerText(fleet.getFleet().getFleetName()); + fleetCornerUi.getStyle().setProperty("borderTopColor", fleet.getFleet().getFleetColor()); + } + } + + public void addRace(RaceListRaceDTO race, String raceViewerURL) { + RegattaCompetitionFleetRace competitionRace = new RegattaCompetitionFleetRace(race, raceViewerURL); + racesContainerUi.appendChild(competitionRace.getElement()); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleet.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleet.ui.xml new file mode 100644 index 00000000000..0d883af280c --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleet.ui.xml @@ -0,0 +1,14 @@ + + + + +
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleetRace.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleetRace.java new file mode 100644 index 00000000000..8bbe4ce4aad --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleetRace.java @@ -0,0 +1,48 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.raceCompetition; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.AnchorElement; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.UIObject; +import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil; +import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; +import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceTrackingState; +import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; + +public class RegattaCompetitionFleetRace extends UIObject { + + private static RegattaCompetitionFleetRaceUiBinder uiBinder = GWT.create(RegattaCompetitionFleetRaceUiBinder.class); + + interface RegattaCompetitionFleetRaceUiBinder extends UiBinder { + } + + @UiField RegattaCompetitionResources local_res; + @UiField DivElement raceNameUi; + @UiField DivElement raceDateUi; + private final AnchorElement anchor; + + public RegattaCompetitionFleetRace(RaceListRaceDTO race, String raceViewerUrl) { + anchor = uiBinder.createAndBindUi(this); + anchor.setHref(raceViewerUrl); + local_res.css().ensureInjected(); + setupRaceState(race.getTrackingState(), race.getViewState()); + this.raceNameUi.setInnerText(race.getRaceName()); + if (race.getStart() != null) { + this.raceDateUi.setInnerText(DateAndTimeFormatterUtil.defaultDateFormatter.render(race.getStart())); + } + setElement(anchor); + } + + private void setupRaceState(RaceTrackingState trackingState, RaceViewState viewState) { + if (viewState == RaceViewState.RUNNING) { + anchor.addClassName(local_res.css().fleet_races_racelive()); + } else if (viewState == RaceViewState.PLANNED || viewState == RaceViewState.SCHEDULED) { + anchor.addClassName(local_res.css().fleet_races_raceplanned()); + } + if (trackingState != RaceTrackingState.TRACKED_VALID_DATA) { + anchor.addClassName(local_res.css().fleet_races_raceuntracked()); + } + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleetRace.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleetRace.ui.xml new file mode 100644 index 00000000000..081f37ebbec --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleetRace.ui.xml @@ -0,0 +1,10 @@ + + + + + +
+
+
+
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionResources.java new file mode 100644 index 00000000000..467fb3802e2 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionResources.java @@ -0,0 +1,33 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.raceCompetition; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; + +public interface RegattaCompetitionResources extends ClientBundle { + public static final RegattaCompetitionResources INSTANCE = GWT.create(RegattaCompetitionResources.class); + + @Source("RegattaCompetition.gss") + LocalCss css(); + + public interface LocalCss extends CssResource { + String phase(); + String phase_head(); + String phase_head_title(); + String phase_head_info(); + String phase_head_info_item(); + String regattalistitem(); + String fleet(); + String fleet_corner(); + String fleet_details(); + String fleet_details_name(); + String fleet_details_competitors(); + String fleet_races(); + String fleet_races_race(); + String fleet_races_race_name(); + String fleet_races_race_date(); + String fleet_races_raceuntracked(); + String fleet_races_racelive(); + String fleet_races_raceplanned(); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionSeries.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionSeries.java new file mode 100644 index 00000000000..ae417f68822 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionSeries.java @@ -0,0 +1,47 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.raceCompetition; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTMLPanel; +import com.sap.sailing.gwt.home.client.place.event.regatta.EventRegattaView.Presenter; +import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListFleetDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListSeriesDTO; +import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceTrackingState; + +public class RegattaCompetitionSeries extends Composite { + + private static RegattaCompetitionSeriesUiBinder uiBinder = GWT.create(RegattaCompetitionSeriesUiBinder.class); + + interface RegattaCompetitionSeriesUiBinder extends UiBinder { + } + + @UiField DivElement seriesNameUi; + @UiField DivElement competitorCountUi; + @UiField DivElement raceCountUi; + private final HTMLPanel containerUi; + + public RegattaCompetitionSeries(Presenter presenter, RaceListSeriesDTO series) { + initWidget(containerUi = uiBinder.createAndBindUi(this)); + this.seriesNameUi.setInnerText(series.getSeriesName()); + this.competitorCountUi.setInnerText(series.getCompetitorCount() + " Comp. TODO"); + this.raceCountUi.setInnerText(series.getRaceCount() + " Races TODO"); + for (RaceListFleetDTO fleet : series.getFleets()) { + addFleet(presenter, fleet); + } + } + + public void addFleet(Presenter presenter, RaceListFleetDTO fleet) { + RegattaCompetitionFleet competitionFleet = new RegattaCompetitionFleet(fleet); + for (RaceListRaceDTO race : fleet.getRaces()) { + boolean tracked = race.getTrackingState() == RaceTrackingState.TRACKED_VALID_DATA; + String raceViewerUrl = tracked ? presenter.getRaceViewerURL(race.getRegattaName(), race.getTrackedRaceName()) : null; + competitionFleet.addRace(race, raceViewerUrl); + } + containerUi.add(competitionFleet); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionSeries.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionSeries.ui.xml new file mode 100644 index 00000000000..dcc326803c6 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionSeries.ui.xml @@ -0,0 +1,15 @@ + + + + + +
+
+
+
+
+
+
+
+
\ No newline at end of file From d0c2ba7f401d613e4c39ace5a531b8dad2f15ca6 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 2 Jul 2015 17:33:41 +0200 Subject: [PATCH 012/219] Races lists - Temporary adjustements to RaceView DTOs --- ...eListDayDTO.java => RaceListFleetDTO.java} | 22 ++++--- .../dispatch/event/RaceListSeriesDTO.java | 57 +++++++++++++++++++ .../dispatch/event/RaceListViewDTO.java | 50 +++++++++++----- 3 files changed, 107 insertions(+), 22 deletions(-) rename java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/{RaceListDayDTO.java => RaceListFleetDTO.java} (50%) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListSeriesDTO.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDayDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListFleetDTO.java similarity index 50% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDayDTO.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListFleetDTO.java index 6a8125f72e4..89c205b4742 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDayDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListFleetDTO.java @@ -1,23 +1,23 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; import java.util.ArrayList; -import java.util.Date; import java.util.List; import com.google.gwt.user.client.rpc.IsSerializable; +import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; -public class RaceListDayDTO implements IsSerializable { - - private Date day; +public class RaceListFleetDTO implements IsSerializable { + private FleetMetadataDTO fleet; + private int competitorCount = (int) (Math.random() * 10); // TODO private ArrayList races = new ArrayList<>(); @SuppressWarnings("unused") - private RaceListDayDTO() { + private RaceListFleetDTO() { } - public RaceListDayDTO(Date day) { - this.day = day; + public RaceListFleetDTO(FleetMetadataDTO fleet) { + this.fleet = fleet; } public void addRace(RaceListRaceDTO race) { @@ -25,8 +25,12 @@ public class RaceListDayDTO implements IsSerializable { races.add(race); } - public Date getDay() { - return day; + public FleetMetadataDTO getFleet() { + return fleet; + } + + public int getCompetitorCount() { + return competitorCount; } public List getRaces() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListSeriesDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListSeriesDTO.java new file mode 100644 index 00000000000..12d1c0e1f8a --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListSeriesDTO.java @@ -0,0 +1,57 @@ +package com.sap.sailing.gwt.ui.shared.dispatch.event; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import com.google.gwt.user.client.rpc.IsSerializable; +import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; + +public class RaceListSeriesDTO implements IsSerializable { + + private String seriesName; + private int raceCount = 0; + private int competitorCount = (int) (Math.random() * 10); // TODO + private Map fleets = new HashMap<>(); + + @SuppressWarnings("unused") + private RaceListSeriesDTO() { + } + + public RaceListSeriesDTO(String seriesName) { + this.seriesName = seriesName; + } + + public void addRace(RaceListRaceDTO race) { + RaceListFleetDTO fleet = ensureFleet(race.getFleet()); + fleet.addRace(race); + raceCount++; + } + + private RaceListFleetDTO ensureFleet(FleetMetadataDTO fleetData) { + String fleetName = fleetData == null ? null : fleetData.getFleetName(); + RaceListFleetDTO fleet = fleets.get(fleetName); + if (fleet == null) { + fleets.put(fleetName, fleet = new RaceListFleetDTO(fleetData)); + } + return fleet; + } + + public String getSeriesName() { + return seriesName; + } + + public int getRaceCount() { + return raceCount; + } + + public int getCompetitorCount() { + return competitorCount; + } + + public Collection getFleets() { + return fleets.values(); + } + + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java index 8fa48de5964..c65292ca02d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java @@ -1,38 +1,62 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.List; import com.sap.sailing.gwt.ui.shared.dispatch.DTO; +import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; public class RaceListViewDTO implements DTO { private LiveRacesDTO liveRaces; - private ArrayList raceDays = new ArrayList<>(); + private ArrayList allRaces = new ArrayList<>(); public void addRace(RaceListRaceDTO race) { // TODO implement based on race.getStart(); } public void setLiveRaces(LiveRacesDTO liveRaces) { - this.liveRaces = liveRaces; + this.liveRaces = new LiveRacesDTO(); + for (int i = 0; i < liveRaces.getRaces().size(); i++) { + LiveRaceDTO liveRace = liveRaces.getRaces().get(i); + if (i < 3) this.liveRaces.addRace(liveRace); + allRaces.add(convert(liveRace)); + } } public LiveRacesDTO getLiveRaces() { - LiveRacesDTO liveRaces = new LiveRacesDTO(); - for (int i = 0; i < this.liveRaces.getRaces().size(); i++) { - if (i == 3) break; - liveRaces.addRace(this.liveRaces.getRaces().get(i)); - } - return liveRaces ; - } - - public LiveRacesDTO getAllRaces() { return liveRaces; } - public List getRaceDays() { - return raceDays; + public List getAllRaces() { + return allRaces; + } + + public Collection getRacesForCompetitionFormat() { + RaceListSeriesDTO withFleets = new RaceListSeriesDTO("Fleets"); + RaceListSeriesDTO noFleets = new RaceListSeriesDTO(""); + for (RaceListRaceDTO race : allRaces) { + RaceListSeriesDTO series = race.getFleet() == null ? noFleets : withFleets; + series.addRace(race); + } + return Arrays.asList(withFleets, noFleets); + } + + private RaceListRaceDTO convert(RaceMetadataDTO liveRace) { + RaceListRaceDTO raceListRace = new RaceListRaceDTO(liveRace.getRegattaName(), liveRace.getRaceName()); + raceListRace.setBoatClass(liveRace.getBoatClass()); + raceListRace.setCourse(liveRace.getCourse()); + raceListRace.setCourseArea(liveRace.getCourseArea()); + raceListRace.setFleet(liveRace.getFleet()); + raceListRace.setRegattaDisplayName(liveRace.getRegattaDisplayName()); + raceListRace.setStart(liveRace.getStart()); + raceListRace.setTrackedRaceName(liveRace.getTrackedRaceName()); + raceListRace.setTrackingState(liveRace.getTrackingState()); + raceListRace.setViewState(liveRace.getViewState()); + raceListRace.setWind(liveRace.getWind()); + return raceListRace; } } From b97f20a8d004c1717aef0f4b4b8c3f6a226cb085 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 2 Jul 2015 17:34:17 +0200 Subject: [PATCH 013/219] Races lists - Integrated competitor format partial to race list view --- .../regatta/tabs/RegattaRacesTabView.java | 18 ++++++++++++------ .../regatta/tabs/RegattaRacesTabView.ui.xml | 4 +--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 50414ce608b..41eff6a0eb3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -1,5 +1,7 @@ package com.sap.sailing.gwt.home.client.place.event.regatta.tabs; +import java.util.List; + import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Display; import com.google.gwt.uibinder.client.UiBinder; @@ -16,6 +18,7 @@ import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListN import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.ListNavigationAction; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.SelectionCallback; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.RaceStateLegend; +import com.sap.sailing.gwt.home.client.place.event.partials.raceCompetition.RegattaCompetitionSeries; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.AbstractRaceList; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListContainer; @@ -23,8 +26,8 @@ import com.sap.sailing.gwt.home.client.place.event.regatta.EventRegattaView.Pres import com.sap.sailing.gwt.home.client.place.event.regatta.RegattaTabView; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRaceListViewAction; -import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; -import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRacesDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListSeriesDTO; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListViewDTO; /** @@ -79,7 +82,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView container = new RaceListContainer("Finished Races TODO", finishedRacesList = new RaceListFinishedRaces(currentPresenter)); + RaceListContainer container = new RaceListContainer<>("Finished Races TODO", finishedRacesList = new RaceListFinishedRaces(currentPresenter)); container.setInfoText("Das ist eine Info!!"); listFormatContainerUi.add(container); } @@ -103,6 +106,9 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView result) { liveRacesList.setData(result.getDto().getLiveRaces(), 0, 0); finishedRacesList.setListData(result.getDto().getAllRaces()); + for (RaceListSeriesDTO series : result.getDto().getRacesForCompetitionFormat()) { + compFormatContainerUi.add(new RegattaCompetitionSeries(currentPresenter, series)); + } contentArea.setWidget(RegattaRacesTabView.this); } }); @@ -134,19 +140,19 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView { + private class RaceListFinishedRaces extends AbstractRaceList { public RaceListFinishedRaces(EventView.Presenter presenter) { super(presenter); } - public void setListData(LiveRacesDTO data) { + public void setListData(List data) { // boolean hasFleets = data.hasFleets(); // this.fleetCornerColumn.setShowDetails(hasFleets); // this.fleetNameColumn.setShowDetails(hasFleets); // boolean hasWind = data.hasWind(); // this.windSpeedColumn.setShowDetails(hasWind); // this.windDirectionColumn.setShowDetails(hasWind); - setTableData(data.getRaces()); + setTableData(data); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml index f1a374e3d3b..27698fb4b68 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml @@ -12,9 +12,7 @@
- - COMPETITION FORMAT - +
\ No newline at end of file From 70e1ccec0e25451baa07620a9abf7bf5329b147b Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Fri, 3 Jul 2015 10:05:04 +0200 Subject: [PATCH 014/219] Races lists - Fixed styles and disabled competition format --- .../partials/raceCompetition/RegattaCompetition.gss | 2 +- .../raceCompetition/RegattaCompetitionFleet.ui.xml | 2 +- .../event/regatta/tabs/RegattaRacesTabView.java | 12 +++++------- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetition.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetition.gss index 89b924d9f8f..b1a13044c53 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetition.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetition.gss @@ -3,7 +3,7 @@ */ .phase { font-size: 1rem; - margin-top: 2em; + margin-bottom: 2em; } .phase_head { padding: 1.333333333333333em 1.333333333333333em 2.666666666666667em 2em; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleet.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleet.ui.xml index 0d883af280c..2b07b75d6be 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleet.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceCompetition/RegattaCompetitionFleet.ui.xml @@ -3,7 +3,7 @@ xmlns:s="urn:import:com.sap.sailing.gwt.home.client.shared" xmlns:p='urn:import:com.sap.sailing.gwt.home.client.place.event.partials'> -
+
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 41eff6a0eb3..1f5f9e47b6d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -18,7 +18,6 @@ import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListN import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.ListNavigationAction; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.SelectionCallback; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.RaceStateLegend; -import com.sap.sailing.gwt.home.client.place.event.partials.raceCompetition.RegattaCompetitionSeries; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.AbstractRaceList; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListContainer; @@ -27,7 +26,6 @@ import com.sap.sailing.gwt.home.client.place.event.regatta.RegattaTabView; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRaceListViewAction; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; -import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListSeriesDTO; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListViewDTO; /** @@ -83,7 +81,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView container = new RaceListContainer<>("Finished Races TODO", finishedRacesList = new RaceListFinishedRaces(currentPresenter)); - container.setInfoText("Das ist eine Info!!"); + container.setInfoText("Info text"); listFormatContainerUi.add(container); } @@ -95,7 +93,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView>() { @@ -106,9 +104,9 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView result) { liveRacesList.setData(result.getDto().getLiveRaces(), 0, 0); finishedRacesList.setListData(result.getDto().getAllRaces()); - for (RaceListSeriesDTO series : result.getDto().getRacesForCompetitionFormat()) { - compFormatContainerUi.add(new RegattaCompetitionSeries(currentPresenter, series)); - } +// for (RaceListSeriesDTO series : result.getDto().getRacesForCompetitionFormat()) { +// compFormatContainerUi.add(new RegattaCompetitionSeries(currentPresenter, series)); +// } contentArea.setWidget(RegattaRacesTabView.this); } }); From 698d334c3ba1cb8f574b78ba943b3fc01522d6ef Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Fri, 3 Jul 2015 10:51:03 +0200 Subject: [PATCH 015/219] Races lists - Added icons for wind fixes, video and audio --- .../images/home/icon-audio.png | Bin 0 -> 710 bytes .../images/home/icon-video.png | Bin 0 -> 399 bytes .../images/home/icon-wind.png | Bin 0 -> 865 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/images/home/icon-audio.png create mode 100644 java/com.sap.sailing.gwt.ui/images/home/icon-video.png create mode 100644 java/com.sap.sailing.gwt.ui/images/home/icon-wind.png diff --git a/java/com.sap.sailing.gwt.ui/images/home/icon-audio.png b/java/com.sap.sailing.gwt.ui/images/home/icon-audio.png new file mode 100644 index 0000000000000000000000000000000000000000..5928bcddb43bc9630c9fc5f996a855f064f6b93b GIT binary patch literal 710 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9GG!XV7ZFl&wkP*AeO zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MJ2`7^YxP7srr_TW@CF4QzH0XlVQ> zYsDek!q+4FqUZfZE+6(|Tvxc9=6yXFqOkJ74aS!ZAq~6FSsh+e&MCuDzR9}Sxkx6) z?%TKbP4Ux~nyYc{nb^s|y#ay#TR%9wy53kSp~3f|0bfGX-0QKd7nIT)XCFG0$ePPO zU-)^$>;sc@URpGMyEyeMyV)V3J1wQ_cQx?oT+unjcPs8<|Apz-n4}L?JuK}!kg;9* z=u44z($VZWT+xks3l^GP|0CiQ&3Z>{TI1rob(`K52UqjuG__`n&kA1gviVpyKl>da zG1G4z-ycMs6KxQdu+FyXzn>B>rFOvcy>*pcG{el$cXPv?F3y@}G=IN>^tZm=&HJK) zj@;epRvq(u^TFI5&XLy`=9%yYhA|x8yg9r_?J)q=C9lg($;@piEl_lS}VtAzn>qSk{>7b zhF+N8ra3WQI2$H}_KydC zt98E!-e|u5D1Vmy*GtPTh~yWuzA3Le`*?F`;>y-#&aU^@b}oKp%V*xI_WRDJ)EdW+ zw|XBPbhvCECvi|XSpBPaf$;kCVS6exw+KarCBI3%{`t4_9$#SFvK38B@v}xY6wh&44$rjF6*2UngClwI~xE1 literal 0 HcmV?d00001 diff --git a/java/com.sap.sailing.gwt.ui/images/home/icon-video.png b/java/com.sap.sailing.gwt.ui/images/home/icon-video.png new file mode 100644 index 0000000000000000000000000000000000000000..ef6c886a6d075f274ca54f21b59d5d9b9b26a8bd GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9GG!XV7ZFl&wkP*AeO zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MJ2`7)BXS7srr_TW@Y1xeU)~+$y~10s+}mcI zE7?3#SS1V+4m2<_v++O~eGA%R{j&OAMzpV;R9~p$zdLPPPX58hQ1zuB4CHoCOzjBX z^}%G`qu!fSwWkJs|JhQl-~4Jr;mKd~F4a1Dx395lWaBRjh?WRf)QPfN82sJkx#HSO zcCXL0vqP-;vpGupd&YrR?cck$b{apGIy*(|*Pqwe=>BPa=8e+N& zv)Q-nWnCAYSN1da!VEJ^WS|ue;V?lIi8K@$Nkr;2N-OA W*el(99S96n1_n=8KbLh*2~7anaiJIh literal 0 HcmV?d00001 diff --git a/java/com.sap.sailing.gwt.ui/images/home/icon-wind.png b/java/com.sap.sailing.gwt.ui/images/home/icon-wind.png new file mode 100644 index 0000000000000000000000000000000000000000..5cfd89b84da826773bccbcbbb4658b567f15d778 GIT binary patch literal 865 zcmV-n1D^beP)GR+b|G@MNcj{Q5{gJKuiUqD+oQ4yXgwzRA8rqu!AV~9OMd2U2+XsL6{0m zSD@^Ae$H$VKEa12dv|7s5(t3!fZfFsBRPk|Vey*eZ1KuOffZPR75Jp&&6u4%{&1Fb ziAgU>??|`q$HVTJfSs}SVS@D;kaTU{LOH{yF9Mig1G?}^x+uCLjYu~})l9$_C+Wik zdrg;n0lO!dEx=6S)&ENRK<##<;mP>0;jiWDtx?93w{-D=mHK&vb;NU+{8wUo zmIwU4ywx#C{UNTI79XYouz9li1t>}|&`gv)FaQCE!msb^`lNb} zn8*m~i7Gr9JGjSuD-0jK1mI6z34H#}un0cBn226N?Q_yw(iK)+n*29R!X5Tz@t7uW6Q$2-V6jo=W5CJ8F~>uc|BWagO%7ZGwSqr) zm3_m#rb#=;9>2FW`LS|o-j2*fBCzbMsoj!;7%A6zhd3fl-k%&;_){Nqw#~A98SLnC zZQKt>2d?m&mBmWg2Dj93uVQi^=8UK&N+umAqAd&CbhQkdt;z=2MJo88nHiaw*B2P= z`nbY!4&bMpnFe>;@KE0((syZ>wpdX<1#pD?`3C7@U;oW4BXrhbg2o5NESJ%7SF^&Q zWxxu1?$1F-%Ne#UA)zndbUs!1;ks{Pfk4>QZrf7-Zt63w2&?58zTB4X)xAE(O}inl zK0(I9l-(ZfhXeB-h&{P{1q|qWQjrXpe#ptcG{>sJSM3Zp6{%?sExP9MgHA2^AvE|e z7)*qy>9wSw>xRiF471NgAWFwL2OE4$%kQ#?)*B@BrYWW(SeZb@+$Wi1olA#Co|`O= zR7L@YsU0ok6t9OTBMPj*3ar2itiTGazzVFu3ar2itiTGaz)vC%*|HZ8j31g@E&lz9 r(#eXWfAUaZ1y*1MR^a22zXA*ZCZQm(TvJvt00000NkvXXu0mjfnRAbT literal 0 HcmV?d00001 From 7cc9755764d5b7789698c2cf7edbf37835275055 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Fri, 3 Jul 2015 11:09:36 +0200 Subject: [PATCH 016/219] Races lists - i18n: Added String message --- .../java/com/sap/sailing/gwt/ui/client/StringMessages.java | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages.properties | 3 ++- .../com/sap/sailing/gwt/ui/client/StringMessages_de.properties | 3 ++- .../com/sap/sailing/gwt/ui/client/StringMessages_ru.properties | 3 ++- .../com/sap/sailing/gwt/ui/client/StringMessages_zh.properties | 1 + 5 files changed, 8 insertions(+), 3 deletions(-) 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 5219b6bc838..ab1adf5f2d7 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 @@ -1317,4 +1317,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String now(); String minutesAgo(String minutes); String hoursAgo(String hours); + String winner(); } 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 f4ecf8168c3..53414b2ebde 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 @@ -1284,4 +1284,5 @@ sailorInfo=Sailor Info sailorInfoLongText=Official Results, Protests,\nNotice Board, Sailor weather: now=Now minutesAgo={0} min ago -hoursAgo={0} h ago \ No newline at end of file +hoursAgo={0} h ago +winner=Winner \ 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 047ab9163f4..56707b31e32 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 @@ -1274,4 +1274,5 @@ sailorInfo=Segler Infos sailorInfoLongText=Offizielle Ergebnisse, Proteste,\nNotice Board, Segler-Wetter: now=Jetzt minutesAgo=vor {0} min -hoursAgo=vor {0} h \ No newline at end of file +hoursAgo=vor {0} h +winner=Sieger \ 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_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index b8b91defd14..6abbda83082 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1222,4 +1222,5 @@ sailorInfo=Моряки информация sailorInfoLongText=Official Results, Protests,\nNotice Board, Sailor weather: now=в настоящее время minutesAgo={0} минут назад -hoursAgo={0} h часов назад \ No newline at end of file +hoursAgo={0} h часов назад +winner=победитель \ 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_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index 45d412ca874..9711fd3390e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1272,3 +1272,4 @@ raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSeconds=Calc.Time raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSecondsTooltip=Calculated time at estimated arrival at the competitor that is currently farthest ahead in the race;\nestimation based on average VMG in current leg and equal (calculated) performance to fastest boat in all subsequent legs sailorInfo=水手信息 sailorInfoLongText=Find here Notice Board,\nProtests, Sailor weather: +winner=Winner \ No newline at end of file From f01f49c690d7b96cd7411bbe6280e65524034750 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Fri, 3 Jul 2015 12:47:34 +0200 Subject: [PATCH 017/219] Races lists - Added winner column to races list --- .../racelist/RaceListColumnFactory.java | 55 +++++++++++++++++++ .../regatta/tabs/RegattaRacesTabView.java | 5 ++ .../dispatch/event/RaceListViewDTO.java | 3 + 3 files changed, 63 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index 5ea62140f35..a7f365aa40d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -17,7 +17,10 @@ import com.google.gwt.safecss.shared.SafeStylesUtils; 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.SafeUri; +import com.google.gwt.safehtml.shared.UriUtils; import com.sap.sailing.domain.common.InvertibleComparator; +import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.impl.NaturalComparator; import com.sap.sailing.gwt.common.client.SharedResources; import com.sap.sailing.gwt.common.client.SharedResources.MainCss; @@ -28,8 +31,10 @@ import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesLi import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources.LocalCss; import com.sap.sailing.gwt.regattaoverview.client.FlagsMeaningExplanator; import com.sap.sailing.gwt.regattaoverview.client.SailingFlagsBuilder; +import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; import com.sap.sailing.gwt.ui.shared.race.FlagStateDTO; import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; @@ -65,6 +70,12 @@ public class RaceListColumnFactory { @Template("{1}") SafeHtml raceViewerLinkButton(String styleNames, String text, String link); + + @Template("{3}") + SafeHtml winner(String styleNamesFlag, String styleNamesText, String flagImageURL, String name); + + @Template("{3}") + SafeHtml winner(String styleNamesFlag, String styleNamesText, SafeUri flagImageURL, String name); } public static SortableRaceListColumn getFleetCornerColumn() { @@ -382,6 +393,50 @@ public class RaceListColumnFactory { }; } + public static SortableRaceListColumn getWinnerColumn() { + Cell cell = new AbstractCell() { + @Override + public void render(Context context, CompetitorDTO value, SafeHtmlBuilder sb) { + if (value != null) { + final SafeUri flagImageUri; + if (value.getFlagImageURL() == null || value.getFlagImageURL().isEmpty()) { + String twoLetterIsoCountryCode = value.getTwoLetterIsoCountryCode(); + if (twoLetterIsoCountryCode==null || twoLetterIsoCountryCode.isEmpty()) { + flagImageUri = FlagImageResolver.getEmptyFlagImageResource().getSafeUri(); + } else { + flagImageUri = FlagImageResolver.getFlagImageResource(twoLetterIsoCountryCode).getSafeUri(); + } + } else { + flagImageUri = UriUtils.fromTrustedString(value.getFlagImageURL()); + } + sb.append(TEMPLATE.winner(CSS.race_item_flag(), CSS.race_item_winner(), flagImageUri, value.getName())); + } + } + }; + InvertibleComparator comparator = new InvertibleComparatorWrapper(new NaturalComparator(false)) { + @Override + protected String getComparisonValue(T object) { + return object.getWinner() != null ? object.getWinner().getName() : null; + } + }; + return new SortableRaceListColumn(I18N.winner(), cell, comparator) { + @Override + public String getHeaderStyle() { + return CSS.raceslist_head_item(); + } + + @Override + public String getColumnStyle() { + return getStyleNamesString(CSS.race_item(), CSS.race_itemwinner()); + } + + @Override + public CompetitorDTO getValue(T object) { + return object.getWinner(); + } + }; + } + public static SortableRaceListColumn getRaceViewerButtonColumn(final EventView.Presenter presenter) { Cell cell = new AbstractCell() { private final String watchNowStyle = getButtonStyleNames(MAIN_CSS.buttonred()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 1f5f9e47b6d..157b79c8378 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -20,7 +20,9 @@ import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListN import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.RaceStateLegend; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.AbstractRaceList; +import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListColumnFactory; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListContainer; +import com.sap.sailing.gwt.home.client.place.event.partials.racelist.SortableRaceListColumn; import com.sap.sailing.gwt.home.client.place.event.regatta.EventRegattaView.Presenter; import com.sap.sailing.gwt.home.client.place.event.regatta.RegattaTabView; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; @@ -139,6 +141,8 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView { + private final SortableRaceListColumn winnerColumn = RaceListColumnFactory.getWinnerColumn(); + public RaceListFinishedRaces(EventView.Presenter presenter) { super(presenter); } @@ -161,6 +165,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView Date: Fri, 3 Jul 2015 15:44:31 +0200 Subject: [PATCH 018/219] Races lists - Added columns for wind fixes, video and audio to races list --- .../racelist/RaceListColumnFactory.java | 65 +++++++++++++++++-- .../racelist/SortableRaceListColumn.java | 13 ++-- .../regatta/tabs/RegattaRacesTabView.java | 6 ++ 3 files changed, 76 insertions(+), 8 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index a7f365aa40d..8079671a70e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -19,6 +19,7 @@ import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.safehtml.shared.UriUtils; +import com.google.gwt.user.cellview.client.SafeHtmlHeader; import com.sap.sailing.domain.common.InvertibleComparator; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.impl.NaturalComparator; @@ -71,11 +72,11 @@ public class RaceListColumnFactory { @Template("{1}") SafeHtml raceViewerLinkButton(String styleNames, String text, String link); - @Template("{3}") - SafeHtml winner(String styleNamesFlag, String styleNamesText, String flagImageURL, String name); - @Template("{3}") SafeHtml winner(String styleNamesFlag, String styleNamesText, SafeUri flagImageURL, String name); + + @Template("") + SafeHtml imageHeader(String styleNames, SafeUri imageURL); } public static SortableRaceListColumn getFleetCornerColumn() { @@ -182,7 +183,7 @@ public class RaceListColumnFactory { public static SortableRaceListColumn getStartTimeColumn() { Cell cell = new DateCell(DateTimeFormat.getFormat(PredefinedFormat.HOUR24_MINUTE)); - InvertibleComparator comparator = new InvertibleComparatorWrapper( new NullSafeComparableComparator()) { + InvertibleComparator comparator = new InvertibleComparatorWrapper(new NullSafeComparableComparator()) { @Override protected Date getComparisonValue(T object) { return object.getStart(); @@ -350,6 +351,33 @@ public class RaceListColumnFactory { }; } + public static SortableRaceListColumn getWindFixesCountColumn() { + return new DataCountColumn(DataCountColumn.ICON_WIND) { + @Override + public Long getValue(T object) { + return null; // TODO + } + }; + } + + public static SortableRaceListColumn getVideoCountColumn() { + return new DataCountColumn(DataCountColumn.ICON_VIDEO) { + @Override + public Long getValue(T object) { + return null; // TODO + } + }; + } + + public static SortableRaceListColumn getAudioCountColumn() { + return new DataCountColumn(DataCountColumn.ICON_AUDIO) { + @Override + public Long getValue(T object) { + return null; // TODO + } + }; + } + public static SortableRaceListColumn getRaceViewStateColumn() { Cell cell = new AbstractCell() { @Override @@ -479,4 +507,33 @@ public class RaceListColumnFactory { } }; } + + private static abstract class DataCountColumn extends SortableRaceListColumn { + private static final SafeUri ICON_WIND = UriUtils.fromTrustedString("images/home/icon-wind.png"); + private static final SafeUri ICON_VIDEO = UriUtils.fromTrustedString("images/home/icon-video.png"); + private static final SafeUri ICON_AUDIO = UriUtils.fromTrustedString("images/home/icon-audio.png"); + + private DataCountColumn(final SafeUri imageUri) { + super(new SafeHtmlHeader(TEMPLATE.imageHeader(CSS.raceslist_head_itemflag(), imageUri)), new AbstractCell() { + @Override + public void render(Context context, Long value, SafeHtmlBuilder sb) { + if (value != null && value > 0) { + sb.append(value); + } else { + sb.appendHtmlConstant("—"); + } + } + }, null); + } + + @Override + public String getHeaderStyle() { + return getStyleNamesString(CSS.raceslist_head_item(), CSS.raceslist_head_itemcenter(), MEDIA_CSS.showonlarge()); + } + + @Override + public String getColumnStyle() { + return getStyleNamesString(CSS.race_item(), CSS.race_itemcenter(), MEDIA_CSS.showonlarge()); + } + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java index 50e1632e76f..81785457a07 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java @@ -9,14 +9,19 @@ import com.sap.sailing.gwt.ui.client.shared.controls.SortableColumn; import com.sap.sse.common.Util; public abstract class SortableRaceListColumn extends SortableColumn { - private final String headerText; + + private final Header header; private final InvertibleComparator comparator; private boolean showDetails = true; protected SortableRaceListColumn(String headerText, Cell cell, InvertibleComparator comparator) { + this(new TextHeader(headerText), cell, comparator); + } + + protected SortableRaceListColumn(Header header, Cell cell, InvertibleComparator comparator) { super(cell, SortingOrder.ASCENDING); - this.headerText = headerText; + this.header = header; this.comparator = comparator; } @@ -27,7 +32,7 @@ public abstract class SortableRaceListColumn extends SortableColumn @Override public final Header getHeader() { - return new TextHeader(headerText); + return header; } public void setShowDetails(boolean showDetails) { @@ -37,7 +42,7 @@ public abstract class SortableRaceListColumn extends SortableColumn public boolean isShowDetails() { return showDetails; } - + protected final String getStyleNamesString(String... styleNames) { return Util.join(" ", styleNames); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 157b79c8378..fe37a91e5c1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -142,6 +142,9 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView { private final SortableRaceListColumn winnerColumn = RaceListColumnFactory.getWinnerColumn(); + private final SortableRaceListColumn windfixesCountColumn = RaceListColumnFactory.getWindFixesCountColumn(); + private final SortableRaceListColumn videoCountColumn = RaceListColumnFactory.getVideoCountColumn(); + private final SortableRaceListColumn audioCountColumn = RaceListColumnFactory.getAudioCountColumn(); public RaceListFinishedRaces(EventView.Presenter presenter) { super(presenter); @@ -165,6 +168,9 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView Date: Fri, 3 Jul 2015 17:34:24 +0200 Subject: [PATCH 019/219] Races lists - Adjusted columns and added fields for wind fixes, video and audio to races list DTO --- .../racelist/RaceListColumnFactory.java | 28 +++++++++---------- .../dispatch/event/RaceListRaceDTO.java | 23 +++++++++++++-- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index 8079671a70e..7d3338980c1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -351,29 +351,29 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getWindFixesCountColumn() { + public static SortableRaceListColumn getWindFixesCountColumn() { return new DataCountColumn(DataCountColumn.ICON_WIND) { @Override - public Long getValue(T object) { - return null; // TODO + public Number getValue(T object) { + return object.getWindFixesCount(); } }; } - public static SortableRaceListColumn getVideoCountColumn() { + public static SortableRaceListColumn getVideoCountColumn() { return new DataCountColumn(DataCountColumn.ICON_VIDEO) { @Override - public Long getValue(T object) { - return null; // TODO + public Number getValue(T object) { + return object.getVideoCount(); } }; } - public static SortableRaceListColumn getAudioCountColumn() { + public static SortableRaceListColumn getAudioCountColumn() { return new DataCountColumn(DataCountColumn.ICON_AUDIO) { @Override - public Long getValue(T object) { - return null; // TODO + public Number getValue(T object) { + return object.getAudioCount(); } }; } @@ -508,17 +508,17 @@ public class RaceListColumnFactory { }; } - private static abstract class DataCountColumn extends SortableRaceListColumn { + private static abstract class DataCountColumn extends SortableRaceListColumn { private static final SafeUri ICON_WIND = UriUtils.fromTrustedString("images/home/icon-wind.png"); private static final SafeUri ICON_VIDEO = UriUtils.fromTrustedString("images/home/icon-video.png"); private static final SafeUri ICON_AUDIO = UriUtils.fromTrustedString("images/home/icon-audio.png"); private DataCountColumn(final SafeUri imageUri) { - super(new SafeHtmlHeader(TEMPLATE.imageHeader(CSS.raceslist_head_itemflag(), imageUri)), new AbstractCell() { + super(new SafeHtmlHeader(TEMPLATE.imageHeader(CSS.raceslist_head_itemflag(), imageUri)), new AbstractCell() { @Override - public void render(Context context, Long value, SafeHtmlBuilder sb) { - if (value != null && value > 0) { - sb.append(value); + public void render(Context context, Number value, SafeHtmlBuilder sb) { + if (value != null && value.longValue() > 0) { + sb.append(value.longValue()); } else { sb.appendHtmlConstant("—"); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java index cdf37c36f52..e126a923868 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java @@ -8,7 +8,9 @@ public class RaceListRaceDTO extends RaceMetadataDTO { private Duration duration; private CompetitorDTO winner; - // TODO: fields for wind(!?), video and audio counters + private int windFixesCount; + private int videoCount; + private int audioCount; @SuppressWarnings("unused") private RaceListRaceDTO() { @@ -30,5 +32,22 @@ public class RaceListRaceDTO extends RaceMetadataDTO { public void setWinner(CompetitorDTO winner) { this.winner = winner; } - + public int getWindFixesCount() { + return windFixesCount; + } + public void setWindFixesCount(int windFixesCount) { + this.windFixesCount = windFixesCount; + } + public int getVideoCount() { + return videoCount; + } + public void setVideoCount(int videoCount) { + this.videoCount = videoCount; + } + public int getAudioCount() { + return audioCount; + } + public void setAudioCount(int audioCount) { + this.audioCount = audioCount; + } } From 03b686e27d9f2453a0ee8fde3edba817ad2195a4 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 6 Jul 2015 09:23:24 +0200 Subject: [PATCH 020/219] Races lists - Temporary adjustements to RaceView DTOs --- .../dispatch/event/GetRaceListViewAction.java | 27 +++++++++---------- .../event/RaceListDataCalculator.java | 21 +++++++++++++++ .../dispatch/event/RaceListViewDTO.java | 17 +++++------- 3 files changed, 39 insertions(+), 26 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java index 068980759af..a05e90ba208 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java @@ -1,6 +1,8 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; import java.util.UUID; +import java.util.logging.Level; +import java.util.logging.Logger; import com.google.gwt.core.shared.GwtIncompatible; import com.sap.sailing.gwt.ui.shared.dispatch.Action; @@ -9,8 +11,10 @@ import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; public class GetRaceListViewAction implements Action> { + private static final Logger logger = Logger.getLogger(GetRaceListViewAction.class.getName()); + private UUID eventId; - + public GetRaceListViewAction() { } @@ -21,20 +25,13 @@ public class GetRaceListViewAction implements Action execute(DispatchContext context) { - final RaceListViewDTO result = new RaceListViewDTO(); - result.setLiveRaces(new GetLiveRacesForEventAction(eventId).execute(context).getDto()); + long start = System.currentTimeMillis(); + RaceListDataCalculator raceListDataCalculator = new RaceListDataCalculator(); + RacesActionUtil.forRacesOfEvent(context, eventId, raceListDataCalculator); + ResultWithTTL result = raceListDataCalculator.getResult(); -// RacesActionUtil.forRacesOfEvent(context, eventId, new RaceCallback() { -// @Override -// public void doForRace(RaceContext rc) { -// // TODO better condition after Frank implemented race state stuff -// if(!rc.isRaceDefinitionAvailable() || !rc.isRaceLogAvailable() || !rc.isLive() || !rc.isStartTimeAvailable()) { -// return; -// } -// -// result.addRace(rc.getLiveRaceDTO()); -// } -// }); - return new ResultWithTTL<>(5000, result); + long duration = System.currentTimeMillis() - start; + logger.log(Level.INFO, "Calculating race list for event "+ eventId + " took: "+ duration + "ms"); + return result; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java new file mode 100644 index 00000000000..1190f2ecc69 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java @@ -0,0 +1,21 @@ +package com.sap.sailing.gwt.ui.shared.dispatch.event; + +import com.google.gwt.core.shared.GwtIncompatible; +import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; +import com.sap.sailing.gwt.ui.shared.dispatch.event.RacesActionUtil.RaceCallback; + +@GwtIncompatible +public class RaceListDataCalculator implements RaceCallback { + + private final RaceListViewDTO result = new RaceListViewDTO(); + + @Override + public void doForRace(RaceContext context) { + context.addLiveRace(result.getLiveRaces()); + } + + public ResultWithTTL getResult() { + return new ResultWithTTL<>(5000, result); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java index 18c96e0c822..1ddfdc3464c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java @@ -11,7 +11,7 @@ import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; public class RaceListViewDTO implements DTO { - private LiveRacesDTO liveRaces; + private LiveRacesDTO liveRaces = new LiveRacesDTO(); private ArrayList allRaces = new ArrayList<>(); @@ -19,21 +19,16 @@ public class RaceListViewDTO implements DTO { // TODO implement based on race.getStart(); } - public void setLiveRaces(LiveRacesDTO liveRaces) { - this.liveRaces = new LiveRacesDTO(); - for (int i = 0; i < liveRaces.getRaces().size(); i++) { - LiveRaceDTO liveRace = liveRaces.getRaces().get(i); - if (i < 3) this.liveRaces.addRace(liveRace); - allRaces.add(convert(liveRace)); - } - } - public LiveRacesDTO getLiveRaces() { return liveRaces; } public List getAllRaces() { - return allRaces; + ArrayList list = new ArrayList(liveRaces.getRaces().size()); + for (LiveRaceDTO liveRace : liveRaces.getRaces()) { + list.add(convert(liveRace)); + } + return list; } public Collection getRacesForCompetitionFormat() { From d0ed8ffc39ab438852011158f6cf4b660bce2796 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 6 Jul 2015 09:28:03 +0200 Subject: [PATCH 021/219] Fixed compiler errors after last merge --- .../gwt/ui/shared/dispatch/event/GetRaceListViewAction.java | 2 +- .../gwt/ui/shared/dispatch/event/RaceListDataCalculator.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java index a05e90ba208..d744a642aa5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java @@ -27,7 +27,7 @@ public class GetRaceListViewAction implements Action execute(DispatchContext context) { long start = System.currentTimeMillis(); RaceListDataCalculator raceListDataCalculator = new RaceListDataCalculator(); - RacesActionUtil.forRacesOfEvent(context, eventId, raceListDataCalculator); + EventActionUtil.forRacesOfEvent(context, eventId, raceListDataCalculator); ResultWithTTL result = raceListDataCalculator.getResult(); long duration = System.currentTimeMillis() - start; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java index 1190f2ecc69..e69ac031d15 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java @@ -2,7 +2,7 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; import com.google.gwt.core.shared.GwtIncompatible; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; -import com.sap.sailing.gwt.ui.shared.dispatch.event.RacesActionUtil.RaceCallback; +import com.sap.sailing.gwt.ui.shared.dispatch.event.EventActionUtil.RaceCallback; @GwtIncompatible public class RaceListDataCalculator implements RaceCallback { From cf96b88a9c44d7d2f6ae69d9f2aee1ad519fe5a7 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 6 Jul 2015 10:11:15 +0200 Subject: [PATCH 022/219] Implemented sorting of the race list --- .../regatta/tabs/RegattaRacesTabView.java | 4 ++- .../dispatch/event/RaceListViewDTO.java | 34 +++---------------- 2 files changed, 8 insertions(+), 30 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index fe37a91e5c1..af074b8a33b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -1,5 +1,6 @@ package com.sap.sailing.gwt.home.client.place.event.regatta.tabs; +import java.util.ArrayList; import java.util.List; import com.google.gwt.core.client.GWT; @@ -105,7 +106,8 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView result) { liveRacesList.setData(result.getDto().getLiveRaces(), 0, 0); - finishedRacesList.setListData(result.getDto().getAllRaces()); + // TODO change setListData to use Collection + finishedRacesList.setListData(new ArrayList(result.getDto().getAllRaces())); // for (RaceListSeriesDTO series : result.getDto().getRacesForCompetitionFormat()) { // compFormatContainerUi.add(new RegattaCompetitionSeries(currentPresenter, series)); // } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java index 1ddfdc3464c..3f58382e078 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java @@ -1,34 +1,27 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.List; +import java.util.TreeSet; -import com.sap.sailing.domain.common.dto.CompetitorDTOImpl; import com.sap.sailing.gwt.ui.shared.dispatch.DTO; -import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; public class RaceListViewDTO implements DTO { private LiveRacesDTO liveRaces = new LiveRacesDTO(); - private ArrayList allRaces = new ArrayList<>(); + private TreeSet allRaces = new TreeSet<>(); public void addRace(RaceListRaceDTO race) { - // TODO implement based on race.getStart(); + allRaces.add(race); } public LiveRacesDTO getLiveRaces() { return liveRaces; } - public List getAllRaces() { - ArrayList list = new ArrayList(liveRaces.getRaces().size()); - for (LiveRaceDTO liveRace : liveRaces.getRaces()) { - list.add(convert(liveRace)); - } - return list; + public Collection getAllRaces() { + return allRaces; } public Collection getRacesForCompetitionFormat() { @@ -40,21 +33,4 @@ public class RaceListViewDTO implements DTO { } return Arrays.asList(withFleets, noFleets); } - - private RaceListRaceDTO convert(RaceMetadataDTO liveRace) { - RaceListRaceDTO raceListRace = new RaceListRaceDTO(liveRace.getRegattaName(), liveRace.getRaceName()); - raceListRace.setBoatClass(liveRace.getBoatClass()); - raceListRace.setCourse(liveRace.getCourse()); - raceListRace.setCourseArea(liveRace.getCourseArea()); - raceListRace.setFleet(liveRace.getFleet()); - raceListRace.setRegattaDisplayName(liveRace.getRegattaDisplayName()); - raceListRace.setStart(liveRace.getStart()); - raceListRace.setTrackedRaceName(liveRace.getTrackedRaceName()); - raceListRace.setTrackingState(liveRace.getTrackingState()); - raceListRace.setViewState(liveRace.getViewState()); - raceListRace.setWind(liveRace.getWind()); - raceListRace.setWinner(new CompetitorDTOImpl("Ingmar Pedersen", null, null, "de", - null, null, null, null, null, null, null, null, null)); - return raceListRace; - } } From 6dcff553451b0a9531330f78968778ad61a38d47 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 6 Jul 2015 10:16:01 +0200 Subject: [PATCH 023/219] GetRaceListViewAction is now called with a regattaId to make it work with multi regatta events and series events --- .../client/place/event/regatta/tabs/RegattaRacesTabView.java | 2 +- .../gwt/ui/shared/dispatch/event/GetRaceListViewAction.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index af074b8a33b..2a304957f11 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -98,7 +98,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView>() { @Override public void onFailure(Throwable caught) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java index d744a642aa5..5de466dc359 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java @@ -14,11 +14,12 @@ public class GetRaceListViewAction implements Action execute(DispatchContext context) { long start = System.currentTimeMillis(); RaceListDataCalculator raceListDataCalculator = new RaceListDataCalculator(); - EventActionUtil.forRacesOfEvent(context, eventId, raceListDataCalculator); + EventActionUtil.forRacesOfRegatta(context, eventId, regattaId, raceListDataCalculator); ResultWithTTL result = raceListDataCalculator.getResult(); long duration = System.currentTimeMillis() - start; From d1258ee017a6782bc9fcbe3c4aedbfc03c3059fb Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 6 Jul 2015 10:19:06 +0200 Subject: [PATCH 024/219] Implemented mapping for RaceMetadataDTO in RaceContext --- .../ui/shared/dispatch/event/RaceContext.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 1d5ba6f48b9..8480cdb9388 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -38,6 +38,7 @@ import com.sap.sailing.domain.tracking.WindWithConfidence; import com.sap.sailing.gwt.server.HomeServiceUtil; import com.sap.sailing.gwt.ui.shared.race.FlagStateDTO; import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; +import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceTrackingState; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO; @@ -285,24 +286,28 @@ public class RaceContext { if(isLiveOrOfPublicInterest()) { // the start time is always given for live races LiveRaceDTO liveRaceDTO = new LiveRaceDTO(getRegattaName(), raceColumn.getName()); - liveRaceDTO.setViewState(getLiveRaceViewState()); - liveRaceDTO.setRegattaDisplayName(getRegattaDisplayName()); - liveRaceDTO.setTrackedRaceName(trackedRace != null ? trackedRace.getRaceIdentifier().getRaceName() : null); - liveRaceDTO.setTrackingState(getRaceTrackingState()); - liveRaceDTO.setFleet(getFleetMetadataOrNull()); - liveRaceDTO.setStart(getStartTimeAsDate()); - liveRaceDTO.setBoatClass(HomeServiceUtil.getBoatClassName(leaderboard)); - liveRaceDTO.setCourseArea(getCourseAreaOrNull()); - liveRaceDTO.setCourse(getCourseNameOrNull()); + fillRaceData(liveRaceDTO); liveRaceDTO.setFlagState(getFlagStateOrNull()); liveRaceDTO.setProgress(getProgressOrNull()); - liveRaceDTO.setWind(getWindOrNull()); return liveRaceDTO; } return null; } + private void fillRaceData(RaceMetadataDTO dto) { + dto.setViewState(getLiveRaceViewState()); + dto.setRegattaDisplayName(getRegattaDisplayName()); + dto.setTrackedRaceName(trackedRace != null ? trackedRace.getRaceIdentifier().getRaceName() : null); + dto.setTrackingState(getRaceTrackingState()); + dto.setFleet(getFleetMetadataOrNull()); + dto.setStart(getStartTimeAsDate()); + dto.setBoatClass(HomeServiceUtil.getBoatClassName(leaderboard)); + dto.setCourseArea(getCourseAreaOrNull()); + dto.setCourse(getCourseNameOrNull()); + dto.setWind(getWindOrNull()); + } + public boolean isLiveOrOfPublicInterest() { TimePoint startTime = getStartTime(); boolean result = false; From ceda7ef1a0263d04d0fbf092d0441b2f9c2606ab Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 6 Jul 2015 10:25:46 +0200 Subject: [PATCH 025/219] First implementation to map fginished races --- .../gwt/ui/shared/dispatch/event/RaceContext.java | 13 +++++++++++++ .../dispatch/event/RaceListDataCalculator.java | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 8480cdb9388..21f01f1ec13 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -295,6 +295,19 @@ public class RaceContext { return null; } + public RaceListRaceDTO getFinishedRaceOrNull() { + // a race is of 'public interest' of a race is a combination of it's 'live' state + // and special flags states indicating how the postponed/canceled races will be continued + if(getLiveRaceViewState() == RaceViewState.FINISHED) { + // the start time is always given for live races + RaceListRaceDTO liveRaceDTO = new RaceListRaceDTO(getRegattaName(), raceColumn.getName()); + fillRaceData(liveRaceDTO); + + return liveRaceDTO; + } + return null; + } + private void fillRaceData(RaceMetadataDTO dto) { dto.setViewState(getLiveRaceViewState()); dto.setRegattaDisplayName(getRegattaDisplayName()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java index e69ac031d15..a3731a6357f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java @@ -12,6 +12,11 @@ public class RaceListDataCalculator implements RaceCallback { @Override public void doForRace(RaceContext context) { context.addLiveRace(result.getLiveRaces()); + + RaceListRaceDTO finishedRace = context.getFinishedRaceOrNull(); + if(finishedRace != null) { + result.addRace(finishedRace); + } } public ResultWithTTL getResult() { From 2bbcd187f41a6392dee6264199d73c5bd30f50eb Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 6 Jul 2015 10:26:04 +0200 Subject: [PATCH 026/219] Mapping duration for finished races --- .../gwt/ui/shared/dispatch/event/RaceContext.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 21f01f1ec13..64e74644463 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -43,6 +43,7 @@ import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceTrackingState; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO; import com.sap.sailing.gwt.ui.shared.race.SimpleWindDTO; +import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -302,11 +303,21 @@ public class RaceContext { // the start time is always given for live races RaceListRaceDTO liveRaceDTO = new RaceListRaceDTO(getRegattaName(), raceColumn.getName()); fillRaceData(liveRaceDTO); + liveRaceDTO.setDuration(getDurationOrNull()); return liveRaceDTO; } return null; } + + private Duration getDurationOrNull() { + TimePoint startTime = getStartTime(); + TimePoint finishTime = getFinishTime(); + if(startTime != null && finishTime != null) { + return startTime.until(finishTime); + } + return null; + } private void fillRaceData(RaceMetadataDTO dto) { dto.setViewState(getLiveRaceViewState()); From d9ae7adcae815b1333ca860a32b8bf7d0a0b5579 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 6 Jul 2015 10:36:41 +0200 Subject: [PATCH 027/219] Using Collection instead of List where possible --- .../place/event/partials/racelist/RaceListContainer.java | 4 ++-- .../place/event/regatta/tabs/RegattaRacesTabView.java | 8 +++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.java index ac0ab199dc1..c3bb632ee88 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.java @@ -1,7 +1,7 @@ package com.sap.sailing.gwt.home.client.place.event.partials.racelist; -import java.util.List; +import java.util.Collection; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.DivElement; @@ -31,7 +31,7 @@ public class RaceListContainer extends Composite { this.titleUi.setInnerText(title); } - public void setRaceListData(List data) { + public void setRaceListData(Collection data) { this.raceListUi.setTableData(data); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 2a304957f11..b26b3b6ae27 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -1,7 +1,6 @@ package com.sap.sailing.gwt.home.client.place.event.regatta.tabs; -import java.util.ArrayList; -import java.util.List; +import java.util.Collection; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Display; @@ -106,8 +105,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView result) { liveRacesList.setData(result.getDto().getLiveRaces(), 0, 0); - // TODO change setListData to use Collection - finishedRacesList.setListData(new ArrayList(result.getDto().getAllRaces())); + finishedRacesList.setListData(result.getDto().getAllRaces()); // for (RaceListSeriesDTO series : result.getDto().getRacesForCompetitionFormat()) { // compFormatContainerUi.add(new RegattaCompetitionSeries(currentPresenter, series)); // } @@ -152,7 +150,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView data) { + public void setListData(Collection data) { // boolean hasFleets = data.hasFleets(); // this.fleetCornerColumn.setShowDetails(hasFleets); // this.fleetNameColumn.setShowDetails(hasFleets); From 88c9b7d827af0ce996289748a8d27d9d7e9dbd7b Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 6 Jul 2015 10:47:04 +0200 Subject: [PATCH 028/219] Fixed GetRaceListViewAction constructor to save regattaId --- .../gwt/ui/shared/dispatch/event/GetRaceListViewAction.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java index 5de466dc359..07b28425a69 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java @@ -21,6 +21,7 @@ public class GetRaceListViewAction implements Action Date: Mon, 6 Jul 2015 10:51:56 +0200 Subject: [PATCH 029/219] Using SimpleCompetitorDTO --- .../partials/racelist/RaceListColumnFactory.java | 12 ++++++------ .../ui/shared/dispatch/event/RaceListRaceDTO.java | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index 7d3338980c1..901b4c2d74e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -21,7 +21,7 @@ import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.safehtml.shared.UriUtils; import com.google.gwt.user.cellview.client.SafeHtmlHeader; import com.sap.sailing.domain.common.InvertibleComparator; -import com.sap.sailing.domain.common.dto.CompetitorDTO; +import com.sap.sailing.domain.common.dto.SimpleCompetitorDTO; import com.sap.sailing.domain.common.impl.NaturalComparator; import com.sap.sailing.gwt.common.client.SharedResources; import com.sap.sailing.gwt.common.client.SharedResources.MainCss; @@ -421,10 +421,10 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getWinnerColumn() { - Cell cell = new AbstractCell() { + public static SortableRaceListColumn getWinnerColumn() { + Cell cell = new AbstractCell() { @Override - public void render(Context context, CompetitorDTO value, SafeHtmlBuilder sb) { + public void render(Context context, SimpleCompetitorDTO value, SafeHtmlBuilder sb) { if (value != null) { final SafeUri flagImageUri; if (value.getFlagImageURL() == null || value.getFlagImageURL().isEmpty()) { @@ -447,7 +447,7 @@ public class RaceListColumnFactory { return object.getWinner() != null ? object.getWinner().getName() : null; } }; - return new SortableRaceListColumn(I18N.winner(), cell, comparator) { + return new SortableRaceListColumn(I18N.winner(), cell, comparator) { @Override public String getHeaderStyle() { return CSS.raceslist_head_item(); @@ -459,7 +459,7 @@ public class RaceListColumnFactory { } @Override - public CompetitorDTO getValue(T object) { + public SimpleCompetitorDTO getValue(T object) { return object.getWinner(); } }; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java index e126a923868..6b73ea5ee3a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java @@ -1,13 +1,13 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; -import com.sap.sailing.domain.common.dto.CompetitorDTO; +import com.sap.sailing.domain.common.dto.SimpleCompetitorDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; import com.sap.sse.common.Duration; public class RaceListRaceDTO extends RaceMetadataDTO { private Duration duration; - private CompetitorDTO winner; + private SimpleCompetitorDTO winner; private int windFixesCount; private int videoCount; private int audioCount; @@ -26,10 +26,10 @@ public class RaceListRaceDTO extends RaceMetadataDTO { public void setDuration(Duration duration) { this.duration = duration; } - public CompetitorDTO getWinner() { + public SimpleCompetitorDTO getWinner() { return winner; } - public void setWinner(CompetitorDTO winner) { + public void setWinner(SimpleCompetitorDTO winner) { this.winner = winner; } public int getWindFixesCount() { From f746ab40f4fb58d767a7e0b85eb88b23cca4002a Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 6 Jul 2015 11:09:57 +0200 Subject: [PATCH 030/219] Fixed compiler errors after merge --- .../place/event/partials/racelist/RaceListColumnFactory.java | 2 +- .../sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index 901b4c2d74e..b730e5b608f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -21,7 +21,6 @@ import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.safehtml.shared.UriUtils; import com.google.gwt.user.cellview.client.SafeHtmlHeader; import com.sap.sailing.domain.common.InvertibleComparator; -import com.sap.sailing.domain.common.dto.SimpleCompetitorDTO; import com.sap.sailing.domain.common.impl.NaturalComparator; import com.sap.sailing.gwt.common.client.SharedResources; import com.sap.sailing.gwt.common.client.SharedResources.MainCss; @@ -36,6 +35,7 @@ import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.event.SimpleCompetitorDTO; import com.sap.sailing.gwt.ui.shared.race.FlagStateDTO; import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java index 6b73ea5ee3a..c5b410e9328 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java @@ -1,6 +1,5 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; -import com.sap.sailing.domain.common.dto.SimpleCompetitorDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; import com.sap.sse.common.Duration; From 851da493ab2bdb5a4a563dd4ecb6a51b5c48d9b2 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 6 Jul 2015 11:30:07 +0200 Subject: [PATCH 031/219] Calculating winner from tracked race --- .../ui/shared/dispatch/event/RaceContext.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 64e74644463..1f9d7679160 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -12,6 +12,7 @@ import com.sap.sailing.domain.abstractlog.race.analyzing.impl.WindFixesFinder; import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; import com.sap.sailing.domain.abstractlog.race.state.impl.ReadonlyRaceStateImpl; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState; +import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.Event; @@ -304,12 +305,27 @@ public class RaceContext { RaceListRaceDTO liveRaceDTO = new RaceListRaceDTO(getRegattaName(), raceColumn.getName()); fillRaceData(liveRaceDTO); liveRaceDTO.setDuration(getDurationOrNull()); + liveRaceDTO.setWinner(getWinnerOrNull()); return liveRaceDTO; } return null; } + private SimpleCompetitorDTO getWinnerOrNull() { + if(trackedRace != null) { + TimePoint time = getFinishTime(); + if(time == null) { + time = MillisecondsTimePoint.now(); + } + List competitorsFromBestToWorst = trackedRace.getCompetitorsFromBestToWorst(time); + if(competitorsFromBestToWorst != null && !competitorsFromBestToWorst.isEmpty()) { + return new SimpleCompetitorDTO(competitorsFromBestToWorst.get(0)); + } + } + return null; + } + private Duration getDurationOrNull() { TimePoint startTime = getStartTime(); TimePoint finishTime = getFinishTime(); From affcf0ad9381676d1d1d03cdb0614a5c05c48250 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 6 Jul 2015 11:37:02 +0200 Subject: [PATCH 032/219] Added TODO --- .../sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 1f9d7679160..1325ba594d7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -313,6 +313,7 @@ public class RaceContext { } private SimpleCompetitorDTO getWinnerOrNull() { + // TODO calculate winner from score correction if(trackedRace != null) { TimePoint time = getFinishTime(); if(time == null) { From 65c0d12a7f0551f2cc2b1d7bfdb5a99f17172de2 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 6 Jul 2015 12:19:01 +0200 Subject: [PATCH 033/219] Races lists - Used new utility method for resolving competitor flag image --- .../partials/racelist/RaceListColumnFactory.java | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index b730e5b608f..7de744e6e56 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -426,17 +426,7 @@ public class RaceListColumnFactory { @Override public void render(Context context, SimpleCompetitorDTO value, SafeHtmlBuilder sb) { if (value != null) { - final SafeUri flagImageUri; - if (value.getFlagImageURL() == null || value.getFlagImageURL().isEmpty()) { - String twoLetterIsoCountryCode = value.getTwoLetterIsoCountryCode(); - if (twoLetterIsoCountryCode==null || twoLetterIsoCountryCode.isEmpty()) { - flagImageUri = FlagImageResolver.getEmptyFlagImageResource().getSafeUri(); - } else { - flagImageUri = FlagImageResolver.getFlagImageResource(twoLetterIsoCountryCode).getSafeUri(); - } - } else { - flagImageUri = UriUtils.fromTrustedString(value.getFlagImageURL()); - } + SafeUri flagImageUri = FlagImageResolver.getFlagImageResource(value.getFlagImageURL(), value.getTwoLetterIsoCountryCode()); sb.append(TEMPLATE.winner(CSS.race_item_flag(), CSS.race_item_winner(), flagImageUri, value.getName())); } } From 2a4d2e1956b21ee899825b462cfcbb0ce826883f Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 6 Jul 2015 13:32:01 +0200 Subject: [PATCH 034/219] Races lists - i18n: Added String messages --- .../java/com/sap/sailing/gwt/ui/client/StringMessages.java | 2 ++ .../com/sap/sailing/gwt/ui/client/StringMessages.properties | 4 +++- .../sap/sailing/gwt/ui/client/StringMessages_de.properties | 4 +++- .../sap/sailing/gwt/ui/client/StringMessages_ru.properties | 4 +++- .../sap/sailing/gwt/ui/client/StringMessages_zh.properties | 4 +++- 5 files changed, 14 insertions(+), 4 deletions(-) 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 ab1adf5f2d7..b7418e60c9f 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 @@ -1318,4 +1318,6 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String minutesAgo(String minutes); String hoursAgo(String hours); String winner(); + String durationPlain(); + String finishedRaces(); } 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 53414b2ebde..3a6dae751f3 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 @@ -1285,4 +1285,6 @@ sailorInfoLongText=Official Results, Protests,\nNotice Board, Sailor weather: now=Now minutesAgo={0} min ago hoursAgo={0} h ago -winner=Winner \ No newline at end of file +winner=Winner +durationPlain=Duration +finishedRaces=Finished Races \ 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 56707b31e32..dada28afe7e 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 @@ -1275,4 +1275,6 @@ sailorInfoLongText=Offizielle Ergebnisse, Proteste,\nNotice Board, Segler-Wetter now=Jetzt minutesAgo=vor {0} min hoursAgo=vor {0} h -winner=Sieger \ No newline at end of file +winner=Sieger +durationPlain=Dauer +finishedRaces=Beendete Wettfahrten \ 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_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index 6abbda83082..2c24dcbd0bf 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1223,4 +1223,6 @@ sailorInfoLongText=Official Results, Protests,\nNotice Board, Sailor weather: now=в настоящее время minutesAgo={0} минут назад hoursAgo={0} h часов назад -winner=победитель \ No newline at end of file +winner=победитель +durationPlain=Продолжительность +finishedRaces=Finished Races \ 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_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index 9711fd3390e..cae692efe51 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1272,4 +1272,6 @@ raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSeconds=Calc.Time raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSecondsTooltip=Calculated time at estimated arrival at the competitor that is currently farthest ahead in the race;\nestimation based on average VMG in current leg and equal (calculated) performance to fastest boat in all subsequent legs sailorInfo=水手信息 sailorInfoLongText=Find here Notice Board,\nProtests, Sailor weather: -winner=Winner \ No newline at end of file +winner=Winner +durationPlain=Duration +finishedRaces=Finished Races \ No newline at end of file From 3d7b890acfd712c73b81a32db9beb935ff6d9fe4 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 6 Jul 2015 13:40:52 +0200 Subject: [PATCH 035/219] Races lists - Added duration column --- .../racelist/RaceListColumnFactory.java | 28 +++++++++++++++++++ .../regatta/tabs/RegattaRacesTabView.java | 11 +++++--- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index 7de744e6e56..d8560869c52 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -33,6 +33,7 @@ import com.sap.sailing.gwt.regattaoverview.client.FlagsMeaningExplanator; import com.sap.sailing.gwt.regattaoverview.client.SailingFlagsBuilder; import com.sap.sailing.gwt.ui.client.FlagImageResolver; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil; import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; import com.sap.sailing.gwt.ui.shared.dispatch.event.SimpleCompetitorDTO; @@ -44,6 +45,7 @@ import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO; import com.sap.sailing.gwt.ui.shared.race.SimpleWindDTO; import com.sap.sailing.gwt.ui.shared.util.NullSafeComparableComparator; +import com.sap.sse.common.Duration; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -207,6 +209,32 @@ public class RaceListColumnFactory { }; } + public static SortableRaceListColumn getDurationColumn() { + Cell cell = new TextCell(); + InvertibleComparator comparator = new InvertibleComparatorWrapper(new NullSafeComparableComparator(false)) { + @Override + protected Duration getComparisonValue(T object) { + return object.getDuration(); + } + }; + return new SortableRaceListColumn(I18N.durationPlain(), cell, comparator) { + @Override + public String getHeaderStyle() { + return getStyleNamesString(CSS.raceslist_head_item(), MEDIA_CSS.showonlarge()); + } + + @Override + public String getColumnStyle() { + return getStyleNamesString(CSS.race_item(), MEDIA_CSS.showonlarge()); + } + + @Override + public String getValue(T object) { + return object.getDuration() != null ? DateAndTimeFormatterUtil.formatElapsedTime(object.getDuration().asMillis()) : null; + } + }; + } + public static SortableRaceListColumn getFlagsColumn() { Cell cell = new AbstractCell() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index b26b3b6ae27..4a2654742a3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -25,6 +25,7 @@ import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListCon import com.sap.sailing.gwt.home.client.place.event.partials.racelist.SortableRaceListColumn; import com.sap.sailing.gwt.home.client.place.event.regatta.EventRegattaView.Presenter; import com.sap.sailing.gwt.home.client.place.event.regatta.RegattaTabView; +import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRaceListViewAction; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; @@ -35,6 +36,8 @@ import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListViewDTO; */ public class RegattaRacesTabView extends Composite implements RegattaTabView { + private static final StringMessages I18N = StringMessages.INSTANCE; + private enum Navigation implements ListNavigationAction { SORT_LIST_FORMAT("Sortable list Format TODO", false), COMPETITION_FORMAT("Competition Format TODO", true); @@ -82,9 +85,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView container = new RaceListContainer<>("Finished Races TODO", finishedRacesList = new RaceListFinishedRaces(currentPresenter)); - container.setInfoText("Info text"); - listFormatContainerUi.add(container); + listFormatContainerUi.add(new RaceListContainer<>(I18N.finishedRaces(), finishedRacesList = new RaceListFinishedRaces(currentPresenter))); } @Override @@ -141,10 +142,11 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView { - private final SortableRaceListColumn winnerColumn = RaceListColumnFactory.getWinnerColumn(); + private final SortableRaceListColumn durationColumn = RaceListColumnFactory.getDurationColumn(); private final SortableRaceListColumn windfixesCountColumn = RaceListColumnFactory.getWindFixesCountColumn(); private final SortableRaceListColumn videoCountColumn = RaceListColumnFactory.getVideoCountColumn(); private final SortableRaceListColumn audioCountColumn = RaceListColumnFactory.getAudioCountColumn(); + private final SortableRaceListColumn winnerColumn = RaceListColumnFactory.getWinnerColumn(); public RaceListFinishedRaces(EventView.Presenter presenter) { super(presenter); @@ -166,6 +168,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView Date: Mon, 6 Jul 2015 13:53:28 +0200 Subject: [PATCH 036/219] Merge branch 'design2015' into design2015-races --- .../place/event/partials/racelist/RaceListColumnFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index d8560869c52..4c5047ff702 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -454,7 +454,7 @@ public class RaceListColumnFactory { @Override public void render(Context context, SimpleCompetitorDTO value, SafeHtmlBuilder sb) { if (value != null) { - SafeUri flagImageUri = FlagImageResolver.getFlagImageResource(value.getFlagImageURL(), value.getTwoLetterIsoCountryCode()); + SafeUri flagImageUri = FlagImageResolver.getFlagImageUri(value.getFlagImageURL(), value.getTwoLetterIsoCountryCode()); sb.append(TEMPLATE.winner(CSS.race_item_flag(), CSS.race_item_winner(), flagImageUri, value.getName())); } } From a59a9a5370a0fa2d1a38b6bce95e4854ce935236 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 6 Jul 2015 14:48:30 +0200 Subject: [PATCH 037/219] Races lists - Added utility class for "contains data" calculation --- .../partials/racelist/RaceListDataUtil.java | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java new file mode 100644 index 00000000000..05daf8ea620 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java @@ -0,0 +1,107 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.racelist; + +import java.util.Collection; + +import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; +import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; +import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; +import com.sap.sailing.gwt.ui.shared.race.SimpleWindDTO; +import com.sap.sse.common.Duration; + +public class RaceListDataUtil { + + private interface ValueProvider { + V getValue(T object); + } + + private static boolean hasValues(Collection races, ValueProvider valueProvider) { + for (T race : races) { + if (valueProvider.getValue(race) != null) { + return true; + } + } + return false; + } + + private static boolean hasNumberValues(Collection races, ValueProvider valueProvider) { + for (T race : races) { + Number value = valueProvider.getValue(race); + if (value != null && value.longValue() > 0) { + return true; + } + } + return false; + } + + public static boolean hasFleets(Collection data) { + return hasValues(data, new ValueProvider() { + @Override + public FleetMetadataDTO getValue(T object) { + return object.getFleet(); + } + }); + } + + public static boolean hasDurations(Collection data) { + return hasValues(data, new ValueProvider() { + @Override + public Duration getValue(T object) { + return object.getDuration(); + } + }); + } + + public static boolean hasWind(Collection data) { + return hasValues(data, new ValueProvider() { + @Override + public SimpleWindDTO getValue(T object) { + return object.getWind(); + } + }); + } + + public static boolean hasWindFixes(Collection data) { + return hasNumberValues(data, new ValueProvider() { + @Override + public Number getValue(T object) { + return object.getWindFixesCount(); + } + }); + } + + public static boolean hasVideos(Collection data) { + return hasNumberValues(data, new ValueProvider() { + @Override + public Number getValue(T object) { + return object.getVideoCount(); + } + }); + } + + public static boolean hasAudios(Collection data) { + return hasNumberValues(data, new ValueProvider() { + @Override + public Number getValue(T object) { + return object.getAudioCount(); + } + }); + } + + public static boolean hasCourses(Collection data) { + return hasValues(data, new ValueProvider() { + @Override + public String getValue(T object) { + return object.getCourse(); + } + }); + } + + public static boolean hasCourseAreas(Collection data) { + return hasValues(data, new ValueProvider() { + @Override + public String getValue(T object) { + return object.getCourseArea(); + } + }); + } +} From 87d5da47a5917c9a514131810a4f7b049f403aba Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 6 Jul 2015 14:48:56 +0200 Subject: [PATCH 038/219] Races lists - Used new utility class for "contains data" calculation --- .../partials/raceListLive/RacesListLive.java | 18 ++++++++++-------- .../regatta/tabs/RegattaRacesTabView.java | 17 +++++++++++------ 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java index e39f80af6a4..d9783450daa 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java @@ -1,11 +1,14 @@ package com.sap.sailing.gwt.home.client.place.event.partials.raceListLive; +import java.util.Collection; + import com.google.gwt.dom.client.Style.Display; import com.google.gwt.user.client.ui.Composite; import com.sap.sailing.gwt.home.client.place.event.EventView; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.AbstractRaceList; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListColumnFactory; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListContainer; +import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListDataUtil; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.SortableRaceListColumn; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; import com.sap.sailing.gwt.ui.client.StringMessages; @@ -28,12 +31,11 @@ public class RacesListLive extends Composite implements RefreshableWidget { - private final SortableRaceListColumn regattaNameColumn = RaceListColumnFactory.getRegattaNameColumn(); private final SortableRaceListColumn flagsColumn = RaceListColumnFactory.getFlagsColumn(); private final SortableRaceListColumn courseAreaColumn = RaceListColumnFactory.getCourseAreaColumn(); @@ -45,16 +47,16 @@ public class RacesListLive extends Composite implements RefreshableWidget data) { + boolean hasFleets = RaceListDataUtil.hasFleets(data); this.fleetCornerColumn.setShowDetails(hasFleets); this.fleetNameColumn.setShowDetails(hasFleets); - this.courseAreaColumn.setShowDetails(data.hasCourseAreas()); - this.courseColumn.setShowDetails(data.hasCourses()); - boolean hasWind = data.hasWind(); + this.courseAreaColumn.setShowDetails(RaceListDataUtil.hasCourseAreas(data)); + this.courseColumn.setShowDetails(RaceListDataUtil.hasCourses(data)); + boolean hasWind = RaceListDataUtil.hasWind(data); this.windSpeedColumn.setShowDetails(hasWind); this.windDirectionColumn.setShowDetails(hasWind); - setTableData(data.getRaces()); + setTableData(data); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 4a2654742a3..a394372201d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -22,6 +22,7 @@ import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesLi import com.sap.sailing.gwt.home.client.place.event.partials.racelist.AbstractRaceList; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListColumnFactory; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListContainer; +import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListDataUtil; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.SortableRaceListColumn; import com.sap.sailing.gwt.home.client.place.event.regatta.EventRegattaView.Presenter; import com.sap.sailing.gwt.home.client.place.event.regatta.RegattaTabView; @@ -153,12 +154,16 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView data) { -// boolean hasFleets = data.hasFleets(); -// this.fleetCornerColumn.setShowDetails(hasFleets); -// this.fleetNameColumn.setShowDetails(hasFleets); -// boolean hasWind = data.hasWind(); -// this.windSpeedColumn.setShowDetails(hasWind); -// this.windDirectionColumn.setShowDetails(hasWind); + boolean hasFleets = RaceListDataUtil.hasFleets(data); + this.fleetCornerColumn.setShowDetails(hasFleets); + this.fleetNameColumn.setShowDetails(hasFleets); + this.durationColumn.setShowDetails(RaceListDataUtil.hasDurations(data)); + boolean hasWind = RaceListDataUtil.hasWind(data); + this.windSpeedColumn.setShowDetails(hasWind); + this.windDirectionColumn.setShowDetails(hasWind); + this.windfixesCountColumn.setShowDetails(RaceListDataUtil.hasWindFixes(data)); + this.videoCountColumn.setShowDetails(RaceListDataUtil.hasVideos(data)); + this.audioCountColumn.setShowDetails(RaceListDataUtil.hasAudios(data)); setTableData(data); } From 3a72b6d159588fa8e5ef82b4f9be8bc4ad1c0db8 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 6 Jul 2015 14:49:29 +0200 Subject: [PATCH 039/219] Races lists - Removed no longer needed "contains data" calculation methods --- .../shared/dispatch/event/LiveRacesDTO.java | 35 ------------------- 1 file changed, 35 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRacesDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRacesDTO.java index 62b007408b1..ec1917b8735 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRacesDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRacesDTO.java @@ -16,39 +16,4 @@ public class LiveRacesDTO implements DTO { this.races.add(race); } - public boolean hasFleets() { - for(LiveRaceDTO race : races) { - if(race.getFleet() != null) { - return true; - } - } - return false; - } - - public boolean hasCourseAreas() { - for (LiveRaceDTO race : races) { - if (race.getCourseArea() != null) { - return true; - } - } - return false; - } - - public boolean hasCourses() { - for (LiveRaceDTO race : races) { - if (race.getCourse() != null) { - return true; - } - } - return false; - } - - public boolean hasWind() { - for (LiveRaceDTO race : races) { - if (race.getWind() != null) { - return true; - } - } - return false; - } } From 363bf5f5d74eb8244bee2c50e92b485700db6303 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 6 Jul 2015 14:57:06 +0200 Subject: [PATCH 040/219] Added new result containing sorted set data --- .../ui/shared/dispatch/SortedSetResult.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/SortedSetResult.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/SortedSetResult.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/SortedSetResult.java new file mode 100644 index 00000000000..0744ebd6cef --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/SortedSetResult.java @@ -0,0 +1,26 @@ +package com.sap.sailing.gwt.ui.shared.dispatch; + +import java.util.Collection; +import java.util.Set; +import java.util.TreeSet; + +public class SortedSetResult implements DTO, Result { + private TreeSet values = new TreeSet<>(); + + @SuppressWarnings("unused") + private SortedSetResult() { + } + + public SortedSetResult(Collection values) { + super(); + this.values.addAll(values); + } + + public Set getValues() { + return values; + } + + public boolean isEmpty() { + return values.isEmpty(); + } +} From ba6770caeae8dd6eb240b02171b3e2c67cea35f0 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 6 Jul 2015 15:39:25 +0200 Subject: [PATCH 041/219] Refactored live race calculation to avoid specific container DTOs --- .../partials/raceListLive/RacesListLive.java | 14 +++++++++----- .../regatta/tabs/RegattaRacesTabView.java | 4 ++-- .../event/GetLiveRacesForEventAction.java | 11 ++++++----- .../event/GetLiveRacesForRegattaAction.java | 9 +++++---- .../dispatch/event/LiveRaceCalculator.java | 13 ++++++++----- .../shared/dispatch/event/LiveRacesDTO.java | 19 ------------------- .../ui/shared/dispatch/event/RaceContext.java | 5 +++-- .../event/RaceListDataCalculator.java | 2 +- .../dispatch/event/RaceListViewDTO.java | 16 ++++++---------- .../gwt/ui/shared/race/RaceMetadataDTO.java | 4 ++-- 10 files changed, 42 insertions(+), 55 deletions(-) delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRacesDTO.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java index d9783450daa..b9ec1d99169 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java @@ -12,10 +12,10 @@ import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListDat import com.sap.sailing.gwt.home.client.place.event.partials.racelist.SortableRaceListColumn; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; -import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRacesDTO; -public class RacesListLive extends Composite implements RefreshableWidget { +public class RacesListLive extends Composite implements RefreshableWidget> { private final RaceListLiveRaces raceList; @@ -26,12 +26,16 @@ public class RacesListLive extends Composite implements RefreshableWidget data, long nextUpdate, int updateNo) { + this.setListData(data.getValues()); + } + + public void setListData(Collection data) { + if(data == null || data.isEmpty()) { getElement().getStyle().setDisplay(Display.NONE); } else { getElement().getStyle().clearDisplay(); - raceList.setListData(data.getRaces()); + raceList.setListData(data); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index a394372201d..eab45773c0b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -106,8 +106,8 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView result) { - liveRacesList.setData(result.getDto().getLiveRaces(), 0, 0); - finishedRacesList.setListData(result.getDto().getAllRaces()); + liveRacesList.setListData(result.getDto().getLiveRaces()); + finishedRacesList.setListData(result.getDto().getFinishedRaces()); // for (RaceListSeriesDTO series : result.getDto().getRacesForCompetitionFormat()) { // compFormatContainerUi.add(new RegattaCompetitionSeries(currentPresenter, series)); // } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesForEventAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesForEventAction.java index 4f595bf248e..503045b0f9a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesForEventAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesForEventAction.java @@ -9,9 +9,10 @@ import com.sap.sailing.domain.base.Event; import com.sap.sailing.gwt.ui.shared.dispatch.Action; import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContext; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; +import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; import com.sap.sailing.gwt.ui.shared.dispatch.event.EventActionUtil.CalculationWithEvent; -public class GetLiveRacesForEventAction implements Action> { +public class GetLiveRacesForEventAction implements Action>> { private static final Logger logger = Logger.getLogger(GetLiveRacesForEventAction.class.getName()); private UUID eventId; @@ -25,14 +26,14 @@ public class GetLiveRacesForEventAction implements Action execute(final DispatchContext context) { + public ResultWithTTL> execute(final DispatchContext context) { long start = System.currentTimeMillis(); - ResultWithTTL result = EventActionUtil.withLiveRaceOrDefaultSchedule(context, eventId, new CalculationWithEvent() { + ResultWithTTL> result = EventActionUtil.withLiveRaceOrDefaultSchedule(context, eventId, new CalculationWithEvent>() { @Override - public ResultWithTTL calculateWithEvent(Event event) { + public ResultWithTTL> calculateWithEvent(Event event) { LiveRaceCalculator liveRaceCalculator = new LiveRaceCalculator(); EventActionUtil.forRacesOfEvent(context, eventId, liveRaceCalculator); - ResultWithTTL result = liveRaceCalculator.getResult(); + ResultWithTTL> result = liveRaceCalculator.getResult(); return result; } }); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesForRegattaAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesForRegattaAction.java index b4d7c89a7f2..885e26747fd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesForRegattaAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesForRegattaAction.java @@ -7,9 +7,10 @@ import com.sap.sailing.domain.base.Event; import com.sap.sailing.gwt.ui.shared.dispatch.Action; import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContext; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; +import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; import com.sap.sailing.gwt.ui.shared.dispatch.event.EventActionUtil.CalculationWithEvent; -public class GetLiveRacesForRegattaAction implements Action> { +public class GetLiveRacesForRegattaAction implements Action>> { private UUID eventId; private String regattaName; @@ -23,10 +24,10 @@ public class GetLiveRacesForRegattaAction implements Action execute(final DispatchContext context) { - return EventActionUtil.withLiveRaceOrDefaultSchedule(context, eventId, new CalculationWithEvent() { + public ResultWithTTL> execute(final DispatchContext context) { + return EventActionUtil.withLiveRaceOrDefaultSchedule(context, eventId, new CalculationWithEvent>() { @Override - public ResultWithTTL calculateWithEvent(Event event) { + public ResultWithTTL> calculateWithEvent(Event event) { LiveRaceCalculator liveRaceCalculator = new LiveRaceCalculator(); EventActionUtil.forRacesOfRegatta(context, eventId, regattaName, liveRaceCalculator); return liveRaceCalculator.getResult(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceCalculator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceCalculator.java index 46636654ee4..1cdbf3a5c73 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceCalculator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceCalculator.java @@ -1,23 +1,26 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; +import java.util.TreeSet; + import com.google.gwt.core.shared.GwtIncompatible; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; +import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; import com.sap.sailing.gwt.ui.shared.dispatch.event.EventActionUtil.RaceCallback; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; import com.sap.sse.common.impl.MillisecondsTimePoint; @GwtIncompatible final class LiveRaceCalculator implements RaceCallback { - private final LiveRacesDTO result = new LiveRacesDTO(); + private final TreeSet resultSet = new TreeSet(); @Override public void doForRace(RaceContext rc) { - rc.addLiveRace(result); + rc.addLiveRace(resultSet); } - public ResultWithTTL getResult() { + public ResultWithTTL> getResult() { long ttl = 1000 * 60 * 2; - for(LiveRaceDTO race : result.getRaces()) { + for(LiveRaceDTO race : resultSet) { if(race.getViewState() == RaceViewState.RUNNING) { ttl = Math.min(ttl, 1000 * 30); } else if(race.getViewState() == RaceViewState.SCHEDULED) { @@ -27,6 +30,6 @@ final class LiveRaceCalculator implements RaceCallback { ttl = Math.min(ttl, 1000 * 60); } } - return new ResultWithTTL(ttl, result); + return new ResultWithTTL>(ttl, new SortedSetResult<>(resultSet)); } } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRacesDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRacesDTO.java deleted file mode 100644 index ec1917b8735..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRacesDTO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.sap.sailing.gwt.ui.shared.dispatch.event; - -import java.util.Collection; -import java.util.TreeSet; - -import com.sap.sailing.gwt.ui.shared.dispatch.DTO; - -public class LiveRacesDTO implements DTO { - private TreeSet races = new TreeSet<>(); - - public Collection getRaces() { - return races; - } - - public void addRace(LiveRaceDTO race) { - this.races.add(race); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 1325ba594d7..18446485bc4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -1,5 +1,6 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; +import java.util.Collection; import java.util.Date; import java.util.List; @@ -275,10 +276,10 @@ public class RaceContext { return finishTime; } - public void addLiveRace(LiveRacesDTO result) { + public void addLiveRace(Collection result) { LiveRaceDTO liveRaceDTO = getLiveRaceOrNull(); if(liveRaceDTO != null) { - result.addRace(liveRaceDTO); + result.add(liveRaceDTO); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java index a3731a6357f..1c3626b6f6e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java @@ -15,7 +15,7 @@ public class RaceListDataCalculator implements RaceCallback { RaceListRaceDTO finishedRace = context.getFinishedRaceOrNull(); if(finishedRace != null) { - result.addRace(finishedRace); + result.getFinishedRaces().add(finishedRace); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java index 3f58382e078..fb3ad592ff8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java @@ -8,26 +8,22 @@ import com.sap.sailing.gwt.ui.shared.dispatch.DTO; public class RaceListViewDTO implements DTO { - private LiveRacesDTO liveRaces = new LiveRacesDTO(); + private TreeSet liveRaces = new TreeSet<>(); - private TreeSet allRaces = new TreeSet<>(); + private TreeSet finishedRaces = new TreeSet<>(); - public void addRace(RaceListRaceDTO race) { - allRaces.add(race); - } - - public LiveRacesDTO getLiveRaces() { + public Collection getLiveRaces() { return liveRaces; } - public Collection getAllRaces() { - return allRaces; + public Collection getFinishedRaces() { + return finishedRaces; } public Collection getRacesForCompetitionFormat() { RaceListSeriesDTO withFleets = new RaceListSeriesDTO("Fleets"); RaceListSeriesDTO noFleets = new RaceListSeriesDTO(""); - for (RaceListRaceDTO race : allRaces) { + for (RaceListRaceDTO race : finishedRaces) { RaceListSeriesDTO series = race.getFleet() == null ? noFleets : withFleets; series.addRace(race); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/RaceMetadataDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/RaceMetadataDTO.java index c15825adb26..58de580e0b8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/RaceMetadataDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/RaceMetadataDTO.java @@ -2,11 +2,11 @@ package com.sap.sailing.gwt.ui.shared.race; import java.util.Date; -import com.google.gwt.user.client.rpc.IsSerializable; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.dispatch.DTO; import com.sap.sse.common.Util; -public class RaceMetadataDTO implements IsSerializable, Comparable { +public class RaceMetadataDTO implements DTO, Comparable { public enum RaceViewState { PLANNED { // no start time set From af800938ae03daf5d568e4ec8166bd08fcaa8c5f Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 6 Jul 2015 16:09:40 +0200 Subject: [PATCH 042/219] Refactored race calculation to avoid utility methods in RaceContext --- .../gwt/ui/shared/dispatch/SortedSetResult.java | 10 +++++++--- .../shared/dispatch/event/LiveRaceCalculator.java | 10 ++++------ .../gwt/ui/shared/dispatch/event/RaceContext.java | 8 -------- .../dispatch/event/RaceListDataCalculator.java | 8 ++------ .../ui/shared/dispatch/event/RaceListViewDTO.java | 15 +++++++++++++++ 5 files changed, 28 insertions(+), 23 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/SortedSetResult.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/SortedSetResult.java index 0744ebd6cef..5a8fb7fb77a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/SortedSetResult.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/SortedSetResult.java @@ -7,15 +7,19 @@ import java.util.TreeSet; public class SortedSetResult implements DTO, Result { private TreeSet values = new TreeSet<>(); - @SuppressWarnings("unused") - private SortedSetResult() { + public SortedSetResult() { } public SortedSetResult(Collection values) { - super(); this.values.addAll(values); } + public void addValue(T value) { + if (value != null) { + this.values.add(value); + } + } + public Set getValues() { return values; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceCalculator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceCalculator.java index 1cdbf3a5c73..40930c16ac9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceCalculator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceCalculator.java @@ -1,7 +1,5 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; -import java.util.TreeSet; - import com.google.gwt.core.shared.GwtIncompatible; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; @@ -11,16 +9,16 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; @GwtIncompatible final class LiveRaceCalculator implements RaceCallback { - private final TreeSet resultSet = new TreeSet(); + private final SortedSetResult result = new SortedSetResult(); @Override public void doForRace(RaceContext rc) { - rc.addLiveRace(resultSet); + result.addValue(rc.getLiveRaceOrNull()); } public ResultWithTTL> getResult() { long ttl = 1000 * 60 * 2; - for(LiveRaceDTO race : resultSet) { + for(LiveRaceDTO race : result.getValues()) { if(race.getViewState() == RaceViewState.RUNNING) { ttl = Math.min(ttl, 1000 * 30); } else if(race.getViewState() == RaceViewState.SCHEDULED) { @@ -30,6 +28,6 @@ final class LiveRaceCalculator implements RaceCallback { ttl = Math.min(ttl, 1000 * 60); } } - return new ResultWithTTL>(ttl, new SortedSetResult<>(resultSet)); + return new ResultWithTTL>(ttl, result); } } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 18446485bc4..e9361eed2a1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -1,6 +1,5 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; -import java.util.Collection; import java.util.Date; import java.util.List; @@ -276,13 +275,6 @@ public class RaceContext { return finishTime; } - public void addLiveRace(Collection result) { - LiveRaceDTO liveRaceDTO = getLiveRaceOrNull(); - if(liveRaceDTO != null) { - result.add(liveRaceDTO); - } - } - public LiveRaceDTO getLiveRaceOrNull() { // a race is of 'public interest' of a race is a combination of it's 'live' state // and special flags states indicating how the postponed/canceled races will be continued diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java index 1c3626b6f6e..cb330043312 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java @@ -11,12 +11,8 @@ public class RaceListDataCalculator implements RaceCallback { @Override public void doForRace(RaceContext context) { - context.addLiveRace(result.getLiveRaces()); - - RaceListRaceDTO finishedRace = context.getFinishedRaceOrNull(); - if(finishedRace != null) { - result.getFinishedRaces().add(finishedRace); - } + result.add(context.getLiveRaceOrNull()); + result.add(context.getFinishedRaceOrNull()); } public ResultWithTTL getResult() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java index fb3ad592ff8..188e5ab23ca 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java @@ -5,6 +5,7 @@ import java.util.Collection; import java.util.TreeSet; import com.sap.sailing.gwt.ui.shared.dispatch.DTO; +import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; public class RaceListViewDTO implements DTO { @@ -12,6 +13,20 @@ public class RaceListViewDTO implements DTO { private TreeSet finishedRaces = new TreeSet<>(); + public void add(LiveRaceDTO liveRace) { + add(liveRaces, liveRace); + } + + public void add(RaceListRaceDTO finishedRace) { + add(finishedRaces, finishedRace); + } + + private void add(TreeSet set, T race) { + if (race != null) { + set.add(race); + } + } + public Collection getLiveRaces() { return liveRaces; } From 4a2abd031e1f626ef95a2f567120f2c73c6d8d3c Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 7 Jul 2015 13:50:12 +0200 Subject: [PATCH 043/219] Added view model for regatta progress --- .../dispatch/regatta/RegattaProgressDTO.java | 18 +++++++++ .../regatta/RegattaProgressSeriesDTO.java | 38 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressDTO.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressSeriesDTO.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressDTO.java new file mode 100644 index 00000000000..5c7885fba0b --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressDTO.java @@ -0,0 +1,18 @@ +package com.sap.sailing.gwt.ui.shared.dispatch.regatta; + +import java.util.ArrayList; +import java.util.List; + +import com.sap.sailing.gwt.ui.shared.dispatch.DTO; + +public class RegattaProgressDTO implements DTO { + private ArrayList series = new ArrayList<>(); + + public void addSeries(RegattaProgressSeriesDTO regattaProgressOfSeries) { + series.add(regattaProgressOfSeries); + } + + public List getSeries() { + return series; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressSeriesDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressSeriesDTO.java new file mode 100644 index 00000000000..365d7b4d40a --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressSeriesDTO.java @@ -0,0 +1,38 @@ +package com.sap.sailing.gwt.ui.shared.dispatch.regatta; + +import java.util.Map; +import java.util.TreeMap; + +import com.sap.sailing.gwt.ui.shared.dispatch.DTO; +import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; + +public class RegattaProgressSeriesDTO implements DTO { + private String name; + private int totalRaceCount; + private TreeMap fleetState = new TreeMap<>(); + + @SuppressWarnings("unused") + private RegattaProgressSeriesDTO() { + } + + public RegattaProgressSeriesDTO(String name, int totalRaceCount) { + this.name = name; + this.totalRaceCount = totalRaceCount; + } + + public String getName() { + return name; + } + + public int getTotalRaceCount() { + return totalRaceCount; + } + + public Map getFleetState() { + return fleetState; + } + + public void addFleet(FleetMetadataDTO fleet, int raceCount) { + fleetState.put(fleet, raceCount); + } +} From a54ab2c6203aa48826b727366865e6c8fa4200e2 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 7 Jul 2015 13:50:35 +0200 Subject: [PATCH 044/219] Initial implementation to calculate the regatta progress for the regatta list --- .../dispatch/event/EventActionUtil.java | 10 +-- .../ui/shared/dispatch/event/RaceContext.java | 24 +++++++ .../event/RaceListDataCalculator.java | 3 + .../dispatch/event/RaceListViewDTO.java | 11 +++ .../event/RegattaProgressCalculator.java | 67 +++++++++++++++++++ 5 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RegattaProgressCalculator.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/EventActionUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/EventActionUtil.java index 4581315a4e8..19ea6c3f274 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/EventActionUtil.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/EventActionUtil.java @@ -57,11 +57,7 @@ public final class EventActionUtil { Event event = context.getRacingEventService().getEvent(eventId); for (LeaderboardGroup lg : event.getLeaderboardGroups()) { for (Leaderboard lb : lg.getLeaderboards()) { - for(RaceColumn raceColumn : lb.getRaceColumns()) { - for(Fleet fleet : raceColumn.getFleets()) { - callback.doForRace(new RaceContext(event, lb, raceColumn, fleet, context.getRacingEventService())); - } - } + forRacesOfLeaderboard(context, event, lb, callback); } } } @@ -70,6 +66,10 @@ public final class EventActionUtil { Event event = context.getRacingEventService().getEvent(eventId); // TODO check that the leaderboard is part of the event Leaderboard lb = context.getRacingEventService().getLeaderboardByName(regattaName); + forRacesOfLeaderboard(context, event, lb, callback); + } + + private static void forRacesOfLeaderboard(DispatchContext context, Event event, Leaderboard lb, RaceCallback callback) { for(RaceColumn raceColumn : lb.getRaceColumns()) { for(Fleet fleet : raceColumn.getFleets()) { callback.doForRace(new RaceContext(event, lb, raceColumn, fleet, context.getRacingEventService())); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index e9361eed2a1..a15c06def58 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -18,6 +18,7 @@ import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.base.RaceColumnInSeries; import com.sap.sailing.domain.base.RaceDefinition; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.common.LeaderboardNameConstants; @@ -105,6 +106,10 @@ public class RaceContext { if (!isShowFleetData()) { return null; } + return getFleetMetadata(); + } + + public FleetMetadataDTO getFleetMetadata() { return new FleetMetadataDTO(fleet.getName(), fleet.getColor() == null ? null : fleet.getColor().getAsHtml()); } @@ -448,4 +453,23 @@ public class RaceContext { public RegattaAndRaceIdentifier getRaceIdentifier() { return trackedRace.getRaceIdentifier(); } + + public String getSeriesName() { + if(raceColumn instanceof RaceColumnInSeries) { + return ((RaceColumnInSeries) raceColumn).getSeries().getName(); + } + return ""; + } + + public String getRaceName() { + return raceColumn.getName(); + } + + public String getFleetName() { + return fleet.getName(); + } + + public boolean isFinished() { + return state.getStatus() == RaceLogRaceStatus.FINISHED; + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java index cb330043312..17e863d3700 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java @@ -7,15 +7,18 @@ import com.sap.sailing.gwt.ui.shared.dispatch.event.EventActionUtil.RaceCallback @GwtIncompatible public class RaceListDataCalculator implements RaceCallback { + private final RegattaProgressCalculator progressCalculator = new RegattaProgressCalculator(); private final RaceListViewDTO result = new RaceListViewDTO(); @Override public void doForRace(RaceContext context) { + progressCalculator.doForRace(context); result.add(context.getLiveRaceOrNull()); result.add(context.getFinishedRaceOrNull()); } public ResultWithTTL getResult() { + result.setProgress(progressCalculator.getResult()); return new ResultWithTTL<>(5000, result); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java index 188e5ab23ca..3c174a67224 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java @@ -5,6 +5,7 @@ import java.util.Collection; import java.util.TreeSet; import com.sap.sailing.gwt.ui.shared.dispatch.DTO; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; public class RaceListViewDTO implements DTO { @@ -13,6 +14,8 @@ public class RaceListViewDTO implements DTO { private TreeSet finishedRaces = new TreeSet<>(); + private RegattaProgressDTO progress; + public void add(LiveRaceDTO liveRace) { add(liveRaces, liveRace); } @@ -44,4 +47,12 @@ public class RaceListViewDTO implements DTO { } return Arrays.asList(withFleets, noFleets); } + + public RegattaProgressDTO getProgress() { + return progress; + } + + public void setProgress(RegattaProgressDTO progress) { + this.progress = progress; + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RegattaProgressCalculator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RegattaProgressCalculator.java new file mode 100644 index 00000000000..94a7c297c62 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RegattaProgressCalculator.java @@ -0,0 +1,67 @@ +package com.sap.sailing.gwt.ui.shared.dispatch.event; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; + +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressSeriesDTO; +import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; + +public class RegattaProgressCalculator implements EventActionUtil.RaceCallback { + private final Map> racesPerSeries = new LinkedHashMap<>(); + private final Map>> racesPerSeriesAndFleet = new HashMap<>(); + private final Map fleets = new HashMap<>(); + + @Override + public void doForRace(RaceContext context) { + String seriesName = context.getSeriesName(); + + Set racesInSeries = racesPerSeries.get(seriesName); + if(racesInSeries == null) { + racesInSeries = new HashSet<>(); + racesPerSeries.put(seriesName, racesInSeries); + } + String raceName = context.getRaceName(); + racesInSeries.add(raceName); + + Map> racesInSeriesAndFleet = racesPerSeriesAndFleet.get(seriesName); + if(racesInSeriesAndFleet == null) { + racesInSeriesAndFleet = new LinkedHashMap>(); + racesPerSeriesAndFleet.put(seriesName, racesInSeriesAndFleet); + } + String fleetName = context.getFleetName(); + Set racesInFleet = racesInSeriesAndFleet.get(fleetName); + if(racesInFleet == null) { + racesInFleet = new HashSet<>(); + racesInSeriesAndFleet.put(fleetName, racesInFleet); + } + if(context.isFinished()) { + racesInFleet.add(raceName); + } + + if(!fleets.containsKey(fleetName)) { + fleets.put(fleetName, context.getFleetMetadata()); + } + + } + + public RegattaProgressDTO getResult() { + RegattaProgressDTO progress = new RegattaProgressDTO(); + for(Map.Entry> racesInSeries : racesPerSeries.entrySet()) { + String seriesName = racesInSeries.getKey(); + int totalRaceCount = racesInSeries.getValue().size(); + RegattaProgressSeriesDTO regattaProgressOfSeries = new RegattaProgressSeriesDTO(seriesName, totalRaceCount); + for(Map.Entry> racesInFleet : racesPerSeriesAndFleet.get(seriesName).entrySet()) { + String fleetName = racesInFleet.getKey(); + int finishedRacesForFleet = racesInFleet.getValue().size(); + regattaProgressOfSeries.addFleet(fleets.get(fleetName), finishedRacesForFleet); + } + progress.addSeries(regattaProgressOfSeries); + } + return progress; + } + +} From b27c7b0777157458c154e7d284722f2f2b6797da Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 7 Jul 2015 14:00:36 +0200 Subject: [PATCH 045/219] Added RegattaWithProgressDTO to be used by the regatta list --- .../regatta/RegattaWithProgressDTO.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaWithProgressDTO.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaWithProgressDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaWithProgressDTO.java new file mode 100644 index 00000000000..c0ac4835a47 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaWithProgressDTO.java @@ -0,0 +1,20 @@ +package com.sap.sailing.gwt.ui.shared.dispatch.regatta; + +import com.sap.sailing.gwt.ui.shared.eventview.RegattaMetadataDTO; + +public class RegattaWithProgressDTO extends RegattaMetadataDTO { + private RegattaProgressDTO progress; + + @SuppressWarnings("unused") + private RegattaWithProgressDTO() { + } + + public RegattaWithProgressDTO(RegattaProgressDTO progress) { + super(); + this.progress = progress; + } + + public RegattaProgressDTO getProgress() { + return progress; + } +} From 6a28a1e0108f8af1600b481c57be945d9027d1d0 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 7 Jul 2015 15:40:35 +0200 Subject: [PATCH 046/219] Regatta list - Adjusted and extended RegattaHeader partial --- .../partials/regattaHeader/RegattaHeader.css | 79 ----------- .../partials/regattaHeader/RegattaHeader.gss | 127 ++++++++++++++++++ .../partials/regattaHeader/RegattaHeader.java | 29 ++-- .../regattaHeader/RegattaHeader.ui.xml | 49 +++---- .../regattaHeader/RegattaHeaderBody.java | 53 ++++++++ .../regattaHeader/RegattaHeaderBody.ui.xml | 79 +++-------- .../regattaHeader/RegattaHeaderResources.java | 11 +- 7 files changed, 250 insertions(+), 177 deletions(-) delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.css create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.gss create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.css b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.css deleted file mode 100644 index 9a134001372..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.css +++ /dev/null @@ -1,79 +0,0 @@ -/** - * The header of a regatta of an event - */ -.regattaheader { - font-size: 1rem; - margin-top: 2em; - padding: 0.666666666666667em; - overflow: hidden; - border-radius: 0.333333333333333em; - border: 1px solid #dedede; - background-color: #f2f2f2; -} -.regattaheaderlink { - display: block; - margin-top: 0; - border: none; - border-radius: 0; - color: #0a0a0a; -} -.regattaheader_logo { - float: left; - width: 4em; - height: 3.333333333333333em; - margin-right: 0.666666666666667em; - text-align: center; - line-height: 3.333333333333333em; - border-right: 1px solid #ccc; - padding-right: 0.666666666666667em; -} -.regattaheader_logo img { - display: inline-block; - text-align: center; - vertical-align: middle; -} -.regattaheader_content { - float: left; - width: 80%; - overflow: hidden; -} -.regattaheader_content_title { - font-size: 1.466666666666667em; - font-weight: 700; - height: 1.363636363636364em; - line-height: 1.363636363636364em; -} -.regattaheader_content_details { - height: 1.333333333333333em; -} -.regattaheader_content_details_item { - float: left; - font-size: 13px; - font-weight: 600; - color: #666; - padding: 0 0.666666666666667em; - border-right: 1px solid #ccc; -} -.regattaheader_content_details_item:first-of-type { - padding-left: 0; -} -.regattaheader_content_details_item:last-of-type { - border: none; - padding-right: 0; -} -.regattaheader_arrow { - float: right; - width: 5%; - line-height: 3.333333333333333em; - text-align: right; -} -.regattaheader_arrow:before { - content: ''; - display: inline-block; - margin-left: 0.333333333333333em; - width: 0.8em; - height: 1.333333333333333em; - background-image: url("../images/home/breadcrumb-arrow.png"); - background-size: contain; - background-repeat: no-repeat; -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.gss new file mode 100644 index 00000000000..9b0463f4391 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.gss @@ -0,0 +1,127 @@ +/** + * The header of a regatta of an event + */ +.regattaheader { + width: 100%; + float: left; + font-size: 1rem; + padding: 0.666666666666667em; + padding-right: 1em; + overflow: hidden; + color: #0a0a0a; + background-color: #f2f2f2; + border-bottom: 1px solid #ddd; +} +.regattaheaderpadding { + padding-right: 5em; +} +.regattaheader_logo { + float: left; + width: 3.333333333333333em; + height: 3.333333333333333em; + text-align: center; + line-height: 3.333333333333333em; + background-size: contain; + background-position: center; + background-repeat: no-repeat; + -webkit-filter: grayscale(100%); + filter: grayscale(100%); +} +.regattaheader_logo img { + display: inline-block; + text-align: center; + vertical-align: middle; +} +.regattaheader_content { + float: left; + width: 60%; + overflow: hidden; + border-left: 1px solid #ccc; + margin-left: 0.666666666666667em; + padding-left: 1em; +} +.regattaheader_content_title { + font-size: 1.466666666666667em; + font-weight: 700; + height: 1.363636363636364em; + line-height: 1.363636363636364em; +} +.regattaheader_content_details { + height: 1.333333333333333em; +} +.regattaheader_content_details_item { + float: left; + font-size: 13px; + font-weight: 600; + color: #666; + padding: 0 0.666666666666667em; + border-right: 1px solid #ccc; +} +.regattaheader_content_details_item:first-of-type { + padding-left: 0; +} +.regattaheader_content_details_item:last-of-type { + border: none; + padding-right: 0; +} +.regattaheader_toggle { + float: right; + width: 4em; + cursor: pointer; + margin: 0.666666666666667em 0 0.666666666666667em -4em; + line-height: 3.333333333333333em; + text-align: center; + padding: 0 0.666666666666667em; + border-left: 1px solid #ccc; +} +.regattaheader_toggle_icon { + padding: 1em 0; + width: 1.333333333333333em; + height: 1.333333333333333em; + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.standings_listhidden .regattaheader_toggle_icon { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); +} +.regattaheader_arrow { + position: absolute; + top: 0; + right: 0; + bottom: 0; + text-align: right; + padding: 0.666666666666667em; + padding-right: 4.666666666666667em; + background-image: url("images/home/arrow-down-grey.png"); + background-size: 1.333333333333333em 1.333333333333333em; + background-position: center; + background-repeat: no-repeat; + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.regattaheader_update { + width: 20%; + float: right; + padding: 0.533333333333333em 0; + text-align: right; + font-weight: 600; + color: #666; +} +.regattaheader_update_title { + text-transform: uppercase; +} +img.regattaheader_update_title_icon { + height: 1.2em; + margin-right: 0.333333333333333em; + vertical-align: bottom; +} +.regattaheader_update_timestamp { + font-size: 12px; +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java index 50e553081e1..be0bda4eb76 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java @@ -1,26 +1,33 @@ package com.sap.sailing.gwt.home.client.place.event.partials.regattaHeader; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.AnchorElement; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.shared.eventview.RegattaReferenceDTO; +import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; +import com.sap.sailing.gwt.ui.shared.eventview.RegattaMetadataDTO; public class RegattaHeader extends Composite { - private static EventHeaderUiBinder uiBinder = GWT.create(EventHeaderUiBinder.class); - interface EventHeaderUiBinder extends UiBinder { + private static RegattaHeaderUiBinder uiBinder = GWT.create(RegattaHeaderUiBinder.class); + + interface RegattaHeaderUiBinder extends UiBinder { } - @UiField StringMessages i18n; - - - public RegattaHeader(RegattaReferenceDTO regattaRefDTO) { - - RegattaHeaderResources.INSTANCE.css().ensureInjected(); + @UiField protected AnchorElement headerBodyUi; + @UiField protected AnchorElement headerArrowUi; + + public RegattaHeader(RegattaMetadataDTO regattaMetadata, PlaceNavigation placeNavigation) { initWidget(uiBinder.createAndBindUi(this)); + headerBodyUi.appendChild(new RegattaHeaderBody(regattaMetadata).getElement()); + initNavigation(placeNavigation); } - + + private void initNavigation(PlaceNavigation placeNavigation) { + placeNavigation.configureAnchorElement(headerBodyUi); + placeNavigation.configureAnchorElement(headerArrowUi); + } + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.ui.xml index 1304c8dd297..9facc856539 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.ui.xml @@ -1,30 +1,23 @@ - - - - - - - -
-
-
- - - - - - -
-
-
- -
-
-
-
+ + + + + +
+
+
+ + + + + + + + +
+
+
+
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java new file mode 100644 index 00000000000..7d34bd41f2e --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java @@ -0,0 +1,53 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.regattaHeader; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.SpanElement; +import com.google.gwt.resources.client.ImageResource; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.ui.UIObject; +import com.sap.sailing.gwt.common.client.BoatClassImageResolver; +import com.sap.sailing.gwt.home.client.shared.LabelTypeUtil; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.eventview.RegattaMetadataDTO; + +public class RegattaHeaderBody extends UIObject { + + private static RegattaHeaderBodyUiBinder uiBinder = GWT.create(RegattaHeaderBodyUiBinder.class); + + interface RegattaHeaderBodyUiBinder extends UiBinder { + } + + @UiField protected DivElement logoUi; + @UiField protected SpanElement nameUi; + @UiField protected DivElement labelUi; + @UiField protected DivElement detailsItemContainerUi; + + public RegattaHeaderBody(RegattaMetadataDTO regattaMetadata) { + RegattaHeaderResources.INSTANCE.css().ensureInjected(); + setElement(uiBinder.createAndBindUi(this)); + ImageResource logo = BoatClassImageResolver.getBoatClassIconResource(regattaMetadata.getBoatClass()); + logoUi.getStyle().setBackgroundImage("url('" + logo.getSafeUri().asString() + "')"); + nameUi.setInnerText(regattaMetadata.getDisplayName()); + LabelTypeUtil.renderLabelTypeOrHide(labelUi, regattaMetadata.getState().getStateMarker()); + addDetailsItem(regattaMetadata.getCompetitorsCount(), StringMessages.INSTANCE.competitors()); + addDetailsItem(regattaMetadata.getRaceCount(), StringMessages.INSTANCE.races()); + addDetailsItem(regattaMetadata.getTrackedRacesCount(), StringMessages.INSTANCE.trackedRaces()); + addDetailsItem(regattaMetadata.getBoatCategory()); + } + + private void addDetailsItem(int count, String text) { + addDetailsItem(count + " " + text); + } + + private void addDetailsItem(String text) { + DivElement detailsItem = DOM.createDiv().cast(); + detailsItem.addClassName(RegattaHeaderResources.INSTANCE.css().regattaheader_content_details_item()); + detailsItem.setInnerText(text); + detailsItemContainerUi.appendChild(detailsItem); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.ui.xml index dac8b67d8b1..c901052f007 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.ui.xml @@ -1,59 +1,24 @@ - - - - - - - -
- -
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- -
-
-
- - -
-
- - -
-
- - -
-
- -
-
-
-
+ + + + +
+
+
+
+ +
+
+
+ +
+
+ +
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderResources.java index 5234b07d59b..30dd5cf7f89 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderResources.java @@ -7,17 +7,24 @@ import com.google.gwt.resources.client.CssResource; public interface RegattaHeaderResources extends ClientBundle { public static final RegattaHeaderResources INSTANCE = GWT.create(RegattaHeaderResources.class); - @Source("RegattaHeader.css") + @Source("RegattaHeader.gss") LocalCss css(); public interface LocalCss extends CssResource { String regattaheader(); - String regattaheaderlink(); + String regattaheaderpadding(); String regattaheader_logo(); String regattaheader_content(); String regattaheader_content_title(); String regattaheader_content_details(); String regattaheader_content_details_item(); + String regattaheader_toggle(); + String regattaheader_toggle_icon(); + String standings_listhidden(); String regattaheader_arrow(); + String regattaheader_update(); + String regattaheader_update_title(); + String regattaheader_update_title_icon(); + String regattaheader_update_timestamp(); } } From ed68177fc5d718438e2b502cd14ad539e319a0dd Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 7 Jul 2015 16:44:03 +0200 Subject: [PATCH 047/219] First implementation for an action to load the regatta list data --- .../event/GetRegattaListViewAction.java | 38 +++++++++++++++++++ .../dispatch/event/LeaderboardContext.java | 10 ++++- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattaListViewAction.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattaListViewAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattaListViewAction.java new file mode 100644 index 00000000000..0751bf6d392 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattaListViewAction.java @@ -0,0 +1,38 @@ +package com.sap.sailing.gwt.ui.shared.dispatch.event; + +import java.util.LinkedList; +import java.util.List; +import java.util.UUID; + +import com.google.gwt.core.shared.GwtIncompatible; +import com.sap.sailing.gwt.ui.shared.dispatch.Action; +import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContext; +import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; +import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; +import com.sap.sailing.gwt.ui.shared.dispatch.event.EventActionUtil.LeaderboardCallback; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; + +public class GetRegattaListViewAction implements Action>> { + private UUID eventId; + + @SuppressWarnings("unused") + private GetRegattaListViewAction() { + } + + public GetRegattaListViewAction(UUID eventId) { + this.eventId = eventId; + } + + @Override + @GwtIncompatible + public ResultWithTTL> execute(final DispatchContext context) { + final List result = new LinkedList<>(); + EventActionUtil.forLeaderboardsOfEvent(context, eventId, new LeaderboardCallback() { + @Override + public void doForLeaderboard(LeaderboardContext leaderboardContext) { + result.add(leaderboardContext.getRegattaWithProgress(context)); + } + }); + return new ResultWithTTL<>(5 * 1000, new SortedSetResult<>(result)); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LeaderboardContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LeaderboardContext.java index 68b680e62f8..5698a15711e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LeaderboardContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LeaderboardContext.java @@ -5,13 +5,14 @@ import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; +import com.sap.sailing.gwt.server.HomeServiceUtil; import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContext; import com.sap.sailing.gwt.ui.shared.dispatch.event.EventActionUtil.RaceCallback; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; public class LeaderboardContext { private final Event event; - @SuppressWarnings("unused") private final LeaderboardGroup leaderboardGroup; private final Leaderboard leaderboard; @@ -29,4 +30,11 @@ public class LeaderboardContext { } } + public RegattaWithProgressDTO getRegattaWithProgress(DispatchContext context) { + RegattaProgressCalculator regattaProgressCalculator = new RegattaProgressCalculator(); + forRaces(context, regattaProgressCalculator); + RegattaWithProgressDTO regattaDTO = new RegattaWithProgressDTO(regattaProgressCalculator.getResult()); + HomeServiceUtil.fillRegattaFields(leaderboardGroup, leaderboard, regattaDTO); + return regattaDTO; + } } From 945f95abfbb083887285552841ffa4c2c66d5fbd Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 7 Jul 2015 18:03:58 +0200 Subject: [PATCH 048/219] Regatta list - Adjusted RegattaHeader partial --- .../event/partials/regattaHeader/RegattaHeader.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java index be0bda4eb76..f27c79068fd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java @@ -16,16 +16,15 @@ public class RegattaHeader extends Composite { interface RegattaHeaderUiBinder extends UiBinder { } - @UiField protected AnchorElement headerBodyUi; - @UiField protected AnchorElement headerArrowUi; + @UiField AnchorElement headerBodyUi; + @UiField AnchorElement headerArrowUi; - public RegattaHeader(RegattaMetadataDTO regattaMetadata, PlaceNavigation placeNavigation) { + public RegattaHeader(RegattaMetadataDTO regattaMetadata) { initWidget(uiBinder.createAndBindUi(this)); headerBodyUi.appendChild(new RegattaHeaderBody(regattaMetadata).getElement()); - initNavigation(placeNavigation); } - private void initNavigation(PlaceNavigation placeNavigation) { + public void setRegattaNavigation(PlaceNavigation placeNavigation) { placeNavigation.configureAnchorElement(headerBodyUi); placeNavigation.configureAnchorElement(headerArrowUi); } From 4e696dd68866d60236adc95047abdebc2174fb8c Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 7 Jul 2015 18:04:27 +0200 Subject: [PATCH 049/219] Regatta list - Added MultiRegattaList partial --- .../multiRegattaList/MultiRegattaList.gss | 262 ++++++++++++++++++ .../MultiRegattaListItem.java | 30 ++ .../MultiRegattaListItem.ui.xml | 18 ++ .../MultiRegattaListResources.java | 55 ++++ .../MultiRegattaListSteps.java | 37 +++ .../MultiRegattaListSteps.ui.xml | 19 ++ .../MultiRegattaListStepsBody.java | 39 +++ .../MultiRegattaListStepsBody.ui.xml | 9 + 8 files changed, 469 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.ui.xml create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListResources.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.ui.xml create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss new file mode 100644 index 00000000000..299ed974043 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss @@ -0,0 +1,262 @@ +/** + * A list of regattas to an event + */ +.race { + color: #333; + font-size: 1rem; + overflow: hidden; +} +.race:last-of-type .race_item { + border: none; +} +.race_fleetcorner { + width: 1em; + vertical-align: top; + border-bottom: 1px solid #ebebeb; +} +.race_fleetcorner_icon { + width: 1em; + margin-right: -2.333333333333333em; + position: relative; + top: 1px; + left: 1px; + border-style: solid; + border-color: transparent; + border-width: 1em 1em 0 0; +} +.race_item { + text-align: left; + vertical-align: baseline; + border-bottom: 1px solid #ebebeb; + white-space: nowrap; + padding: 1.4em 0.666666666666667em 0.733333333333333em 1.333333333333333em; +} +.race_item .button { + white-space: nowrap; +} +.race_item:first-of-type { + padding-left: 2em; +} +.race_itemrank:after { + content: '.'; +} +.race_itemshort { + width: 5em; +} +.race_itemlong { + width: 32.5%; +} +.race_itemwind { + white-space: nowrap; +} +.race_itemwindflag { + padding: 1.066666666666667em 0.666666666666667em 0.4em 1.333333333333333em; +} +img.race_item_windflag { + max-width: 2.4em; + max-height: 2.4em; + vertical-align: middle; +} +.race_itemname { + font-weight: 600; +} +.race_itemwinner { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + vertical-align: middle; + min-width: 13.333333333333334em; + max-width: 16.666666666666668em; +} +.race_item_flag { + max-width: 1.6em; + max-height: 1.6em; + vertical-align: middle; +} +.race_item_position { + margin-right: 0.333333333333333em; +} +.race_item_winner { + margin-left: 5px; + vertical-align: middle; +} +.race_itemwinner { + padding: 0.733333333333333em 1.333333333333333em; +} +.race_itemcenter { + text-align: center; +} +.race_itemright { + text-align: right; + vertical-align: middle; + padding-left: 0; + padding-right: 0.666666666666667em; + padding-top: 0.666666666666667em; +} +.race_itemright_button { + padding: 0.666666666666667em; +} +.race_itemstatus { + position: relative; +} +.race_itemstatus:first-letter { + text-transform: capitalize; +} +.race_itemstatus_container { + min-width: 5.333333333333333em; + display: inline-block; +} +.race_itemstatus_container_text { + clip: auto; +} +.race_itemstatus_container_progressbar { + height: 0.2em; + position: relative; + top: 0.2em; + width: 100%; + background-color: #dedede; +} +.race_itemstatus_container_progressbar_progress { + height: 100%; + background-color: #efaa00; +} +.racewinners .race_item { + padding: 1.2em 0.666666666666667em 1.2em 1.333333333333333em; +} +.racewinners .race_item:nth-last-child(1) { + display: none; +} +@media (min-width: 61em) { + .racewinners .race_item:nth-last-child(1) { + display: inline-block; + } +} +.racewinners .race_itemname { + vertical-align: middle; +} +.race_fleetcornerblue:before { + border-top-color: #00f; +} +.race_fleetcornerred:before { + border-top-color: #f00; +} +.race_fleetcornersilver:before { + border-top-color: #c0c0c0; +} +.race_fleetcornergold:before { + border-top-color: #ffd700; +} +.race_fleetcorneryellow:before { + border-top-color: #ff0; +} +.regattalistitem { + font-size: 1rem; + float: left; + width: 100%; + margin-top: 2em; + border: 1px solid #ddd; + border-radius: 0.333333333333333em; + overflow: hidden; +} +.regattalistitem div:last-child { + border-bottom: none; +} +.regattalistitem_table { + width: 100%; + border-spacing: 0; + border-collapse: separate; + border-bottom: 1px solid #ddd; +} +.regattalistitem_table:last-of-type { + border-bottom: none; +} +.regattalistitem_tableborderTop { + border-top: 1px solid #ebebeb; +} +.regattalistitem_steps { + border-bottom: 1px solid #ddd; + overflow: hidden; +} +.regattalistitem_steps_step { + float: left; + position: relative; + height: 4em; + line-height: 4em; + text-transform: uppercase; + padding: 0 0.666666666666667em 0 1.333333333333333em; +} +.regattalistitem_steps_stepinactive { + color: #ddd; +} +.regattalistitem_steps_step:first-of-type { + padding-left: 2em; +} +.regattalistitem_steps_step_check { + display: inline-block; + vertical-align: middle; + width: 2.133333333333333em; + height: 2.133333333333333em; + margin-left: -0.333333333333333em; + background-image: url("../images/home/icon/icon-green-check.png"); + background-repeat: no-repeat; + background-size: contain; +} +.regattalistitem_steps_step_text { + margin-right: 2.4em; + display: inline-block; + font-size: 0; +} +.regattalistitem_steps_step_text::first-letter { + font-size: 1rem; + padding-right: 2.666666666666667em; +} +@media (min-width: 49.0625em) { + .regattalistitem_steps_step_text { + font-size: 1em; + } + .regattalistitem_steps_step_text::first-letter { + padding-right: 0; + } +} +.regattalistitem_steps_step_count { + position: absolute; + top: 50%; + right: 1.333333333333333em; + font-size: 0.8em; + line-height: 1.6em; + width: 1.6em; + height: 1.6em; + text-align: center; + background-color: #eee; + border: 1px solid #ddd; + border-radius: 0.2em; + -webkit-transform: translateY(-50%); + -moz-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); +} +.regattalistitem_steps_step:after { + content: ''; + position: absolute; + top: 0.333333333333333em; + left: 100%; + display: block; + width: 3.333333333333333em; + height: 3.333333333333333em; + margin-left: -3.333333333333333em; + border: 1px solid transparent; + border-top-color: #ddd; + border-right-color: #ddd; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); +} +.regattalistitem_steps_button { + height: 100%; + padding: 0.666666666666667em; + text-align: right; +} +.regattalistitem_steps_button .button { + margin-left: 0.8em; +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java new file mode 100644 index 00000000000..2ba1636a2ca --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java @@ -0,0 +1,30 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.home.client.place.event.multiregatta.EventMultiregattaView.Presenter; +import com.sap.sailing.gwt.home.client.place.event.partials.regattaHeader.RegattaHeader; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; + +public class MultiRegattaListItem extends Composite { + + private static MultiRegattaListItemUiBinder uiBinder = GWT.create(MultiRegattaListItemUiBinder.class); + + interface MultiRegattaListItemUiBinder extends UiBinder { + } + + @UiField(provided = true) RegattaHeader regattaHeaderUi; + @UiField(provided = true) MultiRegattaListSteps regattaStepsUi; + + public MultiRegattaListItem(RegattaWithProgressDTO regattaWithProgress, Presenter presenter) { + MultiRegattaListResources.INSTANCE.css().ensureInjected(); + regattaHeaderUi = new RegattaHeader(regattaWithProgress); + regattaStepsUi = new MultiRegattaListSteps(regattaWithProgress.getProgress()); + initWidget(uiBinder.createAndBindUi(this)); + regattaHeaderUi.setRegattaNavigation(presenter.getRegattaNavigation(regattaWithProgress.getId())); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.ui.xml new file mode 100644 index 00000000000..0b6bf8c1799 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.ui.xml @@ -0,0 +1,18 @@ + + + + + + +
+ + + +
+
+
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListResources.java new file mode 100644 index 00000000000..8a324a508b7 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListResources.java @@ -0,0 +1,55 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; + +public interface MultiRegattaListResources extends ClientBundle { + public static final MultiRegattaListResources INSTANCE = GWT.create(MultiRegattaListResources.class); + + @Source("MultiRegattaList.gss") + LocalCss css(); + + public interface LocalCss extends CssResource { + String race(); + String race_item(); + String race_fleetcorner(); + String race_fleetcorner_icon(); + String button(); + String race_itemrank(); + String race_itemshort(); + String race_itemlong(); + String race_itemwind(); + String race_itemwindflag(); + String race_item_windflag(); + String race_itemname(); + String race_itemwinner(); + String race_item_flag(); + String race_item_position(); + String race_item_winner(); + String race_itemcenter(); + String race_itemright(); + String race_itemright_button(); + String race_itemstatus(); + String race_itemstatus_container(); + String race_itemstatus_container_text(); + String race_itemstatus_container_progressbar(); + String race_itemstatus_container_progressbar_progress(); + String racewinners(); + String race_fleetcornerblue(); + String race_fleetcornerred(); + String race_fleetcornersilver(); + String race_fleetcornergold(); + String race_fleetcorneryellow(); + String regattalistitem(); + String regattalistitem_table(); + String regattalistitem_tableborderTop(); + String regattalistitem_steps(); + String regattalistitem_steps_step(); + String regattalistitem_steps_stepinactive(); + String regattalistitem_steps_step_check(); + String regattalistitem_steps_step_text(); + String regattalistitem_steps_step_count(); + String regattalistitem_steps_button(); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java new file mode 100644 index 00000000000..ad885977a93 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java @@ -0,0 +1,37 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.AnchorElement; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.home.shared.app.PlaceNavigation; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressSeriesDTO; + +public class MultiRegattaListSteps extends Composite { + + private static MultiRegattaListStepsUiBinder uiBinder = GWT.create(MultiRegattaListStepsUiBinder.class); + + interface MultiRegattaListStepsUiBinder extends UiBinder { + } + + @UiField DivElement stepsContainerUi; + @UiField DivElement leaderboardButtonContainerUi; + @UiField AnchorElement leaderboardButtonUi; + + public MultiRegattaListSteps(RegattaProgressDTO regattaProgress) { + initWidget(uiBinder.createAndBindUi(this)); + for(RegattaProgressSeriesDTO seriesProgress : regattaProgress.getSeries()) { + stepsContainerUi.insertBefore(new MultiRegattaListStepsBody(seriesProgress).getElement(), leaderboardButtonContainerUi); + } + } + + void setLeaderboardNavigation(PlaceNavigation placeNavigation) { + placeNavigation.configureAnchorElement(leaderboardButtonUi); + leaderboardButtonUi.getStyle().clearDisplay(); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.ui.xml new file mode 100644 index 00000000000..81a1bffef6d --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.ui.xml @@ -0,0 +1,19 @@ + + + + + + +
+ +
+ +
+
+
+
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java new file mode 100644 index 00000000000..5a3277c1eea --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java @@ -0,0 +1,39 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList; + +import java.util.Map.Entry; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.dom.client.Element; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.ui.UIObject; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressSeriesDTO; +import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; + +public class MultiRegattaListStepsBody extends UIObject { + + private static MultiRegattaListStepsBodyUiBinder uiBinder = GWT.create(MultiRegattaListStepsBodyUiBinder.class); + + interface MultiRegattaListStepsBodyUiBinder extends UiBinder { + } + + public MultiRegattaListStepsBody(RegattaProgressSeriesDTO seriesProgress) { + Element main = uiBinder.createAndBindUi(this); + main.appendChild(getDetailsItem(seriesProgress.getName())); + main.appendChild(getDetailsItem("Race count:" + seriesProgress.getTotalRaceCount())); + for (Entry fleetState : seriesProgress.getFleetState().entrySet()) { + DivElement div = getDetailsItem(fleetState.getKey().getFleetName() + " - " + fleetState.getValue()); + div.getStyle().setColor(fleetState.getKey().getFleetColor()); + main.appendChild(div); + } + setElement(main); + } + + private DivElement getDetailsItem(String text) { + DivElement detailsItem = DOM.createDiv().cast(); + detailsItem.setInnerText(text); + return detailsItem; + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml new file mode 100644 index 00000000000..f8711f59d8f --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml @@ -0,0 +1,9 @@ + + + + + +
+
+
\ No newline at end of file From 893c06cb3e0fb5eb27ec6624efc4906617c1aa35 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 7 Jul 2015 18:04:49 +0200 Subject: [PATCH 050/219] Regatta list - First integration of MultiRegattaList partial --- .../tabs/MultiregattaRegattasTabView.java | 71 ++++++------------- .../tabs/MultiregattaRegattasTabView.ui.xml | 2 +- 2 files changed, 22 insertions(+), 51 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java index 9d2ef2fee2d..b3fde2937e2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java @@ -1,8 +1,6 @@ package com.sap.sailing.gwt.home.client.place.event.multiregatta.tabs; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.UUID; import com.google.gwt.core.client.GWT; import com.google.gwt.uibinder.client.UiBinder; @@ -10,28 +8,28 @@ import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTMLPanel; -import com.google.gwt.user.client.ui.SimplePanel; import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.home.client.place.event.multiregatta.EventMultiregattaView; import com.sap.sailing.gwt.home.client.place.event.multiregatta.EventMultiregattaView.Presenter; import com.sap.sailing.gwt.home.client.place.event.multiregatta.MultiregattaTabView; -import com.sap.sailing.gwt.home.client.place.event.partials.eventregatta.EventRegattaList; +import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaListItem; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshManager; -import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; -import com.sap.sailing.gwt.ui.shared.RaceGroupDTO; -import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; +import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetLiveRacesForEventAction; -import com.sap.sse.common.Util.Triple; +import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRegattaListViewAction; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; /** * Created by pgtaboada on 25.11.14. */ public class MultiregattaRegattasTabView extends Composite implements MultiregattaTabView { - @UiField SimplePanel content; @UiField(provided = true) RacesListLive racesListLive; + @UiField FlowPanel regattasContainerUi; private Presenter currentPresenter; public MultiregattaRegattasTabView() { @@ -61,47 +59,20 @@ public class MultiregattaRegattasTabView extends Composite implements Multiregat refreshManager.add(racesListLive, new GetLiveRacesForEventAction(currentPresenter.getCtx().getEventDTO().getId())); contentArea.setWidget(this); - // TODO: understand, and than move this into appropiate place (probably context) - currentPresenter.ensureRegattaStructure(new AsyncCallback>() { - @Override - public void onSuccess(List raceGroups) { - if (raceGroups.size() > 0) { - initView(); - } else { - // createEventWithoutRegattasView(event, panel); - } - } - - @Override - public void onFailure(Throwable caught) { - // createErrorView( - // "Error while loading the regatta structure with service getRegattaStructureOfEvent()", - // caught, panel); - } - }); - } - - protected void initView() { - Map> regattaStructure = getRegattaStructure(); - EventRegattaList eventRegattaList = new EventRegattaList(regattaStructure, currentPresenter); - content.setWidget(eventRegattaList); - } - - private Map> getRegattaStructure() { - Map> result = new HashMap<>(); - Map raceGroupsMap = new HashMap<>(); - for (RaceGroupDTO raceGroup: currentPresenter.getCtx().getRaceGroups()) { - raceGroupsMap.put(raceGroup.getName(), raceGroup); - } - - for (LeaderboardGroupDTO leaderboardGroup : currentPresenter.getCtx().getLeaderboardGroups()) { - for(StrippedLeaderboardDTO leaderboard: leaderboardGroup.getLeaderboards()) { - String leaderboardName = leaderboard.name; - result.put(leaderboardName, new Triple(raceGroupsMap.get(leaderboardName), - leaderboard, leaderboardGroup)); + UUID eventId = currentPresenter.getCtx().getEventDTO().getId(); + currentPresenter.getDispatch().execute(new GetRegattaListViewAction(eventId), new AsyncCallback>>() { + @Override + public void onFailure(Throwable caught) { } - } - return result; + + @Override + public void onSuccess(ResultWithTTL> result) { + regattasContainerUi.clear(); + for (RegattaWithProgressDTO regattaWithProgress : result.getDto().getValues()) { + regattasContainerUi.add(new MultiRegattaListItem(regattaWithProgress, currentPresenter)); + } + } + }); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml index 581f562df2b..b15bb613bf8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml @@ -12,8 +12,8 @@
+
-
\ No newline at end of file From d4f299c702a2ddb708436c9db21d9c9d43f547cf Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 8 Jul 2015 14:12:22 +0200 Subject: [PATCH 051/219] Live Races list - Fixed possible NPE if there are no live races --- .../place/event/partials/raceListLive/RacesListLive.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java index b9ec1d99169..d8f5e795bda 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java @@ -1,6 +1,7 @@ package com.sap.sailing.gwt.home.client.place.event.partials.raceListLive; import java.util.Collection; +import java.util.Collections; import com.google.gwt.dom.client.Style.Display; import com.google.gwt.user.client.ui.Composite; @@ -27,7 +28,7 @@ public class RacesListLive extends Composite implements RefreshableWidget data, long nextUpdate, int updateNo) { - this.setListData(data.getValues()); + this.setListData(data == null ? Collections.emptySet() : data.getValues()); } public void setListData(Collection data) { From 2231b16665ccb21c9916b4237d5a8637f8f95dab Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 8 Jul 2015 14:15:20 +0200 Subject: [PATCH 052/219] Regatta list - Added Leaderboard navigation link --- .../event/partials/multiRegattaList/MultiRegattaListItem.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java index 2ba1636a2ca..682a63c31c4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java @@ -25,6 +25,7 @@ public class MultiRegattaListItem extends Composite { regattaStepsUi = new MultiRegattaListSteps(regattaWithProgress.getProgress()); initWidget(uiBinder.createAndBindUi(this)); regattaHeaderUi.setRegattaNavigation(presenter.getRegattaNavigation(regattaWithProgress.getId())); + regattaStepsUi.setLeaderboardNavigation(presenter.getRegattaLeaderboardNavigation(regattaWithProgress.getId())); } } From d149c2bc4cdaa2ed24511b3abd09c261cb55f6b4 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 8 Jul 2015 14:16:01 +0200 Subject: [PATCH 053/219] Regatta list - Wrapped Regatta list in its own widget --- .../tabs/MultiregattaRegattasTabView.java | 35 +++------------ .../tabs/MultiregattaRegattasTabView.ui.xml | 6 +-- .../multiRegattaList/MultiRegattaList.java | 44 +++++++++++++++++++ .../multiRegattaList/MultiRegattaList.ui.xml | 9 ++++ 4 files changed, 63 insertions(+), 31 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.ui.xml diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java index b3fde2937e2..90548ecf0c7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java @@ -1,35 +1,28 @@ package com.sap.sailing.gwt.home.client.place.event.multiregatta.tabs; -import java.util.UUID; - import com.google.gwt.core.client.GWT; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTMLPanel; import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.home.client.place.event.multiregatta.EventMultiregattaView; import com.sap.sailing.gwt.home.client.place.event.multiregatta.EventMultiregattaView.Presenter; import com.sap.sailing.gwt.home.client.place.event.multiregatta.MultiregattaTabView; -import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaListItem; +import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaList; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshManager; -import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; -import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetLiveRacesForEventAction; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRegattaListViewAction; -import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; /** * Created by pgtaboada on 25.11.14. */ public class MultiregattaRegattasTabView extends Composite implements MultiregattaTabView { - @UiField(provided = true) RacesListLive racesListLive; - @UiField FlowPanel regattasContainerUi; + @UiField(provided = true) RacesListLive racesListLiveUi; + @UiField(provided = true) MultiRegattaList regattaListUi; private Presenter currentPresenter; public MultiregattaRegattasTabView() { @@ -53,31 +46,17 @@ public class MultiregattaRegattasTabView extends Composite implements Multiregat @Override public void start(final MultiregattaRegattasPlace myPlace, final AcceptsOneWidget contentArea) { - racesListLive = new RacesListLive(currentPresenter, true); + racesListLiveUi = new RacesListLive(currentPresenter, true); + regattaListUi = new MultiRegattaList(currentPresenter); initWidget(ourUiBinder.createAndBindUi(this)); RefreshManager refreshManager = new RefreshManager(this, currentPresenter.getDispatch()); - refreshManager.add(racesListLive, new GetLiveRacesForEventAction(currentPresenter.getCtx().getEventDTO().getId())); + refreshManager.add(racesListLiveUi, new GetLiveRacesForEventAction(currentPresenter.getCtx().getEventDTO().getId())); + refreshManager.add(regattaListUi, new GetRegattaListViewAction(currentPresenter.getCtx().getEventDTO().getId())); contentArea.setWidget(this); - - UUID eventId = currentPresenter.getCtx().getEventDTO().getId(); - currentPresenter.getDispatch().execute(new GetRegattaListViewAction(eventId), new AsyncCallback>>() { - @Override - public void onFailure(Throwable caught) { - } - - @Override - public void onSuccess(ResultWithTTL> result) { - regattasContainerUi.clear(); - for (RegattaWithProgressDTO regattaWithProgress : result.getDto().getValues()) { - regattasContainerUi.add(new MultiRegattaListItem(regattaWithProgress, currentPresenter)); - } - } - }); } @Override public void stop() { - } interface MyBinder extends UiBinder { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml index b15bb613bf8..09fecde6023 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml @@ -1,6 +1,6 @@ + xmlns:p="urn:import:com.sap.sailing.gwt.home.client.place.event.partials"> .space-top { @@ -11,8 +11,8 @@
- - + +
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.java new file mode 100644 index 00000000000..31c488b3414 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.java @@ -0,0 +1,44 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList; + +import java.util.Collection; +import java.util.Collections; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.home.client.place.event.multiregatta.EventMultiregattaView.Presenter; +import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; +import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; + +public class MultiRegattaList extends Composite implements RefreshableWidget> { + + private static MultiRegattaListUiBinder uiBinder = GWT.create(MultiRegattaListUiBinder.class); + + interface MultiRegattaListUiBinder extends UiBinder { + } + + @UiField FlowPanel regattasContainerUi; + private final Presenter currentPresenter; + + public MultiRegattaList(Presenter presenter) { + this.currentPresenter = presenter; + initWidget(uiBinder.createAndBindUi(this)); + } + + @Override + public void setData(SortedSetResult data, long nextUpdate, int updateNo) { + this.setListData(data == null ? Collections.emptySet() : data.getValues()); + } + + public void setListData(Collection data) { + regattasContainerUi.clear(); + for (RegattaWithProgressDTO regattaWithProgress : data) { + regattasContainerUi.add(new MultiRegattaListItem(regattaWithProgress, currentPresenter)); + } + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.ui.xml new file mode 100644 index 00000000000..89467cba98b --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.ui.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file From 6c3336c987468165e9ca5ed0b25d56a457090e35 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 8 Jul 2015 14:16:34 +0200 Subject: [PATCH 054/219] Regatta list - Adjusted temporary regatta progress layout --- .../MultiRegattaListStepsBody.java | 21 ++++++++++++------- .../MultiRegattaListStepsBody.ui.xml | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java index 5a3277c1eea..6c2f2c685b8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java @@ -3,8 +3,10 @@ package com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList; import java.util.Map.Entry; import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.SpanElement; +import com.google.gwt.dom.client.Style.FontWeight; +import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.UIObject; @@ -20,18 +22,21 @@ public class MultiRegattaListStepsBody extends UIObject { public MultiRegattaListStepsBody(RegattaProgressSeriesDTO seriesProgress) { Element main = uiBinder.createAndBindUi(this); - main.appendChild(getDetailsItem(seriesProgress.getName())); - main.appendChild(getDetailsItem("Race count:" + seriesProgress.getTotalRaceCount())); + SpanElement nameElement = getDetailsItem(seriesProgress.getName()); + nameElement.getStyle().setFontWeight(FontWeight.BOLD); + main.appendChild(nameElement); + main.appendChild(getDetailsItem("Total - " + seriesProgress.getTotalRaceCount())); for (Entry fleetState : seriesProgress.getFleetState().entrySet()) { - DivElement div = getDetailsItem(fleetState.getKey().getFleetName() + " - " + fleetState.getValue()); - div.getStyle().setColor(fleetState.getKey().getFleetColor()); - main.appendChild(div); + SpanElement element = getDetailsItem(fleetState.getKey().getFleetName() + " - " + fleetState.getValue()); + element.getStyle().setColor(fleetState.getKey().getFleetColor()); + main.appendChild(element); } setElement(main); } - private DivElement getDetailsItem(String text) { - DivElement detailsItem = DOM.createDiv().cast(); + private SpanElement getDetailsItem(String text) { + SpanElement detailsItem = DOM.createSpan().cast(); + detailsItem.getStyle().setPaddingRight(0.75, Unit.EM); detailsItem.setInnerText(text); return detailsItem; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml index f8711f59d8f..9a0a5fc09d6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml @@ -4,6 +4,6 @@ -
+
\ No newline at end of file From dd0fe3ef7c6d5430cdccdb706d2f3164b3dca60e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 8 Jul 2015 16:07:10 +0200 Subject: [PATCH 055/219] cloned RaceBoard entry point, making it EmbeddedMapAndWindChart --- .../EmbeddedMapAndWindChart.css | 694 ++++++++++++++++++ .../EmbeddedMapAndWindChart.html | 46 ++ ...WT Remote Profiling (Run-Mode only).launch | 2 +- .../SailingGWT sdm.launch | 1 + java/com.sap.sailing.gwt.ui/pom.xml | 1 + .../ui/client/shared/charts/WindChart.java | 5 +- .../ui/raceboard/EmbeddedMapAndWindChart.java | 256 +++++++ 7 files changed, 1003 insertions(+), 2 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.css create mode 100644 java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChart.java diff --git a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.css b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.css new file mode 100644 index 00000000000..62ba67e0fa7 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.css @@ -0,0 +1,694 @@ +/** Add css rules here for your application. */ +/* + body #calendar:after + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; +*/ + + + * { + font-family: 'Open Sans', sans-serif; + font-size: 12px; +} + + +iframe { + display: block; + width: 100%; + height: 100%; + border: none; + overflow-y: auto; + overflow-x: hidden; +} + +.clear { + clear: both; + font-size: 1px; + height: 0px; + line-height: 0px; + margin: -1px 0 0; + width: 100%; +} + +.cover { + left: -1000px; + overflow: hidden; + position: absolute; + top: -1000px; +} + +body { + background: white; + font-family: 'Open Sans', Arial, Verdana, sans-serif; + line-height: 1; + font-size: 14px; + font-weight: 400; + margin: 0; + +} + +table td, select, button { + font-family: 'Open Sans', Arial, Verdana, sans-serif; + line-height: 1; + font-size: 14px; +} + +.contentOuterPanel { + background: #dddcdc; + margin: 0 12px 0 12px; + padding: 12px; +} + + + +/** Example rules used by the template application (remove for your app) */ +h1 { + font-size: 2em; + font-family: 'Open Sans', Arial, Verdana, sans-serif; + font-weight: 700; + color: #777777; + margin: 40px 0px 70px; + text-align: center; +} + +table { + border-collapse: separate; +} + +.CombinedWindPanelParentDiv { + padding-top: 34px; + padding-left: 10px; +} + +.TrueNorthIndicatorPanelParentDiv { + padding-top: 10px; + padding-left: 10px; +} + +.MapSimulationLegendParentDiv { + padding-bottom: 10px; + padding-right: 10px; + pointer-events: none; +} + +.MapSimulationLegend { + pointer-events: all; +} + +.RaceMap-HeaderPanel { + height: 60px; + width: 100%; + background-color: #333; + opacity: .5; +} + +.leaderboardLabel { + border-bottom: 2px solid #007dc0; + padding: 0 0 6px 0; + font-weight: 700; +} + +.refreshAndSettings { + background: #f2f2f2; + border-bottom: 2px solid #fff; + border-top: 2px solid #fff; + height: 30px; +} + +.refreshAndSettings table td { + padding: 0 10px 0 0; +} + +.refreshAndSettings table table td { + padding: 0 0 0 0; +} + +.race-name { + line-height: 1.0; +} + +.openColumn { + position: relative; + vertical-align: middle; +} + +img.openColumn { + display: block; + margin: 3px auto 3px auto !important; +} + +.breadcrumbPanel { + height: 30px; + margin: 0 12px 13px 12px; +} + +.mainPanel { + width: 100%; +} + +.raceBoardNavigation { + float: left; + margin: 9px 0 0 12px; + font-family: 'Open Sans', Arial, Verdana, sans-serif; + font-weight: 300; +} + +.raceBoardControls { + float: right; + margin: 9px 0 0 12px; + font-family: 'Open Sans', Arial, Verdana, sans-serif; + font-weight: 300; +} + +.raceBoardNavigation-navigationitem { + color: #dddcdc; + text-transform: uppercase; + font-weight: 500; + margin: 0 12px 0 0; + padding: 0 0 5px 0; +} + +.raceBoardNavigation-navigationitem:hover { + border-bottom: 4px solid #f0ab00; + color: #dddcdc; + text-decoration: none; +} + +.raceBoardNavigation-navigationitem:active { + border-bottom: 4px solid #f0ab00; + color: #dddcdc; + text-decoration: none; +} + +.competitorInfo-Canvas { + pointer-events: none; +} + +.gwt-DialogBox { + z-index: 20; +} + +.abstractChartPanel-importantMessageOfChart { + font-family: 'Open Sans', Arial, Verdana, sans-serif; + font-weight: 600; + font-size: 20px; + height: 70px; + margin: 0 auto; + padding: 49px 0 0 80px; + width: 300px; + color: #7c7c7c; + background: url(images/important-message.png) left center no-repeat; +} + +.breadcrumbPanel-NextArrow { + display: none; +} + +.errorLabel { + color: #FF0000; +} + +.raceBoardNavigation-settingsButtonPanel { + float: right; + margin: 9px 12px 0 0; +} + +.raceBoardNavigation-settingsButton { + background: url(images/settings_white.png), + url(images/btn-cta-orangeleft.png); + background-position: center, center 0; + background-repeat: no-repeat, repeat-x; + width: 27px; + height: 23px; + margin: 0 12px 0 1px; + -webkit-border-radius: 0px 3px 3px 0px; + -moz-border-radius: 0px 3px 3px 0px; + -o-border-radius: 0px 3px 3px 0px; + -ms-border-radius: 0px 3px 3px 0px; + border-radius: 0px 3px 3px 0px; +} + +.raceBoardNavigation-settingsButton:hover { + background-image: url(images/settings_white.png), + url(images/btn-cta-orangeleft.png); + background-position: center, center -30px; + background-repeat: no-repeat, repeat-x; + cursor: pointer; +} + +.raceBoardNavigation-filterButton:hover { + background-image: url(images/filter_white.png), + url(images/btn-cta-orangeleft.png); + background-position: center, center -30px; + background-repeat: no-repeat, repeat-x; + cursor: pointer; +} + +.raceBoardNavigation-innerElement { + background: url("images/btn-cta-orangeleft.png") repeat-x scroll center + 0 transparent; + color: #FFFFFF; + cursor: pointer; + font-family: 'Open Sans', Verdana, Arial, sans-serif; + font-weight: 600; + font-size: 14px; + margin: 0 0 0 0; + padding: 2px 7px 2px 3px; + height: 18px; + display: inline-block; + text-decoration: none; + border-radius: 5px 0 0 5px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); + text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.25); + border-bottom: 1px solid rgba(0, 0, 0, 0.25); +} + +.raceBoardNavigation-innerElement:active { + top: 1px; + position: relative; +} + +.raceBoardNavigation-innerElement:hover { + background: url("images/btn-cta-orangeleft.png") repeat-x scroll center + -30px transparent; + cursor: pointer; +} + +.raceBoardNavigation-innerElement label { + cursor: pointer; +} + +.raceBoardNavigation-standaloneElement { + background: url("images/btn-cta-orangeleft.png") repeat-x scroll center + 0 transparent; + color: #FFFFFF; + cursor: pointer; + font-family: 'Open Sans', Verdana, Arial, sans-serif; + font-weight: 600; + font-size: 14px; + margin: 0 0 0 0; + padding: 2px 7px 2px 3px; + height: 23px; + display: inline-block; + text-decoration: none; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); + text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.25); + border-bottom: 1px solid rgba(0, 0, 0, 0.25); + border-radius: 5px 5px 5px 5px; + +} + +.raceBoardNavigation-standaloneElement:active { + top: 1px; + position: relative; +} + +.raceBoardNavigation-standaloneElement:hover { + background: url("images/btn-cta-orangeleft.png") repeat-x scroll center + -30px transparent; + cursor: pointer; +} + +.raceBoardNavigation-standaloneElement label { + cursor: pointer; +} + +.timePanelButton { + float: left; + margin: 0 0 0 5px; +} + +.timePanelButton-SlowDown { + background-color: red !important; +} + +.timePanelButton-SpeedUp { + background-color: green !important; +} + +.playPauseButton { + padding: 0; + float: left; + width: 32px; + height: 28px; + background: url(images/viewicons/@1x/img/SAP_RV_Play_INACTIVE.png) + center no-repeat; + cursor: pointer; + border: 1px solid #cecece; + border-radius: 4px; + outline: 0; +} + +.playPauseButton:hover { + cursor: pointer; + background-color: #cecece; +} + +.playPauseButtonPause { + background: url(images/viewicons/@2x/img/SAP_RV_Pause_INACTIVE.png) 2px + 0 no-repeat; + outline: 0; + background-size: contain; +} + +.playPauseButtonPause:hover { + cursor: pointer; +} + +.backToLivePlayButton { + position: absolute; + right: 15px; + top: 8px; + width: 42px; + height: 38px; + font-size: 8px; + white-space: normal; + border-radius: 4px; + border: none; + cursor: pointer; +} + +.backToLivePlayButton-Inactive { + color: #6dc021; + background-color: white; + font-weight: bold; +} + +.backToLivePlayButton-Active { + background-color: #6dc021; + color: white; + font-weight: normal; +} + +.backToLivePlayButton:hover { + border: 2px solid gray; +} + +.backToLivePlayButton:focus { + outline: 0 !important; +} + +.dockLayoutPanel div[style="position: absolute; overflow: hidden; left: 0px; right: 0px; bottom: 0px; height: 90px;"] + { + z-index: 10; +} + +.browserOptimizedMessage { + padding: 15px 0px; +} + +.trackingQuality-circle { + width: 8px; + height: 8px; + border-radius: 50%; + float: left; +} + +.circleYellow { + background: #fbba00; +} + +.circleGreen { + background: #8ab54e; +} + +.circleRed { + background: #f01010; +} + +.busyIndicator-Simple { + position: absolute; + top: 0.7em; + right: 7.4em; +} + +.busyIndicator-Circle { + +} + +.raceBoard-TitlePanel { + position: relative; + top: 10px; + z-index: 10; + color: #fff; + margin-left: auto; + margin-right: auto; +} + +.raceBoard-TitlePanel-RaceNameLabel { + font-size: 32px; + font-weight: bold; + padding: 7px; +} + +.raceBoard-Logo { + position: absolute; + top: 6px; + left: 10px; + z-index: 10; + cursor: pointer; +} + +.SideBySideComponentViewer-MainPanel { + top: 12px; +} + +.TimePanel-ShowExtended-Button { + width: 29px; + height: 28px; + float: left; + cursor: pointer; + border-radius: 4px; + border: 1px solid #ececec; +} + +.TimePanel-ShowExtended-Button-Open { + background: white url(images/arrows_bottom_black.png) center no-repeat; +} + +.TimePanel-ShowExtended-Button-Closed { + background: white url(images/arrows_top_black.png) center no-repeat; +} + +.TimePanel-ShowExtended-Button:hover { + background-color: #cecece; +} + +.TimePanel-ShowExtended-Button:focus { + outline: 0 !important; +} + +.RaceBoard-globalNavigation-Link { + display: inline; + margin-right: 3px; +} + +.RaceBoard-globalNavigation-Link a { + color: #fff; + cursor: pointer; +} + +.RaceBoard-globalNavigation-Link+.RaceBoard-globalNavigation-Link:before + { + content: ' \00bb\00a0'; +} + +.TimePanel-settingsButtonStyle { + position: absolute; + right: 0px; + z-index: 1; + border: none; +} + +.TimePanel-settingsButtonStyle:focus { + outline: 0 !important; +} + +.TimePanel-settingsButtonStyle:hover { + border: 1px solid gray; +} + +.gwt-SplitLayoutPanel-NorthSouthToggleButton-Closed-multiCompetitorRaceChart + { + background-color: white; + background-image: + url(images/viewicons/@1x/img/SAP_RV_CompetitorCharts_INACTIVE.png), + url(images/arrows_top_black_small.png); + background-repeat: no-repeat, no-repeat; + background-position: 5% 50%, 95% 50% +} + +.gwt-SplitLayoutPanel-NorthSouthToggleButton-Open-multiCompetitorRaceChart + { + background-color: white; + background-image: + url(images/viewicons/@1x/img/SAP_RV_CompetitorCharts_GHOSTED.png), + url(images/arrows_bottom_black_small.png); + background-repeat: no-repeat, no-repeat; + background-position: 5% 50%, 95% 50% +} + +.gwt-SplitLayoutPanel-NorthSouthToggleButton-Closed-windChart { + background-color: white; + background-image: + url(images/viewicons/@1x/img/SAP_RV_CompetitorCharts_INACTIVE.png), + url(images/arrows_top_black_small.png); + background-repeat: no-repeat, no-repeat; + background-position: 5% 50%, 95% 50% +} + +.gwt-SplitLayoutPanel-NorthSouthToggleButton-Open-windChart { + background-color: white; + background-image: + url(images/viewicons/@1x/img/SAP_RV_CompetitorCharts_GHOSTED.png), + url(images/arrows_bottom_black_small.png); + background-repeat: no-repeat, no-repeat; + background-position: 5% 50%, 95% 50% +} + +.gwt-SplitLayoutPanel-EastToggleButton-Open-leaderboard { + background-color: white; + background-image: + url(images/viewicons/@1x/img/SAP_RV_Leaderboard_GHOSTED.png), + url(images/arrows_top_black_small.png); + background-repeat: no-repeat, no-repeat; + background-position: 4% 50%, 96% 50% +} + +.gwt-SplitLayoutPanel-EastToggleButton-Closed-leaderboard { + background-color: white; + background-image: + url(images/viewicons/@1x/img/SAP_RV_Leaderboard_INACTIVE.png), + url(images/arrows_bottom_black_small.png); + background-repeat: no-repeat, no-repeat; + background-position: 4% 50%, 96% 50% +} + +.gwt-SplitLayoutPanel-NorthSouthToggleButton-Closed-media, + .gwt-SplitLayoutPanel-NorthSouthToggleButton-Open-media { + background-color: white; + background-image: + url(images/viewicons/@1x/img/SAP_RV_AudioVideo_INACTIVE.png); + background-repeat: no-repeat, no-repeat; + background-position: 10% 50%, 90% 50% +} + +.gwt-SplitLayoutPanel-NorthSouthToggleButton-mediaplaying { + background-image: + url(images/viewicons/@1x/img/SAP_RV_AudioVideo_GHOSTED.png); +} + +.gwt-SplitLayoutPanel-NorthSouthToggleButton-Small-media { + background-position: 5% 50%, 100% 50% !important; + margin-left: 0px !important; + padding: 2px 35px !important; +} + +@external gwt-ToggleButton-up, gwt-ToggleButton-down, gwt-ToggleButton-up-hovering, gwt-ToggleButton-down-hovering; +.gwt-ToggleButton-up, .gwt-ToggleButton-up-hovering { + background: url(images/unlock.png) center no-repeat; + margin-left: 5px; +} + +.gwt-ToggleButton-down, .gwt-ToggleButton-down-hovering { + background: url(images/lock.png) center no-repeat; + margin-left: 5px; +} + +.RegattaRaceInformation-Header { + font-family: 'Open Sans', Arial, Verdana, sans-serif; + position: relative; + left: 140px; + top: 11px; +} + +.RegattaRaceInformation-Header .RaceName-Label { + display: inline; + color: white; + margin-right: 10px; + font-size: 36px; +} + +.RegattaRaceInformation-Header .RaceSeriesAndFleet-Label { + display: inline; + color: white; + font-size: 15px; +} + +.RegattaAndRaceTime-Header { + position: absolute; + right: 10px; + top: 13px; + text-align: right; + color: white; +} + +.RegattaAndRaceTime-Header .RegattaName-Anchor { + font-size: 15px; + color: white; + text-decoration: none; + padding-left: 25px; + background-image: url(images/home.png); + background-repeat: no-repeat; + background-size: 17px; + background-position: 4px 1px; +} + +.RegattaAndRaceTime-Header .RegattaName-Anchor:hover { + text-decoration: underline; +} + +.RegattaAndRaceTime-Header .RaceTime-Label { + font-size: 15px; + margin-top: 5px; +} + +.VideoPopup-Close-Button { + border: none; +} + +.Media-Select-Button { + font-size: 15px; + font-size: 1rem; + display: inline-block; + font-weight: 400; + color: #111; + border: none; + padding: 0.5em 0.3em 0.5em 0.8em; + background-color: #fff; + -webkit-transition: background-color 0.2s; + -moz-transition: background-color 0.2s; + -o-transition: background-color 0.2s; + -ms-transition: background-color 0.2s; + transition: background-color 0.2s; + width: 100%; + max-width: 25em; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.Media-Select-Button:hover, .Media-Select-Button:focus { + background-color: #f0ab00; +} + +.Media-Select-Button-playing { + color: #999; +} + +.Media-Select-Button-playing:hover, .Media-Select-Button-playing:focus { + color: #fff; + background-color: #ccc; +} + +.Media-Select-Popup .dialogMiddleCenterInner { + padding: 0; +} + +.Media-Select-Popup .Caption { + padding: 4px 10px; +} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html new file mode 100644 index 00000000000..65262ac2b0d --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html @@ -0,0 +1,46 @@ + + + + + + + SAP Sailing Analytics Race Board + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT Remote Profiling (Run-Mode only).launch b/java/com.sap.sailing.gwt.ui/SailingGWT Remote Profiling (Run-Mode only).launch index 7c55b6a1b87..3ffcab00446 100755 --- a/java/com.sap.sailing.gwt.ui/SailingGWT Remote Profiling (Run-Mode only).launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT Remote Profiling (Run-Mode only).launch @@ -54,7 +54,7 @@ - + diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch index 7435c9ab64d..829e7bd9dc2 100644 --- a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch @@ -6,6 +6,7 @@ + diff --git a/java/com.sap.sailing.gwt.ui/pom.xml b/java/com.sap.sailing.gwt.ui/pom.xml index a552d29d9de..7b8cb4b5c19 100755 --- a/java/com.sap.sailing.gwt.ui/pom.xml +++ b/java/com.sap.sailing.gwt.ui/pom.xml @@ -130,6 +130,7 @@ com.sap.sailing.gwt.ui.Leaderboard com.sap.sailing.gwt.ui.LeaderboardEditing com.sap.sailing.gwt.ui.RaceBoard + com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart com.sap.sailing.gwt.ui.Spectator com.sap.sailing.gwt.ui.DataMining com.sap.sailing.gwt.ui.VideoPopup diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/WindChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/WindChart.java index a0e443d95a6..6cff6b88243 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/WindChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/WindChart.java @@ -44,6 +44,7 @@ import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.impl.ColorMapImpl; import com.sap.sailing.gwt.ui.actions.GetWindInfoAction; +import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener; import com.sap.sailing.gwt.ui.client.RaceSelectionProvider; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; @@ -86,7 +87,9 @@ public class WindChart extends AbstractRaceChart implements Componentnull, this chart won't update its contents automatically upon race selection change; * otherwise, whenever the selection changes, the wind data of the race selected now is loaded from the - * server and displayed in this chart. If no race is selected, the chart is cleared. + * server and displayed in this chart. If no race is selected, the chart is cleared. The caller of this + * constructor must ensure to trigger {@link RaceSelectionChangeListener#onRaceSelectionChange(List)} at + * least once to ensure that this chart sets its {@link AbstractRaceChart#selectedRaceIdentifier} field. */ public WindChart(SailingServiceAsync sailingService, RaceSelectionProvider raceSelectionProvider, Timer timer, TimeRangeWithZoomProvider timeRangeWithZoomProvider, WindChartSettings settings, final StringMessages stringMessages, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChart.java new file mode 100644 index 00000000000..67080f5baae --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChart.java @@ -0,0 +1,256 @@ + +package com.sap.sailing.gwt.ui.raceboard; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.ServiceDefTarget; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.DockLayoutPanel; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.RootLayoutPanel; +import com.google.gwt.user.client.ui.RootPanel; +import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; +import com.sap.sailing.domain.common.dto.RaceDTO; +import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint; +import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel; +import com.sap.sailing.gwt.ui.client.MediaService; +import com.sap.sailing.gwt.ui.client.MediaServiceAsync; +import com.sap.sailing.gwt.ui.client.ParallelExecutionCallback; +import com.sap.sailing.gwt.ui.client.ParallelExecutionHolder; +import com.sap.sailing.gwt.ui.client.RaceSelectionModel; +import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider; +import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants; +import com.sap.sailing.gwt.ui.shared.EventDTO; +import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; +import com.sap.sailing.gwt.ui.shared.RegattaDTO; +import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; +import com.sap.sse.gwt.client.EntryPointHelper; +import com.sap.sse.gwt.client.async.AsyncActionsExecutor; +import com.sap.sse.gwt.client.player.Timer; +import com.sap.sse.gwt.client.player.Timer.PlayModes; +import com.sap.sse.gwt.shared.GwtHttpRequestUtils; + +public class EmbeddedMapAndWindChart extends AbstractSailingEntryPoint { + private RaceDTO selectedRace; + + // TODO obtain event ID in order to enable showing all marks from all course areas if requested + private static final String PARAM_REGATTA_NAME = "regattaName"; + private static final String PARAM_RACE_NAME = "raceName"; + private static final String PARAM_LEADERBOARD_NAME = "leaderboardName"; + private static final String PARAM_LEADERBOARD_GROUP_NAME = "leaderboardGroupName"; + private static final String PARAM_EVENT_ID = "eventId"; + + private String regattaName; + private String raceName; + private String leaderboardName; + private String leaderboardGroupName; + private UUID eventId; + private RaceBoardViewConfiguration raceboardViewConfig; + + private final MediaServiceAsync mediaService = GWT.create(MediaService.class); + + @Override + protected void doOnModuleLoad() { + super.doOnModuleLoad(); + EntryPointHelper.registerASyncService((ServiceDefTarget) mediaService, RemoteServiceMappingConstants.mediaServiceRemotePath); + // read mandatory parameters + regattaName = Window.Location.getParameter(PARAM_REGATTA_NAME); + raceName = Window.Location.getParameter(PARAM_RACE_NAME); + String leaderboardNameParamValue = Window.Location.getParameter(PARAM_LEADERBOARD_NAME); + String leaderboardGroupNameParamValue = Window.Location.getParameter(PARAM_LEADERBOARD_GROUP_NAME); + if (leaderboardNameParamValue != null && !leaderboardNameParamValue.isEmpty()) { + leaderboardName = leaderboardNameParamValue; + } + if (leaderboardGroupNameParamValue != null && !leaderboardGroupNameParamValue.isEmpty()) { + leaderboardGroupName = leaderboardGroupNameParamValue; + } + String eventIdParamValue = Window.Location.getParameter(PARAM_EVENT_ID); + if (eventIdParamValue != null && !eventIdParamValue.isEmpty()) { + eventId = UUID.fromString(eventIdParamValue); + } + if (leaderboardGroupNameParamValue != null && !leaderboardGroupNameParamValue.isEmpty()) { + leaderboardGroupName = leaderboardGroupNameParamValue; + } + if (regattaName == null || regattaName.isEmpty() || raceName == null || raceName.isEmpty() || + leaderboardName == null || leaderboardName.isEmpty()) { + createErrorPage("This page requires a valid regatta name, race name and leaderboard name."); + return; + } + + // read optional parameters + boolean showLeaderboard = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_LEADERBOARD, true /* default*/); + boolean showWindChart = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_WINDCHART, false /* default*/); + boolean showCompetitorsChart = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_COMPETITORSCHART, false /* default*/); + boolean showViewStreamlets = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_STREAMLETS, false /* default*/); + boolean showViewSimulation = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_SIMULATION, true /* default*/); + String activeCompetitorsFilterSetName = GwtHttpRequestUtils.getStringParameter(RaceBoardViewConfiguration.PARAM_VIEW_COMPETITOR_FILTER, null /* default*/); + final boolean canReplayWhileLiveIsPossible = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_CAN_REPLAY_DURING_LIVE_RACES, false); + final boolean autoSelectMedia = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_AUTOSELECT_MEDIA, false); + final String defaultMedia = GwtHttpRequestUtils.getStringParameter(RaceBoardViewConfiguration.PARAM_DEFAULT_MEDIA, null /* default*/); + final boolean showMapControls = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_MAPCONTROLS, true /* default*/); + raceboardViewConfig = new RaceBoardViewConfiguration(activeCompetitorsFilterSetName, showLeaderboard, + showWindChart, showCompetitorsChart, showViewStreamlets, showViewSimulation, canReplayWhileLiveIsPossible, autoSelectMedia, defaultMedia); + + final ParallelExecutionCallback> getLeaderboardNamesCallback = new ParallelExecutionCallback>(); + final ParallelExecutionCallback> getRegattasCallback = new ParallelExecutionCallback>(); + final ParallelExecutionCallback getLeaderboardGroupByNameCallback = new ParallelExecutionCallback(); + final ParallelExecutionCallback getEventByIdCallback = new ParallelExecutionCallback(); + List> callbacks = new ArrayList<>(); + callbacks.add(getLeaderboardNamesCallback); + callbacks.add(getRegattasCallback); + if (leaderboardGroupName != null) { + callbacks.add(getLeaderboardGroupByNameCallback); + } + if (eventId != null) { + callbacks.add(getEventByIdCallback); + } + ParallelExecutionCallback[] callbackArray = callbacks.toArray(new ParallelExecutionCallback[0]); + new ParallelExecutionHolder(callbackArray) { + @Override + public void handleSuccess() { + checkUrlParameters(getLeaderboardNamesCallback.getData(), + leaderboardGroupName == null ? null : getLeaderboardGroupByNameCallback.getData(), + canReplayWhileLiveIsPossible, getRegattasCallback.getData(), eventId == null ? null : getEventByIdCallback.getData(), + showMapControls); + } + + @Override + public void handleFailure(Throwable t) { + reportError("Error trying to create the raceboard: " + t.getMessage()); + } + }; + sailingService.getRegattas(getRegattasCallback); + sailingService.getLeaderboardNames(getLeaderboardNamesCallback); + if (eventId != null) { + sailingService.getEventById(eventId, /* withStatisticalData */ false, getEventByIdCallback); + } + if (leaderboardGroupName != null) { + sailingService.getLeaderboardGroupByName(leaderboardGroupNameParamValue, false /*withGeoLocationData*/, getLeaderboardGroupByNameCallback); + } + } + + private void createErrorPage(String message) { + LogoAndTitlePanel logoAndTitlePanel = new LogoAndTitlePanel(getStringMessages(), this, getUserService()); + logoAndTitlePanel.addStyleName("LogoAndTitlePanel"); + RootPanel.get().add(logoAndTitlePanel); + RootPanel.get().add(new Label(message)); + } + + private void checkUrlParameters(List leaderboardNames, LeaderboardGroupDTO leaderboardGroup, + boolean canReplayWhileLiveIsPossible, List regattas, EventDTO event, + boolean showMapControls) { + if (!leaderboardNames.contains(leaderboardName)) { + createErrorPage(getStringMessages().noSuchLeaderboard()); + return; + } + if (eventId != null && event == null) { + createErrorPage(getStringMessages().noSuchEvent()); + } + if (leaderboardGroupName != null && leaderboardGroup != null) { + boolean foundLeaderboard = false; + for (StrippedLeaderboardDTO leaderboard : leaderboardGroup.leaderboards) { + if (leaderboard.name.equals(leaderboardName)) { + foundLeaderboard = true; + break; + } + } + if (!foundLeaderboard) { + createErrorPage(getStringMessages().leaderboardNotContainedInLeaderboardGroup(leaderboardName, leaderboardGroupName)); + return; + } + if (event != null) { + boolean foundLeaderboardGroupInEvent = false; + for (LeaderboardGroupDTO lg : event.getLeaderboardGroups()) { + if (lg.getId().equals(leaderboardGroup.getId())) { + foundLeaderboardGroupInEvent = true; + break; + } + } + if (!foundLeaderboardGroupInEvent) { + createErrorPage(getStringMessages().leaderboardGroupNotContainedInEvent(leaderboardGroupName, event.getName())); + } + } + } + RaceDTO race = findRace(regattaName, raceName, regattas); + selectedRace = race; + if (selectedRace == null) { + createErrorPage("Could not obtain a race with name " + raceName + " for a regatta with name " + regattaName); + return; + } + Window.setTitle(selectedRace.getName()); + RaceSelectionModel raceSelectionModel = new RaceSelectionModel(); + List singletonList = Collections.singletonList(selectedRace.getRaceIdentifier()); + raceSelectionModel.setSelection(singletonList); + Timer timer = new Timer(PlayModes.Replay, 1000l); + AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor(); + RaceTimesInfoProvider raceTimesInfoProvider = new RaceTimesInfoProvider(sailingService, asyncActionsExecutor, this, singletonList, 5000l /* requestInterval*/); + RaceBoardPanel raceBoardPanel = new RaceBoardPanel(sailingService, mediaService, getUserService(), asyncActionsExecutor, timer, raceSelectionModel, + leaderboardName, leaderboardGroupName, event, raceboardViewConfig, EmbeddedMapAndWindChart.this, getStringMessages(), userAgent, raceTimesInfoProvider, showMapControls); + raceBoardPanel.fillRegattas(regattas); + createRaceBoardInOneScreenMode(raceBoardPanel, raceboardViewConfig); + } + + private RaceDTO findRace(String regattaName, String raceName, List regattas) { + for (RegattaDTO regattaDTO : regattas) { + if (regattaDTO.getName().equals(regattaName)) { + for (RaceDTO raceDTO : regattaDTO.races) { + if (raceDTO.getName().equals(raceName)) { + return raceDTO; + } + } + } + } + return null; + } + + private FlowPanel createTimePanel(RaceBoardPanel raceBoardPanel) { + FlowPanel timeLineInnerBgPanel = new FlowPanel(); + timeLineInnerBgPanel.addStyleName("timeLineInnerBgPanel"); + timeLineInnerBgPanel.add(raceBoardPanel.getTimePanel()); + + FlowPanel timeLineInnerPanel = new FlowPanel(); + timeLineInnerPanel.add(timeLineInnerBgPanel); + timeLineInnerPanel.addStyleName("timeLineInnerPanel"); + + FlowPanel timelinePanel = new FlowPanel(); + timelinePanel.add(timeLineInnerPanel); + timelinePanel.addStyleName("timeLinePanel"); + + return timelinePanel; + } + + private void createRaceBoardInOneScreenMode(final RaceBoardPanel raceBoardPanel, + RaceBoardViewConfiguration raceboardViewConfiguration) { + final DockLayoutPanel p = new DockLayoutPanel(Unit.PX); + RootLayoutPanel.get().add(p); + final FlowPanel timePanel = createTimePanel(raceBoardPanel); + final Button toggleButton = raceBoardPanel.getTimePanel().getAdvancedToggleButton(); + toggleButton.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + boolean advancedModeShown = raceBoardPanel.getTimePanel().toggleAdvancedMode(); + if (advancedModeShown) { + p.setWidgetSize(timePanel, 96); + toggleButton.removeStyleDependentName("Closed"); + toggleButton.addStyleDependentName("Open"); + } else { + p.setWidgetSize(timePanel, 67); + toggleButton.addStyleDependentName("Closed"); + toggleButton.removeStyleDependentName("Open"); + } + } + }); + p.addSouth(timePanel, 67); + p.add(raceBoardPanel); + p.addStyleName("dockLayoutPanel"); + } +} From 2b6f253b9a2794faf1d31887c4d72a9f30ec8ca2 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 8 Jul 2015 16:07:30 +0200 Subject: [PATCH 056/219] Race/Regatta list filter - Added icons for filter --- .../images/home/arrow-down-filled-black.png | Bin 0 -> 314 bytes .../images/home/arrow-down-filled-yellow.png | Bin 0 -> 314 bytes .../partials/listNavigation/RegattaNavigation.gss | 6 +++--- 3 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/images/home/arrow-down-filled-black.png create mode 100644 java/com.sap.sailing.gwt.ui/images/home/arrow-down-filled-yellow.png diff --git a/java/com.sap.sailing.gwt.ui/images/home/arrow-down-filled-black.png b/java/com.sap.sailing.gwt.ui/images/home/arrow-down-filled-black.png new file mode 100644 index 0000000000000000000000000000000000000000..4f016bdc68a6109892d3b8297583769c5ba83952 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMQ!3HD+(^8%SDb50q$YKTtaUl?9OrL)Vtg6H{ zq9iy!t)x7$D3!r6B|j-u!8128JvAsbF{QHbWU38N=W$OL$B>F!Tc$h|Y%<_!byhE6 zG5_Fh-LQCyZ;9|-hVL)B>pB zPBlEAEpSM-bGlP@4y}vxeBY^iaVebP0 Hl+XkKrCE5U literal 0 HcmV?d00001 diff --git a/java/com.sap.sailing.gwt.ui/images/home/arrow-down-filled-yellow.png b/java/com.sap.sailing.gwt.ui/images/home/arrow-down-filled-yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..24bc60cc04a262dcd990430f8b4a557d29251536 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMQ!3HD+(^8%SDb50q$YKTtaUl?9OrL)Vtg6H{ zq9iy!t)x7$D3!r6B|j-u!8128JvAsbF{QHbWU38N=W$OL$B>F!Nq;uXddS4g+-%4E z_JF&Z!b655;+d(8Cu-FGP53Y0(8IEVVXGt4g+JU1^9>p#0^|dQRhZ7+Wk@nO=(0de zHRxnhtHWop0~S6fi~>5{xO8uDn5Z*GHgLwW1~@XGP)&&{5R}@l(eUyA|Nl28AC+z2EXW=s0xAH83zUh->x9?MrD}5A+g)r>mdKI;Vst E0I{=XdjJ3c literal 0 HcmV?d00001 diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigation.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigation.gss index fd25305a6af..78954d4a522 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigation.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigation.gss @@ -49,7 +49,7 @@ font-size: 0.866666666666667rem; text-align: right; margin-top: 0; - background: transparent url("../images/home/arrow-down-filled-black.png") no-repeat; + background: transparent url("images/home/arrow-down-filled-black.png") no-repeat; background-position: 96%; background-size: 0.923076923076923em 0.538461538461538em; border: 1px solid transparent; @@ -65,7 +65,7 @@ background-color: #f2f2f2; } .regattanavigation_filter.jsdropdownactive { - background-image: url("../images/home/arrow-down-filled-yellow.png"); + background-image: url("images/home/arrow-down-filled-yellow.png"); } .regattanavigation_filter.jsdropdownactive .regattanavigation_filter_dropdown { display: block; @@ -95,7 +95,7 @@ padding: 0 2.307692307692307em 0 0.769230769230769em; } .regattanavigation_filter_dropdown_linkactive { - background: url("../images/home/dropdown__check@2x.png") no-repeat; + background: url("images/home/dropdown__check@2x.png") no-repeat; background-position: 95%; background-size: 1.2em 0.933333333333333em; } From 0afc915049280bb03550175460dba6094b72763e Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 8 Jul 2015 16:08:13 +0200 Subject: [PATCH 057/219] Race/Regatta list filter - Implementation of list dropdown filter --- .../listNavigation/ListDropdownFilter.java | 96 +++++++++++++++++++ .../listNavigation/ListDropdownFilter.ui.xml | 18 ++++ 2 files changed, 114 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListDropdownFilter.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListDropdownFilter.ui.xml diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListDropdownFilter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListDropdownFilter.java new file mode 100644 index 00000000000..5642c07ef96 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListDropdownFilter.java @@ -0,0 +1,96 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.listNavigation; + +import java.util.Collection; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.common.client.LinkUtil; +import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.RegattaNavigationResources.LocalCss; +import com.sap.sailing.gwt.home.client.shared.DropdownHandler; + +public class ListDropdownFilter extends Composite { + + private static final LocalCss CSS = RegattaNavigationResources.INSTANCE.css(); + private static ListDropdownFilterUiBinder uiBinder = GWT.create(ListDropdownFilterUiBinder.class); + + interface ListDropdownFilterUiBinder extends UiBinder> { + } + + @UiField DivElement dropdownContainerUi; + @UiField DivElement currentValueUi; + @UiField FlowPanel filterItemContainerUi; + private final SelectionCallback selectionCallback; + private final DropdownHandler dropdownHandler; + + public ListDropdownFilter(T defaultValue, SelectionCallback selectionCallback) { + this.selectionCallback = selectionCallback; + CSS.ensureInjected(); + initWidget(uiBinder.createAndBindUi(this)); + this.dropdownHandler = new ListFilterDropdownHandler(); + ListDropdownFilterItem filterItem = new ListDropdownFilterItem(defaultValue); + filterItemContainerUi.add(filterItem); + filterItem.select(defaultValue); + } + + public void setSelectableValues(Collection selectableValues) { + for (T value : selectableValues) { + filterItemContainerUi.add(new ListDropdownFilterItem(value)); + } + } + + public interface SelectionCallback { + void onSelectFilter(T value); + } + + private class ListFilterDropdownHandler extends DropdownHandler { + private ListFilterDropdownHandler() { + super(dropdownContainerUi, filterItemContainerUi.getElement()); + } + @Override + protected void dropdownStateChanged(boolean dropdownShown) { + if (dropdownShown) dropdownContainerUi.addClassName(CSS.jsdropdownactive()); + else dropdownContainerUi.removeClassName(CSS.jsdropdownactive()); + } + } + + private class ListDropdownFilterItem extends Widget { + private ListDropdownFilterItem(T value) { + DivElement element = DOM.createDiv().cast(); + element.setInnerText(String.valueOf(value)); + this.setElement(element); + this.addStyleName(CSS.regattanavigation_filter_dropdown_link()); + this.initClickHandler(value); + } + + private void initClickHandler(final T value) { + this.addDomHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + if(LinkUtil.handleLinkClick((Event) event.getNativeEvent())) { + event.preventDefault(); + dropdownHandler.setVisible(false); + ListDropdownFilterItem.this.select(value); + selectionCallback.onSelectFilter(value); + } + } + }, ClickEvent.getType()); + } + + private void select(T value) { + currentValueUi.setInnerText(String.valueOf(value)); + for (int i=0; i < filterItemContainerUi.getWidgetCount(); i++) { + filterItemContainerUi.getWidget(i).removeStyleName(CSS.regattanavigation_filter_dropdown_linkactive()); + } + this.addStyleName(CSS.regattanavigation_filter_dropdown_linkactive()); + } + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListDropdownFilter.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListDropdownFilter.ui.xml new file mode 100644 index 00000000000..bddd62ad678 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListDropdownFilter.ui.xml @@ -0,0 +1,18 @@ + + + + + + + +
+
+
+ Filter TODO: +
+
+
+ +
+
+
\ No newline at end of file From d3f8b98bb60f3e1137fda1e8caa1c8612838b5ce Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 8 Jul 2015 16:38:50 +0200 Subject: [PATCH 058/219] Race/Regatta list filter - Renamed and adjusted dropdown filter --- ...ropdownFilter.java => DropdownFilter.java} | 44 +++++++++++-------- ...ownFilter.ui.xml => DropdownFilter.ui.xml} | 0 2 files changed, 25 insertions(+), 19 deletions(-) rename java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/{ListDropdownFilter.java => DropdownFilter.java} (78%) rename java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/{ListDropdownFilter.ui.xml => DropdownFilter.ui.xml} (100%) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListDropdownFilter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/DropdownFilter.java similarity index 78% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListDropdownFilter.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/DropdownFilter.java index 5642c07ef96..cf069d074e5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListDropdownFilter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/DropdownFilter.java @@ -17,37 +17,41 @@ import com.sap.sailing.gwt.common.client.LinkUtil; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.RegattaNavigationResources.LocalCss; import com.sap.sailing.gwt.home.client.shared.DropdownHandler; -public class ListDropdownFilter extends Composite { +public class DropdownFilter extends Composite { private static final LocalCss CSS = RegattaNavigationResources.INSTANCE.css(); private static ListDropdownFilterUiBinder uiBinder = GWT.create(ListDropdownFilterUiBinder.class); - interface ListDropdownFilterUiBinder extends UiBinder> { + interface ListDropdownFilterUiBinder extends UiBinder> { } @UiField DivElement dropdownContainerUi; @UiField DivElement currentValueUi; @UiField FlowPanel filterItemContainerUi; - private final SelectionCallback selectionCallback; + private final DropdownFilterList filterList; private final DropdownHandler dropdownHandler; - public ListDropdownFilter(T defaultValue, SelectionCallback selectionCallback) { - this.selectionCallback = selectionCallback; + public DropdownFilter(DropdownFilterList filterList) { + this.filterList = filterList; CSS.ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); this.dropdownHandler = new ListFilterDropdownHandler(); - ListDropdownFilterItem filterItem = new ListDropdownFilterItem(defaultValue); - filterItemContainerUi.add(filterItem); - filterItem.select(defaultValue); - } - - public void setSelectableValues(Collection selectableValues) { - for (T value : selectableValues) { - filterItemContainerUi.add(new ListDropdownFilterItem(value)); + + this.addFilterValue(filterList.getDefaultValues()).select(); + for (T value : filterList.getSelectableValues()) { + addFilterValue(value); } } - public interface SelectionCallback { + private ListDropdownFilterItem addFilterValue(T value) { + ListDropdownFilterItem filterItem = new ListDropdownFilterItem(value); + filterItemContainerUi.add(filterItem); + return filterItem; + } + + public interface DropdownFilterList { + T getDefaultValues(); + Collection getSelectableValues(); void onSelectFilter(T value); } @@ -63,29 +67,31 @@ public class ListDropdownFilter extends Composite { } private class ListDropdownFilterItem extends Widget { + private final T value; private ListDropdownFilterItem(T value) { + this.value = value; DivElement element = DOM.createDiv().cast(); element.setInnerText(String.valueOf(value)); this.setElement(element); this.addStyleName(CSS.regattanavigation_filter_dropdown_link()); - this.initClickHandler(value); + this.initClickHandler(); } - private void initClickHandler(final T value) { + private void initClickHandler() { this.addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { if(LinkUtil.handleLinkClick((Event) event.getNativeEvent())) { event.preventDefault(); dropdownHandler.setVisible(false); - ListDropdownFilterItem.this.select(value); - selectionCallback.onSelectFilter(value); + ListDropdownFilterItem.this.select(); + filterList.onSelectFilter(value); } } }, ClickEvent.getType()); } - private void select(T value) { + private void select() { currentValueUi.setInnerText(String.valueOf(value)); for (int i=0; i < filterItemContainerUi.getWidgetCount(); i++) { filterItemContainerUi.getWidget(i).removeStyleName(CSS.regattanavigation_filter_dropdown_linkactive()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListDropdownFilter.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/DropdownFilter.ui.xml similarity index 100% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/ListDropdownFilter.ui.xml rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/DropdownFilter.ui.xml From 20e789f8f9242dec25e8e2cf87896835694a2a1d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 8 Jul 2015 19:31:24 +0200 Subject: [PATCH 059/219] fixed EmbeddedMapAndWindChart entry point set-up --- .../EmbeddedMapAndWindChart.html | 4 +- .../SailingGWT sdm.launch | 4 +- ...=> EmbeddedMapAndWindChartEntryPoint.java} | 4 +- .../gwt/ui/EmbeddedMapAndWindChart.gwt.xml | 48 +++++++++++++++++++ 4 files changed, 54 insertions(+), 6 deletions(-) rename java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/{EmbeddedMapAndWindChart.java => EmbeddedMapAndWindChartEntryPoint.java} (96%) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/EmbeddedMapAndWindChart.gwt.xml diff --git a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html index 65262ac2b0d..5f7d119372e 100644 --- a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html +++ b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html @@ -19,7 +19,7 @@ - + @@ -27,7 +27,7 @@ - + diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch index 829e7bd9dc2..19d53098aa7 100644 --- a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch @@ -5,8 +5,8 @@ - + @@ -72,7 +72,7 @@ - + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java similarity index 96% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChart.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index 67080f5baae..23d8932d94a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -39,7 +39,7 @@ import com.sap.sse.gwt.client.player.Timer; import com.sap.sse.gwt.client.player.Timer.PlayModes; import com.sap.sse.gwt.shared.GwtHttpRequestUtils; -public class EmbeddedMapAndWindChart extends AbstractSailingEntryPoint { +public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint { private RaceDTO selectedRace; // TODO obtain event ID in order to enable showing all marks from all course areas if requested @@ -194,7 +194,7 @@ public class EmbeddedMapAndWindChart extends AbstractSailingEntryPoint { AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor(); RaceTimesInfoProvider raceTimesInfoProvider = new RaceTimesInfoProvider(sailingService, asyncActionsExecutor, this, singletonList, 5000l /* requestInterval*/); RaceBoardPanel raceBoardPanel = new RaceBoardPanel(sailingService, mediaService, getUserService(), asyncActionsExecutor, timer, raceSelectionModel, - leaderboardName, leaderboardGroupName, event, raceboardViewConfig, EmbeddedMapAndWindChart.this, getStringMessages(), userAgent, raceTimesInfoProvider, showMapControls); + leaderboardName, leaderboardGroupName, event, raceboardViewConfig, EmbeddedMapAndWindChartEntryPoint.this, getStringMessages(), userAgent, raceTimesInfoProvider, showMapControls); raceBoardPanel.fillRegattas(regattas); createRaceBoardInOneScreenMode(raceBoardPanel, raceboardViewConfig); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/EmbeddedMapAndWindChart.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/EmbeddedMapAndWindChart.gwt.xml new file mode 100644 index 00000000000..a37175fe492 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/EmbeddedMapAndWindChart.gwt.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 78cc11fb2606c08140bfdd3c6f1c8fbe543b279b Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 8 Jul 2015 22:06:05 +0200 Subject: [PATCH 060/219] started to remove properties not needed in EmbeddedMapWithWindChart --- .../EmbeddedMapAndWindChartEntryPoint.java | 91 ++++--------------- 1 file changed, 16 insertions(+), 75 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index 23d8932d94a..bfac02f7dfb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -30,9 +30,7 @@ import com.sap.sailing.gwt.ui.client.RaceSelectionModel; import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider; import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants; import com.sap.sailing.gwt.ui.shared.EventDTO; -import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO; -import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; import com.sap.sse.gwt.client.EntryPointHelper; import com.sap.sse.gwt.client.async.AsyncActionsExecutor; import com.sap.sse.gwt.client.player.Timer; @@ -42,14 +40,11 @@ import com.sap.sse.gwt.shared.GwtHttpRequestUtils; public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint { private RaceDTO selectedRace; - // TODO obtain event ID in order to enable showing all marks from all course areas if requested - private static final String PARAM_REGATTA_NAME = "regattaName"; - private static final String PARAM_RACE_NAME = "raceName"; - private static final String PARAM_LEADERBOARD_NAME = "leaderboardName"; - private static final String PARAM_LEADERBOARD_GROUP_NAME = "leaderboardGroupName"; + private static final String PARAM_REGATTA_LIKE_NAME = "regattaLikeName"; + private static final String PARAM_RACE_COLUMN_NAME = "raceColumnName"; private static final String PARAM_EVENT_ID = "eventId"; - private String regattaName; + private String regattaLikeName; private String raceName; private String leaderboardName; private String leaderboardGroupName; @@ -60,56 +55,38 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint @Override protected void doOnModuleLoad() { + GWT.debugger(); super.doOnModuleLoad(); EntryPointHelper.registerASyncService((ServiceDefTarget) mediaService, RemoteServiceMappingConstants.mediaServiceRemotePath); // read mandatory parameters - regattaName = Window.Location.getParameter(PARAM_REGATTA_NAME); - raceName = Window.Location.getParameter(PARAM_RACE_NAME); - String leaderboardNameParamValue = Window.Location.getParameter(PARAM_LEADERBOARD_NAME); - String leaderboardGroupNameParamValue = Window.Location.getParameter(PARAM_LEADERBOARD_GROUP_NAME); - if (leaderboardNameParamValue != null && !leaderboardNameParamValue.isEmpty()) { - leaderboardName = leaderboardNameParamValue; - } - if (leaderboardGroupNameParamValue != null && !leaderboardGroupNameParamValue.isEmpty()) { - leaderboardGroupName = leaderboardGroupNameParamValue; - } + regattaLikeName = Window.Location.getParameter(PARAM_REGATTA_LIKE_NAME); + raceName = Window.Location.getParameter(PARAM_RACE_COLUMN_NAME); String eventIdParamValue = Window.Location.getParameter(PARAM_EVENT_ID); if (eventIdParamValue != null && !eventIdParamValue.isEmpty()) { eventId = UUID.fromString(eventIdParamValue); } - if (leaderboardGroupNameParamValue != null && !leaderboardGroupNameParamValue.isEmpty()) { - leaderboardGroupName = leaderboardGroupNameParamValue; - } - if (regattaName == null || regattaName.isEmpty() || raceName == null || raceName.isEmpty() || + if (regattaLikeName == null || regattaLikeName.isEmpty() || raceName == null || raceName.isEmpty() || leaderboardName == null || leaderboardName.isEmpty()) { createErrorPage("This page requires a valid regatta name, race name and leaderboard name."); return; } // read optional parameters - boolean showLeaderboard = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_LEADERBOARD, true /* default*/); boolean showWindChart = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_WINDCHART, false /* default*/); boolean showCompetitorsChart = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_COMPETITORSCHART, false /* default*/); boolean showViewStreamlets = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_STREAMLETS, false /* default*/); boolean showViewSimulation = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_SIMULATION, true /* default*/); + // TODO could this be used to configure a "selection" filter with no competitor selected? String activeCompetitorsFilterSetName = GwtHttpRequestUtils.getStringParameter(RaceBoardViewConfiguration.PARAM_VIEW_COMPETITOR_FILTER, null /* default*/); - final boolean canReplayWhileLiveIsPossible = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_CAN_REPLAY_DURING_LIVE_RACES, false); - final boolean autoSelectMedia = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_AUTOSELECT_MEDIA, false); - final String defaultMedia = GwtHttpRequestUtils.getStringParameter(RaceBoardViewConfiguration.PARAM_DEFAULT_MEDIA, null /* default*/); final boolean showMapControls = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_MAPCONTROLS, true /* default*/); - raceboardViewConfig = new RaceBoardViewConfiguration(activeCompetitorsFilterSetName, showLeaderboard, - showWindChart, showCompetitorsChart, showViewStreamlets, showViewSimulation, canReplayWhileLiveIsPossible, autoSelectMedia, defaultMedia); + raceboardViewConfig = new RaceBoardViewConfiguration(activeCompetitorsFilterSetName, /* showLeaderboard */ false, + showWindChart, showCompetitorsChart, showViewStreamlets, showViewSimulation, + /* canReplayWhileLiveIsPossible */ false, /* autoSelectMedia */ false, /* defaultMedia */ null); - final ParallelExecutionCallback> getLeaderboardNamesCallback = new ParallelExecutionCallback>(); final ParallelExecutionCallback> getRegattasCallback = new ParallelExecutionCallback>(); - final ParallelExecutionCallback getLeaderboardGroupByNameCallback = new ParallelExecutionCallback(); final ParallelExecutionCallback getEventByIdCallback = new ParallelExecutionCallback(); List> callbacks = new ArrayList<>(); - callbacks.add(getLeaderboardNamesCallback); callbacks.add(getRegattasCallback); - if (leaderboardGroupName != null) { - callbacks.add(getLeaderboardGroupByNameCallback); - } if (eventId != null) { callbacks.add(getEventByIdCallback); } @@ -117,9 +94,8 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint new ParallelExecutionHolder(callbackArray) { @Override public void handleSuccess() { - checkUrlParameters(getLeaderboardNamesCallback.getData(), - leaderboardGroupName == null ? null : getLeaderboardGroupByNameCallback.getData(), - canReplayWhileLiveIsPossible, getRegattasCallback.getData(), eventId == null ? null : getEventByIdCallback.getData(), + checkUrlParameters(getRegattasCallback.getData(), + eventId == null ? null : getEventByIdCallback.getData(), showMapControls); } @@ -129,13 +105,9 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint } }; sailingService.getRegattas(getRegattasCallback); - sailingService.getLeaderboardNames(getLeaderboardNamesCallback); if (eventId != null) { sailingService.getEventById(eventId, /* withStatisticalData */ false, getEventByIdCallback); } - if (leaderboardGroupName != null) { - sailingService.getLeaderboardGroupByName(leaderboardGroupNameParamValue, false /*withGeoLocationData*/, getLeaderboardGroupByNameCallback); - } } private void createErrorPage(String message) { @@ -145,45 +117,14 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint RootPanel.get().add(new Label(message)); } - private void checkUrlParameters(List leaderboardNames, LeaderboardGroupDTO leaderboardGroup, - boolean canReplayWhileLiveIsPossible, List regattas, EventDTO event, - boolean showMapControls) { - if (!leaderboardNames.contains(leaderboardName)) { - createErrorPage(getStringMessages().noSuchLeaderboard()); - return; - } + private void checkUrlParameters(List regattas, EventDTO event, boolean showMapControls) { if (eventId != null && event == null) { createErrorPage(getStringMessages().noSuchEvent()); } - if (leaderboardGroupName != null && leaderboardGroup != null) { - boolean foundLeaderboard = false; - for (StrippedLeaderboardDTO leaderboard : leaderboardGroup.leaderboards) { - if (leaderboard.name.equals(leaderboardName)) { - foundLeaderboard = true; - break; - } - } - if (!foundLeaderboard) { - createErrorPage(getStringMessages().leaderboardNotContainedInLeaderboardGroup(leaderboardName, leaderboardGroupName)); - return; - } - if (event != null) { - boolean foundLeaderboardGroupInEvent = false; - for (LeaderboardGroupDTO lg : event.getLeaderboardGroups()) { - if (lg.getId().equals(leaderboardGroup.getId())) { - foundLeaderboardGroupInEvent = true; - break; - } - } - if (!foundLeaderboardGroupInEvent) { - createErrorPage(getStringMessages().leaderboardGroupNotContainedInEvent(leaderboardGroupName, event.getName())); - } - } - } - RaceDTO race = findRace(regattaName, raceName, regattas); + RaceDTO race = findRace(regattaLikeName, raceName, regattas); selectedRace = race; if (selectedRace == null) { - createErrorPage("Could not obtain a race with name " + raceName + " for a regatta with name " + regattaName); + createErrorPage("Could not obtain a race with name " + raceName + " for a regatta with name " + regattaLikeName); return; } Window.setTitle(selectedRace.getName()); From 292bdbc9c6cc054639acfb1f98b9c5154b60e52f Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 9 Jul 2015 10:11:29 +0200 Subject: [PATCH 061/219] starting to change how race is identified --- .../raceboard/EmbeddedMapAndWindChartEntryPoint.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index bfac02f7dfb..d13ae722234 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -45,7 +45,7 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint private static final String PARAM_EVENT_ID = "eventId"; private String regattaLikeName; - private String raceName; + private String raceColumnName; private String leaderboardName; private String leaderboardGroupName; private UUID eventId; @@ -60,12 +60,12 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint EntryPointHelper.registerASyncService((ServiceDefTarget) mediaService, RemoteServiceMappingConstants.mediaServiceRemotePath); // read mandatory parameters regattaLikeName = Window.Location.getParameter(PARAM_REGATTA_LIKE_NAME); - raceName = Window.Location.getParameter(PARAM_RACE_COLUMN_NAME); + raceColumnName = Window.Location.getParameter(PARAM_RACE_COLUMN_NAME); String eventIdParamValue = Window.Location.getParameter(PARAM_EVENT_ID); if (eventIdParamValue != null && !eventIdParamValue.isEmpty()) { eventId = UUID.fromString(eventIdParamValue); } - if (regattaLikeName == null || regattaLikeName.isEmpty() || raceName == null || raceName.isEmpty() || + if (regattaLikeName == null || regattaLikeName.isEmpty() || raceColumnName == null || raceColumnName.isEmpty() || leaderboardName == null || leaderboardName.isEmpty()) { createErrorPage("This page requires a valid regatta name, race name and leaderboard name."); return; @@ -121,10 +121,10 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint if (eventId != null && event == null) { createErrorPage(getStringMessages().noSuchEvent()); } - RaceDTO race = findRace(regattaLikeName, raceName, regattas); + RaceDTO race = findRace(regattaLikeName, raceColumnName, regattas); selectedRace = race; if (selectedRace == null) { - createErrorPage("Could not obtain a race with name " + raceName + " for a regatta with name " + regattaLikeName); + createErrorPage("Could not obtain a race with name " + raceColumnName + " for a regatta with name " + regattaLikeName); return; } Window.setTitle(selectedRace.getName()); From afab65f816e5dbc688305a8fb7b0a69c4b4caf2a Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 9 Jul 2015 12:39:49 +0200 Subject: [PATCH 062/219] Race/Regatta list filter - Added additional String messages --- .../java/com/sap/sailing/gwt/ui/client/StringMessages.java | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages.properties | 3 ++- .../com/sap/sailing/gwt/ui/client/StringMessages_de.properties | 3 ++- .../com/sap/sailing/gwt/ui/client/StringMessages_ru.properties | 3 ++- .../com/sap/sailing/gwt/ui/client/StringMessages_zh.properties | 3 ++- 5 files changed, 9 insertions(+), 4 deletions(-) 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 27e910ffeae..f87c70b6499 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 @@ -1340,4 +1340,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String durationPlain(); String finishedRaces(); String selectCompetitor(); + String allBoatClasses(); } 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 1baa7c15d35..8c4cca33042 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 @@ -1308,4 +1308,5 @@ hoursAgo={0} h ago winner=Winner durationPlain=Duration finishedRaces=Finished Races -selectCompetitor=Please select one competitor \ No newline at end of file +selectCompetitor=Please select one competitor +allBoatClasses=All Boat Classes \ 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 f5595b6a298..4b0ac18de40 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 @@ -1298,4 +1298,5 @@ hoursAgo=vor {0} h winner=Sieger durationPlain=Dauer finishedRaces=Beendete Wettfahrten -selectCompetitor=Bitte einen Teilnehmer auswählen \ No newline at end of file +selectCompetitor=Bitte einen Teilnehmer auswählen +allBoatClasses=Alle Bootsklassen \ 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_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index aaaab41dfa0..4a33f5cf8f0 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1245,4 +1245,5 @@ hoursAgo={0} h часов назад winner=победитель durationPlain=Продолжительность finishedRaces=Finished Races -selectCompetitor=Please select one competitor \ No newline at end of file +selectCompetitor=Please select one competitor +allBoatClasses=All Boat Classes \ 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_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index d683dac82ae..1b730e50a03 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1294,4 +1294,5 @@ noNews=There are no news available. pointsValue={0,number,#0.00} openLeaderboard=Open Leaderboard resultsStandings=Results/Standings -selectCompetitor=Please select one competitor \ No newline at end of file +selectCompetitor=Please select one competitor +allBoatClasses=All Boat Classes \ No newline at end of file From b87039143a308c6de2564213caeff1ab92c95320 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 9 Jul 2015 12:40:45 +0200 Subject: [PATCH 063/219] Regatta list - Made regatta list filterable by boat category --- .../multiRegattaList/MultiRegattaList.java | 15 +++++++++++++++ .../multiRegattaList/MultiRegattaListItem.java | 6 ++++++ 2 files changed, 21 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.java index 31c488b3414..35e4cfc9fa1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.java @@ -2,6 +2,7 @@ package com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList; import java.util.Collection; import java.util.Collections; +import java.util.TreeSet; import com.google.gwt.core.client.GWT; import com.google.gwt.uibinder.client.UiBinder; @@ -23,6 +24,7 @@ public class MultiRegattaList extends Composite implements RefreshableWidget selectableBoatCategories = new TreeSet<>(); public MultiRegattaList(Presenter presenter) { this.currentPresenter = presenter; @@ -36,8 +38,21 @@ public class MultiRegattaList extends Composite implements RefreshableWidget data) { regattasContainerUi.clear(); + selectableBoatCategories.clear(); for (RegattaWithProgressDTO regattaWithProgress : data) { regattasContainerUi.add(new MultiRegattaListItem(regattaWithProgress, currentPresenter)); + selectableBoatCategories.add(regattaWithProgress.getBoatCategory()); + } + } + + public Collection getSelectableBoatCategories() { + return selectableBoatCategories; + } + + public void setVisibleBoatCategory(String visibleBoatCategory) { + for (int i=0; i < regattasContainerUi.getWidgetCount(); i++) { + MultiRegattaListItem item = (MultiRegattaListItem) regattasContainerUi.getWidget(i); + item.setVisibilityDependingOnBoatCategory(visibleBoatCategory); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java index 682a63c31c4..5450a53f74c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java @@ -18,8 +18,10 @@ public class MultiRegattaListItem extends Composite { @UiField(provided = true) RegattaHeader regattaHeaderUi; @UiField(provided = true) MultiRegattaListSteps regattaStepsUi; + private final RegattaWithProgressDTO regattaWithProgress; public MultiRegattaListItem(RegattaWithProgressDTO regattaWithProgress, Presenter presenter) { + this.regattaWithProgress = regattaWithProgress; MultiRegattaListResources.INSTANCE.css().ensureInjected(); regattaHeaderUi = new RegattaHeader(regattaWithProgress); regattaStepsUi = new MultiRegattaListSteps(regattaWithProgress.getProgress()); @@ -27,5 +29,9 @@ public class MultiRegattaListItem extends Composite { regattaHeaderUi.setRegattaNavigation(presenter.getRegattaNavigation(regattaWithProgress.getId())); regattaStepsUi.setLeaderboardNavigation(presenter.getRegattaLeaderboardNavigation(regattaWithProgress.getId())); } + + void setVisibilityDependingOnBoatCategory(String visibleBoatCategory) { + setVisible(visibleBoatCategory == null || visibleBoatCategory.equals(regattaWithProgress.getBoatCategory())); + } } From e29238441ef7835e1ed634da2801208466830cb7 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 9 Jul 2015 13:19:52 +0200 Subject: [PATCH 064/219] obtain race identifier based on SimpleRaceLogIdentifier properties; use the race log identifier to configure a RaceMap and a WindChart, if wind chart is requested --- .../sailing/gwt/ui/client/SailingService.java | 2 + .../gwt/ui/client/SailingServiceAsync.java | 2 + .../EmbeddedMapAndWindChartEntryPoint.java | 211 ++++++++---------- .../gwt/ui/raceboard/RaceBoardEntryPoint.java | 1 - .../gwt/ui/raceboard/RaceBoardPanel.java | 22 +- .../gwt/ui/server/SailingServiceImpl.java | 19 ++ 6 files changed, 112 insertions(+), 145 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index 4963289df96..f2d0bf96aff 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -614,4 +614,6 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS ArrayList getLeaderboardGroupsByEventId(UUID id); boolean doesRegattaLogContainCompetitors(String name) throws DoesNotHaveRegattaLogException; + + RegattaAndRaceIdentifier getRaceIdentifier(String regattaLikeName, String raceColumnName, String fleetName); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index 3048991ff99..79d76735532 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -719,4 +719,6 @@ public interface SailingServiceAsync extends BuildVersionRetriever, FileStorageM void getLeaderboardGroupsByEventId(UUID id, AsyncCallback> callback); void doesRegattaLogContainCompetitors(String name, AsyncCallback regattaLogCallBack); + + void getRaceIdentifier(String regattaLikeName, String raceColumnName, String fleetName, AsyncCallback asyncCallback); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index d13ae722234..cca558968d1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -1,38 +1,36 @@ package com.sap.sailing.gwt.ui.raceboard; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.Style.Unit; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.rpc.ServiceDefTarget; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.DockLayoutPanel; -import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.DockLayoutPanel.Direction; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootLayoutPanel; import com.google.gwt.user.client.ui.RootPanel; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; +import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.RaceDTO; import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint; +import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; +import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel; -import com.sap.sailing.gwt.ui.client.MediaService; -import com.sap.sailing.gwt.ui.client.MediaServiceAsync; -import com.sap.sailing.gwt.ui.client.ParallelExecutionCallback; -import com.sap.sailing.gwt.ui.client.ParallelExecutionHolder; import com.sap.sailing.gwt.ui.client.RaceSelectionModel; -import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider; -import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants; +import com.sap.sailing.gwt.ui.client.shared.charts.WindChart; +import com.sap.sailing.gwt.ui.client.shared.charts.WindChartSettings; +import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMap; +import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapResources; import com.sap.sailing.gwt.ui.shared.EventDTO; -import com.sap.sailing.gwt.ui.shared.RegattaDTO; -import com.sap.sse.gwt.client.EntryPointHelper; +import com.sap.sse.common.Duration; +import com.sap.sse.common.filter.Filter; +import com.sap.sse.common.filter.FilterSet; import com.sap.sse.gwt.client.async.AsyncActionsExecutor; +import com.sap.sse.gwt.client.player.TimeRangeWithZoomModel; +import com.sap.sse.gwt.client.player.TimeRangeWithZoomProvider; import com.sap.sse.gwt.client.player.Timer; import com.sap.sse.gwt.client.player.Timer.PlayModes; import com.sap.sse.gwt.shared.GwtHttpRequestUtils; @@ -42,71 +40,53 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint private static final String PARAM_REGATTA_LIKE_NAME = "regattaLikeName"; private static final String PARAM_RACE_COLUMN_NAME = "raceColumnName"; + private static final String PARAM_FLEET_NAME = "fleetName"; private static final String PARAM_EVENT_ID = "eventId"; private String regattaLikeName; private String raceColumnName; - private String leaderboardName; - private String leaderboardGroupName; + private String fleetName; private UUID eventId; - private RaceBoardViewConfiguration raceboardViewConfig; - - private final MediaServiceAsync mediaService = GWT.create(MediaService.class); + + private static final RaceMapResources raceMapResources = GWT.create(RaceMapResources.class); @Override protected void doOnModuleLoad() { GWT.debugger(); super.doOnModuleLoad(); - EntryPointHelper.registerASyncService((ServiceDefTarget) mediaService, RemoteServiceMappingConstants.mediaServiceRemotePath); // read mandatory parameters regattaLikeName = Window.Location.getParameter(PARAM_REGATTA_LIKE_NAME); raceColumnName = Window.Location.getParameter(PARAM_RACE_COLUMN_NAME); + fleetName = Window.Location.getParameter(PARAM_FLEET_NAME); String eventIdParamValue = Window.Location.getParameter(PARAM_EVENT_ID); if (eventIdParamValue != null && !eventIdParamValue.isEmpty()) { eventId = UUID.fromString(eventIdParamValue); } if (regattaLikeName == null || regattaLikeName.isEmpty() || raceColumnName == null || raceColumnName.isEmpty() || - leaderboardName == null || leaderboardName.isEmpty()) { - createErrorPage("This page requires a valid regatta name, race name and leaderboard name."); + fleetName == null || fleetName.isEmpty()) { + createErrorPage("This page requires a valid regatta, race column and fleet name to identify the race to show."); return; } // read optional parameters - boolean showWindChart = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_WINDCHART, false /* default*/); - boolean showCompetitorsChart = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_COMPETITORSCHART, false /* default*/); - boolean showViewStreamlets = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_STREAMLETS, false /* default*/); - boolean showViewSimulation = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_SIMULATION, true /* default*/); - // TODO could this be used to configure a "selection" filter with no competitor selected? - String activeCompetitorsFilterSetName = GwtHttpRequestUtils.getStringParameter(RaceBoardViewConfiguration.PARAM_VIEW_COMPETITOR_FILTER, null /* default*/); + final boolean showWindChart = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_WINDCHART, false /* default*/); + final boolean showViewStreamlets = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_STREAMLETS, false /* default*/); + final boolean showViewSimulation = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_SIMULATION, true /* default*/); final boolean showMapControls = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_MAPCONTROLS, true /* default*/); - raceboardViewConfig = new RaceBoardViewConfiguration(activeCompetitorsFilterSetName, /* showLeaderboard */ false, - showWindChart, showCompetitorsChart, showViewStreamlets, showViewSimulation, - /* canReplayWhileLiveIsPossible */ false, /* autoSelectMedia */ false, /* defaultMedia */ null); - - final ParallelExecutionCallback> getRegattasCallback = new ParallelExecutionCallback>(); - final ParallelExecutionCallback getEventByIdCallback = new ParallelExecutionCallback(); - List> callbacks = new ArrayList<>(); - callbacks.add(getRegattasCallback); if (eventId != null) { - callbacks.add(getEventByIdCallback); - } - ParallelExecutionCallback[] callbackArray = callbacks.toArray(new ParallelExecutionCallback[0]); - new ParallelExecutionHolder(callbackArray) { - @Override - public void handleSuccess() { - checkUrlParameters(getRegattasCallback.getData(), - eventId == null ? null : getEventByIdCallback.getData(), - showMapControls); - } + sailingService.getEventById(eventId, /* withStatisticalData */ false, new AsyncCallback() { + @Override + public void onSuccess(EventDTO eventDTO) { + checkUrlParameters(eventDTO, showWindChart, showMapControls, showViewStreamlets, showViewSimulation); + } - @Override - public void handleFailure(Throwable t) { - reportError("Error trying to create the raceboard: " + t.getMessage()); - } - }; - sailingService.getRegattas(getRegattasCallback); - if (eventId != null) { - sailingService.getEventById(eventId, /* withStatisticalData */ false, getEventByIdCallback); + @Override + public void onFailure(Throwable t) { + reportError("Error trying to create the raceboard: " + t.getMessage()); + } + }); + } else { + checkUrlParameters(/* event */ null, showWindChart, showMapControls, showViewStreamlets, showViewSimulation); } } @@ -117,81 +97,66 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint RootPanel.get().add(new Label(message)); } - private void checkUrlParameters(List regattas, EventDTO event, boolean showMapControls) { + private void checkUrlParameters(final EventDTO event, final boolean showWindChart, + final boolean showMapControls, final boolean showViewStreamlets, final boolean showViewSimulation) { if (eventId != null && event == null) { createErrorPage(getStringMessages().noSuchEvent()); } - RaceDTO race = findRace(regattaLikeName, raceColumnName, regattas); - selectedRace = race; - if (selectedRace == null) { - createErrorPage("Could not obtain a race with name " + raceColumnName + " for a regatta with name " + regattaLikeName); - return; - } - Window.setTitle(selectedRace.getName()); - RaceSelectionModel raceSelectionModel = new RaceSelectionModel(); - List singletonList = Collections.singletonList(selectedRace.getRaceIdentifier()); - raceSelectionModel.setSelection(singletonList); - Timer timer = new Timer(PlayModes.Replay, 1000l); - AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor(); - RaceTimesInfoProvider raceTimesInfoProvider = new RaceTimesInfoProvider(sailingService, asyncActionsExecutor, this, singletonList, 5000l /* requestInterval*/); - RaceBoardPanel raceBoardPanel = new RaceBoardPanel(sailingService, mediaService, getUserService(), asyncActionsExecutor, timer, raceSelectionModel, - leaderboardName, leaderboardGroupName, event, raceboardViewConfig, EmbeddedMapAndWindChartEntryPoint.this, getStringMessages(), userAgent, raceTimesInfoProvider, showMapControls); - raceBoardPanel.fillRegattas(regattas); - createRaceBoardInOneScreenMode(raceBoardPanel, raceboardViewConfig); - } - - private RaceDTO findRace(String regattaName, String raceName, List regattas) { - for (RegattaDTO regattaDTO : regattas) { - if (regattaDTO.getName().equals(regattaName)) { - for (RaceDTO raceDTO : regattaDTO.races) { - if (raceDTO.getName().equals(raceName)) { - return raceDTO; - } - } - } - } - return null; - } - - private FlowPanel createTimePanel(RaceBoardPanel raceBoardPanel) { - FlowPanel timeLineInnerBgPanel = new FlowPanel(); - timeLineInnerBgPanel.addStyleName("timeLineInnerBgPanel"); - timeLineInnerBgPanel.add(raceBoardPanel.getTimePanel()); - - FlowPanel timeLineInnerPanel = new FlowPanel(); - timeLineInnerPanel.add(timeLineInnerBgPanel); - timeLineInnerPanel.addStyleName("timeLineInnerPanel"); - - FlowPanel timelinePanel = new FlowPanel(); - timelinePanel.add(timeLineInnerPanel); - timelinePanel.addStyleName("timeLinePanel"); - - return timelinePanel; - } - - private void createRaceBoardInOneScreenMode(final RaceBoardPanel raceBoardPanel, - RaceBoardViewConfiguration raceboardViewConfiguration) { - final DockLayoutPanel p = new DockLayoutPanel(Unit.PX); - RootLayoutPanel.get().add(p); - final FlowPanel timePanel = createTimePanel(raceBoardPanel); - final Button toggleButton = raceBoardPanel.getTimePanel().getAdvancedToggleButton(); - toggleButton.addClickHandler(new ClickHandler() { + sailingService.getRaceIdentifier(regattaLikeName, raceColumnName, fleetName, new AsyncCallback() { @Override - public void onClick(ClickEvent event) { - boolean advancedModeShown = raceBoardPanel.getTimePanel().toggleAdvancedMode(); - if (advancedModeShown) { - p.setWidgetSize(timePanel, 96); - toggleButton.removeStyleDependentName("Closed"); - toggleButton.addStyleDependentName("Open"); + public void onFailure(Throwable caught) { + createErrorPage("Could not obtain a race with name " + raceColumnName + " for fleet "+fleetName+" for a regatta with name " + regattaLikeName+ + ": "+caught.getMessage()); + } + + @Override + public void onSuccess(final RegattaAndRaceIdentifier selectedRaceIdentifier) { + if (selectedRaceIdentifier == null) { + createErrorPage("Could not obtain a race with name " + raceColumnName + " for fleet "+fleetName+" for a regatta with name " + regattaLikeName); } else { - p.setWidgetSize(timePanel, 67); - toggleButton.addStyleDependentName("Closed"); - toggleButton.removeStyleDependentName("Open"); + Window.setTitle(selectedRace.getName()); + RaceSelectionModel raceSelectionModel = new RaceSelectionModel(); + List singletonList = Collections.singletonList(selectedRaceIdentifier); + raceSelectionModel.setSelection(singletonList); + Timer timer = new Timer(PlayModes.Live, Duration.ONE_SECOND.times(3).asMillis()); + AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor(); + final TimeRangeWithZoomProvider timeRangeWithZoomProvider = new TimeRangeWithZoomModel(); + raceMapResources.combinedWindPanelStyle().ensureInjected(); + final CompetitorSelectionProvider competitorSelection = createEmptyFilterCompetitorModel(); // show no competitors + final RaceMap raceMap = new RaceMap(sailingService, asyncActionsExecutor, /* errorReporter */ EmbeddedMapAndWindChartEntryPoint.this, timer, + competitorSelection, getStringMessages(), showMapControls, showViewStreamlets, + showViewSimulation, selectedRaceIdentifier, raceMapResources.combinedWindPanelStyle()); + final WindChart windChart; + if (showWindChart) { + windChart = new WindChart(sailingService, raceSelectionModel, timer, + timeRangeWithZoomProvider, new WindChartSettings(), getStringMessages(), + asyncActionsExecutor, /* errorReporter */ EmbeddedMapAndWindChartEntryPoint.this, /* compactChart */ true); + } else { + windChart = null; + } + createRaceBoardInOneScreenMode(raceMap, windChart); } } }); - p.addSouth(timePanel, 67); - p.add(raceBoardPanel); + } + + private CompetitorSelectionProvider createEmptyFilterCompetitorModel() { + final CompetitorSelectionModel result = new CompetitorSelectionModel(/* hasMultiSelection */ true); + final FilterSet> filterSet = result.getOrCreateCompetitorsFilterSet("Empty"); + filterSet.addFilter(new Filter() { + @Override public boolean matches(CompetitorDTO object) { return false; } + @Override public String getName() { return "Never matching filter"; } + }); + return result; + } + + private void createRaceBoardInOneScreenMode(final RaceMap raceMap, final WindChart windChart) { + final TouchSplitLayoutPanel p = new TouchSplitLayoutPanel(/* horizontal splitter width */ 3, /* vertical splitter height */ 25); + RootLayoutPanel.get().add(p); + p.insert(raceMap.getEntryWidget(), raceMap, Direction.CENTER, 400); + if (windChart != null) { + p.insert(windChart.getEntryWidget(), windChart, Direction.SOUTH, 200); + } p.addStyleName("dockLayoutPanel"); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java index 13512300c2d..c9afd65fa40 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java @@ -194,7 +194,6 @@ public class RaceBoardEntryPoint extends AbstractSailingEntryPoint { RaceTimesInfoProvider raceTimesInfoProvider = new RaceTimesInfoProvider(sailingService, asyncActionsExecutor, this, singletonList, 5000l /* requestInterval*/); RaceBoardPanel raceBoardPanel = new RaceBoardPanel(sailingService, mediaService, getUserService(), asyncActionsExecutor, timer, raceSelectionModel, leaderboardName, leaderboardGroupName, event, raceboardViewConfig, RaceBoardEntryPoint.this, getStringMessages(), userAgent, raceTimesInfoProvider, showMapControls); - raceBoardPanel.fillRegattas(regattas); createRaceBoardInOneScreenMode(raceBoardPanel, raceboardViewConfig); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java index 9af624c6d49..34368e176f4 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java @@ -35,7 +35,6 @@ import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener; import com.sap.sailing.gwt.ui.client.RaceSelectionProvider; import com.sap.sailing.gwt.ui.client.RaceTimePanel; import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider; -import com.sap.sailing.gwt.ui.client.RegattasDisplayer; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.media.MediaPlayerManagerComponent; @@ -54,7 +53,6 @@ import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel; import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings; import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettingsFactory; import com.sap.sailing.gwt.ui.shared.EventDTO; -import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sse.common.filter.FilterSet; import com.sap.sse.common.settings.AbstractSettings; import com.sap.sse.gwt.client.ErrorReporter; @@ -77,7 +75,7 @@ import com.sap.sse.security.ui.client.UserService; * @author Frank Mittag, Axel Uhl (d043530) * */ -public class RaceBoardPanel extends SimplePanel implements RegattasDisplayer, RaceSelectionChangeListener, LeaderboardUpdateListener, PopupPositionProvider { +public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeListener, LeaderboardUpdateListener, PopupPositionProvider { private final SailingServiceAsync sailingService; private final MediaServiceAsync mediaService; private final EventDTO event; @@ -86,11 +84,6 @@ public class RaceBoardPanel extends SimplePanel implements RegattasDisplayer, Ra private final RaceBoardViewConfiguration raceboardViewConfiguration; private String raceBoardName; - /** - * Updated upon each {@link #fillRegattas(List)} - */ - private final Map racesByIdentifier; - private final List componentViewers; private RaceTimePanel timePanel; private final Timer timer; @@ -146,7 +139,6 @@ public class RaceBoardPanel extends SimplePanel implements RegattasDisplayer, Ra this.currentRaceHasBeenSelectedOnce = false; this.leaderboardName = leaderboardName; raceSelectionProvider.addRaceSelectionChangeListener(this); - racesByIdentifier = new HashMap(); selectedRaceIdentifier = raceSelectionProvider.getSelectedRaces().iterator().next(); this.setRaceBoardName(selectedRaceIdentifier.getRaceName()); this.asyncActionsExecutor = asyncActionsExecutor; @@ -336,18 +328,6 @@ public class RaceBoardPanel extends SimplePanel implements RegattasDisplayer, Ra return errorReporter; } - @Override - public void fillRegattas(Iterable regattas) { - racesByIdentifier.clear(); - for (RegattaDTO regatta : regattas) { - for (RaceDTO race : regatta.races) { - if (race != null && race.getRaceIdentifier() != null) { - racesByIdentifier.put(race.getRaceIdentifier(), race); - } - } - } - } - @Override public void onRaceSelectionChange(List selectedRaces) { } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 436ea1c4cdb..836b83b41a9 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -5760,4 +5760,23 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S return true; } } + + @Override + public RegattaAndRaceIdentifier getRaceIdentifier(String regattaLikeName, String raceColumnName, String fleetName) { + RegattaAndRaceIdentifier result = null; + final Leaderboard leaderboard = getService().getLeaderboardByName(regattaLikeName); + if (leaderboard != null) { + final RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName); + if (raceColumn != null) { + final Fleet fleet = raceColumn.getFleetByName(fleetName); + if (fleet != null) { + final TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); + if (trackedRace != null) { + result = trackedRace.getRaceIdentifier(); + } + } + } + } + return result; + } } From 3f8286583dda4f1a5e47ad76a1f6855e874c2a9d Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 9 Jul 2015 12:41:42 +0200 Subject: [PATCH 065/219] Race/Regatta list filter - Improved dropdown filter --- .../listNavigation/DropdownFilter.java | 46 +++++++++++-------- .../listNavigation/DropdownFilter.ui.xml | 2 +- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/DropdownFilter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/DropdownFilter.java index cf069d074e5..725499053f8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/DropdownFilter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/DropdownFilter.java @@ -30,27 +30,35 @@ public class DropdownFilter extends Composite { @UiField FlowPanel filterItemContainerUi; private final DropdownFilterList filterList; private final DropdownHandler dropdownHandler; + private final String nullValueLabel; + private T selectedFilterValue = null; - public DropdownFilter(DropdownFilterList filterList) { + public DropdownFilter(String nullValueLabel, DropdownFilterList filterList) { + this.nullValueLabel = nullValueLabel; this.filterList = filterList; CSS.ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); this.dropdownHandler = new ListFilterDropdownHandler(); - - this.addFilterValue(filterList.getDefaultValues()).select(); - for (T value : filterList.getSelectableValues()) { - addFilterValue(value); - } } - private ListDropdownFilterItem addFilterValue(T value) { - ListDropdownFilterItem filterItem = new ListDropdownFilterItem(value); + public void updateFilterValues() { + filterItemContainerUi.clear(); + DropdownFilterItem filterItemToSelect = addFilterValue(null, nullValueLabel); + for (T value : filterList.getSelectableValues()) { + DropdownFilterItem newFilterItem = addFilterValue(value, String.valueOf(value)); + filterItemToSelect = value.equals(selectedFilterValue) ? newFilterItem : filterItemToSelect; + } + filterItemToSelect.select(); + setVisible(filterList.getSelectableValues().size() > 1); + } + + private DropdownFilterItem addFilterValue(T value, String label) { + DropdownFilterItem filterItem = new DropdownFilterItem(value, label); filterItemContainerUi.add(filterItem); return filterItem; } public interface DropdownFilterList { - T getDefaultValues(); Collection getSelectableValues(); void onSelectFilter(T value); } @@ -66,13 +74,14 @@ public class DropdownFilter extends Composite { } } - private class ListDropdownFilterItem extends Widget { + private class DropdownFilterItem extends Widget { private final T value; - private ListDropdownFilterItem(T value) { + private final String label; + private DropdownFilterItem(T value, String label) { this.value = value; - DivElement element = DOM.createDiv().cast(); - element.setInnerText(String.valueOf(value)); - this.setElement(element); + this.label = label; + this.setElement(DOM.createDiv().cast()); + this.getElement().setInnerText(label); this.addStyleName(CSS.regattanavigation_filter_dropdown_link()); this.initClickHandler(); } @@ -83,20 +92,21 @@ public class DropdownFilter extends Composite { public void onClick(ClickEvent event) { if(LinkUtil.handleLinkClick((Event) event.getNativeEvent())) { event.preventDefault(); - dropdownHandler.setVisible(false); - ListDropdownFilterItem.this.select(); - filterList.onSelectFilter(value); + DropdownFilterItem.this.select(); + DropdownFilter.this.dropdownHandler.setVisible(false); } } }, ClickEvent.getType()); } private void select() { - currentValueUi.setInnerText(String.valueOf(value)); + DropdownFilter.this.selectedFilterValue = value; + DropdownFilter.this.currentValueUi.setInnerText(label); for (int i=0; i < filterItemContainerUi.getWidgetCount(); i++) { filterItemContainerUi.getWidget(i).removeStyleName(CSS.regattanavigation_filter_dropdown_linkactive()); } this.addStyleName(CSS.regattanavigation_filter_dropdown_linkactive()); + DropdownFilter.this.filterList.onSelectFilter(value); } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/DropdownFilter.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/DropdownFilter.ui.xml index bddd62ad678..e188cd37436 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/DropdownFilter.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/DropdownFilter.ui.xml @@ -8,7 +8,7 @@
- Filter TODO: + :
From e1c498a5f4ae27e7691e07857ac27356146de84c Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 9 Jul 2015 13:29:09 +0200 Subject: [PATCH 066/219] Regatta list - Integrated filter into multi regattas regatta list --- .../tabs/MultiregattaRegattasTabView.java | 33 ++++++++++++++++- .../tabs/MultiregattaRegattasTabView.ui.xml | 37 ++++++++++--------- 2 files changed, 51 insertions(+), 19 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java index 90548ecf0c7..44db85b0f03 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java @@ -1,5 +1,7 @@ package com.sap.sailing.gwt.home.client.place.event.multiregatta.tabs; +import java.util.Collection; + import com.google.gwt.core.client.GWT; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; @@ -10,17 +12,24 @@ import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.home.client.place.event.multiregatta.EventMultiregattaView; import com.sap.sailing.gwt.home.client.place.event.multiregatta.EventMultiregattaView.Presenter; import com.sap.sailing.gwt.home.client.place.event.multiregatta.MultiregattaTabView; +import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.DropdownFilter; +import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.DropdownFilter.DropdownFilterList; import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaList; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshManager; +import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetLiveRacesForEventAction; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRegattaListViewAction; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; /** * Created by pgtaboada on 25.11.14. */ public class MultiregattaRegattasTabView extends Composite implements MultiregattaTabView { + @UiField(provided = true) DropdownFilter boatCategoryFilterUi; @UiField(provided = true) RacesListLive racesListLiveUi; @UiField(provided = true) MultiRegattaList regattaListUi; private Presenter currentPresenter; @@ -46,12 +55,14 @@ public class MultiregattaRegattasTabView extends Composite implements Multiregat @Override public void start(final MultiregattaRegattasPlace myPlace, final AcceptsOneWidget contentArea) { + MultiRegattasTabViewRegattaFilterList regattaFilterList = new MultiRegattasTabViewRegattaFilterList(); + boatCategoryFilterUi = new DropdownFilter(StringMessages.INSTANCE.allBoatClasses(), regattaFilterList); racesListLiveUi = new RacesListLive(currentPresenter, true); regattaListUi = new MultiRegattaList(currentPresenter); initWidget(ourUiBinder.createAndBindUi(this)); RefreshManager refreshManager = new RefreshManager(this, currentPresenter.getDispatch()); refreshManager.add(racesListLiveUi, new GetLiveRacesForEventAction(currentPresenter.getCtx().getEventDTO().getId())); - refreshManager.add(regattaListUi, new GetRegattaListViewAction(currentPresenter.getCtx().getEventDTO().getId())); + refreshManager.add(regattaFilterList, new GetRegattaListViewAction(currentPresenter.getCtx().getEventDTO().getId())); contentArea.setWidget(this); } @@ -68,5 +79,25 @@ public class MultiregattaRegattasTabView extends Composite implements Multiregat public MultiregattaRegattasPlace placeToFire() { return new MultiregattaRegattasPlace(currentPresenter.getCtx()); } + + private class MultiRegattasTabViewRegattaFilterList implements DropdownFilterList, RefreshableWidget> { + + @Override + public void setData(SortedSetResult data, long nextUpdate, int updateNo) { + regattaListUi.setData(data, nextUpdate, updateNo); + boatCategoryFilterUi.updateFilterValues(); + } + + @Override + public Collection getSelectableValues() { + return regattaListUi.getSelectableBoatCategories(); + } + + @Override + public void onSelectFilter(String value) { + regattaListUi.setVisibleBoatCategory(value); + } + + } } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml index 09fecde6023..072f58be09d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml @@ -1,19 +1,20 @@ - - - - .space-top { - margin-top: 2em; - margin-bottom: 2em; - } - - -
-
- - -
-
-
+ + + + .space-top { + margin-top: 2em; + margin-bottom: 2em; + } + + +
+
+ + + +
+
+
\ No newline at end of file From 83a6f8d00f909f52a0a080aa414cb6ca6ffb7c41 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 9 Jul 2015 13:45:54 +0200 Subject: [PATCH 067/219] refactored zoom types from ArrayList to Iterable --- .../gwt/ui/client/shared/racemap/RaceMap.java | 2 +- .../RaceMapSettingsDialogComponent.java | 2 +- .../shared/racemap/RaceMapZoomSettings.java | 20 ++++++----- .../EmbeddedMapAndWindChartEntryPoint.java | 34 +++++++++++++------ 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 1dd44ddb30b..8787ed4e3aa 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -1610,7 +1610,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe || !BoundsUtil.contains((currentMapBounds = map.getBounds()), newBounds) || graticuleAreaRatio(currentMapBounds, newBounds) > 10) { // only change bounds if the new bounds don't fit into the current map zoom - List oldZoomSettings = settings.getZoomSettings().getTypesToConsiderOnZoom(); + Iterable oldZoomSettings = settings.getZoomSettings().getTypesToConsiderOnZoom(); setAutoZoomInProgress(true); autoZoomLatLngBounds = newBounds; int newZoomLevel = getZoomLevel(autoZoomLatLngBounds); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettingsDialogComponent.java index 32de30d5e02..8244f485880 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettingsDialogComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettingsDialogComponent.java @@ -98,7 +98,7 @@ public class RaceMapSettingsDialogComponent implements SettingsDialogComponent(cb, zoomType)); zoomSettingsBoxesPanel.add(cb); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapZoomSettings.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapZoomSettings.java index 4704c029c82..8a6bcd5a361 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapZoomSettings.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapZoomSettings.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import com.google.gwt.maps.client.base.LatLngBounds; +import com.sap.sse.common.Util; /** * @author Lennart Hensler (D054527) @@ -29,7 +30,7 @@ public class RaceMapZoomSettings { } }; - private ArrayList typesToConsiderOnZoom; + private Iterable typesToConsiderOnZoom; private boolean zoomToSelectedCompetitors; /** @@ -37,13 +38,14 @@ public class RaceMapZoomSettings { * The attribute zoomToSelectedCompetitors will be false. */ public RaceMapZoomSettings() { - typesToConsiderOnZoom = new ArrayList(); + final List myTypesToConsiderOnZoom = new ArrayList<>(); + typesToConsiderOnZoom = myTypesToConsiderOnZoom; // Other zoom types such as BOATS, TAILS or WINDSENSORS are not currently used as default zoom types. - typesToConsiderOnZoom.add(ZoomTypes.BUOYS); + myTypesToConsiderOnZoom.add(ZoomTypes.BUOYS); zoomToSelectedCompetitors = false; } - public RaceMapZoomSettings(ArrayList typesToConsiderOnZoom, boolean zoomToSelected) { + public RaceMapZoomSettings(Iterable typesToConsiderOnZoom, boolean zoomToSelected) { this.typesToConsiderOnZoom = typesToConsiderOnZoom; this.zoomToSelectedCompetitors = zoomToSelected; } @@ -67,12 +69,14 @@ public class RaceMapZoomSettings { return newBounds; } - public List getTypesToConsiderOnZoom() { + public Iterable getTypesToConsiderOnZoom() { return typesToConsiderOnZoom; } - public void setTypesToConsiderOnZoom(List typesToConsiderOnZoom) { - this.typesToConsiderOnZoom = new ArrayList(typesToConsiderOnZoom); + public void setTypesToConsiderOnZoom(Iterable typesToConsiderOnZoom) { + List newTypesToConsiderOnZoom = new ArrayList<>(); + Util.addAll(typesToConsiderOnZoom, newTypesToConsiderOnZoom); + this.typesToConsiderOnZoom = newTypesToConsiderOnZoom; } public void setZoomToSelectedCompetitors(boolean zoomToSelectedCompetitors) { @@ -84,7 +88,7 @@ public class RaceMapZoomSettings { } public boolean containsZoomType(ZoomTypes zoomType) { - return typesToConsiderOnZoom.contains(zoomType); + return Util.contains(typesToConsiderOnZoom, zoomType); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index cca558968d1..bcc0daf8eb4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -1,6 +1,7 @@ package com.sap.sailing.gwt.ui.raceboard; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.UUID; @@ -12,9 +13,9 @@ import com.google.gwt.user.client.ui.DockLayoutPanel.Direction; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootLayoutPanel; import com.google.gwt.user.client.ui.RootPanel; +import com.sap.sailing.domain.common.LeaderboardNameConstants; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.dto.CompetitorDTO; -import com.sap.sailing.domain.common.dto.RaceDTO; import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint; import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; @@ -24,6 +25,9 @@ import com.sap.sailing.gwt.ui.client.shared.charts.WindChart; import com.sap.sailing.gwt.ui.client.shared.charts.WindChartSettings; import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMap; import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapResources; +import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapSettings; +import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapZoomSettings; +import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapZoomSettings.ZoomTypes; import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sse.common.Duration; import com.sap.sse.common.filter.Filter; @@ -36,8 +40,6 @@ import com.sap.sse.gwt.client.player.Timer.PlayModes; import com.sap.sse.gwt.shared.GwtHttpRequestUtils; public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint { - private RaceDTO selectedRace; - private static final String PARAM_REGATTA_LIKE_NAME = "regattaLikeName"; private static final String PARAM_RACE_COLUMN_NAME = "raceColumnName"; private static final String PARAM_FLEET_NAME = "fleetName"; @@ -114,11 +116,18 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint if (selectedRaceIdentifier == null) { createErrorPage("Could not obtain a race with name " + raceColumnName + " for fleet "+fleetName+" for a regatta with name " + regattaLikeName); } else { - Window.setTitle(selectedRace.getName()); - RaceSelectionModel raceSelectionModel = new RaceSelectionModel(); - List singletonList = Collections.singletonList(selectedRaceIdentifier); - raceSelectionModel.setSelection(singletonList); - Timer timer = new Timer(PlayModes.Live, Duration.ONE_SECOND.times(3).asMillis()); + final StringBuilder title = new StringBuilder(regattaLikeName); + title.append('/'); + title.append(raceColumnName); + if (!fleetName.equals(LeaderboardNameConstants.DEFAULT_FLEET_NAME)) { + title.append('/'); + title.append(fleetName); + } + Window.setTitle(title.toString()); + final RaceSelectionModel raceSelectionModel = new RaceSelectionModel(); + final List raceList = Collections.singletonList(selectedRaceIdentifier); + raceSelectionModel.setSelection(raceList); + final Timer timer = new Timer(PlayModes.Live, Duration.ONE_SECOND.times(3).asMillis()); AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor(); final TimeRangeWithZoomProvider timeRangeWithZoomProvider = new TimeRangeWithZoomModel(); raceMapResources.combinedWindPanelStyle().ensureInjected(); @@ -126,11 +135,16 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint final RaceMap raceMap = new RaceMap(sailingService, asyncActionsExecutor, /* errorReporter */ EmbeddedMapAndWindChartEntryPoint.this, timer, competitorSelection, getStringMessages(), showMapControls, showViewStreamlets, showViewSimulation, selectedRaceIdentifier, raceMapResources.combinedWindPanelStyle()); + final RaceMapSettings mapSettings = raceMap.getSettings(); + mapSettings.setZoomSettings(new RaceMapZoomSettings(Arrays.asList(ZoomTypes.BUOYS), /* zoom to selection */ false)); + raceMap.updateSettings(mapSettings); + raceMap.onRaceSelectionChange(raceList); final WindChart windChart; if (showWindChart) { windChart = new WindChart(sailingService, raceSelectionModel, timer, - timeRangeWithZoomProvider, new WindChartSettings(), getStringMessages(), - asyncActionsExecutor, /* errorReporter */ EmbeddedMapAndWindChartEntryPoint.this, /* compactChart */ true); + timeRangeWithZoomProvider, new WindChartSettings(), getStringMessages(), + asyncActionsExecutor, /* errorReporter */ + EmbeddedMapAndWindChartEntryPoint.this, /* compactChart */ true); } else { windChart = null; } From f7203659e4076d1ff52d5cd10e35eebacb3a7feb Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 9 Jul 2015 14:19:28 +0200 Subject: [PATCH 068/219] Regatta list - Adjusted regatta information classes --- .../event/partials/multiRegattaList/MultiRegattaListItem.java | 1 - .../event/partials/multiRegattaList/MultiRegattaListSteps.java | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java index 5450a53f74c..ccefec47f2f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java @@ -22,7 +22,6 @@ public class MultiRegattaListItem extends Composite { public MultiRegattaListItem(RegattaWithProgressDTO regattaWithProgress, Presenter presenter) { this.regattaWithProgress = regattaWithProgress; - MultiRegattaListResources.INSTANCE.css().ensureInjected(); regattaHeaderUi = new RegattaHeader(regattaWithProgress); regattaStepsUi = new MultiRegattaListSteps(regattaWithProgress.getProgress()); initWidget(uiBinder.createAndBindUi(this)); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java index ad885977a93..1ff3d9c794c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java @@ -23,6 +23,7 @@ public class MultiRegattaListSteps extends Composite { @UiField AnchorElement leaderboardButtonUi; public MultiRegattaListSteps(RegattaProgressDTO regattaProgress) { + MultiRegattaListResources.INSTANCE.css().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); for(RegattaProgressSeriesDTO seriesProgress : regattaProgress.getSeries()) { stepsContainerUi.insertBefore(new MultiRegattaListStepsBody(seriesProgress).getElement(), leaderboardButtonContainerUi); From 1e4f049ba8e6a595e44ea933caa1a00630e8a662 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 9 Jul 2015 14:21:10 +0200 Subject: [PATCH 069/219] Races list - Integrated regatta progress into races list --- .../event/regatta/tabs/RegattaRacesTabView.java | 12 ++++++++++++ .../event/regatta/tabs/RegattaRacesTabView.ui.xml | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index eab45773c0b..81a383a58ad 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -11,6 +11,7 @@ import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.home.client.place.event.EventView; @@ -18,6 +19,8 @@ import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListN import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.ListNavigationAction; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.SelectionCallback; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.RaceStateLegend; +import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaListResources; +import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaListSteps; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.AbstractRaceList; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListColumnFactory; @@ -31,6 +34,7 @@ import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRaceListViewAction; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListViewDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressDTO; /** * Created by pgtaboada on 25.11.14. @@ -69,6 +73,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView listNavigationPanelUi; @UiField FlowPanel listFormatContainerUi; @UiField FlowPanel compFormatContainerUi; @@ -106,6 +111,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView result) { + regattaInfoContainerUi.setWidget(getRegattaInformation(result.getDto().getProgress())); liveRacesList.setListData(result.getDto().getLiveRaces()); finishedRacesList.setListData(result.getDto().getFinishedRaces()); // for (RaceListSeriesDTO series : result.getDto().getRacesForCompetitionFormat()) { @@ -115,6 +121,12 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView - .listContainer > div { @@ -9,6 +8,9 @@ } +
+ +
From 1250e347d5aceba5a28d0cd09d440273f79b5492 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 9 Jul 2015 14:23:45 +0200 Subject: [PATCH 070/219] shows wind chart (sort of) below the race map with a resize handle --- .../ui/client/shared/charts/WindChart.java | 53 +++++++++---------- .../EmbeddedMapAndWindChartEntryPoint.java | 9 ++-- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/WindChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/WindChart.java index 6cff6b88243..c98c5e1c16f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/WindChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/WindChart.java @@ -521,38 +521,35 @@ public class WindChart extends AbstractRaceChart implements Component timeOfLatestRequestInMillis) { - loadData(new Date(timeOfLatestRequestInMillis), timeRangeWithZoomProvider.getToTime(), /* append */true); - } - // otherwise the cache spans across date and so we don't need to load anything - break; - } - case Replay: - { - if (timeOfLatestRequestInMillis == null) { - // pure replay mode - loadData(timeRangeWithZoomProvider.getFromTime(), timeRangeWithZoomProvider.getToTime(), /* append */false); - } else { - // replay mode during live play + if (isVisible()) { + updateTimePlotLine(newTime); + switch (timer.getPlayMode()) { + case Live: + { + // is date before first cache entry or is cache empty? if (timeOfEarliestRequestInMillis == null || newTime.getTime() < timeOfEarliestRequestInMillis) { loadData(timeRangeWithZoomProvider.getFromTime(), newTime, /* append */ true); } else if (newTime.getTime() > timeOfLatestRequestInMillis) { - loadData(new Date(timeOfLatestRequestInMillis), newTime, /* append */true); - } + loadData(new Date(timeOfLatestRequestInMillis), timeRangeWithZoomProvider.getToTime(), /* append */true); + } + // otherwise the cache spans across date and so we don't need to load anything + break; + } + case Replay: + { + if (timeOfLatestRequestInMillis == null) { + // pure replay mode + loadData(timeRangeWithZoomProvider.getFromTime(), timeRangeWithZoomProvider.getToTime(), /* append */false); + } else { + // replay mode during live play + if (timeOfEarliestRequestInMillis == null || newTime.getTime() < timeOfEarliestRequestInMillis) { + loadData(timeRangeWithZoomProvider.getFromTime(), newTime, /* append */ true); + } else if (newTime.getTime() > timeOfLatestRequestInMillis) { + loadData(new Date(timeOfLatestRequestInMillis), newTime, /* append */true); + } + } + break; } - break; } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index bcc0daf8eb4..b4c3523b689 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -51,6 +51,7 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint private UUID eventId; private static final RaceMapResources raceMapResources = GWT.create(RaceMapResources.class); + private static final int DEFAULT_WIND_CHART_HEIGHT = 200; @Override protected void doOnModuleLoad() { @@ -71,7 +72,7 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint } // read optional parameters - final boolean showWindChart = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_WINDCHART, false /* default*/); + final boolean showWindChart = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_WINDCHART, true /* default*/); final boolean showViewStreamlets = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_STREAMLETS, false /* default*/); final boolean showViewSimulation = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_SIMULATION, true /* default*/); final boolean showMapControls = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_MAPCONTROLS, true /* default*/); @@ -167,10 +168,12 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint private void createRaceBoardInOneScreenMode(final RaceMap raceMap, final WindChart windChart) { final TouchSplitLayoutPanel p = new TouchSplitLayoutPanel(/* horizontal splitter width */ 3, /* vertical splitter height */ 25); RootLayoutPanel.get().add(p); - p.insert(raceMap.getEntryWidget(), raceMap, Direction.CENTER, 400); if (windChart != null) { - p.insert(windChart.getEntryWidget(), windChart, Direction.SOUTH, 200); + windChart.setVisible(true); + p.insert(windChart.getEntryWidget(), windChart, Direction.SOUTH, DEFAULT_WIND_CHART_HEIGHT); + p.setWidgetVisibility(windChart.getEntryWidget(), windChart, /* hidden */ false, DEFAULT_WIND_CHART_HEIGHT); } + p.insert(raceMap.getEntryWidget(), raceMap, Direction.CENTER, 400); p.addStyleName("dockLayoutPanel"); } } From de7f1e48b0bb7a858c4e8eba11b37ed46d96c93d Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 9 Jul 2015 15:06:49 +0200 Subject: [PATCH 071/219] Regatta list - Adjusted multi regattas regatta list order --- .../tabs/MultiregattaRegattasTabView.ui.xml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml index 072f58be09d..23f8b2d6d1f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml @@ -3,16 +3,18 @@ - .space-top { - margin-top: 2em; - margin-bottom: 2em; - } + .space-top { + margin-top: 2em; + } + .space-bottom { + margin-bottom: 2em; + }
-
- +
+
From 7d244ac2711ca36db804bcf885644c4f6bd76566 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 9 Jul 2015 15:07:29 +0200 Subject: [PATCH 072/219] Races list - Temporarily remove format switch from race list --- .../client/place/event/regatta/tabs/RegattaRacesTabView.java | 3 ++- .../client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 81a383a58ad..55934bb4ea4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -101,7 +101,8 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView
- +
From f991c5b6fdc8783d8a5b6979ffedc48b8493956d Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 9 Jul 2015 16:04:17 +0200 Subject: [PATCH 073/219] Regatta list - Adjusted multi regatta regattas tab view class --- .../tabs/MultiregattaRegattasTabView.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java index 44db85b0f03..01c0da127ee 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java @@ -28,6 +28,11 @@ import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; * Created by pgtaboada on 25.11.14. */ public class MultiregattaRegattasTabView extends Composite implements MultiregattaTabView { + + interface MyBinder extends UiBinder { + } + + private static MyBinder ourUiBinder = GWT.create(MyBinder.class); @UiField(provided = true) DropdownFilter boatCategoryFilterUi; @UiField(provided = true) RacesListLive racesListLiveUi; @@ -35,7 +40,6 @@ public class MultiregattaRegattasTabView extends Composite implements Multiregat private Presenter currentPresenter; public MultiregattaRegattasTabView() { - } @Override @@ -55,7 +59,7 @@ public class MultiregattaRegattasTabView extends Composite implements Multiregat @Override public void start(final MultiregattaRegattasPlace myPlace, final AcceptsOneWidget contentArea) { - MultiRegattasTabViewRegattaFilterList regattaFilterList = new MultiRegattasTabViewRegattaFilterList(); + MultiregattaRegattasTabViewRegattaFilterList regattaFilterList = new MultiregattaRegattasTabViewRegattaFilterList(); boatCategoryFilterUi = new DropdownFilter(StringMessages.INSTANCE.allBoatClasses(), regattaFilterList); racesListLiveUi = new RacesListLive(currentPresenter, true); regattaListUi = new MultiRegattaList(currentPresenter); @@ -70,17 +74,13 @@ public class MultiregattaRegattasTabView extends Composite implements Multiregat public void stop() { } - interface MyBinder extends UiBinder { - } - - private static MyBinder ourUiBinder = GWT.create(MyBinder.class); - @Override public MultiregattaRegattasPlace placeToFire() { return new MultiregattaRegattasPlace(currentPresenter.getCtx()); } - private class MultiRegattasTabViewRegattaFilterList implements DropdownFilterList, RefreshableWidget> { + private class MultiregattaRegattasTabViewRegattaFilterList implements + DropdownFilterList, RefreshableWidget> { @Override public void setData(SortedSetResult data, long nextUpdate, int updateNo) { From 27afb56b4d64d91d81928819a0a01e46c5605d95 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 9 Jul 2015 16:05:46 +0200 Subject: [PATCH 074/219] Regatta list - Integrated regatta list into multi regatta overview (incl. switch to change between old and new regatta list) --- .../tabs/MultiregattaOverviewTabView.java | 143 +++++++++++------- .../tabs/MultiregattaOverviewTabView.ui.xml | 8 +- 2 files changed, 93 insertions(+), 58 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java index 5c6144acb4d..4093a8945bf 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java @@ -1,5 +1,6 @@ package com.sap.sailing.gwt.home.client.place.event.multiregatta.tabs; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -18,12 +19,20 @@ import com.sap.sailing.gwt.home.client.place.event.multiregatta.EventMultiregatt import com.sap.sailing.gwt.home.client.place.event.multiregatta.MultiregattaTabView; import com.sap.sailing.gwt.home.client.place.event.overview.EventOverviewStage; import com.sap.sailing.gwt.home.client.place.event.partials.eventregatta.EventRegattaList; +import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.DropdownFilter; +import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.DropdownFilter.DropdownFilterList; +import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaList; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshManager; +import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; +import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.RaceGroupDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetLiveRacesForEventAction; +import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRegattaListViewAction; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; import com.sap.sse.common.Util.Triple; /** @@ -31,10 +40,21 @@ import com.sap.sse.common.Util.Triple; */ public class MultiregattaOverviewTabView extends Composite implements MultiregattaTabView { + private static final boolean SHOW_NEW_REGATTA_LIST = true; + + interface MyBinder extends UiBinder { + } + + private static MyBinder ourUiBinder = GWT.create(MyBinder.class); + + @UiField SimplePanel content; + @UiField(provided = true) EventOverviewStage stage; + @UiField(provided = true) RacesListLive racesListLive; + @UiField(provided = true) DropdownFilter boatCategoryFilterUi; + @UiField(provided = true) MultiRegattaList regattaListUi; private Presenter currentPresenter; public MultiregattaOverviewTabView() { - } @Override @@ -54,78 +74,91 @@ public class MultiregattaOverviewTabView extends Composite implements Multiregat @Override public void start(MultiregattaOverviewPlace myPlace, AcceptsOneWidget contentArea) { - racesListLive = new RacesListLive(currentPresenter, true); stage = new EventOverviewStage(currentPresenter); + racesListLive = new RacesListLive(currentPresenter, true); + MultiregattaOverviewRegattasTabViewRegattaFilterList regattaFilterList = new MultiregattaOverviewRegattasTabViewRegattaFilterList(); + boatCategoryFilterUi = new DropdownFilter(StringMessages.INSTANCE.allBoatClasses(), regattaFilterList); + regattaListUi = new MultiRegattaList(currentPresenter); initWidget(ourUiBinder.createAndBindUi(this)); - RefreshManager refreshManager = new RefreshManager(this, currentPresenter.getDispatch()); - stage.setupRefresh(refreshManager); refreshManager.add(racesListLive, new GetLiveRacesForEventAction(currentPresenter.getCtx().getEventDTO().getId())); + + if (SHOW_NEW_REGATTA_LIST) { + refreshManager.add(regattaFilterList, new GetRegattaListViewAction(currentPresenter.getCtx().getEventDTO().getId())); + content.removeFromParent(); + } else { + boatCategoryFilterUi.removeFromParent(); + regattaListUi.removeFromParent(); + // TODO: understand, and than move this into appropiate place (probably context) + currentPresenter.ensureRegattaStructure(new AsyncCallback>() { + @Override + public void onSuccess(List raceGroups) { + if (raceGroups.size() > 0) { + initView(); + } else { + // createEventWithoutRegattasView(event, panel); + } + } + @Override + public void onFailure(Throwable caught) { + // createErrorView( + // "Error while loading the regatta structure with service getRegattaStructureOfEvent()", + // caught, panel); + } + }); + } contentArea.setWidget(this); + } - // TODO: understand, and than move this into appropiate place (probably context) - currentPresenter.ensureRegattaStructure(new AsyncCallback>() { - @Override - public void onSuccess(List raceGroups) { - if (raceGroups.size() > 0) { - initView(); - } else { - // createEventWithoutRegattasView(event, panel); - } - } + protected void initView() { + Map> regattaStructure = getRegattaStructure(); + EventRegattaList eventRegattaList = new EventRegattaList(regattaStructure, currentPresenter); + content.setWidget(eventRegattaList); + } - @Override - public void onFailure(Throwable caught) { - // createErrorView( - // "Error while loading the regatta structure with service getRegattaStructureOfEvent()", - // caught, panel); - } - }); - } - - protected void initView() { - Map> regattaStructure = getRegattaStructure(); - EventRegattaList eventRegattaList = new EventRegattaList(regattaStructure, currentPresenter); - content.setWidget(eventRegattaList); - } - - private Map> getRegattaStructure() { - Map> result = new HashMap<>(); - Map raceGroupsMap = new HashMap<>(); - for (RaceGroupDTO raceGroup: currentPresenter.getCtx().getRaceGroups()) { - raceGroupsMap.put(raceGroup.getName(), raceGroup); - } - - for (LeaderboardGroupDTO leaderboardGroup : currentPresenter.getCtx().getLeaderboardGroups()) { - for(StrippedLeaderboardDTO leaderboard: leaderboardGroup.getLeaderboards()) { - String leaderboardName = leaderboard.name; - result.put(leaderboardName, new Triple(raceGroupsMap.get(leaderboardName), - leaderboard, leaderboardGroup)); - } - } - return result; - } + private Map> getRegattaStructure() { + Map> result = new HashMap<>(); + Map raceGroupsMap = new HashMap<>(); + for (RaceGroupDTO raceGroup : currentPresenter.getCtx().getRaceGroups()) { + raceGroupsMap.put(raceGroup.getName(), raceGroup); + } + for (LeaderboardGroupDTO leaderboardGroup : currentPresenter.getCtx().getLeaderboardGroups()) { + for (StrippedLeaderboardDTO leaderboard : leaderboardGroup.getLeaderboards()) { + String leaderboardName = leaderboard.name; + result.put(leaderboardName, new Triple( + raceGroupsMap.get(leaderboardName), leaderboard, leaderboardGroup)); + } + } + return result; + } @Override public void stop() { } - - interface MyBinder extends UiBinder { - } - - private static MyBinder ourUiBinder = GWT.create(MyBinder.class); - - @UiField SimplePanel content; - @UiField(provided = true) RacesListLive racesListLive; - @UiField(provided = true) EventOverviewStage stage; - @Override public MultiregattaOverviewPlace placeToFire() { return new MultiregattaOverviewPlace(currentPresenter.getCtx()); } + + private class MultiregattaOverviewRegattasTabViewRegattaFilterList implements + DropdownFilterList, RefreshableWidget> { + @Override + public void setData(SortedSetResult data, long nextUpdate, int updateNo) { + regattaListUi.setData(data, nextUpdate, updateNo); + boatCategoryFilterUi.updateFilterValues(); + } + @Override + public Collection getSelectableValues() { + return regattaListUi.getSelectableBoatCategories(); + } + @Override + public void onSelectFilter(String value) { + regattaListUi.setVisibleBoatCategory(value); + } + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.ui.xml index 7e73a5c2923..8f393b6e502 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.ui.xml @@ -1,13 +1,15 @@
-
- +
+ + +
From 2674718962975451ab142c7368bee9c7381fed6d Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 9 Jul 2015 16:22:48 +0200 Subject: [PATCH 075/219] Regatta list - Added switch to change between old and new regatta list in multi regatta regattas tab view --- .../tabs/MultiregattaRegattasTabView.java | 68 ++++++++++++++++++- .../tabs/MultiregattaRegattasTabView.ui.xml | 1 + 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java index 01c0da127ee..b8d1cc000a4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java @@ -1,17 +1,23 @@ package com.sap.sailing.gwt.home.client.place.event.multiregatta.tabs; import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import com.google.gwt.core.client.GWT; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.SimplePanel; import com.sap.sailing.gwt.common.client.controls.tabbar.TabView; import com.sap.sailing.gwt.home.client.place.event.multiregatta.EventMultiregattaView; import com.sap.sailing.gwt.home.client.place.event.multiregatta.EventMultiregattaView.Presenter; import com.sap.sailing.gwt.home.client.place.event.multiregatta.MultiregattaTabView; +import com.sap.sailing.gwt.home.client.place.event.partials.eventregatta.EventRegattaList; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.DropdownFilter; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.DropdownFilter.DropdownFilterList; import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaList; @@ -19,23 +25,30 @@ import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesLi import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshManager; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; +import com.sap.sailing.gwt.ui.shared.RaceGroupDTO; +import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetLiveRacesForEventAction; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRegattaListViewAction; import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; +import com.sap.sse.common.Util.Triple; /** * Created by pgtaboada on 25.11.14. */ public class MultiregattaRegattasTabView extends Composite implements MultiregattaTabView { + + private static final boolean SHOW_NEW_REGATTA_LIST = true; interface MyBinder extends UiBinder { } private static MyBinder ourUiBinder = GWT.create(MyBinder.class); - @UiField(provided = true) DropdownFilter boatCategoryFilterUi; + @UiField SimplePanel content; @UiField(provided = true) RacesListLive racesListLiveUi; + @UiField(provided = true) DropdownFilter boatCategoryFilterUi; @UiField(provided = true) MultiRegattaList regattaListUi; private Presenter currentPresenter; @@ -59,16 +72,65 @@ public class MultiregattaRegattasTabView extends Composite implements Multiregat @Override public void start(final MultiregattaRegattasPlace myPlace, final AcceptsOneWidget contentArea) { + racesListLiveUi = new RacesListLive(currentPresenter, true); MultiregattaRegattasTabViewRegattaFilterList regattaFilterList = new MultiregattaRegattasTabViewRegattaFilterList(); boatCategoryFilterUi = new DropdownFilter(StringMessages.INSTANCE.allBoatClasses(), regattaFilterList); - racesListLiveUi = new RacesListLive(currentPresenter, true); regattaListUi = new MultiRegattaList(currentPresenter); + initWidget(ourUiBinder.createAndBindUi(this)); RefreshManager refreshManager = new RefreshManager(this, currentPresenter.getDispatch()); refreshManager.add(racesListLiveUi, new GetLiveRacesForEventAction(currentPresenter.getCtx().getEventDTO().getId())); - refreshManager.add(regattaFilterList, new GetRegattaListViewAction(currentPresenter.getCtx().getEventDTO().getId())); + + if (SHOW_NEW_REGATTA_LIST) { + refreshManager.add(regattaFilterList, new GetRegattaListViewAction(currentPresenter.getCtx().getEventDTO().getId())); + content.removeFromParent(); + } else { + boatCategoryFilterUi.removeFromParent(); + regattaListUi.removeFromParent(); + // TODO: understand, and than move this into appropiate place (probably context) + currentPresenter.ensureRegattaStructure(new AsyncCallback>() { + @Override + public void onSuccess(List raceGroups) { + if (raceGroups.size() > 0) { + initView(); + } else { + // createEventWithoutRegattasView(event, panel); + } + } + + @Override + public void onFailure(Throwable caught) { + // createErrorView( + // "Error while loading the regatta structure with service getRegattaStructureOfEvent()", + // caught, panel); + } + }); + } contentArea.setWidget(this); } + + protected void initView() { + Map> regattaStructure = getRegattaStructure(); + EventRegattaList eventRegattaList = new EventRegattaList(regattaStructure, currentPresenter); + content.setWidget(eventRegattaList); + } + + private Map> getRegattaStructure() { + Map> result = new HashMap<>(); + Map raceGroupsMap = new HashMap<>(); + for (RaceGroupDTO raceGroup: currentPresenter.getCtx().getRaceGroups()) { + raceGroupsMap.put(raceGroup.getName(), raceGroup); + } + + for (LeaderboardGroupDTO leaderboardGroup : currentPresenter.getCtx().getLeaderboardGroups()) { + for(StrippedLeaderboardDTO leaderboard: leaderboardGroup.getLeaderboards()) { + String leaderboardName = leaderboard.name; + result.put(leaderboardName, new Triple(raceGroupsMap.get(leaderboardName), + leaderboard, leaderboardGroup)); + } + } + return result; + } @Override public void stop() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml index 23f8b2d6d1f..bcf92b4f8d2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml @@ -18,5 +18,6 @@
+
\ No newline at end of file From 8e57ce7bfb606140ad65989d7651da4a74b582fa Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 9 Jul 2015 16:41:37 +0200 Subject: [PATCH 076/219] use a TimePanel to manage time range for wind chart; initialize time range automatically --- .../sap/sailing/gwt/ui/client/TimePanel.java | 24 +++++++++++++++++++ .../EmbeddedMapAndWindChartEntryPoint.java | 13 ++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java index 8bd1ddc7bb7..c89d78a5bbb 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java @@ -20,6 +20,9 @@ import com.google.gwt.user.client.ui.RequiresResize; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.ui.client.TimePanelCssResources.TimePanelCss; +import com.sap.sse.common.TimePoint; +import com.sap.sse.common.Util; +import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.gwt.client.controls.slider.SliderBar; import com.sap.sse.gwt.client.controls.slider.TimeSlider; import com.sap.sse.gwt.client.player.PlayStateListener; @@ -331,9 +334,13 @@ public class TimePanel extends SimplePanel implemen if (timeRangeProvider.isZoomed()) { timeSlider.setCurrentValue(new Double(newTime.getTime()), false); } else { + if (getFromTime() == null || getToTime() == null) { + initializeTimeRange(oldTime, newTime); + } if (getFromTime() != null && getToTime() != null) { // handle the case where time advances beyond slider's end. if (newTime.after(getToTime())) { + // in live mode, expand the range switch (timer.getPlayMode()) { case Live: Date newMaxTime = new Date(newTime.getTime()); @@ -343,6 +350,7 @@ public class TimePanel extends SimplePanel implemen setMinMax(getFromTime(), newMaxTime, /* fireEvent */ false); // no event because we guarantee that time is between min/max break; case Replay: + // in replay, stop playing when the end of the range has been reached timer.pause(); break; } @@ -362,6 +370,22 @@ public class TimePanel extends SimplePanel implemen } } + /** + * When the time range is not yet properly initialized and we get a time change, adjust the time range so that old and + * new time are in range. A margin of one minute is used before and after. This method assumes that at least one of the + * two time points passed as parameters has a value other than null. Should the other be null, + * it is ignored. No assumptions are made about the temporal relation of the two time points to each other; in other + * words, oldTime may also be after newTime which could, e.g., be the case for a timer running + * backwards. + */ + private void initializeTimeRange(Date oldTime, Date newTime) { + TimePoint from = Util.getEarliestOfTimePoints(getFromTime()==null?null:new MillisecondsTimePoint(getFromTime()), oldTime==null?null:new MillisecondsTimePoint(oldTime)); + from = Util.getEarliestOfTimePoints(from, newTime==null?null:new MillisecondsTimePoint(newTime)); + TimePoint to = Util.getEarliestOfTimePoints(getToTime()==null?null:new MillisecondsTimePoint(getToTime()), oldTime==null?null:new MillisecondsTimePoint(oldTime)); + from = Util.getEarliestOfTimePoints(to, newTime==null?null:new MillisecondsTimePoint(newTime)); + timeRangeProvider.setTimeRange(from==null?null:from.asDate(), to==null?null:to.asDate()); + } + protected String getTimeToStartLabelText(Date time) { return null; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index b4c3523b689..a029728a09d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -21,6 +21,8 @@ import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel; import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider; import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel; import com.sap.sailing.gwt.ui.client.RaceSelectionModel; +import com.sap.sailing.gwt.ui.client.TimePanel; +import com.sap.sailing.gwt.ui.client.TimePanelSettings; import com.sap.sailing.gwt.ui.client.shared.charts.WindChart; import com.sap.sailing.gwt.ui.client.shared.charts.WindChartSettings; import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMap; @@ -71,7 +73,7 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint return; } - // read optional parameters + // read optional parameters final boolean showWindChart = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_WINDCHART, true /* default*/); final boolean showViewStreamlets = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_STREAMLETS, false /* default*/); final boolean showViewSimulation = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_SIMULATION, true /* default*/); @@ -128,9 +130,15 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint final RaceSelectionModel raceSelectionModel = new RaceSelectionModel(); final List raceList = Collections.singletonList(selectedRaceIdentifier); raceSelectionModel.setSelection(raceList); - final Timer timer = new Timer(PlayModes.Live, Duration.ONE_SECOND.times(3).asMillis()); + final long refreshInterval = Duration.ONE_SECOND.times(3).asMillis(); + final Timer timer = new Timer(PlayModes.Live); AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor(); final TimeRangeWithZoomProvider timeRangeWithZoomProvider = new TimeRangeWithZoomModel(); + // Use a TimePanel to manage wind chart zoom, although the TimePanel itself is not being displayed + final TimePanel timePanel = new TimePanel<>(timer, timeRangeWithZoomProvider, getStringMessages(), /* canReplayWhileLive */ false); + final TimePanelSettings timePanelSettings = timePanel.getSettings(); + timePanelSettings.setRefreshInterval(refreshInterval); + timePanel.updateSettings(timePanelSettings); raceMapResources.combinedWindPanelStyle().ensureInjected(); final CompetitorSelectionProvider competitorSelection = createEmptyFilterCompetitorModel(); // show no competitors final RaceMap raceMap = new RaceMap(sailingService, asyncActionsExecutor, /* errorReporter */ EmbeddedMapAndWindChartEntryPoint.this, timer, @@ -146,6 +154,7 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint timeRangeWithZoomProvider, new WindChartSettings(), getStringMessages(), asyncActionsExecutor, /* errorReporter */ EmbeddedMapAndWindChartEntryPoint.this, /* compactChart */ true); + windChart.onRaceSelectionChange(raceList); } else { windChart = null; } From 827c98bfc6c2cdfa2b7d5f2e7b4df6641bfa6fbc Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Thu, 9 Jul 2015 16:47:14 +0200 Subject: [PATCH 077/219] Races list - Added switch to change between old and new Races list in regattas races tab view --- .../regatta/tabs/RegattaRacesTabView.java | 98 +++++++++++++++---- .../regatta/tabs/RegattaRacesTabView.ui.xml | 1 + 2 files changed, 79 insertions(+), 20 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 55934bb4ea4..b9b7aae20e6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -1,6 +1,9 @@ package com.sap.sailing.gwt.home.client.place.event.regatta.tabs; import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Display; @@ -27,20 +30,26 @@ import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListCol import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListContainer; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListDataUtil; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.SortableRaceListColumn; +import com.sap.sailing.gwt.home.client.place.event.partials.regattaraces.EventRegattaRaces; import com.sap.sailing.gwt.home.client.place.event.regatta.EventRegattaView.Presenter; import com.sap.sailing.gwt.home.client.place.event.regatta.RegattaTabView; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; +import com.sap.sailing.gwt.ui.shared.RaceGroupDTO; +import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRaceListViewAction; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListViewDTO; import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressDTO; +import com.sap.sse.common.Util.Triple; /** * Created by pgtaboada on 25.11.14. */ public class RegattaRacesTabView extends Composite implements RegattaTabView { + private static final boolean SHOW_NEW_RACES_LIST = true; private static final StringMessages I18N = StringMessages.INSTANCE; private enum Navigation implements ListNavigationAction { @@ -77,6 +86,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView listNavigationPanelUi; @UiField FlowPanel listFormatContainerUi; @UiField FlowPanel compFormatContainerUi; + @UiField SimplePanel oldContentContainer; private RacesListLive liveRacesList; private RaceListFinishedRaces finishedRacesList; @@ -101,26 +111,57 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView>() { - @Override - public void onFailure(Throwable caught) { - } - @Override - public void onSuccess(ResultWithTTL result) { - regattaInfoContainerUi.setWidget(getRegattaInformation(result.getDto().getProgress())); - liveRacesList.setListData(result.getDto().getLiveRaces()); - finishedRacesList.setListData(result.getDto().getFinishedRaces()); -// for (RaceListSeriesDTO series : result.getDto().getRacesForCompetitionFormat()) { -// compFormatContainerUi.add(new RegattaCompetitionSeries(currentPresenter, series)); -// } - contentArea.setWidget(RegattaRacesTabView.this); - } - }); + if (SHOW_NEW_RACES_LIST) { + listNavigationPanelUi.removeFromParent(); // TODO temporary removed + // listNavigationPanelUi.addAction(Navigation.SORT_LIST_FORMAT, true); + // listNavigationPanelUi.addAction(Navigation.COMPETITION_FORMAT, false); + + GetRaceListViewAction action = new GetRaceListViewAction(myPlace.getCtx().getEventDTO().getId(), myPlace.getRegattaId()); + currentPresenter.getDispatch().execute(action, new AsyncCallback>() { + @Override + public void onFailure(Throwable caught) { + } + @Override + public void onSuccess(ResultWithTTL result) { + regattaInfoContainerUi.setWidget(getRegattaInformation(result.getDto().getProgress())); + liveRacesList.setListData(result.getDto().getLiveRaces()); + finishedRacesList.setListData(result.getDto().getFinishedRaces()); + // for (RaceListSeriesDTO series : result.getDto().getRacesForCompetitionFormat()) { + // compFormatContainerUi.add(new RegattaCompetitionSeries(currentPresenter, series)); + // } + contentArea.setWidget(RegattaRacesTabView.this); + } + }); + oldContentContainer.removeFromParent(); + } else { + regattaInfoContainerUi.removeFromParent(); + listFormatContainerUi.removeFromParent(); + compFormatContainerUi.removeFromParent(); + // TODO: understand, and than move this into appropiate place (probably context) + final String selectedRegattaId = myPlace.getCtx().getRegattaId(); + currentPresenter.ensureRegattaStructure(new AsyncCallback>() { + @Override + public void onSuccess(List raceGroups) { + if (raceGroups.size() > 0) { + Map> rs = getRegattaStructure(); + Triple selectedRegatta = rs .get(selectedRegattaId); + EventRegattaRaces regattaRaces = new EventRegattaRaces(currentPresenter); + oldContentContainer.setWidget(regattaRaces); + regattaRaces.setRaces(selectedRegatta.getC(), false, selectedRegatta.getB(), selectedRegatta.getA()); + contentArea.setWidget(RegattaRacesTabView.this); + } else { + // createEventWithoutRegattasView(event, panel); + } + } + + @Override + public void onFailure(Throwable caught) { + // createErrorView( + // "Error while loading the regatta structure with service getRegattaStructureOfEvent()", + // caught, panel); + } + }); + } } private Widget getRegattaInformation(RegattaProgressDTO regattaProgress) { @@ -142,6 +183,23 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView getPlaceClassForActivation() { return RegattaRacesPlace.class; } + + private Map> getRegattaStructure() { + Map> result = new HashMap<>(); + Map raceGroupsMap = new HashMap<>(); + for (RaceGroupDTO raceGroup : currentPresenter.getCtx().getRaceGroups()) { + raceGroupsMap.put(raceGroup.getName(), raceGroup); + } + + for (LeaderboardGroupDTO leaderboardGroup : currentPresenter.getCtx().getLeaderboardGroups()) { + for (StrippedLeaderboardDTO leaderboard : leaderboardGroup.getLeaderboards()) { + String leaderboardName = leaderboard.name; + result.put(leaderboardName, new Triple( + raceGroupsMap.get(leaderboardName), leaderboard, leaderboardGroup)); + } + } + return result; + } private class RegattaRacesTabViewNavigationSelectionCallback implements SelectionCallback { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml index b1e0cffc772..3aa6b9dc881 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml @@ -16,5 +16,6 @@
+
\ No newline at end of file From 42af45fe8f234775307bc1377a582c52ef647480 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 10 Jul 2015 09:27:30 +0200 Subject: [PATCH 078/219] added FIXME comment about map header layout issues --- .../com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 8787ed4e3aa..cb6d690b5a8 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -507,7 +507,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe map = new MapWidget(mapOptions); RaceMap.this.add(map, 0, 0); Image sapLogo = createSAPLogo(); - RaceMap.this.add(sapLogo); + RaceMap.this.add(sapLogo); // FIXME how about adding the SAP logo as a control and this way pushing down the wind and north panels? map.setControls(ControlPosition.LEFT_TOP, combinedWindPanel); combinedWindPanel.getParent().addStyleName("CombinedWindPanelParentDiv"); map.setControls(ControlPosition.LEFT_TOP, trueNorthIndicatorPanel); From 0748572c33902d89187b7322bd9b8c8ce2134001 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 10 Jul 2015 11:32:46 +0200 Subject: [PATCH 079/219] fixed production of error page --- .../ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index a029728a09d..e1c0a429ee2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -7,12 +7,13 @@ import java.util.List; import java.util.UUID; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.DockLayoutPanel; import com.google.gwt.user.client.ui.DockLayoutPanel.Direction; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootLayoutPanel; -import com.google.gwt.user.client.ui.RootPanel; import com.sap.sailing.domain.common.LeaderboardNameConstants; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.dto.CompetitorDTO; @@ -96,10 +97,12 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint } private void createErrorPage(String message) { + final DockLayoutPanel vp = new DockLayoutPanel(Unit.PX); LogoAndTitlePanel logoAndTitlePanel = new LogoAndTitlePanel(getStringMessages(), this, getUserService()); logoAndTitlePanel.addStyleName("LogoAndTitlePanel"); - RootPanel.get().add(logoAndTitlePanel); - RootPanel.get().add(new Label(message)); + RootLayoutPanel.get().add(vp); + vp.addNorth(logoAndTitlePanel, 100); + vp.add(new Label(message)); } private void checkUrlParameters(final EventDTO event, final boolean showWindChart, From 62c568505685e7e1134b55a3c173c584ed968758 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 10 Jul 2015 11:33:40 +0200 Subject: [PATCH 080/219] fixed production of error page also for RaceBoardEntryPoint --- .../sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java index c9afd65fa40..7d9e1c75e65 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java @@ -17,7 +17,6 @@ import com.google.gwt.user.client.ui.DockLayoutPanel; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootLayoutPanel; -import com.google.gwt.user.client.ui.RootPanel; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.dto.RaceDTO; import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint; @@ -138,10 +137,12 @@ public class RaceBoardEntryPoint extends AbstractSailingEntryPoint { } private void createErrorPage(String message) { + final DockLayoutPanel vp = new DockLayoutPanel(Unit.PX); LogoAndTitlePanel logoAndTitlePanel = new LogoAndTitlePanel(getStringMessages(), this, getUserService()); logoAndTitlePanel.addStyleName("LogoAndTitlePanel"); - RootPanel.get().add(logoAndTitlePanel); - RootPanel.get().add(new Label(message)); + RootLayoutPanel.get().add(vp); + vp.addNorth(logoAndTitlePanel, 100); + vp.add(new Label(message)); } private void checkUrlParameters(List leaderboardNames, LeaderboardGroupDTO leaderboardGroup, From 724cedf5e17a3c40cef1045f0d82b541ea58ae27 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 10 Jul 2015 11:40:45 +0200 Subject: [PATCH 081/219] introduced RaceMap constructor parameter showHeaderPanel, addressing bug 3095 --- .../client/startanalysis/StartlineAnalysisCard.java | 2 +- .../gwt/ui/client/RequiresDataInitialization.java | 2 +- .../sailing/gwt/ui/client/shared/racemap/RaceMap.java | 10 +++++----- .../raceboard/EmbeddedMapAndWindChartEntryPoint.java | 2 +- .../sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java | 3 ++- .../com/sap/sailing/gwt/ui/simulator/SimulatorMap.java | 4 ++-- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysisCard.java b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysisCard.java index 034fd34c083..df99f1c9f2c 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysisCard.java +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/startanalysis/StartlineAnalysisCard.java @@ -148,7 +148,7 @@ public class StartlineAnalysisCard extends Composite implements HasWidgets, Star asyncActionsExecutor, null, Collections.singletonList(startAnalysisDTO.regattaAndRaceIdentifier), 5000l /* requestInterval */); raceMap = new RaceMap(sailingServiceAsync, asyncActionsExecutor, null, timer, competitorSelectionModel, StringMessages.INSTANCE, false, false, false, startAnalysisDTO.regattaAndRaceIdentifier, - resources.combinedWindPanelStyle()); + resources.combinedWindPanelStyle(), /* showHeaderPanel */ true); raceMap.onRaceSelectionChange(Collections.singletonList(startAnalysisDTO.regattaAndRaceIdentifier)); raceMap.getSettings().setZoomSettings(new RaceMapZoomSettings(zoomTypes, false)); raceMap.getSettings().setHelpLinesSettings(getHelpLineSettings()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RequiresDataInitialization.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RequiresDataInitialization.java index cf3f1216d15..c6134d49cde 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RequiresDataInitialization.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RequiresDataInitialization.java @@ -9,7 +9,7 @@ package com.sap.sailing.gwt.ui.client; */ public interface RequiresDataInitialization { - public void initializeData(boolean showMapControls); + public void initializeData(boolean showMapControls, boolean showHeaderPanel); public boolean isDataInitialized(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index cb6d690b5a8..a2343a6af9a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -382,7 +382,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe public RaceMap(SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, ErrorReporter errorReporter, Timer timer, CompetitorSelectionProvider competitorSelection, StringMessages stringMessages, boolean showMapControls, boolean showViewStreamlets, boolean showViewSimulation, - RegattaAndRaceIdentifier raceIdentifier, CombinedWindPanelStyle combinedWindPanelStyle) { + RegattaAndRaceIdentifier raceIdentifier, CombinedWindPanelStyle combinedWindPanelStyle, boolean showHeaderPanel) { this.setSize("100%", "100%"); this.showMapControls = showMapControls; this.stringMessages = stringMessages; @@ -414,7 +414,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe headerPanel.setStyleName("RaceMap-HeaderPanel"); panelForLeftHeaderLabels = new AbsolutePanel(); panelForRightHeaderLabels = new AbsolutePanel(); - initializeData(showMapControls); + initializeData(showMapControls, showHeaderPanel); combinedWindPanel = new CombinedWindPanel(raceMapImageManager, combinedWindPanelStyle, stringMessages, coordinateSystem); combinedWindPanel.setVisible(false); trueNorthIndicatorPanel = new TrueNorthIndicatorPanel(this, raceMapImageManager, combinedWindPanelStyle, stringMessages, coordinateSystem); @@ -492,7 +492,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe }); } - private void loadMapsAPIV3(final boolean showMapControls) { + private void loadMapsAPIV3(final boolean showMapControls, boolean showHeaderPanel) { boolean sensor = true; // load all the libs for use in the maps @@ -2358,8 +2358,8 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe } @Override - public void initializeData(boolean showMapControls) { - loadMapsAPIV3(showMapControls); + public void initializeData(boolean showMapControls, boolean showHeaderPanel) { + loadMapsAPIV3(showMapControls, showHeaderPanel); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index e1c0a429ee2..9a8e0368594 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -146,7 +146,7 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint final CompetitorSelectionProvider competitorSelection = createEmptyFilterCompetitorModel(); // show no competitors final RaceMap raceMap = new RaceMap(sailingService, asyncActionsExecutor, /* errorReporter */ EmbeddedMapAndWindChartEntryPoint.this, timer, competitorSelection, getStringMessages(), showMapControls, showViewStreamlets, - showViewSimulation, selectedRaceIdentifier, raceMapResources.combinedWindPanelStyle()); + showViewSimulation, selectedRaceIdentifier, raceMapResources.combinedWindPanelStyle(), /* showHeaderPanel */ false); final RaceMapSettings mapSettings = raceMap.getSettings(); mapSettings.setZoomSettings(new RaceMapZoomSettings(Arrays.asList(ZoomTypes.BUOYS), /* zoom to selection */ false)); raceMap.updateSettings(mapSettings); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java index 34368e176f4..6d89dae29d3 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java @@ -155,7 +155,8 @@ public class RaceBoardPanel extends SimplePanel implements RaceSelectionChangeLi raceMapResources.combinedWindPanelStyle().ensureInjected(); raceMap = new RaceMap(sailingService, asyncActionsExecutor, errorReporter, timer, - competitorSelectionModel, stringMessages, showMapControls, getConfiguration().isShowViewStreamlets(), getConfiguration().isShowViewSimulation(), selectedRaceIdentifier, raceMapResources.combinedWindPanelStyle()); + competitorSelectionModel, stringMessages, showMapControls, getConfiguration().isShowViewStreamlets(), getConfiguration().isShowViewSimulation(), + selectedRaceIdentifier, raceMapResources.combinedWindPanelStyle(), /* showHeaderPanel */ true); CompetitorFilterPanel competitorSearchTextBox = new CompetitorFilterPanel(competitorSelectionModel, stringMessages, raceMap, new LeaderboardFetcher() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorMap.java index 7fb1a5cc601..b32bf914d2d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorMap.java @@ -360,7 +360,7 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ this.replayPathCanvasOverlays = null; this.raceCourseCanvasOverlay = null; this.timeListeners = new LinkedList(); - this.initializeData(showMapControls); + this.initializeData(showMapControls, /* showHeaderPanel */ true); this.parent = parent; } @@ -1000,7 +1000,7 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ } @Override - public void initializeData(boolean showMapControls) { + public void initializeData(boolean showMapControls, boolean showHeaderPanel) { loadMapsAPIV3(); } From b8a6393dd5648a4ebcb66a9a3ff9d4d70b9c6e3d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 10 Jul 2015 11:54:28 +0200 Subject: [PATCH 082/219] hide header panel and SAP logo in embedded / showHeaderPanel=false mode of RaceMap; see again bug 3095 --- .../gwt/ui/client/shared/racemap/RaceMap.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index a2343a6af9a..89a08475e97 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -492,7 +492,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe }); } - private void loadMapsAPIV3(final boolean showMapControls, boolean showHeaderPanel) { + private void loadMapsAPIV3(final boolean showMapControls, final boolean showHeaderPanel) { boolean sensor = true; // load all the libs for use in the maps @@ -506,8 +506,10 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe MapOptions mapOptions = getMapOptions(showMapControls, /* wind up */ false); map = new MapWidget(mapOptions); RaceMap.this.add(map, 0, 0); - Image sapLogo = createSAPLogo(); - RaceMap.this.add(sapLogo); // FIXME how about adding the SAP logo as a control and this way pushing down the wind and north panels? + if (showHeaderPanel) { + Image sapLogo = createSAPLogo(); + RaceMap.this.add(sapLogo); + } map.setControls(ControlPosition.LEFT_TOP, combinedWindPanel); combinedWindPanel.getParent().addStyleName("CombinedWindPanelParentDiv"); map.setControls(ControlPosition.LEFT_TOP, trueNorthIndicatorPanel); @@ -592,8 +594,9 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe simulationOverlay.addToMap(); simulationOverlay.setVisible(false); } - - createHeaderPanel(map); + if (showHeaderPanel) { + createHeaderPanel(map); + } createSettingsButton(map); // Data has been initialized From eeb28b1c67ce8dc66a44695faf7716387000d4da Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 10 Jul 2015 12:18:29 +0200 Subject: [PATCH 083/219] bug 3092: reduced confidence of COURSE_BASED wind source type to 0.01 to really make it only a default, superseded by any other wind source by far --- .../src/com/sap/sailing/domain/common/WindSourceType.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/WindSourceType.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/WindSourceType.java index 9f634453523..82bc51cfa6e 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/WindSourceType.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/WindSourceType.java @@ -27,9 +27,10 @@ public enum WindSourceType { TRACK_BASED_ESTIMATION(false, 0.5, /* useSpeed */ false), /** - * Inferred from the race course layout if the course is known to have its first leg be an upwind leg + * Inferred from the race course layout if the course is known to have its first leg be an upwind leg. This + * source has very low confidence and must be superseded by any other wind source. */ - COURSE_BASED(false, 0.3, /* useSpeed */ false), + COURSE_BASED(false, 0.01, /* useSpeed */ false), /** * Wind estimation combined from all other wind sources, using TrackedRace.getWind(...), based on From 5b67829a0fd5cb3bb6856536629da331ceab0882 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 10 Jul 2015 14:14:07 +0200 Subject: [PATCH 084/219] fixing bug 3096 (which also may have affected RaceBoard aversely) by zoooming to what the settings tell after map re-orientation --- .../com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 89a08475e97..125399e846b 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -483,8 +483,8 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe public void execute() { if (map != null) { map.setOptions(mapOptions); - final LatLngBounds newBounds = getDefaultZoomBounds(); - zoomMapToNewBounds(newBounds); + // ensure zooming to what the settings tell, or defaults if what the settings tell isn't possible right now + mapFirstZoomDone = false; trueNorthIndicatorPanel.redraw(); orientationChangeInProgress = false; } From 98e5fc497f3267f25e617acc78f8f32550e25dee Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 10 Jul 2015 22:06:11 +0200 Subject: [PATCH 085/219] preparing to put the back to live button as control onto the map; it doesn't seem to be so easy; simply adding it breaks the entire entry point --- .../main/java/com/sap/sailing/gwt/ui/client/TimePanel.java | 4 ++++ .../gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java index c89d78a5bbb..c75bcbe4c84 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java @@ -619,4 +619,8 @@ public class TimePanel extends SimplePanel implemen public String getDependentCssClassName() { return "timePanel"; } + + public Button getBackToLiveButton() { + return backToLivePlayButton; + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index 9a8e0368594..885478bcba5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -8,8 +8,10 @@ import java.util.UUID; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.maps.client.controls.ControlPosition; 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.DockLayoutPanel; import com.google.gwt.user.client.ui.DockLayoutPanel.Direction; import com.google.gwt.user.client.ui.Label; @@ -139,6 +141,7 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint final TimeRangeWithZoomProvider timeRangeWithZoomProvider = new TimeRangeWithZoomModel(); // Use a TimePanel to manage wind chart zoom, although the TimePanel itself is not being displayed final TimePanel timePanel = new TimePanel<>(timer, timeRangeWithZoomProvider, getStringMessages(), /* canReplayWhileLive */ false); + final Button backToLivePlayButton = timePanel.getBackToLiveButton(); final TimePanelSettings timePanelSettings = timePanel.getSettings(); timePanelSettings.setRefreshInterval(refreshInterval); timePanel.updateSettings(timePanelSettings); @@ -147,6 +150,8 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint final RaceMap raceMap = new RaceMap(sailingService, asyncActionsExecutor, /* errorReporter */ EmbeddedMapAndWindChartEntryPoint.this, timer, competitorSelection, getStringMessages(), showMapControls, showViewStreamlets, showViewSimulation, selectedRaceIdentifier, raceMapResources.combinedWindPanelStyle(), /* showHeaderPanel */ false); +// backToLivePlayButton.removeFromParent(); +// raceMap.getMap().setControls(ControlPosition.TOP_RIGHT, backToLivePlayButton); final RaceMapSettings mapSettings = raceMap.getSettings(); mapSettings.setZoomSettings(new RaceMapZoomSettings(Arrays.asList(ZoomTypes.BUOYS), /* zoom to selection */ false)); raceMap.updateSettings(mapSettings); From 3483d4ef8b1adb1cd3cd5d7eea5293d39a25adb7 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sat, 11 Jul 2015 01:09:33 +0200 Subject: [PATCH 086/219] back to live button appears, but not in correct place nor with reachable z-ordering --- .../gwt/ui/client/shared/racemap/RaceMap.java | 8 ++++++- .../EmbeddedMapAndWindChartEntryPoint.java | 21 ++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 125399e846b..70a734ed0eb 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -603,11 +603,17 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe RaceMap.this.isMapInitialized = true; RaceMap.this.redraw(); trueNorthIndicatorPanel.redraw(); + showAdditionalControls(map); } }; - LoadApi.go(onLoad, loadLibraries, sensor, "key="+GoogleMapAPIKey.V3_APIKey); } + + /** + * Subclasses may define additional stuff to be shown on the map. + */ + protected void showAdditionalControls(MapWidget map) { + } private void setHasPolar() { GetPolarAction getPolar = new GetPolarAction(sailingService, raceIdentifier); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index 885478bcba5..73f4077f430 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -8,6 +8,7 @@ import java.util.UUID; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.maps.client.MapWidget; import com.google.gwt.maps.client.controls.ControlPosition; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -139,8 +140,14 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint final Timer timer = new Timer(PlayModes.Live); AsyncActionsExecutor asyncActionsExecutor = new AsyncActionsExecutor(); final TimeRangeWithZoomProvider timeRangeWithZoomProvider = new TimeRangeWithZoomModel(); - // Use a TimePanel to manage wind chart zoom, although the TimePanel itself is not being displayed - final TimePanel timePanel = new TimePanel<>(timer, timeRangeWithZoomProvider, getStringMessages(), /* canReplayWhileLive */ false); + // Use a TimePanel to manage wind chart zoom, although the TimePanel itself is not being displayed; + // let the time panel always return to "live" mode if the user wants that + final TimePanel timePanel = new TimePanel( + timer, timeRangeWithZoomProvider, getStringMessages(), /* canReplayWhileLive */ false) { + protected boolean isLiveModeToBeMadePossible() { + return true; + } + }; final Button backToLivePlayButton = timePanel.getBackToLiveButton(); final TimePanelSettings timePanelSettings = timePanel.getSettings(); timePanelSettings.setRefreshInterval(refreshInterval); @@ -149,9 +156,13 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint final CompetitorSelectionProvider competitorSelection = createEmptyFilterCompetitorModel(); // show no competitors final RaceMap raceMap = new RaceMap(sailingService, asyncActionsExecutor, /* errorReporter */ EmbeddedMapAndWindChartEntryPoint.this, timer, competitorSelection, getStringMessages(), showMapControls, showViewStreamlets, - showViewSimulation, selectedRaceIdentifier, raceMapResources.combinedWindPanelStyle(), /* showHeaderPanel */ false); -// backToLivePlayButton.removeFromParent(); -// raceMap.getMap().setControls(ControlPosition.TOP_RIGHT, backToLivePlayButton); + showViewSimulation, selectedRaceIdentifier, raceMapResources.combinedWindPanelStyle(), /* showHeaderPanel */ false) { + @Override + protected void showAdditionalControls(MapWidget map) { + backToLivePlayButton.removeFromParent(); + map.setControls(ControlPosition.TOP_RIGHT, backToLivePlayButton); + } + }; final RaceMapSettings mapSettings = raceMap.getSettings(); mapSettings.setZoomSettings(new RaceMapZoomSettings(Arrays.asList(ZoomTypes.BUOYS), /* zoom to selection */ false)); raceMap.updateSettings(mapSettings); From f61bbb9258a42675ba6793bde7f4b532cab416a4 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sat, 11 Jul 2015 11:41:10 +0200 Subject: [PATCH 087/219] adjusted style for back to live button for EmbeddedMapAndWindChart.css --- java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.css | 9 +++++---- .../ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.css b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.css index 62ba67e0fa7..6376c253b35 100644 --- a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.css +++ b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.css @@ -359,16 +359,17 @@ img.openColumn { } .backToLivePlayButton { - position: absolute; - right: 15px; - top: 8px; width: 42px; height: 38px; font-size: 8px; white-space: normal; border-radius: 4px; border: none; - cursor: pointer; + + margin-right: 23px; + margin-top: 5px; + margin-bottom: 5px; + z-index: 1; } .backToLivePlayButton-Inactive { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index 73f4077f430..44005fab357 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -160,7 +160,7 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint @Override protected void showAdditionalControls(MapWidget map) { backToLivePlayButton.removeFromParent(); - map.setControls(ControlPosition.TOP_RIGHT, backToLivePlayButton); + map.setControls(ControlPosition.RIGHT_BOTTOM, backToLivePlayButton); } }; final RaceMapSettings mapSettings = raceMap.getSettings(); From 06ecbc0f6af537717a2033e15e9743c0821f8dff Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Sat, 11 Jul 2015 17:45:29 +0200 Subject: [PATCH 088/219] removed GWT.debugger() statement --- .../gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index 44005fab357..e21f2aa2de6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -61,7 +61,6 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint @Override protected void doOnModuleLoad() { - GWT.debugger(); super.doOnModuleLoad(); // read mandatory parameters regattaLikeName = Window.Location.getParameter(PARAM_REGATTA_LIKE_NAME); From e0e426acbd160332238027efddeafcb86c385488 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 13 Jul 2015 09:48:02 +0200 Subject: [PATCH 089/219] Implemented calculation of wind source count for finished races --- .../event/partials/racelist/RaceListColumnFactory.java | 2 +- .../event/partials/racelist/RaceListDataUtil.java | 2 +- .../gwt/ui/shared/dispatch/event/RaceContext.java | 8 ++++++++ .../gwt/ui/shared/dispatch/event/RaceListRaceDTO.java | 10 +++++----- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index 4c5047ff702..bb2ac17b09d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -383,7 +383,7 @@ public class RaceListColumnFactory { return new DataCountColumn(DataCountColumn.ICON_WIND) { @Override public Number getValue(T object) { - return object.getWindFixesCount(); + return object.getWindSourcesCount(); } }; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java index 05daf8ea620..b393bcf228f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java @@ -64,7 +64,7 @@ public class RaceListDataUtil { return hasNumberValues(data, new ValueProvider() { @Override public Number getValue(T object) { - return object.getWindFixesCount(); + return object.getWindSourcesCount(); } }); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index a15c06def58..32d0ab54e0f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -304,12 +304,20 @@ public class RaceContext { fillRaceData(liveRaceDTO); liveRaceDTO.setDuration(getDurationOrNull()); liveRaceDTO.setWinner(getWinnerOrNull()); + liveRaceDTO.setWindSourcesCount(getWindSourceCount()); return liveRaceDTO; } return null; } + private int getWindSourceCount() { + if(trackedRace != null) { + return trackedRace.getWindSources().size() - trackedRace.getWindSourcesToExclude().size(); + } + return 0; + } + private SimpleCompetitorDTO getWinnerOrNull() { // TODO calculate winner from score correction if(trackedRace != null) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java index c5b410e9328..df22376c799 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java @@ -7,7 +7,7 @@ public class RaceListRaceDTO extends RaceMetadataDTO { private Duration duration; private SimpleCompetitorDTO winner; - private int windFixesCount; + private int windSourcesCount; private int videoCount; private int audioCount; @@ -31,11 +31,11 @@ public class RaceListRaceDTO extends RaceMetadataDTO { public void setWinner(SimpleCompetitorDTO winner) { this.winner = winner; } - public int getWindFixesCount() { - return windFixesCount; + public int getWindSourcesCount() { + return windSourcesCount; } - public void setWindFixesCount(int windFixesCount) { - this.windFixesCount = windFixesCount; + public void setWindSourcesCount(int windFixesCount) { + this.windSourcesCount = windFixesCount; } public int getVideoCount() { return videoCount; From acb37841bece88b1ce09c5bbd7c1cb2a3b2b365d Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 13 Jul 2015 10:10:02 +0200 Subject: [PATCH 090/219] Races list - Renamed utility method for "has wind sources" --- .../client/place/event/partials/racelist/RaceListDataUtil.java | 2 +- .../client/place/event/regatta/tabs/RegattaRacesTabView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java index b393bcf228f..164dbea4bb1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java @@ -60,7 +60,7 @@ public class RaceListDataUtil { }); } - public static boolean hasWindFixes(Collection data) { + public static boolean hasWindSources(Collection data) { return hasNumberValues(data, new ValueProvider() { @Override public Number getValue(T object) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index b9b7aae20e6..dc35c45f3ef 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -232,7 +232,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView Date: Mon, 13 Jul 2015 10:11:02 +0200 Subject: [PATCH 091/219] Races list - Race stats columns are now sortable, prefered DESC --- .../racelist/RaceListColumnFactory.java | 31 +++++++++++++++---- .../racelist/SortableRaceListColumn.java | 6 +++- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index bb2ac17b09d..4d52219eb98 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -21,6 +21,7 @@ import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.safehtml.shared.UriUtils; import com.google.gwt.user.cellview.client.SafeHtmlHeader; import com.sap.sailing.domain.common.InvertibleComparator; +import com.sap.sailing.domain.common.SortingOrder; import com.sap.sailing.domain.common.impl.NaturalComparator; import com.sap.sailing.gwt.common.client.SharedResources; import com.sap.sailing.gwt.common.client.SharedResources.MainCss; @@ -380,7 +381,13 @@ public class RaceListColumnFactory { } public static SortableRaceListColumn getWindFixesCountColumn() { - return new DataCountColumn(DataCountColumn.ICON_WIND) { + InvertibleComparator comparator = new InvertibleComparatorWrapper(new NullSafeComparableComparator(false)) { + @Override + protected Integer getComparisonValue(T object) { + return object.getWindSourcesCount(); + } + }; + return new DataCountColumn(DataCountColumn.ICON_WIND, comparator) { @Override public Number getValue(T object) { return object.getWindSourcesCount(); @@ -389,7 +396,13 @@ public class RaceListColumnFactory { } public static SortableRaceListColumn getVideoCountColumn() { - return new DataCountColumn(DataCountColumn.ICON_VIDEO) { + InvertibleComparator comparator = new InvertibleComparatorWrapper(new NullSafeComparableComparator(false)) { + @Override + protected Integer getComparisonValue(T object) { + return object.getVideoCount(); + } + }; + return new DataCountColumn(DataCountColumn.ICON_VIDEO, comparator) { @Override public Number getValue(T object) { return object.getVideoCount(); @@ -398,7 +411,13 @@ public class RaceListColumnFactory { } public static SortableRaceListColumn getAudioCountColumn() { - return new DataCountColumn(DataCountColumn.ICON_AUDIO) { + InvertibleComparator comparator = new InvertibleComparatorWrapper(new NullSafeComparableComparator(false)) { + @Override + protected Integer getComparisonValue(T object) { + return object.getAudioCount(); + } + }; + return new DataCountColumn(DataCountColumn.ICON_AUDIO, comparator) { @Override public Number getValue(T object) { return object.getAudioCount(); @@ -531,7 +550,7 @@ public class RaceListColumnFactory { private static final SafeUri ICON_VIDEO = UriUtils.fromTrustedString("images/home/icon-video.png"); private static final SafeUri ICON_AUDIO = UriUtils.fromTrustedString("images/home/icon-audio.png"); - private DataCountColumn(final SafeUri imageUri) { + private DataCountColumn(final SafeUri imageUri, InvertibleComparator comparator) { super(new SafeHtmlHeader(TEMPLATE.imageHeader(CSS.raceslist_head_itemflag(), imageUri)), new AbstractCell() { @Override public void render(Context context, Number value, SafeHtmlBuilder sb) { @@ -541,9 +560,9 @@ public class RaceListColumnFactory { sb.appendHtmlConstant("—"); } } - }, null); + }, comparator, SortingOrder.DESCENDING); } - + @Override public String getHeaderStyle() { return getStyleNamesString(CSS.raceslist_head_item(), CSS.raceslist_head_itemcenter(), MEDIA_CSS.showonlarge()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java index 81785457a07..69ffa9c2d0f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java @@ -20,7 +20,11 @@ public abstract class SortableRaceListColumn extends SortableColumn } protected SortableRaceListColumn(Header header, Cell cell, InvertibleComparator comparator) { - super(cell, SortingOrder.ASCENDING); + this(header, cell, comparator, SortingOrder.ASCENDING); + } + + protected SortableRaceListColumn(Header header, Cell cell, InvertibleComparator comparator, SortingOrder preferredSortingOrder) { + super(cell, preferredSortingOrder); this.header = header; this.comparator = comparator; } From 2e743e8a86db76161cf3fcf888f35ba0aaae0d75 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 13 Jul 2015 10:32:24 +0200 Subject: [PATCH 092/219] Implemented calculation of media count for race list --- .../dispatch/event/EventActionUtil.java | 16 ++++++---- .../dispatch/event/LeaderboardContext.java | 6 ++-- .../ui/shared/dispatch/event/RaceContext.java | 29 ++++++++++++++++++- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/EventActionUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/EventActionUtil.java index 8876b6a10e3..a9a8a4bd2ac 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/EventActionUtil.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/EventActionUtil.java @@ -12,6 +12,7 @@ import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContext; import com.sap.sailing.gwt.ui.shared.dispatch.DispatchException; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; import com.sap.sailing.gwt.ui.shared.general.EventState; +import com.sap.sailing.server.RacingEventService; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; @@ -35,21 +36,23 @@ public final class EventActionUtil { } public static LeaderboardContext getOverallLeaderboardContext(DispatchContext context, UUID eventId) { - Event event = context.getRacingEventService().getEvent(eventId); + RacingEventService service = context.getRacingEventService(); + Event event = service.getEvent(eventId); if(!HomeServiceUtil.isFakeSeries(event)) { throw new DispatchException("The given event is not a series event."); } LeaderboardGroup leaderboardGroup = Util.get(event.getLeaderboardGroups(), 0); Leaderboard overallLeaderboard = leaderboardGroup.getOverallLeaderboard(); - return new LeaderboardContext(event, leaderboardGroup, overallLeaderboard); + return new LeaderboardContext(service, event, leaderboardGroup, overallLeaderboard); } public static LeaderboardContext getLeaderboardContext(DispatchContext context, UUID eventId, String leaderboardId) { - Event event = context.getRacingEventService().getEvent(eventId); + RacingEventService service = context.getRacingEventService(); + Event event = service.getEvent(eventId); for(LeaderboardGroup leaderboardGroup : event.getLeaderboardGroups()) { for(Leaderboard leaderboard : leaderboardGroup.getLeaderboards()) { if(leaderboard.getName().equals(leaderboardId)) { - return new LeaderboardContext(event, leaderboardGroup, leaderboard); + return new LeaderboardContext(service, event, leaderboardGroup, leaderboard); } } } @@ -87,10 +90,11 @@ public final class EventActionUtil { } public static void forLeaderboardsOfEvent(DispatchContext context, UUID eventId, LeaderboardCallback callback) { - Event event = context.getRacingEventService().getEvent(eventId); + RacingEventService service = context.getRacingEventService(); + Event event = service.getEvent(eventId); for (LeaderboardGroup leaderboardGroup : event.getLeaderboardGroups()) { for (Leaderboard leaderboard : leaderboardGroup.getLeaderboards()) { - callback.doForLeaderboard(new LeaderboardContext(event, leaderboardGroup, leaderboard)); + callback.doForLeaderboard(new LeaderboardContext(service, event, leaderboardGroup, leaderboard)); } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LeaderboardContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LeaderboardContext.java index 9ba4b146082..85d904fbd94 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LeaderboardContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LeaderboardContext.java @@ -27,8 +27,10 @@ public class LeaderboardContext { private final Event event; private final LeaderboardGroup leaderboardGroup; private final Leaderboard leaderboard; + private final RacingEventService service; - public LeaderboardContext(Event event, LeaderboardGroup leaderboardGroup, Leaderboard leaderboard) { + public LeaderboardContext(RacingEventService service, Event event, LeaderboardGroup leaderboardGroup, Leaderboard leaderboard) { + this.service = service; this.event = event; this.leaderboardGroup = leaderboardGroup; this.leaderboard = leaderboard; @@ -37,7 +39,7 @@ public class LeaderboardContext { public void forRaces(DispatchContext context, RaceCallback callback) { for(RaceColumn raceColumn : leaderboard.getRaceColumns()) { for(Fleet fleet : raceColumn.getFleets()) { - callback.doForRace(new RaceContext(event, leaderboard, raceColumn, fleet, context.getRacingEventService())); + callback.doForRace(new RaceContext(service, event, leaderboard, raceColumn, fleet, context.getRacingEventService())); } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 32d0ab54e0f..b0ee0fe71e3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -28,6 +28,7 @@ import com.sap.sailing.domain.common.TimingConstants; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.impl.WindSourceImpl; +import com.sap.sailing.domain.common.media.MediaTrack; import com.sap.sailing.domain.common.racelog.FlagPole; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; @@ -45,10 +46,12 @@ import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceTrackingState; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO; import com.sap.sailing.gwt.ui.shared.race.SimpleWindDTO; +import com.sap.sailing.server.RacingEventService; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.common.media.MediaType; @GwtIncompatible public class RaceContext { @@ -64,6 +67,7 @@ public class RaceContext { private final RaceLog raceLog; private final ReadonlyRaceState state; private final Event event; + private final RacingEventService service; private TimePoint startTime; private boolean startTimeCalculated = false; @@ -71,7 +75,8 @@ public class RaceContext { private boolean finishTimeCalculated = false; private RaceViewState raceViewState; - public RaceContext(Event event, Leaderboard leaderboard, RaceColumn raceColumn, Fleet fleet, RaceLogResolver raceLogResolver) { + public RaceContext(RacingEventService service, Event event, Leaderboard leaderboard, RaceColumn raceColumn, Fleet fleet, RaceLogResolver raceLogResolver) { + this.service = service; this.event = event; this.leaderboard = leaderboard; this.raceColumn = raceColumn; @@ -305,12 +310,34 @@ public class RaceContext { liveRaceDTO.setDuration(getDurationOrNull()); liveRaceDTO.setWinner(getWinnerOrNull()); liveRaceDTO.setWindSourcesCount(getWindSourceCount()); + liveRaceDTO.setVideoCount(getVideoCount()); + liveRaceDTO.setAudioCount(getAudioCount()); return liveRaceDTO; } return null; } + private int getAudioCount() { + return getMediaCount( MediaType.audio); + } + + private int getVideoCount() { + return getMediaCount(MediaType.video); + } + + private int getMediaCount(MediaType mediaType) { + int mediaCount = 0; + if(trackedRace != null) { + for(MediaTrack mediaTrack : service.getMediaTracksForRace(trackedRace.getRaceIdentifier())) { + if(mediaTrack.mimeType != null && mediaTrack.mimeType.mediaType == mediaType) { + mediaCount++; + } + } + } + return mediaCount; + } + private int getWindSourceCount() { if(trackedRace != null) { return trackedRace.getWindSources().size() - trackedRace.getWindSourcesToExclude().size(); From 5b9d0b522df7ed043be9c90e000b86055d50617e Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 13 Jul 2015 12:57:09 +0200 Subject: [PATCH 093/219] Regatta list - Added icon for regatta progress --- java/com.sap.sailing.gwt.ui/images/home/icon-green-check.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 java/com.sap.sailing.gwt.ui/images/home/icon-green-check.svg diff --git a/java/com.sap.sailing.gwt.ui/images/home/icon-green-check.svg b/java/com.sap.sailing.gwt.ui/images/home/icon-green-check.svg new file mode 100644 index 00000000000..ef51475e5dd --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/images/home/icon-green-check.svg @@ -0,0 +1 @@ + \ No newline at end of file From f6142f2c05bbb93ef8841f98cf3cf3606fe5ed1c Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 13 Jul 2015 12:58:00 +0200 Subject: [PATCH 094/219] Regatta list - Added utility methods to DTOs --- .../regatta/RegattaProgressSeriesDTO.java | 17 +++++++++++++++++ .../gwt/ui/shared/race/FleetMetadataDTO.java | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressSeriesDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressSeriesDTO.java index 365d7b4d40a..3c330529cf5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressSeriesDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressSeriesDTO.java @@ -35,4 +35,21 @@ public class RegattaProgressSeriesDTO implements DTO { public void addFleet(FleetMetadataDTO fleet, int raceCount) { fleetState.put(fleet, raceCount); } + + public boolean isCompleted() { + for (Integer numberOfRace : fleetState.values()) { + if (numberOfRace < totalRaceCount) { + return false; + } + } + return !fleetState.isEmpty(); + } + + public int getProgressRaceCount() { + int progressRaceCount = 0; + for (Integer numberOfRace : fleetState.values()) { + progressRaceCount = Math.max(progressRaceCount, numberOfRace); + } + return progressRaceCount; + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/FleetMetadataDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/FleetMetadataDTO.java index 9cf9fc546b7..27cc34f3a8f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/FleetMetadataDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/FleetMetadataDTO.java @@ -4,6 +4,7 @@ import com.google.gwt.user.client.rpc.IsSerializable; public class FleetMetadataDTO implements IsSerializable, Comparable { + private static final String DEFAULT_FLEET_COLOR = "#f0ab00"; private String fleetName; private String fleetColor; @@ -22,7 +23,7 @@ public class FleetMetadataDTO implements IsSerializable, Comparable Date: Mon, 13 Jul 2015 12:59:40 +0200 Subject: [PATCH 095/219] Regatta list - Updated regatta progress to new design --- .../multiRegattaList/MultiRegattaList.gss | 100 +++++++----------- .../MultiRegattaListResources.java | 8 +- .../MultiRegattaListStepsBody.java | 49 ++++++--- .../MultiRegattaListStepsBody.ui.xml | 8 +- 4 files changed, 88 insertions(+), 77 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss index 299ed974043..9488d4cf414 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss @@ -158,7 +158,7 @@ img.race_item_windflag { border-radius: 0.333333333333333em; overflow: hidden; } -.regattalistitem div:last-child { +.regattalistitem > div:last-child { border-bottom: none; } .regattalistitem_table { @@ -181,76 +181,56 @@ img.race_item_windflag { float: left; position: relative; height: 4em; - line-height: 4em; text-transform: uppercase; - padding: 0 0.666666666666667em 0 1.333333333333333em; + padding: 0 0.666666666666667em; } .regattalistitem_steps_stepinactive { color: #ddd; } -.regattalistitem_steps_step:first-of-type { - padding-left: 2em; -} -.regattalistitem_steps_step_check { - display: inline-block; - vertical-align: middle; - width: 2.133333333333333em; - height: 2.133333333333333em; - margin-left: -0.333333333333333em; - background-image: url("../images/home/icon/icon-green-check.png"); - background-repeat: no-repeat; - background-size: contain; -} -.regattalistitem_steps_step_text { - margin-right: 2.4em; - display: inline-block; - font-size: 0; -} -.regattalistitem_steps_step_text::first-letter { - font-size: 1rem; - padding-right: 2.666666666666667em; -} -@media (min-width: 49.0625em) { - .regattalistitem_steps_step_text { - font-size: 1em; - } - .regattalistitem_steps_step_text::first-letter { - padding-right: 0; - } -} -.regattalistitem_steps_step_count { - position: absolute; +.regattalistitem_steps_step_infowrapper { + position: relative; top: 50%; - right: 1.333333333333333em; - font-size: 0.8em; - line-height: 1.6em; - width: 1.6em; - height: 1.6em; - text-align: center; - background-color: #eee; - border: 1px solid #ddd; - border-radius: 0.2em; -webkit-transform: translateY(-50%); -moz-transform: translateY(-50%); -ms-transform: translateY(-50%); transform: translateY(-50%); + white-space: nowrap; } -.regattalistitem_steps_step:after { - content: ''; - position: absolute; - top: 0.333333333333333em; - left: 100%; - display: block; - width: 3.333333333333333em; - height: 3.333333333333333em; - margin-left: -3.333333333333333em; - border: 1px solid transparent; - border-top-color: #ddd; - border-right-color: #ddd; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - transform: rotate(45deg); +.regattalistitem_steps_step_name { + font-size: 0.866666666666667em; + font-weight: 600; + display: inline-block; + margin-right: 0.333333333333333em; +} +.regattalistitem_steps_step_check { + display: inline-block; + vertical-align: middle; + width: 1.066666666666667em; + height: 1.066666666666667em; + background-image: url("images/home/icon-green-check.svg"); + background-repeat: no-repeat; + background-size: contain; + margin-right: 0.333333333333333em; +} +.regattalistitem_steps_step_progress { + display: inline-block; + font-size: 0.866666666666667em; + text-transform: none; +} +.regattalistitem_steps_step_fleets { + width: 100%; + height: 1em; + border: 1px solid #dedede; + margin-top: 0.266666666666667em; +} +.regattalistitem_steps_step_fleets_fleet { + border-bottom: 1px solid #dedede; +} +.regattalistitem_steps_step_fleets_fleet:last-child { + border-bottom: none; +} +.regattalistitem_steps_step_fleets_fleet_progress { + height: 100%; } .regattalistitem_steps_button { height: 100%; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListResources.java index 8a324a508b7..4135f335be9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListResources.java @@ -47,9 +47,13 @@ public interface MultiRegattaListResources extends ClientBundle { String regattalistitem_steps(); String regattalistitem_steps_step(); String regattalistitem_steps_stepinactive(); + String regattalistitem_steps_step_infowrapper(); + String regattalistitem_steps_step_name(); String regattalistitem_steps_step_check(); - String regattalistitem_steps_step_text(); - String regattalistitem_steps_step_count(); + String regattalistitem_steps_step_progress(); + String regattalistitem_steps_step_fleets(); + String regattalistitem_steps_step_fleets_fleet(); + String regattalistitem_steps_step_fleets_fleet_progress(); String regattalistitem_steps_button(); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java index 6c2f2c685b8..0d09b4fd42a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java @@ -1,44 +1,65 @@ package com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList; +import java.util.Map; import java.util.Map.Entry; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Element; -import com.google.gwt.dom.client.SpanElement; -import com.google.gwt.dom.client.Style.FontWeight; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.UIObject; +import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaListResources.LocalCss; import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressSeriesDTO; import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; public class MultiRegattaListStepsBody extends UIObject { + private static final LocalCss CSS = MultiRegattaListResources.INSTANCE.css(); private static MultiRegattaListStepsBodyUiBinder uiBinder = GWT.create(MultiRegattaListStepsBodyUiBinder.class); interface MultiRegattaListStepsBodyUiBinder extends UiBinder { } + + @UiField DivElement nameUi; + @UiField DivElement checkUi; + @UiField DivElement progressUi; + @UiField DivElement fleetsContainerUi; public MultiRegattaListStepsBody(RegattaProgressSeriesDTO seriesProgress) { Element main = uiBinder.createAndBindUi(this); - SpanElement nameElement = getDetailsItem(seriesProgress.getName()); - nameElement.getStyle().setFontWeight(FontWeight.BOLD); - main.appendChild(nameElement); - main.appendChild(getDetailsItem("Total - " + seriesProgress.getTotalRaceCount())); + nameUi.setInnerText(seriesProgress.getName()); + if (seriesProgress.isCompleted()) { + progressUi.setInnerText(String.valueOf(seriesProgress.getTotalRaceCount())); + } else { + checkUi.removeFromParent(); + progressUi.setInnerText(seriesProgress.getProgressRaceCount() + " of " + seriesProgress.getTotalRaceCount()); + } + Map fleetStates = seriesProgress.getFleetState(); + double fleetHeight = fleetStates.isEmpty() ? 100.0 : 100.0 / fleetStates.size(); for (Entry fleetState : seriesProgress.getFleetState().entrySet()) { - SpanElement element = getDetailsItem(fleetState.getKey().getFleetName() + " - " + fleetState.getValue()); - element.getStyle().setColor(fleetState.getKey().getFleetColor()); - main.appendChild(element); + double fleetWidth = (fleetState.getValue() * 100.0) / seriesProgress.getTotalRaceCount(); + fleetsContainerUi.appendChild(getFleetElement(fleetWidth, fleetHeight, fleetState.getKey().getFleetColor())); } setElement(main); } - private SpanElement getDetailsItem(String text) { - SpanElement detailsItem = DOM.createSpan().cast(); - detailsItem.getStyle().setPaddingRight(0.75, Unit.EM); - detailsItem.setInnerText(text); - return detailsItem; + private DivElement getFleetElement(double width, double height, String color) { + DivElement fleetProgressUi = createDiv(CSS.regattalistitem_steps_step_fleets_fleet()); + fleetProgressUi.getStyle().setHeight(height, Unit.PCT); + DivElement fleetProgressBarUi = createDiv(CSS.regattalistitem_steps_step_fleets_fleet_progress()); + fleetProgressBarUi.getStyle().setBackgroundColor(color); + fleetProgressBarUi.getStyle().setWidth(width, Unit.PCT); + fleetProgressUi.appendChild(fleetProgressBarUi); + return fleetProgressUi; + } + + private DivElement createDiv(String cssClassName) { + DivElement div = DOM.createDiv().cast(); + div.addClassName(cssClassName); + return div; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml index 9a0a5fc09d6..35af408f762 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml @@ -4,6 +4,12 @@ -
+
+
+
+
+
+
+
\ No newline at end of file From 83dd8d53baa1bbb5381456107ec4890774f2c97a Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 13 Jul 2015 13:10:37 +0200 Subject: [PATCH 096/219] Improved layouting of the regatta progress steps --- .../multiRegattaList/MultiRegattaListSteps.java | 12 +++++++++++- .../multiRegattaList/MultiRegattaListSteps.ui.xml | 5 ++--- .../MultiRegattaListStepsBody.ui.xml | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java index 1ff3d9c794c..e89b132515c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java @@ -1,8 +1,11 @@ package com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList; import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.AnchorElement; import com.google.gwt.dom.client.DivElement; +import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; @@ -18,6 +21,7 @@ public class MultiRegattaListSteps extends Composite { interface MultiRegattaListStepsUiBinder extends UiBinder { } + @UiField DivElement progressContainerUi; @UiField DivElement stepsContainerUi; @UiField DivElement leaderboardButtonContainerUi; @UiField AnchorElement leaderboardButtonUi; @@ -26,13 +30,19 @@ public class MultiRegattaListSteps extends Composite { MultiRegattaListResources.INSTANCE.css().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); for(RegattaProgressSeriesDTO seriesProgress : regattaProgress.getSeries()) { - stepsContainerUi.insertBefore(new MultiRegattaListStepsBody(seriesProgress).getElement(), leaderboardButtonContainerUi); + stepsContainerUi.appendChild(new MultiRegattaListStepsBody(seriesProgress).getElement()); } } void setLeaderboardNavigation(PlaceNavigation placeNavigation) { placeNavigation.configureAnchorElement(leaderboardButtonUi); leaderboardButtonUi.getStyle().clearDisplay(); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override + public void execute() { + stepsContainerUi.getStyle().setMarginRight(leaderboardButtonUi.getOffsetWidth() + 20, Unit.PX); + } + }); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.ui.xml index 81a1bffef6d..183feb1c637 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.ui.xml @@ -5,9 +5,8 @@ -
- +
+
From 6fa7023e202e80984a6f7d9c7751a41409f87218 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 13 Jul 2015 16:17:34 +0200 Subject: [PATCH 105/219] Regatta list - Hide header information if value is 0 --- .../place/event/partials/regattaHeader/RegattaHeaderBody.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java index 7d34bd41f2e..c63d9ff9149 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java @@ -40,7 +40,9 @@ public class RegattaHeaderBody extends UIObject { } private void addDetailsItem(int count, String text) { - addDetailsItem(count + " " + text); + if (count > 0) { + addDetailsItem(count + " " + text); + } } private void addDetailsItem(String text) { From ae0142f76fb55fb7f2eece25332730969b8d23d8 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 13 Jul 2015 16:35:28 +0200 Subject: [PATCH 106/219] Regatta list - Merge new design css to avoid separators between fleet progress bars --- .../multiRegattaList/MultiRegattaList.gss | 19 ++++++++++++++++++- .../MultiRegattaListResources.java | 1 + .../MultiRegattaListStepsBodyFleet.ui.xml | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss index ef0f6d623fe..7f43ab8c29f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss @@ -197,10 +197,24 @@ img.race_item_windflag { white-space: nowrap; } .regattalistitem_steps_step_name { - font-size: 0.866666666666667em; font-weight: 600; display: inline-block; margin-right: 0.333333333333333em; + font-size: 0; +} +.regattalistitem_steps_step_name::first-letter { + font-size: 0.866666666666667rem; + margin-right: 0.333333333333333rem; +} +@media (min-width: 49.0625em) { + .regattalistitem_steps_step_name::first-letter { + margin-right: 0; + } +} +@media (min-width: 49.0625em) { + .regattalistitem_steps_step_name { + font-size: 0.866666666666667em; + } } .regattalistitem_steps_step_check { display: inline-block; @@ -223,6 +237,9 @@ img.race_item_windflag { border: 1px solid #dedede; margin-top: 0.266666666666667em; } +.regattalistitem_steps_step_fleets_fleet { + font-size: inherit; +} .regattalistitem_steps_step_fleets_fleet_progress { height: 100%; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListResources.java index 37105db9112..4135f335be9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListResources.java @@ -52,6 +52,7 @@ public interface MultiRegattaListResources extends ClientBundle { String regattalistitem_steps_step_check(); String regattalistitem_steps_step_progress(); String regattalistitem_steps_step_fleets(); + String regattalistitem_steps_step_fleets_fleet(); String regattalistitem_steps_step_fleets_fleet_progress(); String regattalistitem_steps_button(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBodyFleet.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBodyFleet.ui.xml index f70b786e77f..4bb1819a9f9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBodyFleet.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBodyFleet.ui.xml @@ -4,7 +4,7 @@ -
+
\ No newline at end of file From 3997bd612a88350493d0dbb463471a5c4cc394d8 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 13 Jul 2015 16:45:30 +0200 Subject: [PATCH 107/219] Dropdown Filter - Filter entry has underlined text on mouse hover --- .../place/event/partials/listNavigation/RegattaNavigation.gss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigation.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigation.gss index 78954d4a522..83c96c74862 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigation.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/listNavigation/RegattaNavigation.gss @@ -94,6 +94,9 @@ text-align: left; padding: 0 2.307692307692307em 0 0.769230769230769em; } +.regattanavigation_filter_dropdown_link:hover { + text-decoration: underline; +} .regattanavigation_filter_dropdown_linkactive { background: url("images/home/dropdown__check@2x.png") no-repeat; background-position: 95%; From bab53c0239bfafbc880f1aacf419acfc9a06b871 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 13 Jul 2015 16:50:27 +0200 Subject: [PATCH 108/219] Fixed "jumping" contents --- .../event/partials/multiRegattaList/MultiRegattaListSteps.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java index 712066a0cd9..184bc91cd4f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java @@ -5,6 +5,7 @@ import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.AnchorElement; import com.google.gwt.dom.client.DivElement; +import com.google.gwt.dom.client.Style.Display; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; @@ -40,9 +41,11 @@ public class MultiRegattaListSteps extends Composite { placeNavigation.configureAnchorElement(leaderboardButtonUi); leaderboardButtonUi.getStyle().clearDisplay(); leaderboardButtonUi.addClassName(getLeaderboardButtonStyle(regattaState)); + stepsContainerUi.getStyle().setDisplay(Display.NONE); Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { + stepsContainerUi.getStyle().clearDisplay(); stepsContainerUi.getStyle().setMarginRight(leaderboardButtonUi.getOffsetWidth() + 20, Unit.PX); } }); From 4f52e9a37778d8edd6021c242d53154f17553815 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 13 Jul 2015 16:52:23 +0200 Subject: [PATCH 109/219] Improved layouting of regatta progress steps --- .../multiRegattaList/MultiRegattaListSteps.java | 11 ++++++++++- .../multiRegattaList/MultiRegattaListStepsBody.ui.xml | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java index 184bc91cd4f..47dbb96b81f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java @@ -32,8 +32,17 @@ public class MultiRegattaListSteps extends Composite { public MultiRegattaListSteps(RegattaProgressDTO regattaProgress) { MultiRegattaListResources.INSTANCE.css().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); + double sumParts = 0; for(RegattaProgressSeriesDTO seriesProgress : regattaProgress.getSeries()) { - stepsContainerUi.appendChild(new MultiRegattaListStepsBody(seriesProgress).getElement()); + double parts = Math.pow(seriesProgress.getTotalRaceCount(), 0.4); + sumParts += parts; + } + for(RegattaProgressSeriesDTO seriesProgress : regattaProgress.getSeries()) { + double parts = Math.pow(seriesProgress.getTotalRaceCount(), 0.4); + double percentage = 100.0 * parts / sumParts; + MultiRegattaListStepsBody stepsBody = new MultiRegattaListStepsBody(seriesProgress); + stepsBody.getElement().getStyle().setWidth(percentage, Unit.PCT); + stepsContainerUi.appendChild(stepsBody.getElement()); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml index 33a4a1cc6f4..a908b6e1ddf 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.ui.xml @@ -4,7 +4,7 @@ -
+
From 870453daf4a81be7c01572c20f9b9124bc113b53 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 13 Jul 2015 18:14:56 +0200 Subject: [PATCH 110/219] Removed unnecessary logging --- .../ui/shared/dispatch/event/GetRaceListViewAction.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java index 19a32eb7f22..fd72c837aec 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java @@ -1,8 +1,6 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; import java.util.UUID; -import java.util.logging.Level; -import java.util.logging.Logger; import com.google.gwt.core.shared.GwtIncompatible; import com.sap.sailing.gwt.ui.shared.dispatch.Action; @@ -11,8 +9,6 @@ import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; public class GetRaceListViewAction implements Action> { - private static final Logger logger = Logger.getLogger(GetRaceListViewAction.class.getName()); - private UUID eventId; private String regattaId; @@ -28,13 +24,10 @@ public class GetRaceListViewAction implements Action execute(DispatchContext context) { - long start = System.currentTimeMillis(); RaceListDataCalculator raceListDataCalculator = new RaceListDataCalculator(); EventActionUtil.forRacesOfRegatta(context, eventId, regattaId, raceListDataCalculator); ResultWithTTL result = raceListDataCalculator.getResult(context, eventId); - long duration = System.currentTimeMillis() - start; - logger.log(Level.INFO, "Calculating race list for event "+ eventId + " took: "+ duration + "ms"); return result; } } From 73c6a2c869af607ec66f25ddde24a03e4a6e8f4d Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Mon, 13 Jul 2015 18:22:52 +0200 Subject: [PATCH 111/219] Changed race list to have a RegattaWithProgressDTO --- .../ui/shared/dispatch/event/GetRaceListViewAction.java | 2 +- .../ui/shared/dispatch/event/RaceListDataCalculator.java | 9 +++++---- .../gwt/ui/shared/dispatch/event/RaceListViewDTO.java | 8 ++++---- .../shared/dispatch/regatta/RegattaWithProgressDTO.java | 7 +++++-- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java index fd72c837aec..42efdc66179 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java @@ -26,7 +26,7 @@ public class GetRaceListViewAction implements Action execute(DispatchContext context) { RaceListDataCalculator raceListDataCalculator = new RaceListDataCalculator(); EventActionUtil.forRacesOfRegatta(context, eventId, regattaId, raceListDataCalculator); - ResultWithTTL result = raceListDataCalculator.getResult(context, eventId); + ResultWithTTL result = raceListDataCalculator.getResult(context, eventId, regattaId); return result; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java index 6f16e7b6047..e1db4a19447 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java @@ -10,19 +10,20 @@ import com.sap.sailing.gwt.ui.shared.dispatch.event.EventActionUtil.RaceCallback @GwtIncompatible public class RaceListDataCalculator implements RaceCallback { private final RaceRefreshCalculator refreshCalculator = new RaceRefreshCalculator(); - private final RegattaProgressCalculator progressCalculator = new RegattaProgressCalculator(); +// private final RegattaProgressCalculator progressCalculator = new RegattaProgressCalculator(); private final RaceListViewDTO result = new RaceListViewDTO(); @Override public void doForRace(RaceContext context) { refreshCalculator.doForRace(context); - progressCalculator.doForRace(context); +// progressCalculator.doForRace(context); result.add(context.getLiveRaceOrNull()); result.add(context.getFinishedRaceOrNull()); } - public ResultWithTTL getResult(DispatchContext context, UUID eventId) { - result.setProgress(progressCalculator.getResult()); + public ResultWithTTL getResult(DispatchContext context, UUID eventId, String regattaId) { + LeaderboardContext leaderboardContext = EventActionUtil.getLeaderboardContext(context, eventId, regattaId); + result.setProgress(leaderboardContext.getRegattaWithProgress(context)); return new ResultWithTTL<>(EventActionUtil.getEventStateDependentTTL(context, eventId, refreshCalculator.getTTL()), result); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java index 3c174a67224..0643bb0374c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java @@ -5,7 +5,7 @@ import java.util.Collection; import java.util.TreeSet; import com.sap.sailing.gwt.ui.shared.dispatch.DTO; -import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; public class RaceListViewDTO implements DTO { @@ -14,7 +14,7 @@ public class RaceListViewDTO implements DTO { private TreeSet finishedRaces = new TreeSet<>(); - private RegattaProgressDTO progress; + private RegattaWithProgressDTO progress; public void add(LiveRaceDTO liveRace) { add(liveRaces, liveRace); @@ -48,11 +48,11 @@ public class RaceListViewDTO implements DTO { return Arrays.asList(withFleets, noFleets); } - public RegattaProgressDTO getProgress() { + public RegattaWithProgressDTO getProgress() { return progress; } - public void setProgress(RegattaProgressDTO progress) { + public void setProgress(RegattaWithProgressDTO progress) { this.progress = progress; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaWithProgressDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaWithProgressDTO.java index c0ac4835a47..a245f407350 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaWithProgressDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaWithProgressDTO.java @@ -5,8 +5,7 @@ import com.sap.sailing.gwt.ui.shared.eventview.RegattaMetadataDTO; public class RegattaWithProgressDTO extends RegattaMetadataDTO { private RegattaProgressDTO progress; - @SuppressWarnings("unused") - private RegattaWithProgressDTO() { + public RegattaWithProgressDTO() { } public RegattaWithProgressDTO(RegattaProgressDTO progress) { @@ -17,4 +16,8 @@ public class RegattaWithProgressDTO extends RegattaMetadataDTO { public RegattaProgressDTO getProgress() { return progress; } + + public void setProgress(RegattaProgressDTO progress) { + this.progress = progress; + } } From 17a4aba5e9c5a76a7499d4ac57c7f625652b4c85 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Mon, 13 Jul 2015 18:26:00 +0200 Subject: [PATCH 112/219] Race list - Added header to regatta information on top of race list --- .../multiRegattaList/MultiRegattaListItem.java | 8 ++++++-- .../event/regatta/tabs/RegattaRacesTabView.java | 12 ++---------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java index a39a0163a58..3418af5c0a4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListItem.java @@ -20,12 +20,16 @@ public class MultiRegattaListItem extends Composite { @UiField(provided = true) RegattaHeader regattaHeaderUi; @UiField(provided = true) MultiRegattaListSteps regattaStepsUi; private final RegattaWithProgressDTO regattaWithProgress; - - public MultiRegattaListItem(RegattaWithProgressDTO regattaWithProgress, Presenter presenter) { + + public MultiRegattaListItem(RegattaWithProgressDTO regattaWithProgress) { this.regattaWithProgress = regattaWithProgress; regattaHeaderUi = new RegattaHeader(regattaWithProgress); regattaStepsUi = new MultiRegattaListSteps(regattaWithProgress.getProgress()); initWidget(uiBinder.createAndBindUi(this)); + } + + public MultiRegattaListItem(RegattaWithProgressDTO regattaWithProgress, Presenter presenter) { + this(regattaWithProgress); regattaHeaderUi.setRegattaNavigation(presenter.getRegattaNavigation(regattaWithProgress.getId())); PlaceNavigation leaderboardNavigation = presenter.getRegattaLeaderboardNavigation(regattaWithProgress.getId()); regattaStepsUi.setLeaderboardNavigation(regattaWithProgress.getState(), leaderboardNavigation); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index dc35c45f3ef..a3462327acd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -22,8 +22,7 @@ import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListN import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.ListNavigationAction; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.SelectionCallback; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.RaceStateLegend; -import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaListResources; -import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaListSteps; +import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaListItem; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.AbstractRaceList; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListColumnFactory; @@ -41,7 +40,6 @@ import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRaceListViewAction; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListViewDTO; -import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressDTO; import com.sap.sse.common.Util.Triple; /** @@ -123,7 +121,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView result) { - regattaInfoContainerUi.setWidget(getRegattaInformation(result.getDto().getProgress())); + regattaInfoContainerUi.setWidget(new MultiRegattaListItem(result.getDto().getProgress())); liveRacesList.setListData(result.getDto().getLiveRaces()); finishedRacesList.setListData(result.getDto().getFinishedRaces()); // for (RaceListSeriesDTO series : result.getDto().getRacesForCompetitionFormat()) { @@ -164,12 +162,6 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView Date: Mon, 13 Jul 2015 21:29:57 +0200 Subject: [PATCH 113/219] fixed BoatClassImageResource reference to 18FOOTER.png (capitalization of filename was wrong) --- .../sailing/gwt/common/client/BoatClassImageResources.java | 2 +- .../java/com/sap/sailing/gwt/ui/client/StringMessages.java | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages.properties | 3 ++- .../sap/sailing/gwt/ui/client/StringMessages_de.properties | 3 ++- .../sap/sailing/gwt/ui/client/StringMessages_ru.properties | 3 ++- .../sap/sailing/gwt/ui/client/StringMessages_zh.properties | 3 ++- .../sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java | 5 +++++ .../ui/client/shared/racemap/RaceMapHelpLinesSettings.java | 2 +- .../client/shared/racemap/RaceMapSettingsTypeFormatter.java | 2 ++ 9 files changed, 18 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResources.java index 957869366ab..40007d1670f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/BoatClassImageResources.java @@ -13,7 +13,7 @@ public interface BoatClassImageResources extends ClientBundle { @Source("com/sap/sailing/gwt/ui/client/images/boatclass/12MR.png") ImageResource _12mRIcon(); - @Source("com/sap/sailing/gwt/ui/client/images/boatclass/18Footer.png") + @Source("com/sap/sailing/gwt/ui/client/images/boatclass/18FOOTER.png") ImageResource _18FooterIcon(); @Source("com/sap/sailing/gwt/ui/client/images/boatclass/2_4M.png") 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 e9d7bf902a1..fbb7e043d03 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 @@ -1319,4 +1319,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String minutesAgo(String minutes); String hoursAgo(String hours); String selectCompetitor(); + String courseGeometry(); } 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 0ae2174ff8e..61a50506373 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 @@ -1286,4 +1286,5 @@ sailorInfoLongText=Official Results, Protests,\nNotice Board, Sailor weather: now=Now minutesAgo={0} min ago hoursAgo={0} h ago -selectCompetitor=Please select one competitor \ No newline at end of file +selectCompetitor=Please select one competitor +courseGeometry=Course Geometry \ 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 476739c9c1a..ef44b0e0d5f 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 @@ -1276,4 +1276,5 @@ sailorInfoLongText=Offizielle Ergebnisse, Proteste,\nNotice Board, Segler-Wetter now=Jetzt minutesAgo=vor {0} min hoursAgo=vor {0} h -selectCompetitor=Bitte einen Teilnehmer auswählen \ No newline at end of file +selectCompetitor=Bitte einen Teilnehmer auswählen +courseGeometry=Kursgeometrie \ 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_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index f90d3e7c6e5..b706fe9e511 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1224,4 +1224,5 @@ sailorInfoLongText=Official Results, Protests,\nNotice Board, Sailor weather: now=в настоящее время minutesAgo={0} минут назад hoursAgo={0} h часов назад -selectCompetitor=Please select one competitor \ No newline at end of file +selectCompetitor=Please select one competitor +courseGeometry=Course Geometry \ 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_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index ca6b50c2fcc..cac19a55644 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1273,4 +1273,5 @@ raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSeconds=Calc.Time raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSecondsTooltip=Calculated time at estimated arrival at the competitor that is currently farthest ahead in the race;\nestimation based on average VMG in current leg and equal (calculated) performance to fastest boat in all subsequent legs sailorInfo=水手信息 sailorInfoLongText=Find here Notice Board,\nProtests, Sailor weather: -selectCompetitor=Please select one competitor \ No newline at end of file +selectCompetitor=Please select one competitor +courseGeometry=Course Geometry \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 70a734ed0eb..1cb6f52fb13 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -890,6 +890,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe showCourseSidelinesOnMap(raceMapDataDTO.courseSidelines); showStartAndFinishLines(raceMapDataDTO.coursePositions); showStartLineToFirstMarkTriangle(raceMapDataDTO.coursePositions); + showCourseGeometryMetrics(raceMapDataDTO.coursePositions); // even though the wind data is retrieved by a separate call, re-draw the advantage line because it needs to // adjust to new boat positions showAdvantageLine(competitorsToShow, newTime); @@ -1302,6 +1303,10 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe } } + private void showCourseGeometryMetrics(final CoursePositionsDTO courseDTO) { + + } + private final StringBuilder windwardStartLineMarkToFirstMarkLineText = new StringBuilder(); private final StringBuilder leewardStartLineMarkToFirstMarkLineText = new StringBuilder(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapHelpLinesSettings.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapHelpLinesSettings.java index b5c8604b4f1..2884234d212 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapHelpLinesSettings.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapHelpLinesSettings.java @@ -10,7 +10,7 @@ public class RaceMapHelpLinesSettings { * Types of help lines on the map */ public enum HelpLineTypes { - STARTLINE, FINISHLINE, ADVANTAGELINE, COURSEMIDDLELINE, BUOYZONE, BOATTAILS, STARTLINETOFIRSTMARKTRIANGLE + STARTLINE, FINISHLINE, ADVANTAGELINE, COURSEMIDDLELINE, BUOYZONE, BOATTAILS, STARTLINETOFIRSTMARKTRIANGLE, COURSEGEOMETRY } private final Set visibleHelpLines; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettingsTypeFormatter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettingsTypeFormatter.java index 5217a722a78..5aba257ebdd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettingsTypeFormatter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettingsTypeFormatter.java @@ -37,6 +37,8 @@ public class RaceMapSettingsTypeFormatter { return stringConstants.boatTails(); case STARTLINETOFIRSTMARKTRIANGLE: return stringConstants.startFirstMarkTriangle(); + case COURSEGEOMETRY: + return stringConstants.courseGeometry(); } return null; } From 6432785f5cd4a5990b172b58e8d8d5fa6abdc8ac Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 08:38:31 +0200 Subject: [PATCH 114/219] Race list - Fixed spacings of regatta information on top of race list --- .../client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml index 3aa6b9dc881..91b158813c9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml @@ -9,7 +9,7 @@
- +
From 12c52f925b332e7065edb2c4cda821d89dfaf6b2 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 08:26:39 +0200 Subject: [PATCH 115/219] Added ordering to FleetMetadataDTO --- .../gwt/ui/shared/dispatch/event/RaceContext.java | 2 +- .../gwt/ui/shared/race/FleetMetadataDTO.java | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 3c573a2b553..bfe44fa7228 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -120,7 +120,7 @@ public class RaceContext { } public FleetMetadataDTO getFleetMetadata() { - return new FleetMetadataDTO(fleet.getName(), fleet.getColor() == null ? null : fleet.getColor().getAsHtml()); + return new FleetMetadataDTO(fleet.getName(), fleet.getColor() == null ? null : fleet.getColor().getAsHtml(), fleet.getOrdering()); } private SimpleWindDTO getWindOrNull() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/FleetMetadataDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/FleetMetadataDTO.java index 27cc34f3a8f..6f5bd7cb243 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/FleetMetadataDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/FleetMetadataDTO.java @@ -7,15 +7,17 @@ public class FleetMetadataDTO implements IsSerializable, Comparable Date: Tue, 14 Jul 2015 08:48:48 +0200 Subject: [PATCH 116/219] Regatta list - Reader header no longer shows an arrow if not linked --- .../place/event/partials/regattaHeader/RegattaHeader.java | 1 + .../place/event/partials/regattaHeader/RegattaHeader.ui.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java index f27c79068fd..74ff4e8f089 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java @@ -25,6 +25,7 @@ public class RegattaHeader extends Composite { } public void setRegattaNavigation(PlaceNavigation placeNavigation) { + headerArrowUi.getStyle().clearDisplay(); placeNavigation.configureAnchorElement(headerBodyUi); placeNavigation.configureAnchorElement(headerArrowUi); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.ui.xml index 9facc856539..0d8db0c4e7d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.ui.xml @@ -12,7 +12,7 @@ - + From 0e190541bf3bbea516d4593940af0fb7841c76ed Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 14 Jul 2015 09:17:25 +0200 Subject: [PATCH 117/219] started with showCourseGeometryMetrics --- .../sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java | 5 ++++- .../client/shared/racemap/SmallTransparentInfoOverlay.java | 3 --- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 1cb6f52fb13..645f6064d92 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -1304,7 +1304,10 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe } private void showCourseGeometryMetrics(final CoursePositionsDTO courseDTO) { - + if (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) + && courseDTO.startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1) { + + } } private final StringBuilder windwardStartLineMarkToFirstMarkLineText = new StringBuilder(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/SmallTransparentInfoOverlay.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/SmallTransparentInfoOverlay.java index 70a8344cd51..9369fb24265 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/SmallTransparentInfoOverlay.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/SmallTransparentInfoOverlay.java @@ -42,15 +42,12 @@ public class SmallTransparentInfoOverlay extends CanvasOverlayV3 { infoBoxWidth = 20; infoBoxHeight = 20; cornerRadius = 4; - if (getCanvas() != null) { getCanvas().setWidth(String.valueOf(canvasWidth)); getCanvas().setHeight(String.valueOf(canvasHeight)); getCanvas().setCoordinateSpaceWidth(canvasWidth); getCanvas().setCoordinateSpaceHeight(canvasHeight); } - -// setCanvasSize(canvasWidth, canvasHeight); } @Override From 71f289fa3b29fd43de3c8bcf6cafb3e979256baf Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 09:40:04 +0200 Subject: [PATCH 118/219] Race list - Added utility method to compare start dates --- .../partials/racelist/RaceListDataUtil.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java index 164dbea4bb1..d2ae7846495 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java @@ -33,6 +33,21 @@ public class RaceListDataUtil { return false; } + private static boolean hasDifferentValues(Collection races, ValueProvider valueProvider) { + Object compareValue = null; + for (T race : races) { + Object currentValue = valueProvider.getValue(race); + if (currentValue == null) { + continue; + } else if (compareValue == null) { + compareValue = currentValue; + } else if (!compareValue.equals(currentValue)) { + return true; + } + } + return false; + } + public static boolean hasFleets(Collection data) { return hasValues(data, new ValueProvider() { @Override @@ -104,4 +119,14 @@ public class RaceListDataUtil { } }); } + + private static final long DAY_IN_MILLIS = 1000 * 60 * 60 * 24; + public static boolean hasDifferentStartDates(Collection data) { + return hasDifferentValues(data, new ValueProvider() { + @Override + public Long getValue(T object) { + return object.getStart().getTime() / DAY_IN_MILLIS; + } + }); + } } From dff8016da50c031f5747b84f9bcaabe8e9998179 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 09:40:40 +0200 Subject: [PATCH 119/219] Split up in several actions with different refresh intervals and implemented auto refresh for race list --- .../regatta/tabs/RegattaRacesTabView.java | 41 +++++++------ ...ction.java => GetFinishedRacesAction.java} | 13 +++-- .../event/GetRegattaWithProgressAction.java | 31 ++++++++++ .../event/RaceListDataCalculator.java | 23 +++----- .../dispatch/event/RaceListViewDTO.java | 58 ------------------- 5 files changed, 69 insertions(+), 97 deletions(-) rename java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/{GetRaceListViewAction.java => GetFinishedRacesAction.java} (56%) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattaWithProgressAction.java delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index a3462327acd..80a6f522707 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -32,14 +32,18 @@ import com.sap.sailing.gwt.home.client.place.event.partials.racelist.SortableRac import com.sap.sailing.gwt.home.client.place.event.partials.regattaraces.EventRegattaRaces; import com.sap.sailing.gwt.home.client.place.event.regatta.EventRegattaView.Presenter; import com.sap.sailing.gwt.home.client.place.event.regatta.RegattaTabView; +import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshManager; +import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.RaceGroupDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; -import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; -import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRaceListViewAction; +import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; +import com.sap.sailing.gwt.ui.shared.dispatch.event.GetFinishedRacesAction; +import com.sap.sailing.gwt.ui.shared.dispatch.event.GetLiveRacesForRegattaAction; +import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRegattaWithProgressAction; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; -import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListViewDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; import com.sap.sse.common.Util.Triple; /** @@ -109,27 +113,21 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView>() { + refreshManager.add(liveRacesList, new GetLiveRacesForRegattaAction(myPlace.getCtx().getEventDTO().getId(), myPlace.getRegattaId())); + refreshManager.add(new RefreshableWidget() { @Override - public void onFailure(Throwable caught) { + public void setData(RegattaWithProgressDTO data, long nextUpdate, int updateNo) { + regattaInfoContainerUi.setWidget(new MultiRegattaListItem(data)); } - @Override - public void onSuccess(ResultWithTTL result) { - regattaInfoContainerUi.setWidget(new MultiRegattaListItem(result.getDto().getProgress())); - liveRacesList.setListData(result.getDto().getLiveRaces()); - finishedRacesList.setListData(result.getDto().getFinishedRaces()); - // for (RaceListSeriesDTO series : result.getDto().getRacesForCompetitionFormat()) { - // compFormatContainerUi.add(new RegattaCompetitionSeries(currentPresenter, series)); - // } - contentArea.setWidget(RegattaRacesTabView.this); - } - }); + }, new GetRegattaWithProgressAction(myPlace.getCtx().getEventDTO().getId(), myPlace.getRegattaId())); + refreshManager.add(finishedRacesList, new GetFinishedRacesAction(myPlace.getCtx().getEventDTO().getId(), myPlace.getRegattaId())); + oldContentContainer.removeFromParent(); } else { regattaInfoContainerUi.removeFromParent(); @@ -146,7 +144,6 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView { + private class RaceListFinishedRaces extends AbstractRaceList implements RefreshableWidget> { private final SortableRaceListColumn durationColumn = RaceListColumnFactory.getDurationColumn(); private final SortableRaceListColumn windfixesCountColumn = RaceListColumnFactory.getWindFixesCountColumn(); private final SortableRaceListColumn videoCountColumn = RaceListColumnFactory.getVideoCountColumn(); @@ -215,6 +213,11 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView data, long nextUpdate, int updateNo) { + setListData(data.getValues()); + } public void setListData(Collection data) { boolean hasFleets = RaceListDataUtil.hasFleets(data); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetFinishedRacesAction.java similarity index 56% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetFinishedRacesAction.java index 42efdc66179..a3374c35709 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRaceListViewAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetFinishedRacesAction.java @@ -6,28 +6,29 @@ import com.google.gwt.core.shared.GwtIncompatible; import com.sap.sailing.gwt.ui.shared.dispatch.Action; import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContext; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; +import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; -public class GetRaceListViewAction implements Action> { +public class GetFinishedRacesAction implements Action>> { private UUID eventId; private String regattaId; @SuppressWarnings("unused") - private GetRaceListViewAction() { + private GetFinishedRacesAction() { } - public GetRaceListViewAction(UUID eventId, String regattaId) { + public GetFinishedRacesAction(UUID eventId, String regattaId) { this.eventId = eventId; this.regattaId = regattaId; } @Override @GwtIncompatible - public ResultWithTTL execute(DispatchContext context) { + public ResultWithTTL> execute(DispatchContext context) { RaceListDataCalculator raceListDataCalculator = new RaceListDataCalculator(); EventActionUtil.forRacesOfRegatta(context, eventId, regattaId, raceListDataCalculator); - ResultWithTTL result = raceListDataCalculator.getResult(context, eventId, regattaId); - return result; + return new ResultWithTTL<>(EventActionUtil.getEventStateDependentTTL(context, eventId, 5 * 60 * 1000), + new SortedSetResult<>(raceListDataCalculator.getResult())); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattaWithProgressAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattaWithProgressAction.java new file mode 100644 index 00000000000..25b39c4a25b --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattaWithProgressAction.java @@ -0,0 +1,31 @@ +package com.sap.sailing.gwt.ui.shared.dispatch.event; + +import java.util.UUID; + +import com.google.gwt.core.shared.GwtIncompatible; +import com.sap.sailing.gwt.ui.shared.dispatch.Action; +import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContext; +import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; + +public class GetRegattaWithProgressAction implements Action> { + + private UUID eventId; + private String regattaId; + + @SuppressWarnings("unused") + private GetRegattaWithProgressAction() { + } + + public GetRegattaWithProgressAction(UUID eventId, String regattaId) { + this.eventId = eventId; + this.regattaId = regattaId; + } + + @Override + @GwtIncompatible + public ResultWithTTL execute(DispatchContext context) { + return new ResultWithTTL<>(EventActionUtil.getEventStateDependentTTL(context, eventId, 5 * 60 * 1000), + EventActionUtil.getLeaderboardContext(context, eventId, regattaId).getRegattaWithProgress(context)); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java index e1db4a19447..e305a16ffde 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListDataCalculator.java @@ -1,30 +1,25 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; -import java.util.UUID; +import java.util.Collection; +import java.util.TreeSet; import com.google.gwt.core.shared.GwtIncompatible; -import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContext; -import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; import com.sap.sailing.gwt.ui.shared.dispatch.event.EventActionUtil.RaceCallback; @GwtIncompatible public class RaceListDataCalculator implements RaceCallback { - private final RaceRefreshCalculator refreshCalculator = new RaceRefreshCalculator(); -// private final RegattaProgressCalculator progressCalculator = new RegattaProgressCalculator(); - private final RaceListViewDTO result = new RaceListViewDTO(); + private final TreeSet races = new TreeSet<>(); @Override public void doForRace(RaceContext context) { - refreshCalculator.doForRace(context); -// progressCalculator.doForRace(context); - result.add(context.getLiveRaceOrNull()); - result.add(context.getFinishedRaceOrNull()); + RaceListRaceDTO finishedRace = context.getFinishedRaceOrNull(); + if(finishedRace != null) { + races.add(finishedRace); + } } - public ResultWithTTL getResult(DispatchContext context, UUID eventId, String regattaId) { - LeaderboardContext leaderboardContext = EventActionUtil.getLeaderboardContext(context, eventId, regattaId); - result.setProgress(leaderboardContext.getRegattaWithProgress(context)); - return new ResultWithTTL<>(EventActionUtil.getEventStateDependentTTL(context, eventId, refreshCalculator.getTTL()), result); + public Collection getResult() { + return races; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java deleted file mode 100644 index 0643bb0374c..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.sap.sailing.gwt.ui.shared.dispatch.event; - -import java.util.Arrays; -import java.util.Collection; -import java.util.TreeSet; - -import com.sap.sailing.gwt.ui.shared.dispatch.DTO; -import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; -import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; - -public class RaceListViewDTO implements DTO { - - private TreeSet liveRaces = new TreeSet<>(); - - private TreeSet finishedRaces = new TreeSet<>(); - - private RegattaWithProgressDTO progress; - - public void add(LiveRaceDTO liveRace) { - add(liveRaces, liveRace); - } - - public void add(RaceListRaceDTO finishedRace) { - add(finishedRaces, finishedRace); - } - - private void add(TreeSet set, T race) { - if (race != null) { - set.add(race); - } - } - - public Collection getLiveRaces() { - return liveRaces; - } - - public Collection getFinishedRaces() { - return finishedRaces; - } - - public Collection getRacesForCompetitionFormat() { - RaceListSeriesDTO withFleets = new RaceListSeriesDTO("Fleets"); - RaceListSeriesDTO noFleets = new RaceListSeriesDTO(""); - for (RaceListRaceDTO race : finishedRaces) { - RaceListSeriesDTO series = race.getFleet() == null ? noFleets : withFleets; - series.addRace(race); - } - return Arrays.asList(withFleets, noFleets); - } - - public RegattaWithProgressDTO getProgress() { - return progress; - } - - public void setProgress(RegattaWithProgressDTO progress) { - this.progress = progress; - } -} From 903595ad47e3cfb2afdad808523f437d9daeff13 Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 09:43:42 +0200 Subject: [PATCH 120/219] Refactored DTOs so we can show ranges in the UI --- .../partials/raceListLive/RacesListLive.java | 4 +- .../partials/racelist/AbstractRaceList.java | 5 +- .../racelist/RaceListColumnFactory.java | 68 +++++++++++++++---- .../partials/racelist/RaceListContainer.java | 2 +- .../partials/racelist/RaceListDataUtil.java | 18 ++--- .../regatta/tabs/RegattaRacesTabView.java | 4 +- .../ui/shared/dispatch/event/LiveRaceDTO.java | 3 +- .../ui/shared/dispatch/event/RaceContext.java | 8 +-- .../dispatch/event/RaceListRaceDTO.java | 3 +- .../dispatch/event/RaceListViewDTO.java | 2 +- .../gwt/ui/shared/race/RaceMetadataDTO.java | 13 ++-- .../gwt/ui/shared/race/SimpleWindDTO.java | 26 ------- .../gwt/ui/shared/race/WindStatisticsDTO.java | 9 --- .../ui/shared/race/wind/AbstractWindDTO.java | 19 ++++++ .../ui/shared/race/wind/SimpleWindDTO.java | 15 ++++ .../shared/race/wind/WindStatisticsDTO.java | 27 ++++++++ 16 files changed, 149 insertions(+), 77 deletions(-) delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/SimpleWindDTO.java delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/WindStatisticsDTO.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/AbstractWindDTO.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/SimpleWindDTO.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/WindStatisticsDTO.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java index d8f5e795bda..b24dc22cdfe 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java @@ -19,7 +19,7 @@ import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; public class RacesListLive extends Composite implements RefreshableWidget> { private final RaceListLiveRaces raceList; - + public RacesListLive(EventView.Presenter presenter, boolean showRegattaDetails) { raceList = new RaceListLiveRaces(presenter, showRegattaDetails); initWidget(new RaceListContainer(StringMessages.INSTANCE.liveNow(), raceList)); @@ -46,6 +46,8 @@ public class RacesListLive extends Composite implements RefreshableWidget courseAreaColumn = RaceListColumnFactory.getCourseAreaColumn(); private final SortableRaceListColumn courseColumn = RaceListColumnFactory.getCourseColumn(); private final SortableRaceListColumn raceViewStateColumn = RaceListColumnFactory.getRaceViewStateColumn(); + private final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory + .getWindSpeedColumn(); public RaceListLiveRaces(EventView.Presenter presenter, boolean showRegattaDetails) { super(presenter); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java index fbaa2d945e6..4800badd896 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java @@ -12,10 +12,11 @@ import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesLi import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources.LocalCss; import com.sap.sailing.gwt.ui.leaderboard.SortedCellTable; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; +import com.sap.sailing.gwt.ui.shared.race.wind.AbstractWindDTO; import com.sap.sse.gwt.theme.client.component.celltable.CleanCellTableResources; import com.sap.sse.gwt.theme.client.component.celltable.StyledHeaderOrFooterBuilder; -public abstract class AbstractRaceList extends Composite { +public abstract class AbstractRaceList> extends Composite { private static final LocalCss CSS = RacesListLiveResources.INSTANCE.css(); @@ -25,7 +26,7 @@ public abstract class AbstractRaceList extends Compos protected final SortableRaceListColumn raceNameColumn = RaceListColumnFactory.getRaceNameColumn(); protected final SortableRaceListColumn fleetNameColumn = RaceListColumnFactory.getFleetNameColumn(); protected final SortableRaceListColumn startTimeColumn = RaceListColumnFactory.getStartTimeColumn(); - protected final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory.getWindSpeedColumn(); + // protected final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory.getWindSpeedColumn(); protected final SortableRaceListColumn windDirectionColumn = RaceListColumnFactory.getWindDirectionColumn(); protected final SortableRaceListColumn raceViewerButtonColumn; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index 4d52219eb98..561f94d1967 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -44,7 +44,7 @@ import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceTrackingState; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO; -import com.sap.sailing.gwt.ui.shared.race.SimpleWindDTO; +import com.sap.sailing.gwt.ui.shared.race.wind.AbstractWindDTO; import com.sap.sailing.gwt.ui.shared.util.NullSafeComparableComparator; import com.sap.sse.common.Duration; import com.sap.sse.common.Util; @@ -82,7 +82,7 @@ public class RaceListColumnFactory { SafeHtml imageHeader(String styleNames, SafeUri imageURL); } - public static SortableRaceListColumn getFleetCornerColumn() { + public static > SortableRaceListColumn getFleetCornerColumn() { Cell cell = new AbstractCell() { @Override public void render(Context context, FleetMetadataDTO value, SafeHtmlBuilder sb) { @@ -106,7 +106,7 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getRegattaNameColumn() { + public static > SortableRaceListColumn getRegattaNameColumn() { Cell cell = new TextCell(); InvertibleComparator comparator = new InvertibleComparatorWrapper(new NaturalComparator(false)) { @Override @@ -132,7 +132,7 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getRaceNameColumn() { + public static > SortableRaceListColumn getRaceNameColumn() { Cell cell = new TextCell(); InvertibleComparator comparator = new InvertibleComparatorWrapper(new NaturalComparator(false)) { @Override @@ -158,7 +158,7 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getFleetNameColumn() { + public static > SortableRaceListColumn getFleetNameColumn() { Cell cell = new TextCell(); InvertibleComparator comparator = new InvertibleComparatorWrapper(new NaturalComparator(false)) { @Override @@ -184,7 +184,7 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getStartTimeColumn() { + public static > SortableRaceListColumn getStartTimeColumn() { Cell cell = new DateCell(DateTimeFormat.getFormat(PredefinedFormat.HOUR24_MINUTE)); InvertibleComparator comparator = new InvertibleComparatorWrapper(new NullSafeComparableComparator()) { @Override @@ -265,7 +265,7 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getWindSpeedColumn() { + public static SortableRaceListColumn getWindSpeedColumn() { Cell cell = new TextCell(); InvertibleComparator comparator = new InvertibleComparatorWrapper( new NullSafeComparableComparator()) { @Override @@ -291,10 +291,48 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getWindDirectionColumn() { - Cell cell = new AbstractCell() { + public static SortableRaceListColumn getWindRangeColumn() { + Cell cell = new TextCell(); + InvertibleComparator comparator = new InvertibleComparatorWrapper( + new NullSafeComparableComparator()) { @Override - public void render(Context context, SimpleWindDTO value, SafeHtmlBuilder sb) { + protected Double getComparisonValue(T object) { + return object.getWind() != null ? (object.getWind().getTrueUpperboundWindInKnots() + object.getWind() + .getTrueLowerboundWindInKnots()) : null; + } + }; + return new SortableRaceListColumn(I18N.wind(), cell, comparator) { + @Override + public String getHeaderStyle() { + return CSS.raceslist_head_item(); + } + + @Override + public String getColumnStyle() { + return CSS.race_item(); + } + + @Override + public String getValue(T object) { + if (object == null || object.getWind() == null) { + return ""; + } + Double trueUpperboundWindInKnots = Math.round(object.getWind().getTrueUpperboundWindInKnots()*10d)/10d; + Double trueLowerboundWindInKnots = Math.round(object.getWind().getTrueLowerboundWindInKnots()*10d)/10d; + StringBuilder sb = new StringBuilder(); + sb.append(I18N.knotsValue(trueLowerboundWindInKnots)); + if (trueUpperboundWindInKnots - trueLowerboundWindInKnots != 0d) { + sb.append(" - ").append(I18N.knotsValue(trueUpperboundWindInKnots)); + } + return sb.toString(); + } + }; + } + + public static > SortableRaceListColumn getWindDirectionColumn() { + Cell cell = new AbstractCell() { + @Override + public void render(Context context, AbstractWindDTO value, SafeHtmlBuilder sb) { if (value != null) { SafeStylesBuilder safeStyles = new SafeStylesBuilder(); safeStyles.trustedNameAndValue("-webkit-transform", "rotate(" + value.getTrueWindFromDeg() + "deg)"); @@ -310,7 +348,7 @@ public class RaceListColumnFactory { return object.getWind() != null ? object.getWind().getTrueWindFromDeg() : null; } }; - return new SortableRaceListColumn(I18N.from(), cell, comparator) { + return new SortableRaceListColumn(I18N.from(), cell, comparator) { @Override public String getHeaderStyle() { return getStyleNamesString(CSS.raceslist_head_item(), MEDIA_CSS.hideonsmall()); @@ -322,13 +360,13 @@ public class RaceListColumnFactory { } @Override - public SimpleWindDTO getValue(T object) { + public AbstractWindDTO getValue(T object) { return object.getWind(); } }; } - public static SortableRaceListColumn getCourseAreaColumn() { + public static > SortableRaceListColumn getCourseAreaColumn() { Cell cell = new TextCell(); InvertibleComparator comparator = new InvertibleComparatorWrapper(new NaturalComparator(false)) { @Override @@ -354,7 +392,7 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getCourseColumn() { + public static > SortableRaceListColumn getCourseColumn() { Cell cell = new TextCell(); InvertibleComparator comparator = new InvertibleComparatorWrapper(new NaturalComparator(false)) { @Override @@ -502,7 +540,7 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getRaceViewerButtonColumn(final EventView.Presenter presenter) { + public static > SortableRaceListColumn getRaceViewerButtonColumn(final EventView.Presenter presenter) { Cell cell = new AbstractCell() { private final String watchNowStyle = getButtonStyleNames(MAIN_CSS.buttonred()); private final String analyseRaceStyle = getButtonStyleNames(MAIN_CSS.buttonprimary()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.java index c3bb632ee88..8ae07c45d3a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.java @@ -13,7 +13,7 @@ import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; -public class RaceListContainer extends Composite { +public class RaceListContainer> extends Composite { private static RaceListContainerUiBinder uiBinder = GWT.create(RaceListContainerUiBinder.class); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java index 164dbea4bb1..bec59b5d074 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java @@ -5,7 +5,7 @@ import java.util.Collection; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; -import com.sap.sailing.gwt.ui.shared.race.SimpleWindDTO; +import com.sap.sailing.gwt.ui.shared.race.wind.AbstractWindDTO; import com.sap.sse.common.Duration; public class RaceListDataUtil { @@ -14,7 +14,7 @@ public class RaceListDataUtil { V getValue(T object); } - private static boolean hasValues(Collection races, ValueProvider valueProvider) { + private static > boolean hasValues(Collection races, ValueProvider valueProvider) { for (T race : races) { if (valueProvider.getValue(race) != null) { return true; @@ -23,7 +23,7 @@ public class RaceListDataUtil { return false; } - private static boolean hasNumberValues(Collection races, ValueProvider valueProvider) { + private static > boolean hasNumberValues(Collection races, ValueProvider valueProvider) { for (T race : races) { Number value = valueProvider.getValue(race); if (value != null && value.longValue() > 0) { @@ -33,7 +33,7 @@ public class RaceListDataUtil { return false; } - public static boolean hasFleets(Collection data) { + public static > boolean hasFleets(Collection data) { return hasValues(data, new ValueProvider() { @Override public FleetMetadataDTO getValue(T object) { @@ -51,10 +51,10 @@ public class RaceListDataUtil { }); } - public static boolean hasWind(Collection data) { - return hasValues(data, new ValueProvider() { + public static > boolean hasWind(Collection data) { + return hasValues(data, new ValueProvider() { @Override - public SimpleWindDTO getValue(T object) { + public AbstractWindDTO getValue(T object) { return object.getWind(); } }); @@ -87,7 +87,7 @@ public class RaceListDataUtil { }); } - public static boolean hasCourses(Collection data) { + public static > boolean hasCourses(Collection data) { return hasValues(data, new ValueProvider() { @Override public String getValue(T object) { @@ -96,7 +96,7 @@ public class RaceListDataUtil { }); } - public static boolean hasCourseAreas(Collection data) { + public static > boolean hasCourseAreas(Collection data) { return hasValues(data, new ValueProvider() { @Override public String getValue(T object) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index a3462327acd..7da83f0dfd0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -211,7 +211,9 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView videoCountColumn = RaceListColumnFactory.getVideoCountColumn(); private final SortableRaceListColumn audioCountColumn = RaceListColumnFactory.getAudioCountColumn(); private final SortableRaceListColumn winnerColumn = RaceListColumnFactory.getWinnerColumn(); - + private final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory + .getWindRangeColumn(); + public RaceListFinishedRaces(EventView.Presenter presenter) { super(presenter); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceDTO.java index a17dd10637b..76a336dd357 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LiveRaceDTO.java @@ -3,8 +3,9 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; import com.sap.sailing.gwt.ui.shared.race.FlagStateDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO; +import com.sap.sailing.gwt.ui.shared.race.wind.SimpleWindDTO; -public class LiveRaceDTO extends RaceMetadataDTO { +public class LiveRaceDTO extends RaceMetadataDTO { private FlagStateDTO flagState; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 3c573a2b553..737216621ee 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -48,7 +48,7 @@ import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceTrackingState; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO; -import com.sap.sailing.gwt.ui.shared.race.SimpleWindDTO; +import com.sap.sailing.gwt.ui.shared.race.wind.SimpleWindDTO; import com.sap.sailing.server.RacingEventService; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; @@ -299,7 +299,7 @@ public class RaceContext { fillRaceData(liveRaceDTO); liveRaceDTO.setFlagState(getFlagStateOrNull()); liveRaceDTO.setProgress(getProgressOrNull()); - + liveRaceDTO.setWind(getWindOrNull()); return liveRaceDTO; } return null; @@ -391,7 +391,7 @@ public class RaceContext { return null; } - private void fillRaceData(RaceMetadataDTO dto) { + private void fillRaceData(RaceMetadataDTO dto) { dto.setViewState(getLiveRaceViewState()); dto.setRegattaDisplayName(getRegattaDisplayName()); dto.setTrackedRaceName(trackedRace != null ? trackedRace.getRaceIdentifier().getRaceName() : null); @@ -401,7 +401,7 @@ public class RaceContext { dto.setBoatClass(HomeServiceUtil.getBoatClassName(leaderboard)); dto.setCourseArea(getCourseAreaOrNull()); dto.setCourse(getCourseNameOrNull()); - dto.setWind(getWindOrNull()); + } public boolean isLiveOrOfPublicInterest() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java index df22376c799..3c1306abff2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListRaceDTO.java @@ -1,9 +1,10 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; +import com.sap.sailing.gwt.ui.shared.race.wind.WindStatisticsDTO; import com.sap.sse.common.Duration; -public class RaceListRaceDTO extends RaceMetadataDTO { +public class RaceListRaceDTO extends RaceMetadataDTO { private Duration duration; private SimpleCompetitorDTO winner; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java index 0643bb0374c..0f00193d2ab 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java @@ -24,7 +24,7 @@ public class RaceListViewDTO implements DTO { add(finishedRaces, finishedRace); } - private void add(TreeSet set, T race) { + private > void add(TreeSet set, T race) { if (race != null) { set.add(race); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/RaceMetadataDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/RaceMetadataDTO.java index 58de580e0b8..2e79496a559 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/RaceMetadataDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/RaceMetadataDTO.java @@ -4,9 +4,10 @@ import java.util.Date; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.dispatch.DTO; +import com.sap.sailing.gwt.ui.shared.race.wind.AbstractWindDTO; import com.sap.sse.common.Util; -public class RaceMetadataDTO implements DTO, Comparable { +public abstract class RaceMetadataDTO implements DTO, Comparable> { public enum RaceViewState { PLANNED { // no start time set @@ -66,7 +67,7 @@ public class RaceMetadataDTO implements DTO, Comparable { private String boatClass; private RaceViewState state; private RaceTrackingState trackingState; - private SimpleWindDTO wind; + private WIND wind; protected RaceMetadataDTO() { } @@ -148,11 +149,11 @@ public class RaceMetadataDTO implements DTO, Comparable { this.trackedRaceName = trackedRaceName; } - public SimpleWindDTO getWind() { + public WIND getWind() { return wind; } - public void setWind(SimpleWindDTO wind) { + public void setWind(WIND wind) { this.wind = wind; } @@ -165,7 +166,7 @@ public class RaceMetadataDTO implements DTO, Comparable { } @Override - public int compareTo(RaceMetadataDTO o) { + public int compareTo(RaceMetadataDTO o) { Date thisStart = getStart(); Date otherStart = o.getStart(); if(Util.equalsWithNull(thisStart, otherStart)) { @@ -181,7 +182,7 @@ public class RaceMetadataDTO implements DTO, Comparable { return -thisStart.compareTo(otherStart); } - private int compareBySecondaryCriteria(RaceMetadataDTO o) { + private int compareBySecondaryCriteria(RaceMetadataDTO o) { String thisRegattaName = getRegattaName(); String otherRegattaName = o.getRegattaName(); if(thisRegattaName != otherRegattaName) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/SimpleWindDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/SimpleWindDTO.java deleted file mode 100644 index 6a23dd30aa2..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/SimpleWindDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sap.sailing.gwt.ui.shared.race; - -import com.google.gwt.user.client.rpc.IsSerializable; - -public class SimpleWindDTO implements IsSerializable { - private Double trueWindFromDeg; - private Double trueWindSpeedInKnots; - - @SuppressWarnings("unused") - private SimpleWindDTO() { - } - - public SimpleWindDTO(Double trueWindFromDeg, Double trueWindSpeedInKnots) { - super(); - this.trueWindFromDeg = trueWindFromDeg; - this.trueWindSpeedInKnots = trueWindSpeedInKnots; - } - - public Double getTrueWindFromDeg() { - return trueWindFromDeg; - } - - public Double getTrueWindSpeedInKnots() { - return trueWindSpeedInKnots; - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/WindStatisticsDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/WindStatisticsDTO.java deleted file mode 100644 index 91c4aea64fd..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/WindStatisticsDTO.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sap.sailing.gwt.ui.shared.race; - -public class WindStatisticsDTO extends SimpleWindDTO { - - public WindStatisticsDTO(Double trueWindFromDeg, Double trueWindSpeedInKnots) { - super(trueWindFromDeg, trueWindSpeedInKnots); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/AbstractWindDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/AbstractWindDTO.java new file mode 100644 index 00000000000..e372809709d --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/AbstractWindDTO.java @@ -0,0 +1,19 @@ +package com.sap.sailing.gwt.ui.shared.race.wind; + +import com.google.gwt.user.client.rpc.IsSerializable; + +public abstract class AbstractWindDTO implements IsSerializable { + + private Double trueWindFromDeg; + + protected AbstractWindDTO() { + } + + protected AbstractWindDTO(Double trueWindFromDeg) { + this.trueWindFromDeg = trueWindFromDeg; + } + + public Double getTrueWindFromDeg() { + return trueWindFromDeg; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/SimpleWindDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/SimpleWindDTO.java new file mode 100644 index 00000000000..dcff48cf906 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/SimpleWindDTO.java @@ -0,0 +1,15 @@ +package com.sap.sailing.gwt.ui.shared.race.wind; + + +public class SimpleWindDTO extends AbstractWindDTO { + private Double trueWindSpeedInKnots; + + public SimpleWindDTO(Double trueWindFromDeg, Double trueWindSpeedInKnots) { + super(trueWindFromDeg); + this.trueWindSpeedInKnots = trueWindSpeedInKnots; + } + + public Double getTrueWindSpeedInKnots() { + return trueWindSpeedInKnots; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/WindStatisticsDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/WindStatisticsDTO.java new file mode 100644 index 00000000000..4c5d90f73d9 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/WindStatisticsDTO.java @@ -0,0 +1,27 @@ +package com.sap.sailing.gwt.ui.shared.race.wind; + +public class WindStatisticsDTO extends AbstractWindDTO { + + private Double trueLowerboundWindInKnots; + private Double trueUpperboundWindInKnots; + + public WindStatisticsDTO() { + super(); + } + + public WindStatisticsDTO(Double trueWindFromDeg, Double trueLowerboundWindInKnots, Double trueUpperboundWindInKnots) { + super(trueWindFromDeg); + this.trueLowerboundWindInKnots = trueLowerboundWindInKnots; + this.trueUpperboundWindInKnots = trueUpperboundWindInKnots; + } + + public Double getTrueLowerboundWindInKnots() { + return trueLowerboundWindInKnots; + } + + public Double getTrueUpperboundWindInKnots() { + return trueUpperboundWindInKnots; + } + + +} From b6c87ddaf3febe9a6d3f1ed4b375cd77996a80a8 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 10:07:17 +0200 Subject: [PATCH 121/219] Race list - Adjusted wind DTOs for race lists --- .../sap/sailing/gwt/ui/shared/race/wind/SimpleWindDTO.java | 4 ++++ .../sailing/gwt/ui/shared/race/wind/WindStatisticsDTO.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/SimpleWindDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/SimpleWindDTO.java index dcff48cf906..c5435c8b3be 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/SimpleWindDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/SimpleWindDTO.java @@ -4,6 +4,10 @@ package com.sap.sailing.gwt.ui.shared.race.wind; public class SimpleWindDTO extends AbstractWindDTO { private Double trueWindSpeedInKnots; + protected SimpleWindDTO() { + super(); + } + public SimpleWindDTO(Double trueWindFromDeg, Double trueWindSpeedInKnots) { super(trueWindFromDeg); this.trueWindSpeedInKnots = trueWindSpeedInKnots; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/WindStatisticsDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/WindStatisticsDTO.java index 4c5d90f73d9..baf640b6885 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/WindStatisticsDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/race/wind/WindStatisticsDTO.java @@ -5,7 +5,7 @@ public class WindStatisticsDTO extends AbstractWindDTO { private Double trueLowerboundWindInKnots; private Double trueUpperboundWindInKnots; - public WindStatisticsDTO() { + protected WindStatisticsDTO() { super(); } From d27b0c909f50919391a7147019a3e583ea8e0ef9 Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 10:08:33 +0200 Subject: [PATCH 122/219] Initial data for wind ranges --- .../ui/shared/dispatch/event/RaceContext.java | 255 ++++++++++-------- 1 file changed, 149 insertions(+), 106 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 25f55aff592..093be136910 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -1,5 +1,6 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; +import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.logging.Level; @@ -49,6 +50,7 @@ import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceTrackingState; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO; import com.sap.sailing.gwt.ui.shared.race.wind.SimpleWindDTO; +import com.sap.sailing.gwt.ui.shared.race.wind.WindStatisticsDTO; import com.sap.sailing.server.RacingEventService; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; @@ -61,7 +63,6 @@ public class RaceContext { private static final Logger logger = Logger.getLogger(RaceContext.class.getName()); private static final long TIME_BEFORE_START_TO_SHOW_RACES_AS_LIVE = 15 * 60 * 1000; // 15 min private static final long TIME_TO_SHOW_CANCELED_RACES_AS_LIVE = 5 * 60 * 1000; // 5 min - private final TimePoint now = MillisecondsTimePoint.now(); private final Leaderboard leaderboard; private final RaceColumn raceColumn; @@ -72,15 +73,15 @@ public class RaceContext { private final ReadonlyRaceState state; private final Event event; private final RacingEventService service; - private TimePoint startTime; private boolean startTimeCalculated = false; private TimePoint finishTime; private boolean finishTimeCalculated = false; private RaceViewState raceViewState; private List competitors; - - public RaceContext(RacingEventService service, Event event, Leaderboard leaderboard, RaceColumn raceColumn, Fleet fleet, RaceLogResolver raceLogResolver) { + + public RaceContext(RacingEventService service, Event event, Leaderboard leaderboard, RaceColumn raceColumn, + Fleet fleet, RaceLogResolver raceLogResolver) { this.service = service; this.event = event; this.leaderboard = leaderboard; @@ -120,23 +121,23 @@ public class RaceContext { } public FleetMetadataDTO getFleetMetadata() { - return new FleetMetadataDTO(fleet.getName(), fleet.getColor() == null ? null : fleet.getColor().getAsHtml(), fleet.getOrdering()); + return new FleetMetadataDTO(fleet.getName(), fleet.getColor() == null ? null : fleet.getColor().getAsHtml(), + fleet.getOrdering()); } private SimpleWindDTO getWindOrNull() { - if(trackedRace != null) { - TimePoint toTimePoint = trackedRace.getEndOfRace() == null ? MillisecondsTimePoint.now().minus(trackedRace.getDelayToLiveInMillis()) : trackedRace.getEndOfRace(); + if (trackedRace != null) { + TimePoint toTimePoint = trackedRace.getEndOfRace() == null ? MillisecondsTimePoint.now().minus( + trackedRace.getDelayToLiveInMillis()) : trackedRace.getEndOfRace(); TimePoint newestEvent = trackedRace.getTimePointOfNewestEvent(); - if(newestEvent != null && newestEvent.before(toTimePoint)) { + if (newestEvent != null && newestEvent.before(toTimePoint)) { toTimePoint = newestEvent; } - WindTrack windTrack = trackedRace.getOrCreateWindTrack(new WindSourceImpl(WindSourceType.COMBINED)); - - if(windTrack != null) { - WindWithConfidence> averagedWindWithConfidence = - windTrack.getAveragedWindWithConfidence(trackedRace.getCenterOfCourse(toTimePoint), toTimePoint); - if(averagedWindWithConfidence != null) { + if (windTrack != null) { + WindWithConfidence> averagedWindWithConfidence = windTrack + .getAveragedWindWithConfidence(trackedRace.getCenterOfCourse(toTimePoint), toTimePoint); + if (averagedWindWithConfidence != null) { Wind wind = averagedWindWithConfidence.getObject(); if (wind.getKnots() >= 0.05d) { return new SimpleWindDTO(wind.getFrom().getDegrees(), wind.getKnots()); @@ -145,30 +146,77 @@ public class RaceContext { } } else { Wind wind = checkForWindFixesFromRaceLog(); - if(wind != null) { + if (wind != null) { return new SimpleWindDTO(wind.getFrom().getDegrees(), wind.getKnots()); } } return null; } + private WindStatisticsDTO getWindStatisticsOrNull() { + if (trackedRace != null) { + TimePoint toTimePoint = trackedRace.getEndOfRace() == null ? MillisecondsTimePoint.now().minus( + trackedRace.getDelayToLiveInMillis()) : trackedRace.getEndOfRace(); + TimePoint newestEvent = trackedRace.getTimePointOfNewestEvent(); + if (newestEvent != null && newestEvent.before(toTimePoint)) { + toTimePoint = newestEvent; + } + WindTrack windTrack = trackedRace.getOrCreateWindTrack(new WindSourceImpl(WindSourceType.COMBINED)); + if (windTrack != null) { + TimePoint startTime = getStartTime(); + if (startTime == null) { + startTime = toTimePoint; + } + List pointsToGetWind = Arrays.asList(startTime, + startTime.plus(startTime.until(toTimePoint).divide(2)), toTimePoint); + Double lowerBoundWindInKnots = null; + Double upperBoundWindInKnots = null; + Double averageDirection = null; + for (TimePoint timePoint : pointsToGetWind) { + WindWithConfidence> averagedWindWithConfidence = windTrack + .getAveragedWindWithConfidence(trackedRace.getCenterOfCourse(toTimePoint), toTimePoint); + if (averagedWindWithConfidence != null) { + Wind wind = averagedWindWithConfidence.getObject(); + averageDirection = wind.getFrom().getDegrees(); + double currentWindInKnots = wind.getKnots(); + if (currentWindInKnots >= 0.05d) { + if (lowerBoundWindInKnots == null) { + lowerBoundWindInKnots = currentWindInKnots; + upperBoundWindInKnots = currentWindInKnots; + } else { + lowerBoundWindInKnots = Math.min(lowerBoundWindInKnots, currentWindInKnots); + upperBoundWindInKnots = Math.max(upperBoundWindInKnots, currentWindInKnots); + } + } + } + } + if (lowerBoundWindInKnots != null && upperBoundWindInKnots != null) { + return new WindStatisticsDTO(averageDirection, lowerBoundWindInKnots, upperBoundWindInKnots); + } + } + } else { + Wind wind = checkForWindFixesFromRaceLog(); + if (wind != null) { + return new WindStatisticsDTO(wind.getFrom().getDegrees(), wind.getKnots(), wind.getKnots()); + } + } + return null; + } + private FlagStateDTO getFlagStateOrNull() { // Code extracted from SailingServiceImpl.createRaceInfoDTO // TODO: extract to to util to be used from both places TimePoint startTime = state.getStartTime(); - Flags lastUpperFlag = null; Flags lastLowerFlag = null; boolean lastFlagsAreDisplayed = false; boolean lastFlagsDisplayedStateChanged = false; - if (startTime != null) { FlagPoleState activeFlagState = state.getRacingProcedure().getActiveFlags(startTime, now); List activeFlags = activeFlagState.getCurrentState(); FlagPoleState previousFlagState = activeFlagState.getPreviousState(state.getRacingProcedure(), startTime); List previousFlags = previousFlagState.getCurrentState(); FlagPole mostInterestingFlagPole = FlagPoleState.getMostInterestingFlagPole(previousFlags, activeFlags); - // TODO: adapt the LastFlagFinder#getMostRecent method! if (mostInterestingFlagPole != null) { lastUpperFlag = mostInterestingFlagPole.getUpperFlag(); @@ -177,43 +225,41 @@ public class RaceContext { lastFlagsDisplayedStateChanged = previousFlagState.hasPoleChanged(mostInterestingFlagPole); } } - - switch(state.getStatus()) { - case FINISHED: - TimePoint protestStartTime = state.getProtestTime(); - if (protestStartTime != null) { - lastUpperFlag = Flags.BRAVO; - lastLowerFlag = Flags.NONE; - lastFlagsAreDisplayed = true; - lastFlagsDisplayedStateChanged = true; - } - break; - case UNSCHEDULED: - // search for race aborting in last pass - AbortingFlagFinder abortingFlagFinder = new AbortingFlagFinder(raceLog); - RaceLogFlagEvent abortingFlagEvent = abortingFlagFinder.analyze(); - if (abortingFlagEvent != null) { - lastUpperFlag = abortingFlagEvent.getUpperFlag(); - lastLowerFlag = abortingFlagEvent.getLowerFlag(); - lastFlagsAreDisplayed = abortingFlagEvent.isDisplayed(); - lastFlagsDisplayedStateChanged = true; - } - break; - case FINISHING: - case RUNNING: - case SCHEDULED: - case STARTPHASE: - case UNKNOWN: - break; - }; - - if(lastUpperFlag != null || lastLowerFlag != null) { + switch (state.getStatus()) { + case FINISHED: + TimePoint protestStartTime = state.getProtestTime(); + if (protestStartTime != null) { + lastUpperFlag = Flags.BRAVO; + lastLowerFlag = Flags.NONE; + lastFlagsAreDisplayed = true; + lastFlagsDisplayedStateChanged = true; + } + break; + case UNSCHEDULED: + // search for race aborting in last pass + AbortingFlagFinder abortingFlagFinder = new AbortingFlagFinder(raceLog); + RaceLogFlagEvent abortingFlagEvent = abortingFlagFinder.analyze(); + if (abortingFlagEvent != null) { + lastUpperFlag = abortingFlagEvent.getUpperFlag(); + lastLowerFlag = abortingFlagEvent.getLowerFlag(); + lastFlagsAreDisplayed = abortingFlagEvent.isDisplayed(); + lastFlagsDisplayedStateChanged = true; + } + break; + case FINISHING: + case RUNNING: + case SCHEDULED: + case STARTPHASE: + case UNKNOWN: + break; + } + ; + if (lastUpperFlag != null || lastLowerFlag != null) { return new FlagStateDTO(lastUpperFlag, lastLowerFlag, lastFlagsAreDisplayed, lastFlagsDisplayedStateChanged); } - return null; } - + private Regatta getRegatta() { final Regatta regatta; if (leaderboard instanceof RegattaLeaderboard) { @@ -223,18 +269,18 @@ public class RaceContext { } return regatta; } - + private String getCourseAreaOrNull() { /** The course area will not be shown if there is only one course area defined for the event */ - if(Util.size(event.getVenue().getCourseAreas()) <= 1) { + if (Util.size(event.getVenue().getCourseAreas()) <= 1) { return null; } CourseArea courseArea = null; - if(leaderboard instanceof FlexibleLeaderboard) { - courseArea = ((FlexibleLeaderboard)leaderboard).getDefaultCourseArea(); + if (leaderboard instanceof FlexibleLeaderboard) { + courseArea = ((FlexibleLeaderboard) leaderboard).getDefaultCourseArea(); } Regatta regatta = getRegatta(); - if(regatta != null) { + if (regatta != null) { courseArea = regatta.getDefaultCourseArea(); } return courseArea == null ? null : regatta.getDefaultCourseArea().getName(); @@ -242,7 +288,7 @@ public class RaceContext { private RaceProgressDTO getProgressOrNull() { RaceProgressDTO raceProgress = null; - if(raceDefinition != null && raceDefinition.getCourse() != null && trackedRace != null) { + if (raceDefinition != null && raceDefinition.getCourse() != null && trackedRace != null) { int totalLegsCount = raceDefinition.getCourse().getLegs().size(); int currentLegNo = trackedRace.getLastLegStarted(MillisecondsTimePoint.now()); if (currentLegNo > 0 && totalLegsCount > 0) { @@ -259,14 +305,14 @@ public class RaceContext { } return null; } - + public Date getStartTimeAsDate() { TimePoint startTime = getStartTime(); return startTime == null ? null : startTime.asDate(); } - + public TimePoint getStartTime() { - if(!startTimeCalculated) { + if (!startTimeCalculated) { if (trackedRace != null) { startTime = trackedRace.getStartOfRace(); } @@ -279,7 +325,7 @@ public class RaceContext { } private TimePoint getFinishTime() { - if(!finishTimeCalculated) { + if (!finishTimeCalculated) { if (trackedRace != null) { finishTime = trackedRace.getEndOfRace(); } else if (state != null) { @@ -293,7 +339,7 @@ public class RaceContext { public LiveRaceDTO getLiveRaceOrNull() { // a race is of 'public interest' of a race is a combination of it's 'live' state // and special flags states indicating how the postponed/canceled races will be continued - if(isLiveOrOfPublicInterest()) { + if (isLiveOrOfPublicInterest()) { // the start time is always given for live races LiveRaceDTO liveRaceDTO = new LiveRaceDTO(getRegattaName(), raceColumn.getName()); fillRaceData(liveRaceDTO); @@ -304,11 +350,11 @@ public class RaceContext { } return null; } - + public RaceListRaceDTO getFinishedRaceOrNull() { // a race is of 'public interest' of a race is a combination of it's 'live' state // and special flags states indicating how the postponed/canceled races will be continued - if(getLiveRaceViewState() == RaceViewState.FINISHED) { + if (getLiveRaceViewState() == RaceViewState.FINISHED) { // the start time is always given for live races RaceListRaceDTO liveRaceDTO = new RaceListRaceDTO(getRegattaName(), raceColumn.getName()); fillRaceData(liveRaceDTO); @@ -317,25 +363,24 @@ public class RaceContext { liveRaceDTO.setWindSourcesCount(getWindSourceCount()); liveRaceDTO.setVideoCount(getVideoCount()); liveRaceDTO.setAudioCount(getAudioCount()); - return liveRaceDTO; } return null; } - + private int getAudioCount() { - return getMediaCount( MediaType.audio); + return getMediaCount(MediaType.audio); } private int getVideoCount() { return getMediaCount(MediaType.video); } - + private int getMediaCount(MediaType mediaType) { int mediaCount = 0; - if(trackedRace != null) { - for(MediaTrack mediaTrack : service.getMediaTracksForRace(trackedRace.getRaceIdentifier())) { - if(mediaTrack.mimeType != null && mediaTrack.mimeType.mediaType == mediaType) { + if (trackedRace != null) { + for (MediaTrack mediaTrack : service.getMediaTracksForRace(trackedRace.getRaceIdentifier())) { + if (mediaTrack.mimeType != null && mediaTrack.mimeType.mediaType == mediaType) { mediaCount++; } } @@ -344,35 +389,35 @@ public class RaceContext { } private int getWindSourceCount() { - if(trackedRace != null) { + if (trackedRace != null) { return trackedRace.getWindSources().size() - trackedRace.getWindSourcesToExclude().size(); } return 0; } private SimpleCompetitorDTO getWinnerOrNull() { - if(getLiveRaceViewState() != RaceViewState.FINISHED) { + if (getLiveRaceViewState() != RaceViewState.FINISHED) { // We can't reliably calculate the winner for non finished races return null; } // TODO do not calculate the winner if the blue flag is currently shown. try { competitors = leaderboard.getCompetitorsFromBestToWorst(raceColumn, getFinishTime()); - if(competitors == null || competitors.isEmpty()) { + if (competitors == null || competitors.isEmpty()) { return null; } - if(Util.size(raceColumn.getFleets()) == 1) { + if (Util.size(raceColumn.getFleets()) == 1) { return new SimpleCompetitorDTO(competitors.get(0)); } - if(trackedRace == null) { + if (trackedRace == null) { return null; } - for(Competitor competitor : competitors) { + for (Competitor competitor : competitors) { Fleet fleetOfCompetitor = raceColumn.getFleetOfCompetitor(competitor); - if(fleetOfCompetitor == null) { + if (fleetOfCompetitor == null) { continue; } - if(Util.equalsWithNull(fleet.getName(), fleetOfCompetitor.getName())) { + if (Util.equalsWithNull(fleet.getName(), fleetOfCompetitor.getName())) { return new SimpleCompetitorDTO(competitor); } } @@ -385,7 +430,7 @@ public class RaceContext { private Duration getDurationOrNull() { TimePoint startTime = getStartTime(); TimePoint finishTime = getFinishTime(); - if(startTime != null && finishTime != null) { + if (startTime != null && finishTime != null) { return startTime.until(finishTime); } return null; @@ -401,59 +446,57 @@ public class RaceContext { dto.setBoatClass(HomeServiceUtil.getBoatClassName(leaderboard)); dto.setCourseArea(getCourseAreaOrNull()); dto.setCourse(getCourseNameOrNull()); - } - + public boolean isLiveOrOfPublicInterest() { TimePoint startTime = getStartTime(); boolean result = false; - if(startTime != null) { - if(trackedRace != null && trackedRace.hasGPSData() && trackedRace.hasWindData()) { + if (startTime != null) { + if (trackedRace != null && trackedRace.hasGPSData() && trackedRace.hasWindData()) { result = trackedRace.isLive(now); } else { TimePoint finishTime = getFinishTime(); // no data from tracking but maybe a manual setting of the start and finish time TimePoint startOfLivePeriod = startTime.minus(TIME_BEFORE_START_TO_SHOW_RACES_AS_LIVE); - TimePoint endOfLivePeriod = finishTime != null ? finishTime.plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS) : null; - if(now.after(startOfLivePeriod) && (endOfLivePeriod == null || now.before(endOfLivePeriod))) { + TimePoint endOfLivePeriod = finishTime != null ? finishTime + .plus(TimingConstants.IS_LIVE_GRACE_PERIOD_IN_MILLIS) : null; + if (now.after(startOfLivePeriod) && (endOfLivePeriod == null || now.before(endOfLivePeriod))) { result = true; } } - } else if (raceLog != null) { // in case there is not start time set it could be an postponed or abandoned race RaceLogFlagEvent abortingFlagEvent = checkForAbortFlagEvent(); - if(abortingFlagEvent != null) { + if (abortingFlagEvent != null) { TimePoint abortingTimeInPassBefore = abortingFlagEvent.getLogicalTimePoint(); if (now.minus(abortingTimeInPassBefore.asMillis()).asMillis() < TIME_TO_SHOW_CANCELED_RACES_AS_LIVE) { result = true; // TODO: Problem: This causes the race added to the live races list without having a start time!!! - // This does not work right now -> consider using a start time of the last pass. + // This does not work right now -> consider using a start time of the last pass. } } } - return result; } public RaceTrackingState getRaceTrackingState() { RaceTrackingState trackingState = RaceTrackingState.NOT_TRACKED; - if(trackedRace != null) { + if (trackedRace != null) { trackingState = RaceTrackingState.TRACKED_NO_VALID_DATA; - if(trackedRace.hasWindData() && trackedRace.hasGPSData()) { + if (trackedRace.hasWindData() && trackedRace.hasGPSData()) { trackingState = RaceTrackingState.TRACKED_VALID_DATA; } } return trackingState; } - + public RaceViewState getLiveRaceViewState() { - if(raceViewState == null) { + if (raceViewState == null) { raceViewState = calculateLiveRaceViewState(); } return raceViewState; } - + private RaceViewState calculateLiveRaceViewState() { TimePoint startTime = getStartTime(); TimePoint finishTime = getFinishTime(); @@ -462,34 +505,34 @@ public class RaceContext { raceState = RaceViewState.SCHEDULED; } else if (finishTime != null && now.after(finishTime)) { raceState = RaceViewState.FINISHED; - } else if(raceLog != null) { + } else if (raceLog != null) { RaceLogFlagEvent abortingFlagEvent = checkForAbortFlagEvent(); if (abortingFlagEvent != null) { Flags upperFlag = abortingFlagEvent.getUpperFlag(); - if(upperFlag.equals(Flags.AP)) { + if (upperFlag.equals(Flags.AP)) { raceState = RaceViewState.POSTPONED; - } else if(upperFlag.equals(Flags.NOVEMBER)) { + } else if (upperFlag.equals(Flags.NOVEMBER)) { raceState = RaceViewState.ABANDONED; - } else if(upperFlag.equals(Flags.FIRSTSUBSTITUTE)) { + } else if (upperFlag.equals(Flags.FIRSTSUBSTITUTE)) { raceState = RaceViewState.ABANDONED; } } } return raceState; } - + private Wind checkForWindFixesFromRaceLog() { WindFixesFinder windFixesFinder = new WindFixesFinder(raceLog); List windList = windFixesFinder.analyze(); - if(windList.size() > 0) { - return windList.get(windList.size()-1); + if (windList.size() > 0) { + return windList.get(windList.size() - 1); } return null; } - + private RaceLogFlagEvent checkForAbortFlagEvent() { RaceLogFlagEvent result = null; - if(raceLog != null) { + if (raceLog != null) { AbortingFlagFinder abortingFlagFinder = new AbortingFlagFinder(raceLog); RaceLogFlagEvent abortingFlagEvent = abortingFlagFinder.analyze(); if (abortingFlagEvent != null) { @@ -510,9 +553,9 @@ public class RaceContext { public RegattaAndRaceIdentifier getRaceIdentifier() { return trackedRace.getRaceIdentifier(); } - + public String getSeriesName() { - if(raceColumn instanceof RaceColumnInSeries) { + if (raceColumn instanceof RaceColumnInSeries) { return ((RaceColumnInSeries) raceColumn).getSeries().getName(); } return ""; From 07e794442d03eded4b17f6efe77b8148babf2dbf Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 10:11:42 +0200 Subject: [PATCH 123/219] Race list - Cleanup after wind DTO refactoring --- .../place/event/partials/raceListLive/RacesListLive.java | 3 +-- .../client/place/event/partials/racelist/AbstractRaceList.java | 1 - .../client/place/event/regatta/tabs/RegattaRacesTabView.java | 3 +-- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java index b24dc22cdfe..2abc6cd3193 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java @@ -43,11 +43,10 @@ public class RacesListLive extends Composite implements RefreshableWidget { private final SortableRaceListColumn regattaNameColumn = RaceListColumnFactory.getRegattaNameColumn(); private final SortableRaceListColumn flagsColumn = RaceListColumnFactory.getFlagsColumn(); + private final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory.getWindSpeedColumn(); private final SortableRaceListColumn courseAreaColumn = RaceListColumnFactory.getCourseAreaColumn(); private final SortableRaceListColumn courseColumn = RaceListColumnFactory.getCourseColumn(); private final SortableRaceListColumn raceViewStateColumn = RaceListColumnFactory.getRaceViewStateColumn(); - private final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory - .getWindSpeedColumn(); public RaceListLiveRaces(EventView.Presenter presenter, boolean showRegattaDetails) { super(presenter); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java index 4800badd896..a0effd0a2f7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java @@ -26,7 +26,6 @@ public abstract class AbstractRaceList raceNameColumn = RaceListColumnFactory.getRaceNameColumn(); protected final SortableRaceListColumn fleetNameColumn = RaceListColumnFactory.getFleetNameColumn(); protected final SortableRaceListColumn startTimeColumn = RaceListColumnFactory.getStartTimeColumn(); - // protected final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory.getWindSpeedColumn(); protected final SortableRaceListColumn windDirectionColumn = RaceListColumnFactory.getWindDirectionColumn(); protected final SortableRaceListColumn raceViewerButtonColumn; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 0a562784c20..a52855d9758 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -205,12 +205,11 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView implements RefreshableWidget> { private final SortableRaceListColumn durationColumn = RaceListColumnFactory.getDurationColumn(); + private final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory.getWindRangeColumn(); private final SortableRaceListColumn windfixesCountColumn = RaceListColumnFactory.getWindFixesCountColumn(); private final SortableRaceListColumn videoCountColumn = RaceListColumnFactory.getVideoCountColumn(); private final SortableRaceListColumn audioCountColumn = RaceListColumnFactory.getAudioCountColumn(); private final SortableRaceListColumn winnerColumn = RaceListColumnFactory.getWinnerColumn(); - private final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory - .getWindRangeColumn(); public RaceListFinishedRaces(EventView.Presenter presenter) { super(presenter); From 81df6f66d7e76d8b9c07f5bbdb8ec538359ef98c Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 10:22:57 +0200 Subject: [PATCH 124/219] Fixed loop variable --- .../sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 093be136910..55d8cbc3185 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -174,7 +174,7 @@ public class RaceContext { Double averageDirection = null; for (TimePoint timePoint : pointsToGetWind) { WindWithConfidence> averagedWindWithConfidence = windTrack - .getAveragedWindWithConfidence(trackedRace.getCenterOfCourse(toTimePoint), toTimePoint); + .getAveragedWindWithConfidence(trackedRace.getCenterOfCourse(timePoint), timePoint); if (averagedWindWithConfidence != null) { Wind wind = averagedWindWithConfidence.getObject(); averageDirection = wind.getFrom().getDegrees(); From 147f1db03434c7e9b683a8669fe553083fd1d95e Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 10:29:47 +0200 Subject: [PATCH 125/219] Filling race with wind data --- .../sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 55d8cbc3185..b1025186095 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -363,6 +363,7 @@ public class RaceContext { liveRaceDTO.setWindSourcesCount(getWindSourceCount()); liveRaceDTO.setVideoCount(getVideoCount()); liveRaceDTO.setAudioCount(getAudioCount()); + liveRaceDTO.setWind(getWindStatisticsOrNull()); return liveRaceDTO; } return null; From 62a43b5317017bea8d44eba7b037d88e46a03f57 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 10:43:41 +0200 Subject: [PATCH 126/219] Implemented automatic rerouting of HomeDesktop.html and HomeMobile.html to Home.html to make Kielerwoche 2015 links work after update to a newer version --- java/com.sap.sailing.gwt.ui/HomeDesktop.html | 22 ++++++++++++++++++++ java/com.sap.sailing.gwt.ui/HomeMobile.html | 22 ++++++++++++++++++++ java/com.sap.sailing.gwt.ui/build.properties | 2 ++ 3 files changed, 46 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/HomeDesktop.html create mode 100644 java/com.sap.sailing.gwt.ui/HomeMobile.html diff --git a/java/com.sap.sailing.gwt.ui/HomeDesktop.html b/java/com.sap.sailing.gwt.ui/HomeDesktop.html new file mode 100644 index 00000000000..fb2fefff91f --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/HomeDesktop.html @@ -0,0 +1,22 @@ + + + + + + + SAP Sailing - Homepage + + + + + + diff --git a/java/com.sap.sailing.gwt.ui/HomeMobile.html b/java/com.sap.sailing.gwt.ui/HomeMobile.html new file mode 100644 index 00000000000..fb2fefff91f --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/HomeMobile.html @@ -0,0 +1,22 @@ + + + + + + + SAP Sailing - Homepage + + + + + + diff --git a/java/com.sap.sailing.gwt.ui/build.properties b/java/com.sap.sailing.gwt.ui/build.properties index 7b094eba1a3..10e55f0cc1e 100755 --- a/java/com.sap.sailing.gwt.ui/build.properties +++ b/java/com.sap.sailing.gwt.ui/build.properties @@ -48,5 +48,7 @@ bin.includes = META-INF/,\ AutoPlay.html,\ Home.css,\ Home.html,\ + HomeDesktop.html,\ + HomeMobile.html,\ SettingsDialog.css output.. = WEB-INF/classes/ From c8f4d882134cab1ba30aa1f0bfe17db0b7af9be1 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 10:58:09 +0200 Subject: [PATCH 127/219] Race list - Added additional String messages for wind ranges --- .../main/java/com/sap/sailing/gwt/ui/client/StringMessages.java | 1 + .../java/com/sap/sailing/gwt/ui/client/StringMessages.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_de.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_ru.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_zh.properties | 1 + 5 files changed, 5 insertions(+) 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 d5ae0786fde..a2708fc7908 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 @@ -499,6 +499,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String scoringSchemeHighPointFirstGetsTen(); String knotsUnit(); String knotsValue(double value); + String knotsRange(double lowerValue, double upperValue); String averageJibeLossInMetersTooltip(); String averageManeuverLossInMetersTooltip(); String averageTackLossInMetersTooltip(); 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 d32687e7f02..56f93e34771 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 @@ -521,6 +521,7 @@ raceIsLive=Race {0} is live racesAreLive=Races {0} are live knotsUnit=kts knotsValue={0,number,#0.0} kts +knotsRange={0,number,#0.0} - {1,number,#0.0} kts scoringSchemeHighPointFirstGetsOne=High Point, winner gets 1 point scoringSchemeHighPointFirstGetsTen=High Point, winner gets 10 points knotsUnit=kts 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 7e79a54693e..c946ceb82a3 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 @@ -524,6 +524,7 @@ scoringSchemeHighPointFirstGetsOne=High Point System, Gewinner erhält 1 Punkt scoringSchemeHighPointFirstGetsTen=High Point System, Gewinner erhält 10 Punkte knotsUnit=kn knotsValue={0,number,#0.0} kn +knotsRange={0,number,#0.0} - {1,number,#0.0} kn generatePolarSheet=Polardiagramm erstellen polars=Polardiagramme polarSheetChart=Polardiagramm diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index 8e3ba803431..28b38c72000 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -510,6 +510,7 @@ raceIsLive=Гонка {0} в прямом эфире racesAreLive=Гонки {0} в прямом эфире knotsUnit=Узлы knotsValue={0,number,#0.0} Узлы +knotsRange={0,number,#0.0} - {1,number,#0.0} Узлы scoringSchemeHighPointFirstGetsOne=Самый лучший результат, победитель получает 1 очко scoringSchemeHighPointFirstGetsTen=Самый лучший результат, победитель получает 10 очков generatePolarSheet=Создать полярную электронную таблицу diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index d6123ea6671..cbc7a2212b8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -978,6 +978,7 @@ competitor=参赛队 tracked=跟踪 knotsUnit=kts knotsValue={0,number,#0.0} kts +knotsRange={0,number,#0.0} - {1,number,#0.0} kts errorTryingToObtainRaceLogMarkPassingData=Error trying to obtain race log mark passing data: {0} imageURLs=Image URLs speedOverGroundAtRaceStartTooltip=起航时的实际速度 From 6103f0030c39aa18ef7adb42d08bd20d92a9c28e Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 11:00:13 +0200 Subject: [PATCH 128/219] Race list - Refactored wind columns --- .../racelist/RaceListColumnFactory.java | 66 ++++++++----------- .../regatta/tabs/RegattaRacesTabView.java | 6 +- .../shared/race/wind/WindStatisticsDTO.java | 5 +- 3 files changed, 35 insertions(+), 42 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index 561f94d1967..fd238675317 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -45,6 +45,7 @@ import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceTrackingState; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO; import com.sap.sailing.gwt.ui.shared.race.wind.AbstractWindDTO; +import com.sap.sailing.gwt.ui.shared.race.wind.WindStatisticsDTO; import com.sap.sailing.gwt.ui.shared.util.NullSafeComparableComparator; import com.sap.sse.common.Duration; import com.sap.sse.common.Util; @@ -266,24 +267,13 @@ public class RaceListColumnFactory { } public static SortableRaceListColumn getWindSpeedColumn() { - Cell cell = new TextCell(); InvertibleComparator comparator = new InvertibleComparatorWrapper( new NullSafeComparableComparator()) { @Override protected Double getComparisonValue(T object) { return object.getWind() != null ? object.getWind().getTrueWindSpeedInKnots() : null; } }; - return new SortableRaceListColumn(I18N.wind(), cell, comparator) { - @Override - public String getHeaderStyle() { - return CSS.raceslist_head_item(); - } - - @Override - public String getColumnStyle() { - return CSS.race_item(); - } - + return new WindSpeedOrRangeColumn(comparator) { @Override public String getValue(T object) { return object.getWind() != null ? I18N.knotsValue(object.getWind().getTrueWindSpeedInKnots()) : null; @@ -292,39 +282,23 @@ public class RaceListColumnFactory { } public static SortableRaceListColumn getWindRangeColumn() { - Cell cell = new TextCell(); - InvertibleComparator comparator = new InvertibleComparatorWrapper( - new NullSafeComparableComparator()) { + InvertibleComparator comparator = new InvertibleComparatorWrapper(new NullSafeComparableComparator()) { @Override protected Double getComparisonValue(T object) { - return object.getWind() != null ? (object.getWind().getTrueUpperboundWindInKnots() + object.getWind() - .getTrueLowerboundWindInKnots()) : null; + WindStatisticsDTO wind = object.getWind(); + return wind != null ? (wind.getTrueUpperboundWindInKnots() + wind .getTrueLowerboundWindInKnots()) : null; } }; - return new SortableRaceListColumn(I18N.wind(), cell, comparator) { - @Override - public String getHeaderStyle() { - return CSS.raceslist_head_item(); - } - - @Override - public String getColumnStyle() { - return CSS.race_item(); - } - + return new WindSpeedOrRangeColumn(comparator) { @Override public String getValue(T object) { - if (object == null || object.getWind() == null) { + WindStatisticsDTO wind = object.getWind(); + if (wind == null) { return ""; + } else if (wind.getRoundedDifference() <= 0d) { + return I18N.knotsValue(wind.getTrueLowerboundWindInKnots()); } - Double trueUpperboundWindInKnots = Math.round(object.getWind().getTrueUpperboundWindInKnots()*10d)/10d; - Double trueLowerboundWindInKnots = Math.round(object.getWind().getTrueLowerboundWindInKnots()*10d)/10d; - StringBuilder sb = new StringBuilder(); - sb.append(I18N.knotsValue(trueLowerboundWindInKnots)); - if (trueUpperboundWindInKnots - trueLowerboundWindInKnots != 0d) { - sb.append(" - ").append(I18N.knotsValue(trueUpperboundWindInKnots)); - } - return sb.toString(); + return I18N.knotsRange(wind.getTrueLowerboundWindInKnots(), wind.getTrueUpperboundWindInKnots()); } }; } @@ -418,7 +392,7 @@ public class RaceListColumnFactory { }; } - public static SortableRaceListColumn getWindFixesCountColumn() { + public static SortableRaceListColumn getWindSourcesCountColumn() { InvertibleComparator comparator = new InvertibleComparatorWrapper(new NullSafeComparableComparator(false)) { @Override protected Integer getComparisonValue(T object) { @@ -583,6 +557,22 @@ public class RaceListColumnFactory { }; } + private static abstract class WindSpeedOrRangeColumn> extends SortableRaceListColumn { + protected WindSpeedOrRangeColumn(InvertibleComparator comparator) { + super(I18N.wind(), new TextCell(), comparator); + } + + @Override + public String getHeaderStyle() { + return CSS.raceslist_head_item(); + } + + @Override + public String getColumnStyle() { + return CSS.race_item(); + } + } + private static abstract class DataCountColumn extends SortableRaceListColumn { private static final SafeUri ICON_WIND = UriUtils.fromTrustedString("images/home/icon-wind.png"); private static final SafeUri ICON_VIDEO = UriUtils.fromTrustedString("images/home/icon-video.png"); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index a52855d9758..9eeeab03a7c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -206,7 +206,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView implements RefreshableWidget> { private final SortableRaceListColumn durationColumn = RaceListColumnFactory.getDurationColumn(); private final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory.getWindRangeColumn(); - private final SortableRaceListColumn windfixesCountColumn = RaceListColumnFactory.getWindFixesCountColumn(); + private final SortableRaceListColumn windSourcesCountColumn = RaceListColumnFactory.getWindSourcesCountColumn(); private final SortableRaceListColumn videoCountColumn = RaceListColumnFactory.getVideoCountColumn(); private final SortableRaceListColumn audioCountColumn = RaceListColumnFactory.getAudioCountColumn(); private final SortableRaceListColumn winnerColumn = RaceListColumnFactory.getWinnerColumn(); @@ -228,7 +228,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView Date: Tue, 14 Jul 2015 11:05:16 +0200 Subject: [PATCH 129/219] Showing wind from racelog if none is available from tracked race --- .../ui/shared/dispatch/event/RaceContext.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index b1025186095..b5b0c1cf89b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -144,11 +144,10 @@ public class RaceContext { } } } - } else { - Wind wind = checkForWindFixesFromRaceLog(); - if (wind != null) { - return new SimpleWindDTO(wind.getFrom().getDegrees(), wind.getKnots()); - } + } + Wind wind = checkForWindFixesFromRaceLog(); + if (wind != null) { + return new SimpleWindDTO(wind.getFrom().getDegrees(), wind.getKnots()); } return null; } @@ -194,11 +193,10 @@ public class RaceContext { return new WindStatisticsDTO(averageDirection, lowerBoundWindInKnots, upperBoundWindInKnots); } } - } else { - Wind wind = checkForWindFixesFromRaceLog(); - if (wind != null) { - return new WindStatisticsDTO(wind.getFrom().getDegrees(), wind.getKnots(), wind.getKnots()); - } + } + Wind wind = checkForWindFixesFromRaceLog(); + if (wind != null) { + return new WindStatisticsDTO(wind.getFrom().getDegrees(), wind.getKnots(), wind.getKnots()); } return null; } From b2f74e1d02d4f53371f3fdd3215d1a98ed3be5f3 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 11:06:58 +0200 Subject: [PATCH 130/219] Race list - Enable word wrap in winner column --- .../client/place/event/partials/raceListLive/RacesListLive.gss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.gss index 08b7cd10688..085c79ffdc4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.gss @@ -66,7 +66,7 @@ } .race_itemwinner { overflow: hidden; - white-space: nowrap; + white-space: normal; text-overflow: ellipsis; vertical-align: middle; min-width: 13.333333333333334em; From 61d5ec4dda916f4c475c9e6c9a7cccdb9dada0a2 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 14 Jul 2015 11:42:18 +0200 Subject: [PATCH 131/219] whitespace change only --- .../sap/sailing/gwt/ui/adminconsole/EventDetailsComposite.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDetailsComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDetailsComposite.java index 5b44f253063..a86275481e8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDetailsComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDetailsComposite.java @@ -157,7 +157,7 @@ public class EventDetailsComposite extends Composite { } videoURLList.setValues(videoURLStringsAsList); List leaderboardGroupNamesAsList = new ArrayList<>(); - for(LeaderboardGroupDTO leaderboardGroupDTO: event.getLeaderboardGroups()) { + for (LeaderboardGroupDTO leaderboardGroupDTO : event.getLeaderboardGroups()) { leaderboardGroupNamesAsList.add(leaderboardGroupDTO.getName()); } leaderboardGroupList.setValues(leaderboardGroupNamesAsList); From 12a9656f67c1c4841d8050874db53b804e613c69 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 14 Jul 2015 11:42:54 +0200 Subject: [PATCH 132/219] added course field to CoursePositionsDTO; may need to change to CourseDTO or similar; preliminary only... --- .../java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java | 3 ++- .../java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 8932449626c..b247bbcdf69 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -772,7 +772,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S private MarkDTO convertToMarkDTO(Mark mark, Position position) { MarkDTO markDTO; - if(position != null) { + if (position != null) { markDTO = new MarkDTO(mark.getId().toString(), mark.getName(), position.getLatDeg(), position.getLngDeg()); } else { markDTO = new MarkDTO(mark.getId().toString(), mark.getName()); @@ -1864,6 +1864,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S result.totalLegsCount = trackedRace.getRace().getCourse().getLegs().size(); result.currentLegNumber = trackedRace.getLastLegStarted(dateAsTimePoint); result.marks = new HashSet(); + result.course = new ArrayList<>(); result.waypointPositions = new ArrayList<>(); Set marks = new HashSet(); Course course = trackedRace.getRace().getCourse(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java index a5d53429fba..32ec6e4ec46 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java @@ -8,6 +8,7 @@ import com.sap.sailing.domain.common.NauticalSide; import com.sap.sailing.domain.common.Position; public class CoursePositionsDTO implements IsSerializable { + public List course; public List waypointPositions; public List startMarkPositions; public List finishMarkPositions; From 442201fee6a86b67018ddbc8fa551a36e63c3d85 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 11:49:50 +0200 Subject: [PATCH 133/219] Implemented placeholder text if there are no finished races yet --- .../tabs/MultiregattaOverviewTabView.java | 2 +- .../tabs/MultiregattaRegattasTabView.java | 2 +- .../partials/raceListLive/RacesListLive.java | 30 ++++++---------- .../partials/racelist/RaceListContainer.java | 34 +++++++++++++++++-- .../racelist/RaceListContainer.ui.xml | 3 +- .../regatta/tabs/RegattaOverviewTabView.java | 2 +- .../regatta/tabs/RegattaRacesTabView.java | 20 +++++------ .../regatta/tabs/reload/RefreshManager.java | 4 +-- .../sailing/gwt/ui/client/StringMessages.java | 1 + .../gwt/ui/client/StringMessages.properties | 1 + .../ui/client/StringMessages_de.properties | 3 +- .../ui/client/StringMessages_ru.properties | 3 +- .../ui/client/StringMessages_zh.properties | 3 +- .../ui/shared/dispatch/CollectionResult.java | 7 ++++ .../gwt/ui/shared/dispatch/ListResult.java | 2 +- .../ui/shared/dispatch/SortedSetResult.java | 2 +- 16 files changed, 74 insertions(+), 45 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/CollectionResult.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java index 4093a8945bf..6324b96cb24 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java @@ -83,7 +83,7 @@ public class MultiregattaOverviewTabView extends Composite implements Multiregat initWidget(ourUiBinder.createAndBindUi(this)); RefreshManager refreshManager = new RefreshManager(this, currentPresenter.getDispatch()); stage.setupRefresh(refreshManager); - refreshManager.add(racesListLive, new GetLiveRacesForEventAction(currentPresenter.getCtx().getEventDTO().getId())); + refreshManager.add(racesListLive.getRefreshable(), new GetLiveRacesForEventAction(currentPresenter.getCtx().getEventDTO().getId())); if (SHOW_NEW_REGATTA_LIST) { refreshManager.add(regattaFilterList, new GetRegattaListViewAction(currentPresenter.getCtx().getEventDTO().getId())); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java index b8d1cc000a4..1e9322e5bf3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java @@ -79,7 +79,7 @@ public class MultiregattaRegattasTabView extends Composite implements Multiregat initWidget(ourUiBinder.createAndBindUi(this)); RefreshManager refreshManager = new RefreshManager(this, currentPresenter.getDispatch()); - refreshManager.add(racesListLiveUi, new GetLiveRacesForEventAction(currentPresenter.getCtx().getEventDTO().getId())); + refreshManager.add(racesListLiveUi.getRefreshable(), new GetLiveRacesForEventAction(currentPresenter.getCtx().getEventDTO().getId())); if (SHOW_NEW_REGATTA_LIST) { refreshManager.add(regattaFilterList, new GetRegattaListViewAction(currentPresenter.getCtx().getEventDTO().getId())); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java index 2abc6cd3193..7bc675e9541 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java @@ -1,7 +1,6 @@ package com.sap.sailing.gwt.home.client.place.event.partials.raceListLive; import java.util.Collection; -import java.util.Collections; import com.google.gwt.dom.client.Style.Display; import com.google.gwt.user.client.ui.Composite; @@ -13,31 +12,23 @@ import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListDat import com.sap.sailing.gwt.home.client.place.event.partials.racelist.SortableRaceListColumn; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; +import com.sap.sailing.gwt.ui.shared.dispatch.CollectionResult; import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; -public class RacesListLive extends Composite implements RefreshableWidget> { +public class RacesListLive extends Composite { private final RaceListLiveRaces raceList; + private final RaceListContainer raceListContainer; public RacesListLive(EventView.Presenter presenter, boolean showRegattaDetails) { raceList = new RaceListLiveRaces(presenter, showRegattaDetails); - initWidget(new RaceListContainer(StringMessages.INSTANCE.liveNow(), raceList)); + raceListContainer = new RaceListContainer(StringMessages.INSTANCE.liveNow(), raceList); + initWidget(raceListContainer); getElement().getStyle().setDisplay(Display.NONE); } - @Override - public void setData(SortedSetResult data, long nextUpdate, int updateNo) { - this.setListData(data == null ? Collections.emptySet() : data.getValues()); - } - - public void setListData(Collection data) { - if(data == null || data.isEmpty()) { - getElement().getStyle().setDisplay(Display.NONE); - } else { - getElement().getStyle().clearDisplay(); - raceList.setListData(data); - } + public RefreshableWidget> getRefreshable() { + return raceListContainer; } private class RaceListLiveRaces extends AbstractRaceList { @@ -52,8 +43,9 @@ public class RacesListLive extends Composite implements RefreshableWidget data) { + + @Override + protected void setTableData(Collection data) { boolean hasFleets = RaceListDataUtil.hasFleets(data); this.fleetCornerColumn.setShowDetails(hasFleets); this.fleetNameColumn.setShowDetails(hasFleets); @@ -62,7 +54,7 @@ public class RacesListLive extends Composite implements RefreshableWidget> extends Composite { +public class RaceListContainer> extends Composite implements RefreshableWidget> { private static RaceListContainerUiBinder uiBinder = GWT.create(RaceListContainerUiBinder.class); @@ -22,22 +25,47 @@ public class RaceListContainer> extends Composite { @UiField HeadingElement titleUi; @UiField DivElement infoUi; + @UiField DivElement noContentPlaceholderUi; @UiField(provided = true) AbstractRaceList raceListUi; + private String noContentPlaceholderText; public RaceListContainer(String title, AbstractRaceList raceList) { + this(title, null, raceList); + } + + public RaceListContainer(String title, String noContentPlaceholderText, AbstractRaceList raceList) { + this.noContentPlaceholderText = noContentPlaceholderText; RacesListLiveResources.INSTANCE.css().ensureInjected(); this.raceListUi = raceList; initWidget(uiBinder.createAndBindUi(this)); this.titleUi.setInnerText(title); + raceListUi.setVisible(false); + } + + @Override + public void setData(CollectionResult data, long nextUpdate, int updateNo) { + setRaceListData(data == null ? null : data.getValues()); } public void setRaceListData(Collection data) { - this.raceListUi.setTableData(data); + if(data == null || data.isEmpty()) { + if(noContentPlaceholderText == null) { + getElement().getStyle().setDisplay(Display.NONE); + } else { + noContentPlaceholderUi.setInnerText(noContentPlaceholderText); + noContentPlaceholderUi.getStyle().clearDisplay(); + raceListUi.setVisible(false); + } + } else { + noContentPlaceholderUi.getStyle().setDisplay(Display.NONE); + getElement().getStyle().clearDisplay(); + raceListUi.setVisible(true); + this.raceListUi.setTableData(data); + } } public void setInfoText(String infoText) { this.infoUi.setInnerText(infoText); this.infoUi.getStyle().clearDisplay(); } - } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.ui.xml index 77005d61bff..d2319f51abe 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListContainer.ui.xml @@ -7,7 +7,8 @@

-
+
+
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaOverviewTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaOverviewTabView.java index f639c97ab56..48b4daee058 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaOverviewTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaOverviewTabView.java @@ -48,7 +48,7 @@ public class RegattaOverviewTabView extends Composite implements RegattaTabView< RefreshManager refreshManager = new RefreshManager(this, currentPresenter.getDispatch()); stage.setupRefresh(refreshManager); - refreshManager.add(racesListLive, new GetLiveRacesForRegattaAction(currentPresenter.getCtx().getEventDTO() + refreshManager.add(racesListLive.getRefreshable(), new GetLiveRacesForRegattaAction(currentPresenter.getCtx().getEventDTO() .getId(), currentPresenter.getCtx().getRegattaId())); contentArea.setWidget(this); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 9eeeab03a7c..13a8ee7aec8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -38,7 +38,6 @@ import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.RaceGroupDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; -import com.sap.sailing.gwt.ui.shared.dispatch.SortedSetResult; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetFinishedRacesAction; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetLiveRacesForRegattaAction; import com.sap.sailing.gwt.ui.shared.dispatch.event.GetRegattaWithProgressAction; @@ -91,7 +90,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView raceListContainer; public RegattaRacesTabView() { listNavigationPanelUi = new ListNavigationPanel(new RegattaRacesTabViewNavigationSelectionCallback()); @@ -103,7 +102,8 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView(I18N.finishedRaces(), finishedRacesList = new RaceListFinishedRaces(currentPresenter))); + raceListContainer = new RaceListContainer<>(I18N.finishedRaces(), I18N.noFinishedRaces(), new RaceListFinishedRaces(currentPresenter)); + listFormatContainerUi.add(raceListContainer); } @Override @@ -119,14 +119,14 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView() { @Override public void setData(RegattaWithProgressDTO data, long nextUpdate, int updateNo) { regattaInfoContainerUi.setWidget(new MultiRegattaListItem(data)); } }, new GetRegattaWithProgressAction(myPlace.getCtx().getEventDTO().getId(), myPlace.getRegattaId())); - refreshManager.add(finishedRacesList, new GetFinishedRacesAction(myPlace.getCtx().getEventDTO().getId(), myPlace.getRegattaId())); + refreshManager.add(raceListContainer, new GetFinishedRacesAction(myPlace.getCtx().getEventDTO().getId(), myPlace.getRegattaId())); oldContentContainer.removeFromParent(); } else { @@ -203,7 +203,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView implements RefreshableWidget> { + private class RaceListFinishedRaces extends AbstractRaceList { private final SortableRaceListColumn durationColumn = RaceListColumnFactory.getDurationColumn(); private final SortableRaceListColumn windSpeedColumn = RaceListColumnFactory.getWindRangeColumn(); private final SortableRaceListColumn windSourcesCountColumn = RaceListColumnFactory.getWindSourcesCountColumn(); @@ -216,11 +216,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView data, long nextUpdate, int updateNo) { - setListData(data.getValues()); - } - - public void setListData(Collection data) { + protected void setTableData(Collection data) { boolean hasFleets = RaceListDataUtil.hasFleets(data); this.fleetCornerColumn.setShowDetails(hasFleets); this.fleetNameColumn.setShowDetails(hasFleets); @@ -231,7 +227,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView>> void add(RefreshableWidget widget, + public >> void add(RefreshableWidget widget, ActionProvider provider) { refreshables.add(new RefreshHolder(widget, provider)); reschedule(); } - public >> void add(RefreshableWidget widget, A action) { + public >> void add(RefreshableWidget widget, A action) { add(widget, new DefaultActionProvider<>(action)); } 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 a2708fc7908..d9220bb3ee3 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 @@ -1347,4 +1347,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String numberOfRacesShort(); String miniLeeaderboardLegendText(); String currentOfTotal(int current, int total); + String noFinishedRaces(); } 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 56f93e34771..716d12e3d30 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 @@ -1316,3 +1316,4 @@ points=Points numberOfRacesShort=# Races miniLeeaderboardLegendText=Shows the points along with the number of races per competitor currentOfTotal={0,number}/{1,number} +noFinishedRaces=There are no finished races yet 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 c946ceb82a3..c7be5207829 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 @@ -1305,4 +1305,5 @@ allBoatClasses=Alle Bootsklassen points=Punkte numberOfRacesShort=# Rennen miniLeeaderboardLegendText=Es werden die Punkte und die Anzahl Rennen je Team angezeigt -currentOfTotal={0,number}/{1,number} \ No newline at end of file +currentOfTotal={0,number}/{1,number} +noFinishedRaces=Es wurden noch keine Wettfahrten beendet. \ 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_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index 28b38c72000..19af72126d9 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1252,4 +1252,5 @@ allBoatClasses=All Boat Classes points=Points numberOfRacesShort=# Races miniLeeaderboardLegendText=Shows points along with the number of races per competitor -currentOfTotal={0,number}/{1,number} \ No newline at end of file +currentOfTotal={0,number}/{1,number} +noFinishedRaces=There are no finished races yet \ 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_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index cbc7a2212b8..54ef821188e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1301,4 +1301,5 @@ allBoatClasses=All Boat Classes points=Points numberOfRacesShort=# Races miniLeeaderboardLegendText=Shows points along with the number of races per competitor -currentOfTotal={0,number}/{1,number} \ No newline at end of file +currentOfTotal={0,number}/{1,number} +noFinishedRaces=There are no finished races yet \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/CollectionResult.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/CollectionResult.java new file mode 100644 index 00000000000..fa132a5a098 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/CollectionResult.java @@ -0,0 +1,7 @@ +package com.sap.sailing.gwt.ui.shared.dispatch; + +import java.util.Collection; + +public interface CollectionResult extends DTO, Result { + Collection getValues(); +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/ListResult.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/ListResult.java index 467f6d2235e..6df09bc8878 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/ListResult.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/ListResult.java @@ -3,7 +3,7 @@ package com.sap.sailing.gwt.ui.shared.dispatch; import java.util.ArrayList; import java.util.List; -public class ListResult implements DTO, Result { +public class ListResult implements CollectionResult { private ArrayList values = new ArrayList<>(); @SuppressWarnings("unused") diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/SortedSetResult.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/SortedSetResult.java index 5a8fb7fb77a..7fb41164a53 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/SortedSetResult.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/SortedSetResult.java @@ -4,7 +4,7 @@ import java.util.Collection; import java.util.Set; import java.util.TreeSet; -public class SortedSetResult implements DTO, Result { +public class SortedSetResult implements CollectionResult { private TreeSet values = new TreeSet<>(); public SortedSetResult() { From ad921137a2937c5333e4129ca89668b71ad761c2 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 12:57:36 +0200 Subject: [PATCH 134/219] Race list - Start time is show with date, if the date varies --- .../partials/raceListLive/RacesListLive.java | 1 + .../partials/racelist/AbstractRaceList.java | 3 +- .../racelist/RaceListColumnFactory.java | 59 +++++++++++++------ .../regatta/tabs/RegattaRacesTabView.java | 1 + 4 files changed, 44 insertions(+), 20 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java index 7bc675e9541..43c16bf8745 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/raceListLive/RacesListLive.java @@ -49,6 +49,7 @@ public class RacesListLive extends Composite { boolean hasFleets = RaceListDataUtil.hasFleets(data); this.fleetCornerColumn.setShowDetails(hasFleets); this.fleetNameColumn.setShowDetails(hasFleets); + this.startTimeColumn.setShowTimeOnly(!RaceListDataUtil.hasDifferentStartDates(data)); this.courseAreaColumn.setShowDetails(RaceListDataUtil.hasCourseAreas(data)); this.courseColumn.setShowDetails(RaceListDataUtil.hasCourses(data)); boolean hasWind = RaceListDataUtil.hasWind(data); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java index a0effd0a2f7..cf941d70edd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java @@ -10,6 +10,7 @@ import com.google.gwt.user.client.ui.SimplePanel; import com.sap.sailing.gwt.home.client.place.event.EventView; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources.LocalCss; +import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListColumnFactory.SortableRaceListStartTimeColumn; import com.sap.sailing.gwt.ui.leaderboard.SortedCellTable; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; import com.sap.sailing.gwt.ui.shared.race.wind.AbstractWindDTO; @@ -25,7 +26,7 @@ public abstract class AbstractRaceList fleetCornerColumn = RaceListColumnFactory.getFleetCornerColumn(); protected final SortableRaceListColumn raceNameColumn = RaceListColumnFactory.getRaceNameColumn(); protected final SortableRaceListColumn fleetNameColumn = RaceListColumnFactory.getFleetNameColumn(); - protected final SortableRaceListColumn startTimeColumn = RaceListColumnFactory.getStartTimeColumn(); + protected final SortableRaceListStartTimeColumn startTimeColumn = RaceListColumnFactory.getStartTimeColumn(); protected final SortableRaceListColumn windDirectionColumn = RaceListColumnFactory.getWindDirectionColumn(); protected final SortableRaceListColumn raceViewerButtonColumn; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index fd238675317..e040bda4b4f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -4,7 +4,6 @@ import java.util.Date; import com.google.gwt.cell.client.AbstractCell; import com.google.gwt.cell.client.Cell; -import com.google.gwt.cell.client.DateCell; import com.google.gwt.cell.client.TextCell; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.TextTransform; @@ -185,30 +184,14 @@ public class RaceListColumnFactory { }; } - public static > SortableRaceListColumn getStartTimeColumn() { - Cell cell = new DateCell(DateTimeFormat.getFormat(PredefinedFormat.HOUR24_MINUTE)); + public static > SortableRaceListStartTimeColumn getStartTimeColumn() { InvertibleComparator comparator = new InvertibleComparatorWrapper(new NullSafeComparableComparator()) { @Override protected Date getComparisonValue(T object) { return object.getStart(); } }; - return new SortableRaceListColumn(I18N.start(), cell, comparator) { - @Override - public String getHeaderStyle() { - return CSS.raceslist_head_item(); - } - - @Override - public String getColumnStyle() { - return CSS.race_item(); - } - - @Override - public Date getValue(T object) { - return object.getStart(); - } - }; + return new SortableRaceListStartTimeColumn(comparator); } public static SortableRaceListColumn getDurationColumn() { @@ -557,6 +540,44 @@ public class RaceListColumnFactory { }; } + public static class SortableRaceListStartTimeColumn> extends SortableRaceListColumn { + protected SortableRaceListStartTimeColumn(InvertibleComparator comparator) { + super(I18N.start(), new StartTimeCell(), comparator); + } + + public void setShowTimeOnly(boolean showTimeOnly) { + ((StartTimeCell) getCell()).showTimeOnly = showTimeOnly; + } + + @Override + public String getHeaderStyle() { + return CSS.raceslist_head_item(); + } + + @Override + public String getColumnStyle() { + return CSS.race_item(); + } + + @Override + public Date getValue(T object) { + return object.getStart(); + } + + private static class StartTimeCell extends AbstractCell { + private static final DateTimeFormat DATE_FORMAT = DateTimeFormat.getFormat(PredefinedFormat.MONTH_NUM_DAY); + private static final DateTimeFormat TIME_FORMAT = DateTimeFormat.getFormat(PredefinedFormat.HOUR24_MINUTE); + private boolean showTimeOnly = true; + @Override + public void render(Context context, Date value, SafeHtmlBuilder sb) { + if (value != null) { + sb.appendEscaped(showTimeOnly ? "" : (DATE_FORMAT.format(value) + " ") + TIME_FORMAT.format(value)); + } + } + } + } + + private static abstract class WindSpeedOrRangeColumn> extends SortableRaceListColumn { protected WindSpeedOrRangeColumn(InvertibleComparator comparator) { super(I18N.wind(), new TextCell(), comparator); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 13a8ee7aec8..fdc81d42fd0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -220,6 +220,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView Date: Tue, 14 Jul 2015 13:03:22 +0200 Subject: [PATCH 135/219] Code format --- .../shared/dispatch/event/GetLiveRacesForEventAction.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesForEventAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesForEventAction.java index 2fbbac46e9a..c198ec41807 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesForEventAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesForEventAction.java @@ -24,15 +24,13 @@ public class GetLiveRacesForEventAction implements Action> execute(final DispatchContext context) { - ResultWithTTL> result = EventActionUtil.withLiveRaceOrDefaultSchedule(context, eventId, new CalculationWithEvent>() { + return EventActionUtil.withLiveRaceOrDefaultSchedule(context, eventId, new CalculationWithEvent>() { @Override public ResultWithTTL> calculateWithEvent(Event event) { LiveRaceCalculator liveRaceCalculator = new LiveRaceCalculator(); EventActionUtil.forRacesOfEvent(context, eventId, liveRaceCalculator); - ResultWithTTL> result = liveRaceCalculator.getResult(); - return result; + return liveRaceCalculator.getResult(); } }); - return result; } } From ccdad7b0e6e633adbcfa7516dfe0c20e6ec9360d Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 13:07:18 +0200 Subject: [PATCH 136/219] Race list - Start time is show with date, if the date varies --- .../place/event/partials/racelist/RaceListColumnFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index e040bda4b4f..a892aa2e38c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -571,7 +571,7 @@ public class RaceListColumnFactory { @Override public void render(Context context, Date value, SafeHtmlBuilder sb) { if (value != null) { - sb.appendEscaped(showTimeOnly ? "" : (DATE_FORMAT.format(value) + " ") + TIME_FORMAT.format(value)); + sb.appendEscaped((showTimeOnly ? "" : DATE_FORMAT.format(value) + " ") + TIME_FORMAT.format(value)); } } } From f1bdd1c792c30e6f90d7941395dd8cf147cca084 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 14 Jul 2015 13:26:32 +0200 Subject: [PATCH 137/219] added EmbeddedMapAndWindChart to build.properties --- java/com.sap.sailing.gwt.ui/build.properties | 4 +++- .../sailing/gwt/ui/shared/RaceCourseDTO.java | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/build.properties b/java/com.sap.sailing.gwt.ui/build.properties index 6e226b0d9b9..daa994289b7 100755 --- a/java/com.sap.sailing.gwt.ui/build.properties +++ b/java/com.sap.sailing.gwt.ui/build.properties @@ -51,5 +51,7 @@ bin.includes = META-INF/,\ AutoPlay.html,\ Home.css,\ Home.html,\ - SettingsDialog.css + SettingsDialog.css,\ + EmbeddedMapAndWindChart.css,\ + EmbeddedMapAndWindChart.html output.. = WEB-INF/classes/ diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceCourseDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceCourseDTO.java index 9ddb68d97b0..2215b45c264 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceCourseDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceCourseDTO.java @@ -3,6 +3,7 @@ package com.sap.sailing.gwt.ui.shared; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -21,7 +22,21 @@ public class RaceCourseDTO implements IsSerializable { } public RaceCourseDTO(List waypoints) { - this(waypoints, null); + this(waypoints, getMarksFromWaypoints(waypoints)); + } + + private static List getMarksFromWaypoints(List waypoints) { + final LinkedHashSet marks = new LinkedHashSet<>(); + for (final WaypointDTO waypoint : waypoints) { + for (final MarkDTO m : waypoint.controlPoint.getMarks()) { + marks.add(m); + } + } + final List result = new ArrayList<>(); + for (final MarkDTO m : marks) { + result.add(m); + } + return result; } public RaceCourseDTO(List waypoints, List allMarks) { From a5417cb86ca44150ad54b372881a8ee28878ef4d Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 13:35:31 +0200 Subject: [PATCH 138/219] Fixed finished status --- .../ui/shared/dispatch/event/RaceContext.java | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index b5b0c1cf89b..aeeee391a97 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -31,6 +31,10 @@ import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.TimingConstants; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.WindSourceType; +import com.sap.sailing.domain.common.confidence.BearingWithConfidence; +import com.sap.sailing.domain.common.confidence.BearingWithConfidenceCluster; +import com.sap.sailing.domain.common.confidence.Weigher; +import com.sap.sailing.domain.common.confidence.impl.BearingWithConfidenceImpl; import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.media.MediaTrack; import com.sap.sailing.domain.common.racelog.FlagPole; @@ -160,23 +164,32 @@ public class RaceContext { if (newestEvent != null && newestEvent.before(toTimePoint)) { toTimePoint = newestEvent; } + final BearingWithConfidenceCluster bwcc = new BearingWithConfidenceCluster( + new Weigher() { + private static final long serialVersionUID = -5779398785058438328L; + @Override + public double getConfidence(TimePoint fix, TimePoint request) { + return 1; + } + }); WindTrack windTrack = trackedRace.getOrCreateWindTrack(new WindSourceImpl(WindSourceType.COMBINED)); if (windTrack != null) { TimePoint startTime = getStartTime(); if (startTime == null) { startTime = toTimePoint; } - List pointsToGetWind = Arrays.asList(startTime, - startTime.plus(startTime.until(toTimePoint).divide(2)), toTimePoint); + TimePoint middleOfRace = startTime.plus(startTime.until(toTimePoint).divide(2)); + List pointsToGetWind = Arrays.asList(startTime, middleOfRace, toTimePoint); Double lowerBoundWindInKnots = null; Double upperBoundWindInKnots = null; - Double averageDirection = null; for (TimePoint timePoint : pointsToGetWind) { WindWithConfidence> averagedWindWithConfidence = windTrack .getAveragedWindWithConfidence(trackedRace.getCenterOfCourse(timePoint), timePoint); if (averagedWindWithConfidence != null) { Wind wind = averagedWindWithConfidence.getObject(); - averageDirection = wind.getFrom().getDegrees(); + + bwcc.add(new BearingWithConfidenceImpl(wind.getBearing(), averagedWindWithConfidence + .getConfidence(), timePoint)); double currentWindInKnots = wind.getKnots(); if (currentWindInKnots >= 0.05d) { if (lowerBoundWindInKnots == null) { @@ -190,7 +203,9 @@ public class RaceContext { } } if (lowerBoundWindInKnots != null && upperBoundWindInKnots != null) { - return new WindStatisticsDTO(averageDirection, lowerBoundWindInKnots, upperBoundWindInKnots); + BearingWithConfidence average = bwcc.getAverage(middleOfRace); + return new WindStatisticsDTO(average.getObject().getDegrees(), lowerBoundWindInKnots, + upperBoundWindInKnots); } } } @@ -569,6 +584,6 @@ public class RaceContext { } public boolean isFinished() { - return state.getStatus() == RaceLogRaceStatus.FINISHED; + return getLiveRaceViewState() == RaceViewState.FINISHED; } } From 23c56905ce9b775f2b602556e6943ff665bc708f Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 14:00:02 +0200 Subject: [PATCH 139/219] Implemented calculation of live races for regatta status --- .../MultiRegattaListStepsBody.java | 7 +++--- .../ui/shared/dispatch/event/RaceContext.java | 4 +++ .../event/RegattaProgressCalculator.java | 19 ++++++++++++-- .../regatta/RegattaProgressFleetDTO.java | 25 +++++++++++++++++++ .../regatta/RegattaProgressSeriesDTO.java | 16 ++++++------ 5 files changed, 58 insertions(+), 13 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressFleetDTO.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java index fc79b6bd93f..0eb54812b8d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java @@ -12,6 +12,7 @@ import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.UIObject; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressFleetDTO; import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressSeriesDTO; import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; @@ -41,10 +42,10 @@ public class MultiRegattaListStepsBody extends UIObject { addFleetProgresses(seriesProgress.getFleetState(), seriesProgress.getTotalRaceCount()); } - private void addFleetProgresses(Map fleetStates, int totalRaceCount) { + private void addFleetProgresses(Map fleetStates, int totalRaceCount) { double height = fleetStates.isEmpty() ? 100.0 : 100.0 / fleetStates.size(); - for (Entry fleetState : fleetStates.entrySet()) { - double fleetWidth = (fleetState.getValue() * 100.0) / totalRaceCount; + for (Entry fleetState : fleetStates.entrySet()) { + double fleetWidth = (fleetState.getValue().getFinishedRaceCount() * 100.0) / totalRaceCount; String fleetColor = fleetState.getKey().getFleetColor(); MultiRegattaListStepsBodyFleet fleet = new MultiRegattaListStepsBodyFleet(fleetWidth, height, fleetColor); fleetsContainerUi.appendChild(fleet.getElement()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index aeeee391a97..a55a4e3bbf8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -586,4 +586,8 @@ public class RaceContext { public boolean isFinished() { return getLiveRaceViewState() == RaceViewState.FINISHED; } + + public boolean isLive() { + return getLiveRaceViewState() == RaceViewState.RUNNING; + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RegattaProgressCalculator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RegattaProgressCalculator.java index 94a7c297c62..6515b2bac73 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RegattaProgressCalculator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RegattaProgressCalculator.java @@ -7,12 +7,14 @@ import java.util.Map; import java.util.Set; import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressFleetDTO; import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressSeriesDTO; import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; public class RegattaProgressCalculator implements EventActionUtil.RaceCallback { private final Map> racesPerSeries = new LinkedHashMap<>(); private final Map>> racesPerSeriesAndFleet = new HashMap<>(); + private final Map>> liveRacesPerSeriesAndFleet = new HashMap<>(); private final Map fleets = new HashMap<>(); @Override @@ -38,14 +40,26 @@ public class RegattaProgressCalculator implements EventActionUtil.RaceCallback { racesInFleet = new HashSet<>(); racesInSeriesAndFleet.put(fleetName, racesInFleet); } + Map> liveRacesInSeriesAndFleet = liveRacesPerSeriesAndFleet.get(seriesName); + if(liveRacesInSeriesAndFleet == null) { + liveRacesInSeriesAndFleet = new LinkedHashMap>(); + liveRacesPerSeriesAndFleet.put(seriesName, liveRacesInSeriesAndFleet); + } + Set liveRacesInFleet = liveRacesInSeriesAndFleet.get(fleetName); + if(liveRacesInFleet == null) { + liveRacesInFleet = new HashSet<>(); + liveRacesInSeriesAndFleet.put(fleetName, liveRacesInFleet); + } if(context.isFinished()) { racesInFleet.add(raceName); } + if(context.isLive()) { + liveRacesInFleet.add(raceName); + } if(!fleets.containsKey(fleetName)) { fleets.put(fleetName, context.getFleetMetadata()); } - } public RegattaProgressDTO getResult() { @@ -57,7 +71,8 @@ public class RegattaProgressCalculator implements EventActionUtil.RaceCallback { for(Map.Entry> racesInFleet : racesPerSeriesAndFleet.get(seriesName).entrySet()) { String fleetName = racesInFleet.getKey(); int finishedRacesForFleet = racesInFleet.getValue().size(); - regattaProgressOfSeries.addFleet(fleets.get(fleetName), finishedRacesForFleet); + int liveRacesForFleet = liveRacesPerSeriesAndFleet.get(seriesName).get(fleetName).size(); + regattaProgressOfSeries.addFleet(fleets.get(fleetName), new RegattaProgressFleetDTO(finishedRacesForFleet, liveRacesForFleet)); } progress.addSeries(regattaProgressOfSeries); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressFleetDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressFleetDTO.java new file mode 100644 index 00000000000..40c5262c700 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressFleetDTO.java @@ -0,0 +1,25 @@ +package com.sap.sailing.gwt.ui.shared.dispatch.regatta; + +import com.sap.sailing.gwt.ui.shared.dispatch.DTO; + +public class RegattaProgressFleetDTO implements DTO { + private int finishedRaceCount; + private int liveRaceCount; + + @SuppressWarnings("unused") + private RegattaProgressFleetDTO() { + } + + public RegattaProgressFleetDTO(int finishedRaceCount, int liveRaceCount) { + this.finishedRaceCount = finishedRaceCount; + this.liveRaceCount = liveRaceCount; + } + + public int getFinishedRaceCount() { + return finishedRaceCount; + } + + public int getLiveRaceCount() { + return liveRaceCount; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressSeriesDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressSeriesDTO.java index 3c330529cf5..aa4fa6f57a2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressSeriesDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressSeriesDTO.java @@ -9,7 +9,7 @@ import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; public class RegattaProgressSeriesDTO implements DTO { private String name; private int totalRaceCount; - private TreeMap fleetState = new TreeMap<>(); + private TreeMap fleetState = new TreeMap<>(); @SuppressWarnings("unused") private RegattaProgressSeriesDTO() { @@ -28,17 +28,17 @@ public class RegattaProgressSeriesDTO implements DTO { return totalRaceCount; } - public Map getFleetState() { + public Map getFleetState() { return fleetState; } - public void addFleet(FleetMetadataDTO fleet, int raceCount) { - fleetState.put(fleet, raceCount); + public void addFleet(FleetMetadataDTO fleet, RegattaProgressFleetDTO stats) { + fleetState.put(fleet, stats); } public boolean isCompleted() { - for (Integer numberOfRace : fleetState.values()) { - if (numberOfRace < totalRaceCount) { + for (RegattaProgressFleetDTO stats : fleetState.values()) { + if (stats.getFinishedRaceCount() < totalRaceCount) { return false; } } @@ -47,8 +47,8 @@ public class RegattaProgressSeriesDTO implements DTO { public int getProgressRaceCount() { int progressRaceCount = 0; - for (Integer numberOfRace : fleetState.values()) { - progressRaceCount = Math.max(progressRaceCount, numberOfRace); + for (RegattaProgressFleetDTO stats : fleetState.values()) { + progressRaceCount = Math.max(progressRaceCount, stats.getFinishedRaceCount()); } return progressRaceCount; } From 2df661e3a47acb91fff96534011e0cbd0626d78a Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 14:32:38 +0200 Subject: [PATCH 140/219] Only showing leaderboard group if there is more than one associated with the event --- .../partials/regattaHeader/RegattaHeaderBody.java | 10 ++++++---- .../sap/sailing/gwt/server/HomeServiceUtil.java | 14 ++++++++++---- .../shared/dispatch/event/GetEventViewAction.java | 2 +- .../GetRegattasAndLiveRacesForEventAction.java | 2 +- .../shared/dispatch/event/LeaderboardContext.java | 2 +- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java index c63d9ff9149..6f9d3a89504 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java @@ -46,10 +46,12 @@ public class RegattaHeaderBody extends UIObject { } private void addDetailsItem(String text) { - DivElement detailsItem = DOM.createDiv().cast(); - detailsItem.addClassName(RegattaHeaderResources.INSTANCE.css().regattaheader_content_details_item()); - detailsItem.setInnerText(text); - detailsItemContainerUi.appendChild(detailsItem); + if(text != null) { + DivElement detailsItem = DOM.createDiv().cast(); + detailsItem.addClassName(RegattaHeaderResources.INSTANCE.css().regattaheader_content_details_item()); + detailsItem.setInnerText(text); + detailsItemContainerUi.appendChild(detailsItem); + } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java index 04dbbad2c58..916cea8ee4d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java @@ -429,18 +429,20 @@ public final class HomeServiceUtil { return result; } - public static RegattaMetadataDTO toRegattaMetadataDTO(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard) { + public static RegattaMetadataDTO toRegattaMetadataDTO(EventBase event, LeaderboardGroup leaderboardGroup, Leaderboard leaderboard) { RegattaMetadataDTO regattaDTO = new RegattaMetadataDTO(); - fillRegattaFields(leaderboardGroup, leaderboard, regattaDTO); + fillRegattaFields(event, leaderboardGroup, leaderboard, regattaDTO); return regattaDTO; } - public static void fillRegattaFields(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard, + public static void fillRegattaFields(EventBase event, LeaderboardGroup leaderboardGroup, Leaderboard leaderboard, RegattaMetadataDTO regattaDTO) { regattaDTO.setId(leaderboard.getName()); regattaDTO.setDisplayName(leaderboard.getDisplayName() != null ? leaderboard.getDisplayName() : leaderboard.getName()); - regattaDTO.setBoatCategory(leaderboardGroup.getDisplayName() != null ? leaderboardGroup.getDisplayName() : leaderboardGroup.getName()); + if(hasMultipleLeaderboardGroups(event)) { + regattaDTO.setBoatCategory(leaderboardGroup.getDisplayName() != null ? leaderboardGroup.getDisplayName() : leaderboardGroup.getName()); + } regattaDTO.setCompetitorsCount(calculateCompetitorsCount(leaderboard)); regattaDTO.setRaceCount(calculateRaceCount(leaderboard)); regattaDTO.setTrackedRacesCount(calculateTrackedRaceCount(leaderboard)); @@ -453,6 +455,10 @@ public final class HomeServiceUtil { regattaDTO.setState(calculateRegattaState(regattaDTO)); } + private static boolean hasMultipleLeaderboardGroups(EventBase event) { + return Util.size(event.getLeaderboardGroups()) > 1; + } + public static boolean hasLiveRace(LeaderboardDTO leaderboard) { List> liveRaces = leaderboard.getLiveRaces(getLiveTimePointInMillis()); return !liveRaces.isEmpty(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetEventViewAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetEventViewAction.java index 935e4c3f7c1..dc1af421909 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetEventViewAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetEventViewAction.java @@ -64,7 +64,7 @@ public class GetEventViewAction implements Action { if(isFakeSeries && !HomeServiceUtil.isPartOfEvent(event, leaderboard)) { continue; } - RegattaMetadataDTO regattaDTO = HomeServiceUtil.toRegattaMetadataDTO(leaderboardGroup, leaderboard); + RegattaMetadataDTO regattaDTO = HomeServiceUtil.toRegattaMetadataDTO(event, leaderboardGroup, leaderboard); dto.getRegattas().add(regattaDTO); } catch (Exception e) { logger.log(Level.SEVERE, "Catched exception while reading data for leaderboard " + leaderboard.getName(), e); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattasAndLiveRacesForEventAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattasAndLiveRacesForEventAction.java index d0b284d107c..55f7c25a193 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattasAndLiveRacesForEventAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattasAndLiveRacesForEventAction.java @@ -69,7 +69,7 @@ public class GetRegattasAndLiveRacesForEventAction implements Action result = new HashMap<>(); for (LeaderboardGroup lg : event.getLeaderboardGroups()) { for (Leaderboard lb : lg.getLeaderboards()) { - result.put(lb.getName(), HomeServiceUtil.toRegattaMetadataDTO(lg, lb)); + result.put(lb.getName(), HomeServiceUtil.toRegattaMetadataDTO(event, lg, lb)); } } return result; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LeaderboardContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LeaderboardContext.java index 85d904fbd94..b50a9943712 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LeaderboardContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/LeaderboardContext.java @@ -48,7 +48,7 @@ public class LeaderboardContext { RegattaProgressCalculator regattaProgressCalculator = new RegattaProgressCalculator(); forRaces(context, regattaProgressCalculator); RegattaWithProgressDTO regattaDTO = new RegattaWithProgressDTO(regattaProgressCalculator.getResult()); - HomeServiceUtil.fillRegattaFields(leaderboardGroup, leaderboard, regattaDTO); + HomeServiceUtil.fillRegattaFields(event, leaderboardGroup, leaderboard, regattaDTO); return regattaDTO; } From 3aa03a7df8eaa03facd8065dc85e9709af74f277 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 14:32:38 +0200 Subject: [PATCH 141/219] Only showing leaderboard group if there is more than one associated with the event --- .../sap/sailing/gwt/server/HomeServiceUtil.java | 14 ++++++++++---- .../shared/dispatch/event/GetEventViewAction.java | 2 +- .../GetRegattasAndLiveRacesForEventAction.java | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java index 04dbbad2c58..916cea8ee4d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java @@ -429,18 +429,20 @@ public final class HomeServiceUtil { return result; } - public static RegattaMetadataDTO toRegattaMetadataDTO(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard) { + public static RegattaMetadataDTO toRegattaMetadataDTO(EventBase event, LeaderboardGroup leaderboardGroup, Leaderboard leaderboard) { RegattaMetadataDTO regattaDTO = new RegattaMetadataDTO(); - fillRegattaFields(leaderboardGroup, leaderboard, regattaDTO); + fillRegattaFields(event, leaderboardGroup, leaderboard, regattaDTO); return regattaDTO; } - public static void fillRegattaFields(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard, + public static void fillRegattaFields(EventBase event, LeaderboardGroup leaderboardGroup, Leaderboard leaderboard, RegattaMetadataDTO regattaDTO) { regattaDTO.setId(leaderboard.getName()); regattaDTO.setDisplayName(leaderboard.getDisplayName() != null ? leaderboard.getDisplayName() : leaderboard.getName()); - regattaDTO.setBoatCategory(leaderboardGroup.getDisplayName() != null ? leaderboardGroup.getDisplayName() : leaderboardGroup.getName()); + if(hasMultipleLeaderboardGroups(event)) { + regattaDTO.setBoatCategory(leaderboardGroup.getDisplayName() != null ? leaderboardGroup.getDisplayName() : leaderboardGroup.getName()); + } regattaDTO.setCompetitorsCount(calculateCompetitorsCount(leaderboard)); regattaDTO.setRaceCount(calculateRaceCount(leaderboard)); regattaDTO.setTrackedRacesCount(calculateTrackedRaceCount(leaderboard)); @@ -453,6 +455,10 @@ public final class HomeServiceUtil { regattaDTO.setState(calculateRegattaState(regattaDTO)); } + private static boolean hasMultipleLeaderboardGroups(EventBase event) { + return Util.size(event.getLeaderboardGroups()) > 1; + } + public static boolean hasLiveRace(LeaderboardDTO leaderboard) { List> liveRaces = leaderboard.getLiveRaces(getLiveTimePointInMillis()); return !liveRaces.isEmpty(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetEventViewAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetEventViewAction.java index 935e4c3f7c1..dc1af421909 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetEventViewAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetEventViewAction.java @@ -64,7 +64,7 @@ public class GetEventViewAction implements Action { if(isFakeSeries && !HomeServiceUtil.isPartOfEvent(event, leaderboard)) { continue; } - RegattaMetadataDTO regattaDTO = HomeServiceUtil.toRegattaMetadataDTO(leaderboardGroup, leaderboard); + RegattaMetadataDTO regattaDTO = HomeServiceUtil.toRegattaMetadataDTO(event, leaderboardGroup, leaderboard); dto.getRegattas().add(regattaDTO); } catch (Exception e) { logger.log(Level.SEVERE, "Catched exception while reading data for leaderboard " + leaderboard.getName(), e); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattasAndLiveRacesForEventAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattasAndLiveRacesForEventAction.java index d0b284d107c..55f7c25a193 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattasAndLiveRacesForEventAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetRegattasAndLiveRacesForEventAction.java @@ -69,7 +69,7 @@ public class GetRegattasAndLiveRacesForEventAction implements Action result = new HashMap<>(); for (LeaderboardGroup lg : event.getLeaderboardGroups()) { for (Leaderboard lb : lg.getLeaderboards()) { - result.put(lb.getName(), HomeServiceUtil.toRegattaMetadataDTO(lg, lb)); + result.put(lb.getName(), HomeServiceUtil.toRegattaMetadataDTO(event, lg, lb)); } } return result; From 6d081df70199f7bbfa22ef05df4e1e6f977a1395 Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 14:51:58 +0200 Subject: [PATCH 142/219] Use initials when there is no space for the whole name --- .../MultiRegattaListSteps.java | 29 +++++++++++++ .../MultiRegattaListStepsBody.java | 41 +++++++++++++++++-- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java index 47dbb96b81f..98f9d0e6fdc 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListSteps.java @@ -1,5 +1,8 @@ package com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList; +import java.util.ArrayList; +import java.util.List; + import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; @@ -7,8 +10,12 @@ import com.google.gwt.dom.client.AnchorElement; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Style.Display; import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.common.client.SharedResources; @@ -29,6 +36,9 @@ public class MultiRegattaListSteps extends Composite { @UiField DivElement leaderboardButtonContainerUi; @UiField AnchorElement leaderboardButtonUi; + private HandlerRegistration windowResizeHandlerRegistration; + private final List allMultiregattaSteps = new ArrayList(); + public MultiRegattaListSteps(RegattaProgressDTO regattaProgress) { MultiRegattaListResources.INSTANCE.css().ensureInjected(); initWidget(uiBinder.createAndBindUi(this)); @@ -41,9 +51,28 @@ public class MultiRegattaListSteps extends Composite { double parts = Math.pow(seriesProgress.getTotalRaceCount(), 0.4); double percentage = 100.0 * parts / sumParts; MultiRegattaListStepsBody stepsBody = new MultiRegattaListStepsBody(seriesProgress); + allMultiregattaSteps.add(stepsBody); stepsBody.getElement().getStyle().setWidth(percentage, Unit.PCT); stepsContainerUi.appendChild(stepsBody.getElement()); } + + } + + @Override + protected void onLoad() { + windowResizeHandlerRegistration = Window.addResizeHandler(new ResizeHandler() { + @Override + public void onResize(ResizeEvent event) { + for (MultiRegattaListStepsBody widget : allMultiregattaSteps) { + widget.onResize(); + } + } + }); + } + + @Override + protected void onUnload() { + windowResizeHandlerRegistration.removeHandler(); } void setLeaderboardNavigation(RegattaState regattaState, PlaceNavigation placeNavigation) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java index 0eb54812b8d..d3fb8c997b7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java @@ -6,17 +6,22 @@ import java.util.Map; import java.util.Map.Entry; import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.Style.Display; +import com.google.gwt.dom.client.Style.Visibility; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.RequiresResize; import com.google.gwt.user.client.ui.UIObject; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressFleetDTO; import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaProgressSeriesDTO; import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; -public class MultiRegattaListStepsBody extends UIObject { +public class MultiRegattaListStepsBody extends UIObject implements RequiresResize { private static final StringMessages I18N = StringMessages.INSTANCE; private static MultiRegattaListStepsBodyUiBinder uiBinder = GWT.create(MultiRegattaListStepsBodyUiBinder.class); @@ -29,18 +34,29 @@ public class MultiRegattaListStepsBody extends UIObject { @UiField DivElement progressUi; @UiField DivElement fleetsContainerUi; + private final String seriesName; + public MultiRegattaListStepsBody(RegattaProgressSeriesDTO seriesProgress) { setElement(uiBinder.createAndBindUi(this)); - nameUi.setInnerText(DEFAULT_SERIES_NAME.equals(seriesProgress.getName()) ? I18N.races() : seriesProgress.getName()); + nameUi.getStyle().setVisibility(Visibility.HIDDEN); + seriesName = DEFAULT_SERIES_NAME.equals(seriesProgress.getName()) ? I18N.races() : seriesProgress.getName(); + nameUi.setInnerText(seriesName); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override + public void execute() { + renderNames(); + } + }); if (seriesProgress.isCompleted()) { progressUi.setInnerText(String.valueOf(seriesProgress.getTotalRaceCount())); } else { - checkUi.removeFromParent(); + checkUi.getStyle().setDisplay(Display.NONE); progressUi.setInnerText(I18N.currentOfTotal( seriesProgress.getProgressRaceCount(), seriesProgress.getTotalRaceCount())); } addFleetProgresses(seriesProgress.getFleetState(), seriesProgress.getTotalRaceCount()); } + private void addFleetProgresses(Map fleetStates, int totalRaceCount) { double height = fleetStates.isEmpty() ? 100.0 : 100.0 / fleetStates.size(); @@ -52,4 +68,23 @@ public class MultiRegattaListStepsBody extends UIObject { } } + private void renderNames() { + + if (getElement().getOffsetWidth() < nameUi.getOffsetWidth() + checkUi.getOffsetWidth() + + progressUi.getOffsetWidth()) { + String[] tokens = seriesName.split(" "); + StringBuilder initials = new StringBuilder(); + for (int i = 0; i < tokens.length; i++) { + initials.append(tokens[i].charAt(0)); + } + nameUi.setInnerText(initials.toString()); + } + nameUi.setTitle(seriesName + " " + nameUi.getOffsetWidth() + " / " + getElement().getOffsetWidth()); + nameUi.getStyle().setVisibility(Visibility.VISIBLE); + } + + @Override + public void onResize() { + renderNames(); + } } From 12ca2147f3ed3f2d5c985adcca59f32755964b28 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 14:54:34 +0200 Subject: [PATCH 143/219] Showing default course area for regattas in the event header if there is more than one course area for the event --- .../event/partials/header/EventHeader.java | 8 +++++++- .../event/partials/header/EventHeader.ui.xml | 5 ++--- .../sailing/gwt/server/HomeServiceUtil.java | 19 +++++++++++++++++++ .../shared/eventview/HasRegattaMetadata.java | 2 ++ .../shared/eventview/RegattaMetadataDTO.java | 9 +++++++++ 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.java index 7969d96691c..f0a66eb425b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.java @@ -56,6 +56,7 @@ public class EventHeader extends Composite { @UiField DivElement races; @UiField DivElement trackedRaces; @UiField DivElement eventCategory; + @UiField DivElement courseAreaUi; @UiField FlowPanel dropdownContent; @@ -123,6 +124,11 @@ public class EventHeader extends Composite { } else { hide(trackedRaces); } + if(regattaMetadata.getDefaultCourseAreaName() != null) { + courseAreaUi.setInnerText(regattaMetadata.getDefaultCourseAreaName()); + } else { + hide(courseAreaUi); + } if(regattaMetadata.getBoatCategory() != null) { eventCategory.setInnerText(regattaMetadata.getBoatCategory()); } else { @@ -149,7 +155,7 @@ public class EventHeader extends Composite { hide(eventLink); } - hide(competitors, races, trackedRaces); + hide(competitors, races, trackedRaces, courseAreaUi, eventCategory); } initTitleAndSelection(nameToShow); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.ui.xml index 4c94e3af3bd..dd42d71a412 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.ui.xml @@ -53,9 +53,8 @@
-
- -
+
+
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java index 916cea8ee4d..3124314e649 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java @@ -22,6 +22,7 @@ import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.domain.common.dto.LeaderboardDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO; +import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; @@ -453,6 +454,7 @@ public final class HomeServiceUtil { regattaDTO.setEndDate(regatta.getEndDate() != null ? regatta.getEndDate().asDate() : null); } regattaDTO.setState(calculateRegattaState(regattaDTO)); + regattaDTO.setDefaultCourseAreaName(getCourseAreaNameForRegattaIdThereIsMoreThanOne(event, leaderboard)); } private static boolean hasMultipleLeaderboardGroups(EventBase event) { @@ -469,4 +471,21 @@ public final class HomeServiceUtil { long livePlayDelayInMillis = 15_000; return System.currentTimeMillis() - livePlayDelayInMillis; } + + public static String getCourseAreaNameForRegattaIdThereIsMoreThanOne(EventBase event, Leaderboard leaderboard) { + /** The course area will not be shown if there is only one course area defined for the event */ + if (Util.size(event.getVenue().getCourseAreas()) <= 1) { + return null; + } + CourseArea courseArea = null; + if (leaderboard instanceof FlexibleLeaderboard) { + courseArea = ((FlexibleLeaderboard) leaderboard).getDefaultCourseArea(); + } else if(leaderboard instanceof RegattaLeaderboard) { + Regatta regatta = ((RegattaLeaderboard) leaderboard).getRegatta(); + if (regatta != null) { + courseArea = regatta.getDefaultCourseArea(); + } + } + return courseArea == null ? null : courseArea.getName(); + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/eventview/HasRegattaMetadata.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/eventview/HasRegattaMetadata.java index 7c849454698..ca95f5abe4d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/eventview/HasRegattaMetadata.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/eventview/HasRegattaMetadata.java @@ -37,4 +37,6 @@ public interface HasRegattaMetadata { Date getEndDate(); RegattaState getState(); + + String getDefaultCourseAreaName(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/eventview/RegattaMetadataDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/eventview/RegattaMetadataDTO.java index 3b228202187..cd66c98c588 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/eventview/RegattaMetadataDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/eventview/RegattaMetadataDTO.java @@ -9,6 +9,7 @@ public class RegattaMetadataDTO extends RegattaReferenceDTO implements HasRegatt private int trackedRacesCount; private String boatClass; private String boatCategory; + private String defaultCourseAreaName; private Date startDate; private Date endDate; private RegattaState state; @@ -91,4 +92,12 @@ public class RegattaMetadataDTO extends RegattaReferenceDTO implements HasRegatt public void setState(RegattaState state) { this.state = state; } + + public String getDefaultCourseAreaName() { + return defaultCourseAreaName; + } + + public void setDefaultCourseAreaName(String defaultCourseAreaName) { + this.defaultCourseAreaName = defaultCourseAreaName; + } } From 23f77a96b63c0e64b50b4270d5aede933181f38a Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 14:58:46 +0200 Subject: [PATCH 144/219] Removed duplicate code --- .../ui/shared/dispatch/event/RaceContext.java | 27 +------------------ 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 1d5ba6f48b9..6b97d4f7ba6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -12,7 +12,6 @@ import com.sap.sailing.domain.abstractlog.race.analyzing.impl.WindFixesFinder; import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; import com.sap.sailing.domain.abstractlog.race.state.impl.ReadonlyRaceStateImpl; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState; -import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.Fleet; @@ -29,7 +28,6 @@ import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.racelog.FlagPole; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; -import com.sap.sailing.domain.leaderboard.FlexibleLeaderboard; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.tracking.TrackedRace; @@ -43,7 +41,6 @@ import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO.RaceViewState; import com.sap.sailing.gwt.ui.shared.race.RaceProgressDTO; import com.sap.sailing.gwt.ui.shared.race.SimpleWindDTO; import com.sap.sse.common.TimePoint; -import com.sap.sse.common.Util; import com.sap.sse.common.impl.MillisecondsTimePoint; @GwtIncompatible @@ -196,30 +193,8 @@ public class RaceContext { return null; } - private Regatta getRegatta() { - final Regatta regatta; - if (leaderboard instanceof RegattaLeaderboard) { - regatta = ((RegattaLeaderboard) leaderboard).getRegatta(); - } else { - regatta = null; - } - return regatta; - } - private String getCourseAreaOrNull() { - /** The course area will not be shown if there is only one course area defined for the event */ - if(Util.size(event.getVenue().getCourseAreas()) <= 1) { - return null; - } - CourseArea courseArea = null; - if(leaderboard instanceof FlexibleLeaderboard) { - courseArea = ((FlexibleLeaderboard)leaderboard).getDefaultCourseArea(); - } - Regatta regatta = getRegatta(); - if(regatta != null) { - courseArea = regatta.getDefaultCourseArea(); - } - return courseArea == null ? null : regatta.getDefaultCourseArea().getName(); + return HomeServiceUtil.getCourseAreaNameForRegattaIdThereIsMoreThanOne(event, leaderboard); } private RaceProgressDTO getProgressOrNull() { From 1f7a37d5f93e5f72be2dbdeda9fa7aea732f02a0 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 15:04:41 +0200 Subject: [PATCH 145/219] Added defaul course area to regatta header body --- .../place/event/partials/regattaHeader/RegattaHeaderBody.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java index 6f9d3a89504..d735566ad20 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java @@ -36,6 +36,7 @@ public class RegattaHeaderBody extends UIObject { addDetailsItem(regattaMetadata.getCompetitorsCount(), StringMessages.INSTANCE.competitors()); addDetailsItem(regattaMetadata.getRaceCount(), StringMessages.INSTANCE.races()); addDetailsItem(regattaMetadata.getTrackedRacesCount(), StringMessages.INSTANCE.trackedRaces()); + addDetailsItem(regattaMetadata.getDefaultCourseAreaName()); addDetailsItem(regattaMetadata.getBoatCategory()); } From db80dc946130cd33da4505c1592825597f7060e7 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 14 Jul 2015 15:07:23 +0200 Subject: [PATCH 146/219] added script to count unique IPs / Days / User-Agents per referrer from Apache logs --- configuration/unique_ips_per_referrer | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100755 configuration/unique_ips_per_referrer diff --git a/configuration/unique_ips_per_referrer b/configuration/unique_ips_per_referrer new file mode 100755 index 00000000000..22e455f4517 --- /dev/null +++ b/configuration/unique_ips_per_referrer @@ -0,0 +1,20 @@ +#!/bin/bash + +# groups Apache / httpd log entries into "${referrer}.ips" files, where ${referrer} is the +# referrer URL identifying the "event"; the lines written to the .ips files hold the IP +# address of the requestor, the date (not the time) and the user agent string. +# Sorting for unique entries should give a count similar to what goaccess is using to +# determine "unique visitors." + +# A sample line: +# 505Worlds2012.sapsailing.com 66.249.73.53 - - [12/Jan/2014:03:33:11 +0000] "GET /robots.txt HTTP/1.1" 404 238 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" + +#cat $* | sed -e 's/^\([^ ]*\) \([^ ]*\) \([^ ]*\) \([^ ]*\) \[\([^:]*\):\([^]]*\)\] \"[^\"]*\" [^ ]* [^ ]* \"[^\"]\" \"\([\"]*\)\"\(.*\)$/\1 \2 \5 \7/' +cat $* | sed -e 's/^\([^ ]*\) \([^ ]*\) \([^ ]*\) \([^ ]*\) \[\([^:]*\):\([^]]*\)\] \"[^\"]*\" [^ ]* [^ ]* \"[^\"]*\" \"\([^\"]*\)\"/\1 \2 \5 \7/' | while read referrer hit; do + echo "$hit" >>${referrer}.ips +done +for i in *.ips; do + echo -n "$i " + cat $i | sort -u | wc | awk '{ print $1; }' +done | tee unique-ips-days-useragents-per-event +echo "Done. Wrote results to `pwd`/unique-ips-days-useragents-per-event From ccdf09a380b6f5d4e625ac640af5674521744871 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 15:08:13 +0200 Subject: [PATCH 147/219] Fixed NPE in regatta filter if boat category is null --- .../event/partials/multiRegattaList/MultiRegattaList.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.java index 35e4cfc9fa1..999216c7de5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.java @@ -41,7 +41,10 @@ public class MultiRegattaList extends Composite implements RefreshableWidget Date: Tue, 14 Jul 2015 15:11:22 +0200 Subject: [PATCH 148/219] Adjusted/Fixed message for mini leaderboard header --- .../com/sap/sailing/gwt/ui/client/StringMessages.properties | 2 +- .../com/sap/sailing/gwt/ui/client/StringMessages_de.properties | 2 +- .../com/sap/sailing/gwt/ui/client/StringMessages_ru.properties | 2 +- .../com/sap/sailing/gwt/ui/client/StringMessages_zh.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 31757f394dc..14a1b8f765c 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 @@ -1302,7 +1302,7 @@ noResults=There are no results available yet. noNews=There are no news available. pointsValue={0,number,#0.00} openLeaderboard=Open Leaderboard -resultsStandings=Results/Standings +resultsStandings=Results now=Now minutesAgo={0} min ago hoursAgo={0} h ago 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 a2eb4896fbb..ff25eab7cdd 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 @@ -1292,7 +1292,7 @@ noResults=Leider gibt es noch keine Ergebnisse. noNews=Leider gibt es keine Neuigkeiten. pointsValue={0,number,#0.00} openLeaderboard=Rangliste öffnen -resultsStandings=Ergbnisse/Platzierungen +resultsStandings=Ergebnisse now=Jetzt minutesAgo=vor {0} min hoursAgo=vor {0} h diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index 81fee10254f..e8f58e003ed 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1239,7 +1239,7 @@ noResults=There are no results available yet. noNews=There are no news available. pointsValue={0,number,#0.00} openLeaderboard=Open Leaderboard -resultsStandings=Results/Standings +resultsStandings=Results now=в настоящее время minutesAgo={0} минут назад hoursAgo={0} h часов назад diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index 6a31bfae1a3..78357f3cb5d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1291,7 +1291,7 @@ noResults=There are no results available yet. noNews=There are no news available. pointsValue={0,number,#0.00} openLeaderboard=Open Leaderboard -resultsStandings=Results/Standings +resultsStandings=Results selectCompetitor=Please select one competitor points=Points numberOfRacesShort=# Races From d5bbf66fbc2978a41a2b678513f1f13bc8df7455 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 15:13:52 +0200 Subject: [PATCH 149/219] Removed duplicate message --- .../mobile/partials/minileaderboard/MinileaderboardBox.ui.xml | 2 +- .../main/java/com/sap/sailing/gwt/ui/client/StringMessages.java | 1 - .../com/sap/sailing/gwt/ui/client/StringMessages.properties | 1 - .../com/sap/sailing/gwt/ui/client/StringMessages_de.properties | 1 - .../com/sap/sailing/gwt/ui/client/StringMessages_ru.properties | 1 - .../com/sap/sailing/gwt/ui/client/StringMessages_zh.properties | 1 - 6 files changed, 1 insertion(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/minileaderboard/MinileaderboardBox.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/minileaderboard/MinileaderboardBox.ui.xml index 0a11d2d549f..391b63bff6e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/minileaderboard/MinileaderboardBox.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/minileaderboard/MinileaderboardBox.ui.xml @@ -9,7 +9,7 @@ - + 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 e40d1065dc8..b7f5bd61e5a 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 @@ -1333,7 +1333,6 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String noNews(); String pointsValue(double value); String openLeaderboard(); - String resultsStandings(); String now(); String minutesAgo(String minutes); String hoursAgo(String hours); 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 14a1b8f765c..f72ace0a843 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 @@ -1302,7 +1302,6 @@ noResults=There are no results available yet. noNews=There are no news available. pointsValue={0,number,#0.00} openLeaderboard=Open Leaderboard -resultsStandings=Results now=Now minutesAgo={0} min ago hoursAgo={0} h ago 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 ff25eab7cdd..e623d851926 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 @@ -1292,7 +1292,6 @@ noResults=Leider gibt es noch keine Ergebnisse. noNews=Leider gibt es keine Neuigkeiten. pointsValue={0,number,#0.00} openLeaderboard=Rangliste öffnen -resultsStandings=Ergebnisse now=Jetzt minutesAgo=vor {0} min hoursAgo=vor {0} h diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index e8f58e003ed..efdcc7711ff 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1239,7 +1239,6 @@ noResults=There are no results available yet. noNews=There are no news available. pointsValue={0,number,#0.00} openLeaderboard=Open Leaderboard -resultsStandings=Results now=в настоящее время minutesAgo={0} минут назад hoursAgo={0} h часов назад diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index 78357f3cb5d..a1b62091445 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1291,7 +1291,6 @@ noResults=There are no results available yet. noNews=There are no news available. pointsValue={0,number,#0.00} openLeaderboard=Open Leaderboard -resultsStandings=Results selectCompetitor=Please select one competitor points=Points numberOfRacesShort=# Races From 7f7e6b9c2194a12eabce3adaf56c10c8526fde2e Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 15:18:35 +0200 Subject: [PATCH 150/219] Removed debug data from title --- .../partials/multiRegattaList/MultiRegattaListStepsBody.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java index d3fb8c997b7..c4b144cfa2f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java @@ -79,7 +79,7 @@ public class MultiRegattaListStepsBody extends UIObject implements RequiresResiz } nameUi.setInnerText(initials.toString()); } - nameUi.setTitle(seriesName + " " + nameUi.getOffsetWidth() + " / " + getElement().getOffsetWidth()); + nameUi.setTitle(seriesName); nameUi.getStyle().setVisibility(Visibility.VISIBLE); } From 9a72f57c5a5c6e677ecfa60367efdd80512d48ec Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 15:18:54 +0200 Subject: [PATCH 151/219] Showing different header text for mini leaderboard of event and series --- .../mobile/partials/minileaderboard/MinileaderboardBox.java | 5 ++++- .../sailing/gwt/home/mobile/places/event/EventViewImpl.java | 2 +- .../places/minileaderboard/MiniLeaderboardViewImpl.java | 3 ++- .../gwt/home/mobile/places/series/SeriesViewImpl.java | 3 ++- .../SeriesMiniOverallLeaderboardViewImpl.java | 3 ++- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/minileaderboard/MinileaderboardBox.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/minileaderboard/MinileaderboardBox.java index bca086b52ec..c1c540aa1ad 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/minileaderboard/MinileaderboardBox.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/minileaderboard/MinileaderboardBox.java @@ -25,12 +25,15 @@ public class MinileaderboardBox extends Composite implements RefreshableWidget { } + + private final StringMessages I18N = StringMessages.INSTANCE; @UiField MobileSection itemContainerUi; @UiField SectionHeaderContent headerUi; - public MinileaderboardBox() { + public MinileaderboardBox(boolean isOverall) { initWidget(uiBinder.createAndBindUi(this)); + headerUi.setSectionTitle(isOverall ? I18N.overallStandings() : I18N.results()); headerUi.setInfoText(StringMessages.INSTANCE.details()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/EventViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/EventViewImpl.java index 9fb11bde045..fdd0da6baf7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/EventViewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/event/EventViewImpl.java @@ -81,7 +81,7 @@ public class EventViewImpl extends Composite implements EventView { listContentUi.add(regattaStatus); refreshManager.add(regattaStatus, new GetRegattasAndLiveRacesForEventAction(event.getId())); } else { - MinileaderboardBox miniLeaderboard = new MinileaderboardBox(); + MinileaderboardBox miniLeaderboard = new MinileaderboardBox(false); miniLeaderboard.setAction(MSG.showAll(), currentPresenter.getRegattaMiniLeaderboardNavigation(regattaId)); listContentUi.add(miniLeaderboard); refreshManager.add(miniLeaderboard, new GetMiniLeaderbordAction(event.getId(), regattaId, 3)); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/minileaderboard/MiniLeaderboardViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/minileaderboard/MiniLeaderboardViewImpl.java index c60dc80db34..291cc3f9a21 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/minileaderboard/MiniLeaderboardViewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/minileaderboard/MiniLeaderboardViewImpl.java @@ -30,7 +30,7 @@ public class MiniLeaderboardViewImpl extends Composite implements MiniLeaderboar private Presenter currentPresenter; @UiField(provided = true) EventHeader eventHeaderUi; - @UiField + @UiField(provided = true) MinileaderboardBox minileaderboardUi; @UiField Quickfinder quickFinderUi; @@ -41,6 +41,7 @@ public class MiniLeaderboardViewImpl extends Composite implements MiniLeaderboar if(presenter.getCtx().getEventDTO().getType() == EventType.MULTI_REGATTA) { regattaDisplayName = presenter.getCtx().getRegatta().getDisplayName(); } + minileaderboardUi = new MinileaderboardBox(false); eventHeaderUi = new EventHeader(presenter.getCtx().getEventDTO(), regattaDisplayName); initWidget(uiBinder.createAndBindUi(this)); RefreshManager refreshManager = new RefreshManager(this, currentPresenter.getDispatch()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesViewImpl.java index d8956b3cbf4..43b873e76c3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesViewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/SeriesViewImpl.java @@ -29,7 +29,7 @@ public class SeriesViewImpl extends Composite implements SeriesView { @UiField(provided = true) SeriesHeader eventHeaderUi; @UiField Quickfinder quickFinderUi; - @UiField MinileaderboardBox leaderboardUi; + @UiField(provided = true) MinileaderboardBox leaderboardUi; @UiField FlowPanel eventsUi; // @UiField(provided = true) StatisticsBox statisticsBoxUi; @@ -42,6 +42,7 @@ public class SeriesViewImpl extends Composite implements SeriesView { EventSeriesViewDTO series = currentPresenter.getCtx().getSeriesDTO(); eventHeaderUi = new SeriesHeader(series); // this.setupStatisticsBox(event); + leaderboardUi = new MinileaderboardBox(true); initWidget(uiBinder.createAndBindUi(this)); this.setupListContent(series); this.setupEventListContent(series); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardViewImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardViewImpl.java index eb7d6e1394c..31af84116a8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardViewImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/places/series/minileaderboard/SeriesMiniOverallLeaderboardViewImpl.java @@ -29,11 +29,12 @@ public class SeriesMiniOverallLeaderboardViewImpl extends Composite implements S @UiField(provided = true) SeriesHeader eventHeaderUi; @UiField Quickfinder quickFinderUi; - @UiField + @UiField(provided = true) MinileaderboardBox minileaderboardUi; public SeriesMiniOverallLeaderboardViewImpl(Presenter presenter) { this.currentPresenter = presenter; + minileaderboardUi = new MinileaderboardBox(true); eventHeaderUi = new SeriesHeader(presenter.getCtx().getSeriesDTO()); initWidget(uiBinder.createAndBindUi(this)); RefreshManager refreshManager = new RefreshManager(this, currentPresenter.getDispatch()); From 66af27e6a2726460dc82fcc86748bf3b079057a8 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 14 Jul 2015 15:21:27 +0200 Subject: [PATCH 152/219] slightly refactored creation of RaceCourseDTO; need to take care of MarkDTO position production now --- .../gwt/ui/server/SailingServiceImpl.java | 36 +++++++------------ .../gwt/ui/shared/CoursePositionsDTO.java | 2 +- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index b247bbcdf69..d0dfa26675f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -902,7 +902,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S CourseBase lastCourse = state.getCourseDesign(); if (lastCourse != null) { - raceInfoDTO.lastCourseDesign = convertCourseDesignToRaceCourseDTO(lastCourse); + raceInfoDTO.lastCourseDesign = convertToRaceCourseDTO(lastCourse); raceInfoDTO.lastCourseName = lastCourse.getName(); } @@ -952,20 +952,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S raceInfoDTO.startProcedureDTO = info; } - private RaceCourseDTO convertCourseDesignToRaceCourseDTO(CourseBase lastCourseDesign) { - RaceCourseDTO result = new RaceCourseDTO(Collections. emptyList()); - if (lastCourseDesign != null) { - List waypointDTOs = new ArrayList(); - for (Waypoint waypoint : lastCourseDesign.getWaypoints()) { - ControlPointDTO controlPointDTO = convertToControlPointDTO(waypoint.getControlPoint()); - WaypointDTO waypointDTO = new WaypointDTO(waypoint.getName(), controlPointDTO, waypoint.getPassingInstructions()); - waypointDTOs.add(waypointDTO); - } - result = new RaceCourseDTO(waypointDTOs); - } - return result; - } - private List convertToRaceDTOs(Regatta regatta) { List result = new ArrayList(); for (RaceDefinition r : regatta.getAllRaces()) { @@ -5099,25 +5085,27 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } private RaceCourseDTO convertToRaceCourseDTO(CourseBase course) { - List waypointDTOs = new ArrayList(); - Map controlPointCache = new HashMap<>(); - RaceCourseDTO result = new RaceCourseDTO(waypointDTOs); - for (Waypoint waypoint : course.getWaypoints()) { - waypointDTOs.add(convertToWaypointDTO(waypoint, controlPointCache)); + final RaceCourseDTO result; + if (course != null) { + List waypointDTOs = new ArrayList(); + Map controlPointCache = new HashMap<>(); + for (Waypoint waypoint : course.getWaypoints()) { + waypointDTOs.add(convertToWaypointDTO(waypoint, controlPointCache)); + } + result = new RaceCourseDTO(waypointDTOs); + } else { + result = new RaceCourseDTO(Collections. emptyList()); } return result; } @Override - public RaceCourseDTO getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName, - String fleetName) { + public RaceCourseDTO getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName, String fleetName) { RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); - CourseBase lastPublishedCourse = new LastPublishedCourseDesignFinder(raceLog).analyze(); if (lastPublishedCourse == null) { lastPublishedCourse = new CourseDataImpl(""); } - return convertToRaceCourseDTO(lastPublishedCourse); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java index 32ec6e4ec46..e1ce593e682 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java @@ -8,7 +8,7 @@ import com.sap.sailing.domain.common.NauticalSide; import com.sap.sailing.domain.common.Position; public class CoursePositionsDTO implements IsSerializable { - public List course; + public List course; public List waypointPositions; public List startMarkPositions; public List finishMarkPositions; From 0e2a9177ff8763f954680ba2688563cb3cf5209c Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 15:24:40 +0200 Subject: [PATCH 153/219] Improved german message --- .../com/sap/sailing/gwt/ui/client/StringMessages_de.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e623d851926..4463e6f6fb0 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 @@ -1273,7 +1273,7 @@ raceCalcluatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSeconds=Ber.Zeit@ raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSecondsTooltip=Berechnete Zeit bei erwarteter Ankunft am derzeit absolut in Führung liegenden Teilnehmers;\nSchätzung basierend auf durchschnittlichem VMG im aktuellen Bahnschenkel und gleicher verrechneter Geschwindigket wie der absolut in Führung liegende Teilnehmer\nfür alle nachfolgenden Bahnschenkel sailorInfo=Segler Infos sailorInfoLongText=Offizielle Ergebnisse, Proteste,\nNotice Board, Segler-Wetter: -resultsQuickfinder=Ergebnis Schnellauswahl +resultsQuickfinder=Ergebnis-Schnellauswahl statistics=Statistiken impressions=Eindrücke notAvailableOnMobileMessage=Diese Ansicht ist noch nicht für die Mobile bzw. Smartphone Ansicht umgesetzt.\nWollen Sie die Desktop Ansicht besuchen? From 11e951dfc295060670cf4928ebfb0a6f23b01dfd Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 15:24:51 +0200 Subject: [PATCH 154/219] Regatta list - Show live races in regatta progress bar --- .../MultiRegattaListStepsBody.java | 19 +++++++++---------- .../MultiRegattaListStepsBodyFleet.java | 9 ++++++--- .../MultiRegattaListStepsBodyFleet.ui.xml | 5 +++-- .../regatta/RegattaProgressFleetDTO.java | 4 ++++ 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java index c4b144cfa2f..7afd6f6ff85 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBody.java @@ -41,12 +41,6 @@ public class MultiRegattaListStepsBody extends UIObject implements RequiresResiz nameUi.getStyle().setVisibility(Visibility.HIDDEN); seriesName = DEFAULT_SERIES_NAME.equals(seriesProgress.getName()) ? I18N.races() : seriesProgress.getName(); nameUi.setInnerText(seriesName); - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - @Override - public void execute() { - renderNames(); - } - }); if (seriesProgress.isCompleted()) { progressUi.setInnerText(String.valueOf(seriesProgress.getTotalRaceCount())); } else { @@ -55,21 +49,26 @@ public class MultiRegattaListStepsBody extends UIObject implements RequiresResiz seriesProgress.getProgressRaceCount(), seriesProgress.getTotalRaceCount())); } addFleetProgresses(seriesProgress.getFleetState(), seriesProgress.getTotalRaceCount()); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { + @Override + public void execute() { + renderNames(); + } + }); } - private void addFleetProgresses(Map fleetStates, int totalRaceCount) { double height = fleetStates.isEmpty() ? 100.0 : 100.0 / fleetStates.size(); for (Entry fleetState : fleetStates.entrySet()) { - double fleetWidth = (fleetState.getValue().getFinishedRaceCount() * 100.0) / totalRaceCount; + double finishedWidth = (fleetState.getValue().getFinishedRaceCount() * 100.0) / totalRaceCount; + double liveWidth = (fleetState.getValue().getFinishedAndLiveRaceCount() * 100.0) / totalRaceCount; String fleetColor = fleetState.getKey().getFleetColor(); - MultiRegattaListStepsBodyFleet fleet = new MultiRegattaListStepsBodyFleet(fleetWidth, height, fleetColor); + MultiRegattaListStepsBodyFleet fleet = new MultiRegattaListStepsBodyFleet(finishedWidth, liveWidth, height, fleetColor); fleetsContainerUi.appendChild(fleet.getElement()); } } private void renderNames() { - if (getElement().getOffsetWidth() < nameUi.getOffsetWidth() + checkUi.getOffsetWidth() + progressUi.getOffsetWidth()) { String[] tokens = seriesName.split(" "); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBodyFleet.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBodyFleet.java index 9ed3a907e5c..94474e460a1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBodyFleet.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBodyFleet.java @@ -16,12 +16,15 @@ public class MultiRegattaListStepsBodyFleet extends UIObject { } @UiField DivElement fleetProgressBarUi; + @UiField DivElement fleetProgressBarLiveUi; - public MultiRegattaListStepsBodyFleet(double width, double height, String color) { + public MultiRegattaListStepsBodyFleet(double finishedWidth, double liveWidth, double height, String color) { setElement(uiBinder.createAndBindUi(this)); getElement().getStyle().setHeight(height, Unit.PCT); - fleetProgressBarUi.getStyle().setWidth(width, Unit.PCT); + fleetProgressBarUi.getStyle().setWidth(finishedWidth, Unit.PCT); fleetProgressBarUi.getStyle().setBackgroundColor(color); + fleetProgressBarLiveUi.getStyle().setWidth(liveWidth, Unit.PCT); + fleetProgressBarLiveUi.getStyle().setBackgroundColor("#ff4040"); } - + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBodyFleet.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBodyFleet.ui.xml index 4bb1819a9f9..fe69964d172 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBodyFleet.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsBodyFleet.ui.xml @@ -4,7 +4,8 @@ -
-
+
+
+
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressFleetDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressFleetDTO.java index 40c5262c700..be3a530de8e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressFleetDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/regatta/RegattaProgressFleetDTO.java @@ -22,4 +22,8 @@ public class RegattaProgressFleetDTO implements DTO { public int getLiveRaceCount() { return liveRaceCount; } + + public int getFinishedAndLiveRaceCount() { + return finishedRaceCount + liveRaceCount; + } } From d182dc450f57ce696b9c764dc71d882944caa7d1 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 15:27:31 +0200 Subject: [PATCH 155/219] Adjusted mobile event header date formatting to be more consistent with the desktop header --- .../gwt/home/mobile/partials/eventheader/EventHeader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.java index c04e7b8e0bd..c467508665f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/eventheader/EventHeader.java @@ -47,7 +47,7 @@ public class EventHeader extends Composite { } LabelTypeUtil.renderLabelType(eventStateUi, event.getState().getStateMarker()); LogoUtil.setEventLogo(eventLogoUi, event); - eventDateUi.setInnerText(EventDatesFormatterUtil.formatDateRangeWithoutYear(event.getStartDate(), event.getEndDate())); + eventDateUi.setInnerText(EventDatesFormatterUtil.formatDateRangeWithYear(event.getStartDate(), event.getEndDate())); eventLocationUi.setInnerText(event.getLocationAndVenueAndCountry()); } } From b873b0e5127401ce5b5e37a9d6687f501645b9ea Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 15:35:40 +0200 Subject: [PATCH 156/219] Race list - Cleanup: removed no longer class --- .../dispatch/event/RaceListViewDTO.java | 58 ------------------- 1 file changed, 58 deletions(-) delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java deleted file mode 100644 index 0f00193d2ab..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceListViewDTO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.sap.sailing.gwt.ui.shared.dispatch.event; - -import java.util.Arrays; -import java.util.Collection; -import java.util.TreeSet; - -import com.sap.sailing.gwt.ui.shared.dispatch.DTO; -import com.sap.sailing.gwt.ui.shared.dispatch.regatta.RegattaWithProgressDTO; -import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; - -public class RaceListViewDTO implements DTO { - - private TreeSet liveRaces = new TreeSet<>(); - - private TreeSet finishedRaces = new TreeSet<>(); - - private RegattaWithProgressDTO progress; - - public void add(LiveRaceDTO liveRace) { - add(liveRaces, liveRace); - } - - public void add(RaceListRaceDTO finishedRace) { - add(finishedRaces, finishedRace); - } - - private > void add(TreeSet set, T race) { - if (race != null) { - set.add(race); - } - } - - public Collection getLiveRaces() { - return liveRaces; - } - - public Collection getFinishedRaces() { - return finishedRaces; - } - - public Collection getRacesForCompetitionFormat() { - RaceListSeriesDTO withFleets = new RaceListSeriesDTO("Fleets"); - RaceListSeriesDTO noFleets = new RaceListSeriesDTO(""); - for (RaceListRaceDTO race : finishedRaces) { - RaceListSeriesDTO series = race.getFleet() == null ? noFleets : withFleets; - series.addRace(race); - } - return Arrays.asList(withFleets, noFleets); - } - - public RegattaWithProgressDTO getProgress() { - return progress; - } - - public void setProgress(RegattaWithProgressDTO progress) { - this.progress = progress; - } -} From f623bea71334d761c3fe15ad809aead3e9ff3606 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 15:40:51 +0200 Subject: [PATCH 157/219] Regatta list - Fixed plural forms in regatta header --- .../event/partials/regattaHeader/RegattaHeaderBody.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java index d735566ad20..451c364ee94 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java @@ -16,6 +16,7 @@ import com.sap.sailing.gwt.ui.shared.eventview.RegattaMetadataDTO; public class RegattaHeaderBody extends UIObject { + private static final StringMessages I18N = StringMessages.INSTANCE; private static RegattaHeaderBodyUiBinder uiBinder = GWT.create(RegattaHeaderBodyUiBinder.class); interface RegattaHeaderBodyUiBinder extends UiBinder { @@ -33,9 +34,9 @@ public class RegattaHeaderBody extends UIObject { logoUi.getStyle().setBackgroundImage("url('" + logo.getSafeUri().asString() + "')"); nameUi.setInnerText(regattaMetadata.getDisplayName()); LabelTypeUtil.renderLabelTypeOrHide(labelUi, regattaMetadata.getState().getStateMarker()); - addDetailsItem(regattaMetadata.getCompetitorsCount(), StringMessages.INSTANCE.competitors()); - addDetailsItem(regattaMetadata.getRaceCount(), StringMessages.INSTANCE.races()); - addDetailsItem(regattaMetadata.getTrackedRacesCount(), StringMessages.INSTANCE.trackedRaces()); + addDetailsItem(regattaMetadata.getCompetitorsCount(), I18N.competitorsCount(regattaMetadata.getCompetitorsCount())); + addDetailsItem(regattaMetadata.getRaceCount(), I18N.racesCount(regattaMetadata.getRaceCount())); + addDetailsItem(regattaMetadata.getTrackedRacesCount(), I18N.trackedRacesCount(regattaMetadata.getTrackedRacesCount())); addDetailsItem(regattaMetadata.getDefaultCourseAreaName()); addDetailsItem(regattaMetadata.getBoatCategory()); } From 3f0b87f8ca7d7b85ee23e351de41b084c350f245 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 15:43:12 +0200 Subject: [PATCH 158/219] Better visualization of course area name in event header --- .../home/client/place/event/partials/header/EventHeader.java | 2 +- .../main/java/com/sap/sailing/gwt/ui/client/StringMessages.java | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_de.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_ru.properties | 1 + .../com/sap/sailing/gwt/ui/client/StringMessages_zh.properties | 1 + 6 files changed, 6 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.java index f0a66eb425b..854d64e843d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.java @@ -125,7 +125,7 @@ public class EventHeader extends Composite { hide(trackedRaces); } if(regattaMetadata.getDefaultCourseAreaName() != null) { - courseAreaUi.setInnerText(regattaMetadata.getDefaultCourseAreaName()); + courseAreaUi.setInnerText(i18n.courseAreaName(regattaMetadata.getDefaultCourseAreaName())); } else { hide(courseAreaUi); } 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 b7f5bd61e5a..6ed7b17d05e 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 @@ -1275,6 +1275,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String competitorsCount(@PluralCount(DefaultRule_1_0n.class) int count); String trackedRacesCount(@PluralCount(DefaultRule_1_0n.class) int count); String eventsCount(@PluralCount(DefaultRule_1_0n.class) int count); + String courseAreaName(String courseAreaName); String currentOfTotalLegs(int currentLeg, int totalLegs); String clone(); String changed(); 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 f72ace0a843..7ba8c175872 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 @@ -1241,6 +1241,7 @@ trackedRacesCount[one]={0,number} tracked race eventsCount={0,number} events eventsCount[one]={0,number} event competitorsCount={0,number} competitors +courseAreaName=Course area: {0} competitorsCount[one]={0,number} competitor currentOfTotalLegs=Leg {0,number}/{1,number} clone=Clone 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 4463e6f6fb0..e90bc2fbeb7 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 @@ -1231,6 +1231,7 @@ trackedRacesCount[one]={0,number} getracktes Rennen eventsCount={0,number} Veranstaltungen eventsCount[one]={0,number} Veranstaltung competitorsCount={0,number} Teams +courseAreaName=Regattabahn: {0} competitorsCount[one]={0,number} Team currentOfTotalLegs=Schenkel {0,number}/{1,number} clone=Clone diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index efdcc7711ff..8dd1fa29d1e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1179,6 +1179,7 @@ trackedRacesCount[one]={0,number} tracked race eventsCount={0,number} events eventsCount[one]={0,number} event competitorsCount={0,number} competitors +courseAreaName=Зона курса: {0} competitorsCount[one]={0,number} competitor currentOfTotalLegs=Этап {0,number}/{1,number} clone=Clone diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index a1b62091445..74a9761fba5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1229,6 +1229,7 @@ trackedRacesCount[one]={0,number} tracked race eventsCount={0,number} events eventsCount[one]={0,number} event competitorsCount={0,number} competitors +courseAreaName=Course area: {0} competitorsCount[one]={0,number} competitor� dashboardWindBotLoadingText=Loading wind bot data ... dashboardWindBotLoadingMessage=Depending on your connection this operation might take some minutes to complete the first time. From 867c12a855253d178482996c860200ab356b5b4b Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 15:44:21 +0200 Subject: [PATCH 159/219] Removed unused partial --- .../partials/regattaHeader/RegattaHeader.css | 79 ------------------- .../partials/regattaHeader/RegattaHeader.java | 26 ------ .../regattaHeader/RegattaHeader.ui.xml | 30 ------- .../regattaHeader/RegattaHeaderBody.ui.xml | 59 -------------- .../regattaHeader/RegattaHeaderResources.java | 23 ------ 5 files changed, 217 deletions(-) delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.css delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.ui.xml delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.ui.xml delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderResources.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.css b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.css deleted file mode 100644 index 9a134001372..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.css +++ /dev/null @@ -1,79 +0,0 @@ -/** - * The header of a regatta of an event - */ -.regattaheader { - font-size: 1rem; - margin-top: 2em; - padding: 0.666666666666667em; - overflow: hidden; - border-radius: 0.333333333333333em; - border: 1px solid #dedede; - background-color: #f2f2f2; -} -.regattaheaderlink { - display: block; - margin-top: 0; - border: none; - border-radius: 0; - color: #0a0a0a; -} -.regattaheader_logo { - float: left; - width: 4em; - height: 3.333333333333333em; - margin-right: 0.666666666666667em; - text-align: center; - line-height: 3.333333333333333em; - border-right: 1px solid #ccc; - padding-right: 0.666666666666667em; -} -.regattaheader_logo img { - display: inline-block; - text-align: center; - vertical-align: middle; -} -.regattaheader_content { - float: left; - width: 80%; - overflow: hidden; -} -.regattaheader_content_title { - font-size: 1.466666666666667em; - font-weight: 700; - height: 1.363636363636364em; - line-height: 1.363636363636364em; -} -.regattaheader_content_details { - height: 1.333333333333333em; -} -.regattaheader_content_details_item { - float: left; - font-size: 13px; - font-weight: 600; - color: #666; - padding: 0 0.666666666666667em; - border-right: 1px solid #ccc; -} -.regattaheader_content_details_item:first-of-type { - padding-left: 0; -} -.regattaheader_content_details_item:last-of-type { - border: none; - padding-right: 0; -} -.regattaheader_arrow { - float: right; - width: 5%; - line-height: 3.333333333333333em; - text-align: right; -} -.regattaheader_arrow:before { - content: ''; - display: inline-block; - margin-left: 0.333333333333333em; - width: 0.8em; - height: 1.333333333333333em; - background-image: url("../images/home/breadcrumb-arrow.png"); - background-size: contain; - background-repeat: no-repeat; -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java deleted file mode 100644 index 50e553081e1..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sap.sailing.gwt.home.client.place.event.partials.regattaHeader; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.shared.eventview.RegattaReferenceDTO; - -public class RegattaHeader extends Composite { - private static EventHeaderUiBinder uiBinder = GWT.create(EventHeaderUiBinder.class); - - interface EventHeaderUiBinder extends UiBinder { - } - - @UiField StringMessages i18n; - - - public RegattaHeader(RegattaReferenceDTO regattaRefDTO) { - - RegattaHeaderResources.INSTANCE.css().ensureInjected(); - initWidget(uiBinder.createAndBindUi(this)); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.ui.xml deleted file mode 100644 index 1304c8dd297..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.ui.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - -
-
-
- - - - - - -
-
-
- -
-
-
- - \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.ui.xml deleted file mode 100644 index dac8b67d8b1..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.ui.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - -
- -
-
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- -
-
-
- - -
-
- - -
-
- - -
-
- -
-
-
-
-
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderResources.java deleted file mode 100644 index 5234b07d59b..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderResources.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.sap.sailing.gwt.home.client.place.event.partials.regattaHeader; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; -import com.google.gwt.resources.client.CssResource; - -public interface RegattaHeaderResources extends ClientBundle { - public static final RegattaHeaderResources INSTANCE = GWT.create(RegattaHeaderResources.class); - - @Source("RegattaHeader.css") - LocalCss css(); - - public interface LocalCss extends CssResource { - String regattaheader(); - String regattaheaderlink(); - String regattaheader_logo(); - String regattaheader_content(); - String regattaheader_content_title(); - String regattaheader_content_details(); - String regattaheader_content_details_item(); - String regattaheader_arrow(); - } -} From a05b324be84428e3e084056ed173bbdb19f10c26 Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 15:45:24 +0200 Subject: [PATCH 160/219] Increased font-size, padding, line spacing in footer (mobile) --- .../sailing/gwt/home/mobile/partials/footer/Footer.gss | 8 +++++--- .../sailing/gwt/home/mobile/partials/footer/Footer.ui.xml | 8 ++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss index 6bcb034911b..8a83f10fc1e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss @@ -1,13 +1,15 @@ .sitefooter { - font-size: 0.8rem; background: #333; - padding: 2.5em; + padding: 5em 3em; margin-top: -13.916666666666666em; color: #fff; text-align: center; + font-size: 110%; } .sitefooter a { color: #fff; + line-height: 2; + padding: 5px; } .sitefooter_language { display: block; @@ -20,5 +22,5 @@ a.sitefooter_language_linkactive { } .sitefooter_links { font-weight: 600; - padding: 2.083333333333333em 0; + padding: 3em 0; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.ui.xml index 3771f0fd98f..d15e5dda458 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.ui.xml @@ -32,7 +32,7 @@ url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZlcnNpb249JzEuMScgaGVpZ2h0PScxOHB4JyB3aWR0aD0nMTZweCc+PHRleHQgeD0nMCcgeT0nMTUnIGZpbGw9JyNlZmFhMDAnIGZvbnQtc2l6ZT0nMTYnPiYjOTY2MDs8L3RleHQ+PC9zdmc+"); background-position: right center; background-repeat: no-repeat; - font-size: 0.8rem; + font-size: 110%; } @@ -58,8 +58,8 @@ - | + | @@ -69,14 +69,14 @@ href="mailto:sailing_analytics%40sap.com?subject=[SAP Sailing] Feedback" title="{i18n.footerFeedback}"> - | + | Desktop - | + | Date: Tue, 14 Jul 2015 15:51:55 +0200 Subject: [PATCH 161/219] Better visualization of course area name in regatta header --- .../event/partials/regattaHeader/RegattaHeaderBody.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java index 451c364ee94..f949fd41653 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java @@ -37,7 +37,10 @@ public class RegattaHeaderBody extends UIObject { addDetailsItem(regattaMetadata.getCompetitorsCount(), I18N.competitorsCount(regattaMetadata.getCompetitorsCount())); addDetailsItem(regattaMetadata.getRaceCount(), I18N.racesCount(regattaMetadata.getRaceCount())); addDetailsItem(regattaMetadata.getTrackedRacesCount(), I18N.trackedRacesCount(regattaMetadata.getTrackedRacesCount())); - addDetailsItem(regattaMetadata.getDefaultCourseAreaName()); + String defaultCourseAreaName = regattaMetadata.getDefaultCourseAreaName(); + if(defaultCourseAreaName != null) { + addDetailsItem(I18N.courseAreaName(defaultCourseAreaName)); + } addDetailsItem(regattaMetadata.getBoatCategory()); } From ea4aa8d1c57d40331190f9b3c37ed9250601515c Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 16:09:45 +0200 Subject: [PATCH 162/219] Fixed calculation of live race count for regatta progress --- .../sailing/gwt/ui/shared/dispatch/event/RaceContext.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 010b4fe3e51..a0cbad0385c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -564,6 +564,12 @@ public class RaceContext { } public boolean isLive() { + if(getStartTime() == null) { + return false; + } + if (trackedRace != null && trackedRace.hasGPSData() && trackedRace.hasWindData()) { + return trackedRace.isLive(now); + } return getLiveRaceViewState() == RaceViewState.RUNNING; } } From e943df5de503bce5502aa8aa230e4577020b2817 Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 16:10:40 +0200 Subject: [PATCH 163/219] Introduced placeholder class for experimental features boolean flags --- .../tabs/MultiregattaOverviewTabView.java | 5 ++--- .../tabs/MultiregattaRegattasTabView.java | 5 ++--- .../regatta/tabs/RegattaRacesTabView.java | 4 ++-- .../gwt/home/shared/ExperimentalFeatures.java | 18 ++++++++++++++++++ 4 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/ExperimentalFeatures.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java index 6324b96cb24..744b7117b12 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java @@ -25,6 +25,7 @@ import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.Mul import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshManager; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; +import com.sap.sailing.gwt.home.shared.ExperimentalFeatures; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.RaceGroupDTO; @@ -40,8 +41,6 @@ import com.sap.sse.common.Util.Triple; */ public class MultiregattaOverviewTabView extends Composite implements MultiregattaTabView { - private static final boolean SHOW_NEW_REGATTA_LIST = true; - interface MyBinder extends UiBinder { } @@ -85,7 +84,7 @@ public class MultiregattaOverviewTabView extends Composite implements Multiregat stage.setupRefresh(refreshManager); refreshManager.add(racesListLive.getRefreshable(), new GetLiveRacesForEventAction(currentPresenter.getCtx().getEventDTO().getId())); - if (SHOW_NEW_REGATTA_LIST) { + if (ExperimentalFeatures.SHOW_NEW_REGATTA_LIST) { refreshManager.add(regattaFilterList, new GetRegattaListViewAction(currentPresenter.getCtx().getEventDTO().getId())); content.removeFromParent(); } else { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java index 1e9322e5bf3..68d1346bc56 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java @@ -24,6 +24,7 @@ import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.Mul import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshManager; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; +import com.sap.sailing.gwt.home.shared.ExperimentalFeatures; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.RaceGroupDTO; @@ -39,8 +40,6 @@ import com.sap.sse.common.Util.Triple; */ public class MultiregattaRegattasTabView extends Composite implements MultiregattaTabView { - private static final boolean SHOW_NEW_REGATTA_LIST = true; - interface MyBinder extends UiBinder { } @@ -81,7 +80,7 @@ public class MultiregattaRegattasTabView extends Composite implements Multiregat RefreshManager refreshManager = new RefreshManager(this, currentPresenter.getDispatch()); refreshManager.add(racesListLiveUi.getRefreshable(), new GetLiveRacesForEventAction(currentPresenter.getCtx().getEventDTO().getId())); - if (SHOW_NEW_REGATTA_LIST) { + if (ExperimentalFeatures.SHOW_NEW_REGATTA_LIST) { refreshManager.add(regattaFilterList, new GetRegattaListViewAction(currentPresenter.getCtx().getEventDTO().getId())); content.removeFromParent(); } else { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index fdc81d42fd0..4fbafa79738 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -34,6 +34,7 @@ import com.sap.sailing.gwt.home.client.place.event.regatta.EventRegattaView.Pres import com.sap.sailing.gwt.home.client.place.event.regatta.RegattaTabView; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshManager; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; +import com.sap.sailing.gwt.home.shared.ExperimentalFeatures; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.RaceGroupDTO; @@ -50,7 +51,6 @@ import com.sap.sse.common.Util.Triple; */ public class RegattaRacesTabView extends Composite implements RegattaTabView { - private static final boolean SHOW_NEW_RACES_LIST = true; private static final StringMessages I18N = StringMessages.INSTANCE; private enum Navigation implements ListNavigationAction { @@ -114,7 +114,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView Date: Tue, 14 Jul 2015 16:13:28 +0200 Subject: [PATCH 164/219] added missing EmbeddedMapAndWindChart compilation results directory to build.properties --- java/com.sap.sailing.gwt.ui/build.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/build.properties b/java/com.sap.sailing.gwt.ui/build.properties index daa994289b7..18a48a98d2f 100755 --- a/java/com.sap.sailing.gwt.ui/build.properties +++ b/java/com.sap.sailing.gwt.ui/build.properties @@ -53,5 +53,6 @@ bin.includes = META-INF/,\ Home.html,\ SettingsDialog.css,\ EmbeddedMapAndWindChart.css,\ - EmbeddedMapAndWindChart.html + EmbeddedMapAndWindChart.html,\ + com.sap.sailing.gwt.ui.EmbeddedMapAndWindChart/ output.. = WEB-INF/classes/ From bf40dc9cc59825d72a0f218dd33d1946b8045aae Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 16:14:59 +0200 Subject: [PATCH 165/219] Regatta list - Fixed plural forms in regatta header --- .../place/event/partials/regattaHeader/RegattaHeaderBody.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java index f949fd41653..a273d872cb4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeaderBody.java @@ -46,7 +46,7 @@ public class RegattaHeaderBody extends UIObject { private void addDetailsItem(int count, String text) { if (count > 0) { - addDetailsItem(count + " " + text); + addDetailsItem(text); } } From 91918cb3786dc5b4142cb34c44b9804359672586 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 16:15:25 +0200 Subject: [PATCH 166/219] Regatta list - Adjusted regatta progress bar layouting --- .../event/partials/multiRegattaList/MultiRegattaList.gss | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss index 7f43ab8c29f..42b617a51be 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaList.gss @@ -233,9 +233,10 @@ img.race_item_windflag { } .regattalistitem_steps_step_fleets { width: 100%; - height: 1em; - border: 1px solid #dedede; + height: 17px; + outline: 1px solid #dedede; margin-top: 0.266666666666667em; + padding: 1px; } .regattalistitem_steps_step_fleets_fleet { font-size: inherit; @@ -247,6 +248,7 @@ img.race_item_windflag { height: 100%; padding: 0.666666666666667em; text-align: right; + margin-top: 3px; } .regattalistitem_steps_button .button { margin-left: 0.8em; From 14105f8bf939153c1939a1cec086eaf5aa6643cc Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 14 Jul 2015 16:36:18 +0200 Subject: [PATCH 167/219] consolidated code that produces a RaceCourseDTO --- .../gwt/ui/server/SailingServiceImpl.java | 56 +++++++++++-------- .../gwt/ui/shared/CoursePositionsDTO.java | 2 +- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index d0dfa26675f..b26da614b0b 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -902,7 +902,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S CourseBase lastCourse = state.getCourseDesign(); if (lastCourse != null) { - raceInfoDTO.lastCourseDesign = convertToRaceCourseDTO(lastCourse); + raceInfoDTO.lastCourseDesign = convertToRaceCourseDTO(lastCourse, /* trackedRace */ null, /* timePoint */ null); raceInfoDTO.lastCourseName = lastCourse.getName(); } @@ -1850,7 +1850,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S result.totalLegsCount = trackedRace.getRace().getCourse().getLegs().size(); result.currentLegNumber = trackedRace.getLastLegStarted(dateAsTimePoint); result.marks = new HashSet(); - result.course = new ArrayList<>(); + result.course = convertToRaceCourseDTO(trackedRace.getRace().getCourse(), trackedRace, dateAsTimePoint); + // now make sure we don't duplicate the MarkDTO objects but instead use the ones from the RaceCourseDTO + // object and amend them with the Position result.waypointPositions = new ArrayList<>(); Set marks = new HashSet(); Course course = trackedRace.getRace().getCourse(); @@ -1939,32 +1941,22 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S private ControlPointDTO convertToControlPointDTO(ControlPoint controlPoint, TrackedRace trackedRace, TimePoint timePoint) { ControlPointDTO result; + final TimePoint timePointToUse = trackedRace == null ? null : + timePoint == null ? MillisecondsTimePoint.now().minus(trackedRace.getDelayToLiveInMillis()) : timePoint; if (controlPoint instanceof ControlPointWithTwoMarks) { final Mark left = ((ControlPointWithTwoMarks) controlPoint).getLeft(); - final Position leftPos = trackedRace.getOrCreateTrack(left).getEstimatedPosition(timePoint, /* extrapolate */ false); + final Position leftPos = timePointToUse == null ? null : trackedRace.getOrCreateTrack(left).getEstimatedPosition(timePointToUse, /* extrapolate */ false); final Mark right = ((ControlPointWithTwoMarks) controlPoint).getRight(); - final Position rightPos = trackedRace.getOrCreateTrack(right).getEstimatedPosition(timePoint, /* extrapolate */ false); + final Position rightPos = timePointToUse == null ? null : trackedRace.getOrCreateTrack(right).getEstimatedPosition(timePointToUse, /* extrapolate */ false); result = new GateDTO(controlPoint.getId().toString(), controlPoint.getName(), convertToMarkDTO(left, leftPos), convertToMarkDTO(right, rightPos)); } else { - final Position posOfFirst = trackedRace.getOrCreateTrack(controlPoint.getMarks().iterator().next()). - getEstimatedPosition(timePoint, /* extrapolate */ false); + final Position posOfFirst = timePointToUse == null ? null : trackedRace.getOrCreateTrack(controlPoint.getMarks().iterator().next()). + getEstimatedPosition(timePointToUse, /* extrapolate */ false); result = new MarkDTO(controlPoint.getId().toString(), controlPoint.getName(), posOfFirst == null ? -1 : posOfFirst.getLatDeg(), posOfFirst == null ? -1 : posOfFirst.getLngDeg()); } return result; } - private ControlPointDTO convertToControlPointDTO(ControlPoint controlPoint) { - ControlPointDTO result; - if (controlPoint instanceof ControlPointWithTwoMarks) { - final Mark left = ((ControlPointWithTwoMarks) controlPoint).getLeft(); - final Mark right = ((ControlPointWithTwoMarks) controlPoint).getRight(); - result = new GateDTO(controlPoint.getId().toString(), controlPoint.getName(), convertToMarkDTO(left, null), convertToMarkDTO(right, null)); - } else { - result = new MarkDTO(controlPoint.getId().toString(), controlPoint.getName()); - } - return result; - } - private ControlPoint getOrCreateControlPoint(ControlPointDTO dto) { String idAsString = dto.getIdAsString(); if (idAsString == null) { @@ -5075,22 +5067,40 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S raceLog.add(event); } - private WaypointDTO convertToWaypointDTO(Waypoint waypoint, Map controlPointCache) { + /** + * @param trackedRace + * if null, no position data will be attached to the {@link MarkDTO}s + * @param timePoint + * if trackedRace is not null, specifies the time point for which to determine + * the mark positions and attach to the {@link MarkDTO}s. If null, the current time point + * will be used as default. + */ + private WaypointDTO convertToWaypointDTO(Waypoint waypoint, Map controlPointCache, TrackedRace trackedRace, TimePoint timePoint) { ControlPointDTO cp = controlPointCache.get(waypoint.getControlPoint().getId()); if (cp == null) { - cp = convertToControlPointDTO(waypoint.getControlPoint()); + cp = convertToControlPointDTO(waypoint.getControlPoint(), trackedRace, timePoint); controlPointCache.put(waypoint.getControlPoint().getId(), cp); } return new WaypointDTO(waypoint.getName(), cp, waypoint.getPassingInstructions()); } - private RaceCourseDTO convertToRaceCourseDTO(CourseBase course) { + /** + * @param course + * the course to convert + * @param trackedRace + * if null, no position data will be attached to the {@link MarkDTO}s + * @param timePoint + * if trackedRace is not null, specifies the time point for which to determine + * the mark positions and attach to the {@link MarkDTO}s. If null, the current time point + * will be used as default. + */ + private RaceCourseDTO convertToRaceCourseDTO(CourseBase course, TrackedRace trackedRace, TimePoint timePoint) { final RaceCourseDTO result; if (course != null) { List waypointDTOs = new ArrayList(); Map controlPointCache = new HashMap<>(); for (Waypoint waypoint : course.getWaypoints()) { - waypointDTOs.add(convertToWaypointDTO(waypoint, controlPointCache)); + waypointDTOs.add(convertToWaypointDTO(waypoint, controlPointCache, trackedRace, timePoint)); } result = new RaceCourseDTO(waypointDTOs); } else { @@ -5106,7 +5116,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S if (lastPublishedCourse == null) { lastPublishedCourse = new CourseDataImpl(""); } - return convertToRaceCourseDTO(lastPublishedCourse); + return convertToRaceCourseDTO(lastPublishedCourse, /* trackedRace */ null, /* timePoint */ null); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java index e1ce593e682..20f948cd99c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java @@ -8,7 +8,7 @@ import com.sap.sailing.domain.common.NauticalSide; import com.sap.sailing.domain.common.Position; public class CoursePositionsDTO implements IsSerializable { - public List course; + public RaceCourseDTO course; public List waypointPositions; public List startMarkPositions; public List finishMarkPositions; From 67134ddbdae5fd13f7690a87342daf72be909ec1 Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 16:46:23 +0200 Subject: [PATCH 168/219] Fixed overlapping footer --- .../com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss index 8a83f10fc1e..70cd072f687 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/footer/Footer.gss @@ -1,7 +1,7 @@ .sitefooter { background: #333; padding: 5em 3em; - margin-top: -13.916666666666666em; + margin-top: -10em; color: #fff; text-align: center; font-size: 110%; From 2f547d3005ef430018cf8d409fc8bae4972d9b20 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 16:50:13 +0200 Subject: [PATCH 169/219] Regatta icons are colored in mobile overview --- .../gwt/home/mobile/partials/sectionHeader/SectionHeader.gss | 2 -- 1 file changed, 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/sectionHeader/SectionHeader.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/sectionHeader/SectionHeader.gss index 9e55aefa556..f9854757a6e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/sectionHeader/SectionHeader.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/mobile/partials/sectionHeader/SectionHeader.gss @@ -34,8 +34,6 @@ margin: -1em 1em -1em 0; background-size: contain; background-position: center; - -webkit-filter: grayscale(100%); - filter: grayscale(100%); } .sectionheader_item_image_seperator { position: absolute; From bbc6a913a2166260760310505d1c2dc6f7d86323 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 16:55:31 +0200 Subject: [PATCH 170/219] Regatta icons are colored in regatta list --- .../client/place/event/partials/regattaHeader/RegattaHeader.gss | 2 -- 1 file changed, 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.gss index 9b0463f4391..52b6701c6da 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/regattaHeader/RegattaHeader.gss @@ -24,8 +24,6 @@ background-size: contain; background-position: center; background-repeat: no-repeat; - -webkit-filter: grayscale(100%); - filter: grayscale(100%); } .regattaheader_logo img { display: inline-block; From c79f28ea3c30e1f3be2be8de524c412974d98f7c Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 16:58:32 +0200 Subject: [PATCH 171/219] Event logo as place navigation --- .../client/place/event/partials/header/EventHeader.java | 6 +++++- .../client/place/event/partials/header/EventHeader.ui.xml | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.java index 854d64e843d..c9f1b8ccbf1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.java @@ -41,6 +41,8 @@ public class EventHeader extends Composite { @UiField StringMessages i18n; @UiField DivElement eventLogo; + @UiField + AnchorElement eventLogoAnchorUi; @UiField HeadingElement staticTitle; @UiField SpanElement eventName; @UiField DivElement eventState; @@ -97,7 +99,9 @@ public class EventHeader extends Composite { private void initFields() { LogoUtil.setEventLogo(eventLogo, event); - + if (presenter.showRegattaMetadata()) { + presenter.getCurrentEventNavigation().configureAnchorElement(eventLogoAnchorUi); + } String eventDisplayName = event.getDisplayName(); String nameToShow; if(presenter.showRegattaMetadata()) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.ui.xml index dd42d71a412..a5afb03d77f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/header/EventHeader.ui.xml @@ -10,7 +10,7 @@
-
+
From 48630ab5dfe271529465d3ea0a71905e2e336859 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 17:10:59 +0200 Subject: [PATCH 172/219] Regatta list - Added legend to explain regatta progres bars --- .../MultiRegattaListStepsLegend.java | 19 ++++++++ .../MultiRegattaListStepsLegend.ui.xml | 44 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsLegend.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsLegend.ui.xml diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsLegend.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsLegend.java new file mode 100644 index 00000000000..8fd14b1c925 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsLegend.java @@ -0,0 +1,19 @@ +package com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.user.client.ui.Widget; + +public class MultiRegattaListStepsLegend extends Widget { + + private static MultiRegattaListStepsLegendUiBinder uiBinder = GWT.create(MultiRegattaListStepsLegendUiBinder.class); + + interface MultiRegattaListStepsLegendUiBinder extends UiBinder { + } + + public MultiRegattaListStepsLegend() { + setElement(uiBinder.createAndBindUi(this)); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsLegend.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsLegend.ui.xml new file mode 100644 index 00000000000..dc507c03d19 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsLegend.ui.xml @@ -0,0 +1,44 @@ + + + + + .multiregatta_steps_legend { + font-size: 1rem; + } + .multiregatta_steps_legend_item { + display: inline-block; + padding: 0.4em 0.666666666666667em; + margin: 0.333333333333333em 0.666666666666667em 0.333333333333333em 0; + font-size: 0.666em; + font-weight: 700; + line-height: 0.666666666666667em; + border: 1px solid #008fcc; + } + .multiregatta_steps_legend_item_finished { + color: #fff; + border-color: #ccc; + background-color: #f0ab00; + } + .multiregatta_steps_legend_item_live { + color: #fff; + border-color: #e94a1b; + background-color: #e94a1b; + } + .multiregatta_steps_legend_item_planned { + color: #ccc; + border-color: #ccc; + background-color: #fff; + } + +
+
+ +
+
+ +
+
+ +
+
+
\ No newline at end of file From ddcbf213ed49fb2f829a37a9e96e3f6289f11d99 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 17:11:40 +0200 Subject: [PATCH 173/219] Regatta list - Integrated legend to multi regatta overview and regatta list --- .../tabs/MultiregattaOverviewTabView.ui.xml | 14 +++++++++++++- .../tabs/MultiregattaRegattasTabView.ui.xml | 18 +++++++++++------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.ui.xml index 8f393b6e502..65bff5ac77e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.ui.xml @@ -3,12 +3,24 @@ xmlns:p="urn:import:com.sap.sailing.gwt.home.client.place.event.partials" xmlns:o="urn:import:com.sap.sailing.gwt.home.client.place.event.overview"> + + .legend_and_filter { + text-align: right; + } + .legend_and_filter > div { + display: inline-block; + vertical-align: middle; + } +
- +
+ + +
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml index bcf92b4f8d2..5c09f742e01 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml @@ -3,18 +3,22 @@ - .space-top { - margin-top: 2em; + .legend_and_filter { + text-align: right; } - .space-bottom { - margin-bottom: 2em; + .legend_and_filter > div { + display: inline-block; + vertical-align: middle; }
-
- - +
+ +
+ + +
From b19b5d5807462709fcb628dd29bf517e86d96f4e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 14 Jul 2015 17:13:05 +0200 Subject: [PATCH 174/219] embed RaceCourseDTO in CoursePositionsDTO so that the sequence of waypoints becomes clear; shares MarkDTOs for efficiency --- .../ui/actions/GetCoursePositionsAction.java | 26 ------------------- .../gwt/ui/server/SailingServiceImpl.java | 10 +++---- 2 files changed, 5 insertions(+), 31 deletions(-) delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetCoursePositionsAction.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetCoursePositionsAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetCoursePositionsAction.java deleted file mode 100644 index 0fb4ffb6cb4..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/actions/GetCoursePositionsAction.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sap.sailing.gwt.ui.actions; - -import java.util.Date; - -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; -import com.sap.sailing.gwt.ui.client.SailingServiceAsync; -import com.sap.sailing.gwt.ui.shared.CoursePositionsDTO; -import com.sap.sse.gwt.client.async.AsyncAction; - -public class GetCoursePositionsAction implements AsyncAction { - private final SailingServiceAsync sailingService; - private final RegattaAndRaceIdentifier raceIdentifier; - private final Date date; - - public GetCoursePositionsAction(SailingServiceAsync sailingService, RegattaAndRaceIdentifier raceIdentifier, Date date) { - this.sailingService = sailingService; - this.raceIdentifier = raceIdentifier; - this.date = date; - } - - @Override - public void execute(AsyncCallback callback) { - sailingService.getCoursePositions(raceIdentifier, date, callback); - } -} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index b26da614b0b..66420347069 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -1865,11 +1865,11 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S marks.add(b); } } - for (Mark mark : marks) { - GPSFixTrack track = trackedRace.getOrCreateTrack(mark); - Position positionAtDate = track.getEstimatedPosition(dateAsTimePoint, /* extrapolate */false); - if (positionAtDate != null) { - result.marks.add(convertToMarkDTO(mark, positionAtDate)); + for (final WaypointDTO waypointDTO : result.course.waypoints) { + for (final MarkDTO markDTO : waypointDTO.controlPoint.getMarks()) { + if (markDTO.position != null) { + result.marks.add(markDTO); + } } } From 48f016b0fbaf97293cc1fdfec983b3565f59791a Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Tue, 14 Jul 2015 17:16:48 +0200 Subject: [PATCH 175/219] Using local works directories for SDM to reduce amout of temp files --- java/com.sap.sailing.gwt.ui/.tmp/gwt-work/.gitignore | 1 + java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch | 4 ++-- java/com.sap.sse.security.ui/.tmp/gwt-work/.gitignore | 1 + java/com.sap.sse.security.ui/Security UI sdm.launch | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/.tmp/gwt-work/.gitignore create mode 100644 java/com.sap.sse.security.ui/.tmp/gwt-work/.gitignore diff --git a/java/com.sap.sailing.gwt.ui/.tmp/gwt-work/.gitignore b/java/com.sap.sailing.gwt.ui/.tmp/gwt-work/.gitignore new file mode 100644 index 00000000000..3e3e47daf0f --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/.tmp/gwt-work/.gitignore @@ -0,0 +1 @@ +com.* diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch index 33e498bd16d..f64162a6d60 100644 --- a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch @@ -70,7 +70,7 @@ - + - + diff --git a/java/com.sap.sse.security.ui/.tmp/gwt-work/.gitignore b/java/com.sap.sse.security.ui/.tmp/gwt-work/.gitignore new file mode 100644 index 00000000000..3e3e47daf0f --- /dev/null +++ b/java/com.sap.sse.security.ui/.tmp/gwt-work/.gitignore @@ -0,0 +1 @@ +com.* diff --git a/java/com.sap.sse.security.ui/Security UI sdm.launch b/java/com.sap.sse.security.ui/Security UI sdm.launch index fce3bab6e54..61f2e3c85a0 100755 --- a/java/com.sap.sse.security.ui/Security UI sdm.launch +++ b/java/com.sap.sse.security.ui/Security UI sdm.launch @@ -43,7 +43,7 @@ - + From 822f86192cf92a30f7c01fc8cb73a2ee5fad5fbc Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 17:56:45 +0200 Subject: [PATCH 176/219] Fixed highcharts/ entry point ordering --- .../sap/sailing/gwt/home/shared/SwitchingEntryPoint.java | 2 +- .../resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml | 2 +- .../resources/com/sap/sailing/gwt/ui/PolarSheets.gwt.xml | 3 ++- .../main/resources/com/sap/sailing/gwt/ui/Simulator.gwt.xml | 6 ++++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/SwitchingEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/SwitchingEntryPoint.java index f7d0cf8138c..686007a75a3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/SwitchingEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/SwitchingEntryPoint.java @@ -152,7 +152,7 @@ public class SwitchingEntryPoint implements EntryPoint { } private void configureDesktopHeader() { - metaElement("viewport", "width=device-width,initial-scale=0.5,maximum-scale=1"); + metaElement("viewport", "width=device-width,initial-scale=0.5,maximum-scale=2"); } private void configureMobileHeader() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml index e4e99b518f1..e098ff0fd05 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml @@ -24,7 +24,6 @@ - @@ -43,5 +42,6 @@ + \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/PolarSheets.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/PolarSheets.gwt.xml index 097de8c561b..84d10e354f5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/PolarSheets.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/PolarSheets.gwt.xml @@ -6,7 +6,6 @@ - @@ -38,4 +37,6 @@ + + \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/Simulator.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/Simulator.gwt.xml index cbdc948f6c7..cdb1604cf67 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/Simulator.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/Simulator.gwt.xml @@ -23,8 +23,6 @@ - - @@ -44,4 +42,8 @@ It generates a set of files in WEB-INF/deploy; those files need to be placed on the server --> + + + + \ No newline at end of file From 69f16a536ecda16b26a97cbbc8a2cdcea78bba26 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 18:17:14 +0200 Subject: [PATCH 177/219] Regatta list - Adjusted legend to explain regatta progres bars --- .../multiRegattaList/MultiRegattaListStepsLegend.ui.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsLegend.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsLegend.ui.xml index dc507c03d19..420b9d0cd60 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsLegend.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/multiRegattaList/MultiRegattaListStepsLegend.ui.xml @@ -4,11 +4,12 @@ .multiregatta_steps_legend { font-size: 1rem; + text-align: right; } .multiregatta_steps_legend_item { display: inline-block; padding: 0.4em 0.666666666666667em; - margin: 0.333333333333333em 0.666666666666667em 0.333333333333333em 0; + margin: 0.333333333333333em 0 0.333333333333333em 0.666666666666667em; font-size: 0.666em; font-weight: 700; line-height: 0.666666666666667em; From c8358c85c748429573e916e56e37eacd7c9aed2d Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Tue, 14 Jul 2015 18:17:32 +0200 Subject: [PATCH 178/219] Regatta list - Integrated legend to regatta races overview --- .../place/event/regatta/tabs/RegattaRacesTabView.ui.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml index 91b158813c9..6c075f51380 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.ui.xml @@ -6,9 +6,14 @@ .listContainer > div { margin-bottom: 2em; } + .legend { + margin-top: 2em; + margin-bottom: -1.5em; + }
+
From 6f0991dee69b4609281fe0e1e3dd49a67a069561 Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Tue, 14 Jul 2015 18:26:34 +0200 Subject: [PATCH 179/219] Style fixes --- .../main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml | 2 +- java/com.sap.sailing.www/clean/sailing-clean-1.0.cache.css | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml index e4e99b518f1..e098ff0fd05 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml @@ -24,7 +24,6 @@ - @@ -43,5 +42,6 @@ + \ No newline at end of file diff --git a/java/com.sap.sailing.www/clean/sailing-clean-1.0.cache.css b/java/com.sap.sailing.www/clean/sailing-clean-1.0.cache.css index 31e30169820..4f765a519e3 100644 --- a/java/com.sap.sailing.www/clean/sailing-clean-1.0.cache.css +++ b/java/com.sap.sailing.www/clean/sailing-clean-1.0.cache.css @@ -30,11 +30,9 @@ select { cursor: pointer; cursor: hand; font-size:small; - background: url("images/hborder.png") repeat-x 0px -2077px; border:1px solid #bbb; border-bottom: 1px solid #a0a0a0; border-radius: 3px; - -moz-border-radius: 3px; } .gwt-Button:active { border: 1px inset #ccc; From 8ef0c9a34361255a379f707f75ee0a0548d7224d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 14 Jul 2015 23:35:33 +0200 Subject: [PATCH 180/219] refactored drawing of course middle line so it becomes re-usable also for course geometry display --- .../sailing/gwt/ui/client/StringMessages.java | 1 + .../gwt/ui/client/StringMessages.properties | 3 +- .../ui/client/StringMessages_de.properties | 3 +- .../ui/client/StringMessages_ru.properties | 3 +- .../ui/client/StringMessages_zh.properties | 3 +- .../gwt/ui/client/shared/racemap/RaceMap.java | 113 +++++++++++------- 6 files changed, 77 insertions(+), 49 deletions(-) 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 fbb7e043d03..a41e159bcb4 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 @@ -1320,4 +1320,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String hoursAgo(String hours); String selectCompetitor(); String courseGeometry(); + String degreesToWind(String diff); } 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 61a50506373..e8b97368595 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 @@ -1287,4 +1287,5 @@ now=Now minutesAgo={0} min ago hoursAgo={0} h ago selectCompetitor=Please select one competitor -courseGeometry=Course Geometry \ No newline at end of file +courseGeometry=Course Geometry +degreesToWind={0}° to wind \ 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 ef44b0e0d5f..f929f94cb0c 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 @@ -1277,4 +1277,5 @@ now=Jetzt minutesAgo=vor {0} min hoursAgo=vor {0} h selectCompetitor=Bitte einen Teilnehmer auswählen -courseGeometry=Kursgeometrie \ No newline at end of file +courseGeometry=Kursgeometrie +degreesToWind={0}° zum Wind \ 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_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index b706fe9e511..8d5e2281c88 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1225,4 +1225,5 @@ now=в настоящее время minutesAgo={0} минут назад hoursAgo={0} h часов назад selectCompetitor=Please select one competitor -courseGeometry=Course Geometry \ No newline at end of file +courseGeometry=Course Geometry +degreesToWind={0}° to wind \ 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_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index cac19a55644..9164ffce991 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1274,4 +1274,5 @@ raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSecondsTooltip=Ca sailorInfo=水手信息 sailorInfoLongText=Find here Notice Board,\nProtests, Sailor weather: selectCompetitor=Please select one competitor -courseGeometry=Course Geometry \ No newline at end of file +courseGeometry=Course Geometry +degreesToWind={0}° to wind \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 645f6064d92..903a4a95248 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -762,7 +762,6 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe getRaceMapDataCallback(oldTime, newTime, fromAndToAndOverlap.getC(), competitorsToShow, requestID)); // draw the wind into the map, get the combined wind - // TODO bug2057 also fetch wind for LEG_MIDDLE for all legs because this needs to be the basis for the advantage line display List windSourceTypeNames = new ArrayList(); windSourceTypeNames.add(WindSourceType.EXPEDITION.name()); windSourceTypeNames.add(WindSourceType.COMBINED.name()); @@ -1306,7 +1305,8 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe private void showCourseGeometryMetrics(final CoursePositionsDTO courseDTO) { if (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) && courseDTO.startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1) { - + // based on the courseDTO, find the symmetrical pairs of marks that form legs, regardless the to/from + // direction, draw those } } @@ -1515,55 +1515,78 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe finishLine = null; } } + final int zeroBasedIndexOfStartWaypoint = legOfLeadingCompetitor-1; // draw the course middle line - if (legOfLeadingCompetitor > 0 && courseDTO.waypointPositions.size() > legOfLeadingCompetitor && - settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEMIDDLELINE)) { - Position position1DTO = courseDTO.waypointPositions.get(legOfLeadingCompetitor-1); - Position position2DTO = courseDTO.waypointPositions.get(legOfLeadingCompetitor); - LatLng courseMiddleLinePoint1 = coordinateSystem.toLatLng(position1DTO); - LatLng courseMiddleLinePoint2 = coordinateSystem.toLatLng(position2DTO); - if (courseMiddleLine == null) { - PolylineOptions options = PolylineOptions.newInstance(); - options.setClickable(true); - options.setGeodesic(true); - options.setStrokeColor("#2268a0"); - options.setStrokeWeight(1); - options.setStrokeOpacity(1.0); - - MVCArray pointsAsArray = MVCArray.newInstance(); - pointsAsArray.insertAt(0, courseMiddleLinePoint1); - pointsAsArray.insertAt(1, courseMiddleLinePoint2); + final boolean showCourseMiddleLine = legOfLeadingCompetitor > 0 && courseDTO.waypointPositions.size() > legOfLeadingCompetitor && + settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEMIDDLELINE); + courseMiddleLine = showCourseMiddleLine(courseDTO, courseMiddleLine, + zeroBasedIndexOfStartWaypoint, showCourseMiddleLine); + } + } - courseMiddleLine = Polyline.newInstance(options); - courseMiddleLine.setPath(pointsAsArray); - - courseMiddleLine.addMouseOverHandler(new MouseOverMapHandler() { - @Override - public void onEvent(MouseOverMapEvent event) { - map.setTitle(stringMessages.courseMiddleLine()); + private Polyline showCourseMiddleLine(final CoursePositionsDTO courseDTO, Polyline lineToShowOrRemoveOrUpdate, + final int zeroBasedIndexOfStartWaypoint, final boolean showLine) { + if (showLine) { + final Position position1DTO = courseDTO.waypointPositions.get(zeroBasedIndexOfStartWaypoint); + final Position position2DTO = courseDTO.waypointPositions.get(zeroBasedIndexOfStartWaypoint+1); + LatLng courseMiddleLinePoint1 = coordinateSystem.toLatLng(position1DTO); + LatLng courseMiddleLinePoint2 = coordinateSystem.toLatLng(position2DTO); + final MVCArray pointsAsArray; + if (lineToShowOrRemoveOrUpdate == null) { + PolylineOptions options = PolylineOptions.newInstance(); + options.setClickable(true); + options.setGeodesic(true); + options.setStrokeColor("#2268a0"); + options.setStrokeWeight(1); + options.setStrokeOpacity(1.0); + pointsAsArray = MVCArray.newInstance(); + lineToShowOrRemoveOrUpdate = Polyline.newInstance(options); + lineToShowOrRemoveOrUpdate.setPath(pointsAsArray); + lineToShowOrRemoveOrUpdate.addMouseOverHandler(new MouseOverMapHandler() { + @Override + public void onEvent(MouseOverMapEvent event) { + final StringBuilder sb = new StringBuilder(); + sb.append(stringMessages.courseMiddleLine()); + sb.append('\n'); + sb.append(NumberFormat.getFormat("0").format( + Math.abs(position1DTO.getDistance(position2DTO).getMeters()))+stringMessages.metersUnit()); + if (lastCombinedWindTrackInfoDTO != null) { + final WindTrackInfoDTO windTrackAtLegMiddle = lastCombinedWindTrackInfoDTO.getCombinedWindOnLegMiddle(zeroBasedIndexOfStartWaypoint); + if (windTrackAtLegMiddle != null && windTrackAtLegMiddle.windFixes != null && !windTrackAtLegMiddle.windFixes.isEmpty()) { + WindDTO windAtLegMiddle = windTrackAtLegMiddle.windFixes.get(0); + final double legBearingDeg = position1DTO.getBearingGreatCircle(position2DTO).getDegrees(); + final String diff = NumberFormat.getFormat("0.0").format( + Math.min(Math.abs(windAtLegMiddle.dampenedTrueWindBearingDeg-legBearingDeg), + Math.abs(windAtLegMiddle.dampenedTrueWindFromDeg-legBearingDeg))); + sb.append(", "); + sb.append(stringMessages.degreesToWind(diff)); + } } - }); - courseMiddleLine.addMouseOutMoveHandler(new MouseOutMapHandler() { - @Override - public void onEvent(MouseOutMapEvent event) { - map.setTitle(""); - } - }); - courseMiddleLine.setMap(map); - } else { - courseMiddleLine.getPath().removeAt(1); - courseMiddleLine.getPath().removeAt(0); - courseMiddleLine.getPath().insertAt(0, courseMiddleLinePoint1); - courseMiddleLine.getPath().insertAt(1, courseMiddleLinePoint2); - } + map.setTitle(sb.toString()); + } + }); + lineToShowOrRemoveOrUpdate.addMouseOutMoveHandler(new MouseOutMapHandler() { + @Override + public void onEvent(MouseOutMapEvent event) { + map.setTitle(""); + } + }); + lineToShowOrRemoveOrUpdate.setMap(map); + } else { + pointsAsArray = lineToShowOrRemoveOrUpdate.getPath(); + pointsAsArray.removeAt(1); + pointsAsArray.removeAt(0); } - else { - if (courseMiddleLine != null) { - courseMiddleLine.setMap(null); - courseMiddleLine = null; - } + pointsAsArray.insertAt(0, courseMiddleLinePoint1); + pointsAsArray.insertAt(1, courseMiddleLinePoint2); + } + else { + if (lineToShowOrRemoveOrUpdate != null) { + lineToShowOrRemoveOrUpdate.setMap(null); + lineToShowOrRemoveOrUpdate = null; } } + return lineToShowOrRemoveOrUpdate; } /** From 3ccc03f43bf1a8d381b3ec0495af120908e61233 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 14 Jul 2015 23:39:33 +0200 Subject: [PATCH 181/219] added course geometry checkbox to settings dialog --- .../ui/client/shared/racemap/RaceMapSettingsDialogComponent.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettingsDialogComponent.java index 8244f485880..1113211fef4 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettingsDialogComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettingsDialogComponent.java @@ -195,6 +195,7 @@ public class RaceMapSettingsDialogComponent implements SettingsDialogComponent Date: Tue, 14 Jul 2015 23:49:39 +0200 Subject: [PATCH 182/219] added a bunch of TODOs about bug3027 in RaceMap --- .../com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 903a4a95248..09e91a6ad15 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -1460,6 +1460,10 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe startLine = null; } } + // TODO bug3027: also show advantage information for all other gates/lines; generalize CoursePositionsDTO line structures to provide this info + // TODO bug3027: show SmallTransparentInfoOverlay in addition to tooltip if course geometry option is true; remove it if option is false + // TODO bug3027: show *all* course middle lines if course geometry option is true + // draw the finish line if (legOfLeadingCompetitor > 0 && legOfLeadingCompetitor == numberOfLegs && settings.getHelpLinesSettings().isVisible(HelpLineTypes.FINISHLINE) && courseDTO.finishMarkPositions != null && courseDTO.finishMarkPositions.size() == 2) { From 7221adbb7694a37b81f63ed1d24a6d0a830a6835 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Jul 2015 09:16:36 +0200 Subject: [PATCH 183/219] started to harmonize how start/finish line are drawn; will be able to remove specific position fields for start/finish line shortly --- .../gwt/ui/client/shared/racemap/RaceMap.java | 24 ++++++++++--------- .../gwt/ui/raceboard/RaceBoardEntryPoint.java | 1 + 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 09e91a6ad15..9874be75005 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -110,6 +110,7 @@ import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO; import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO; import com.sap.sailing.gwt.ui.shared.SidelineDTO; import com.sap.sailing.gwt.ui.shared.SpeedWithBearingDTO; +import com.sap.sailing.gwt.ui.shared.WaypointDTO; import com.sap.sailing.gwt.ui.shared.WindDTO; import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO; import com.sap.sailing.gwt.ui.shared.WindTrackInfoDTO; @@ -1401,13 +1402,14 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe private final StringBuilder finishLineAdvantageText = new StringBuilder(); private void showStartAndFinishLines(final CoursePositionsDTO courseDTO) { - if (map != null && courseDTO != null && lastRaceTimesInfo != null) { + if (map != null && courseDTO != null && courseDTO.course != null && courseDTO.course.waypoints != null && + !courseDTO.course.waypoints.isEmpty() && lastRaceTimesInfo != null) { com.sap.sse.common.Util.Pair leadingVisibleCompetitorInfo = getFarthestAheadVisibleCompetitorWithOneBasedLegNumber(getCompetitorsToShow()); - int legOfLeadingCompetitor = leadingVisibleCompetitorInfo == null ? -1 : leadingVisibleCompetitorInfo.getA(); - int numberOfLegs = lastRaceTimesInfo.legInfos.size(); + int oneBasedLegOfLeadingCompetitor = leadingVisibleCompetitorInfo == null ? -1 : leadingVisibleCompetitorInfo.getA(); + int numberOfLegs = courseDTO.course.waypoints.size()-1; // draw the start line - updateCountdownCanvas(courseDTO.startMarkPositions); - if (legOfLeadingCompetitor <= 1 && + updateCountdownCanvas(courseDTO.course.waypoints.get(0)); + if (oneBasedLegOfLeadingCompetitor <= 1 && settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINE) && courseDTO.startMarkPositions != null && courseDTO.startMarkPositions.size() == 2) { LatLng startLinePoint1 = coordinateSystem.toLatLng(courseDTO.startMarkPositions.get(0)); LatLng startLinePoint2 = coordinateSystem.toLatLng(courseDTO.startMarkPositions.get(1)); @@ -1465,7 +1467,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe // TODO bug3027: show *all* course middle lines if course geometry option is true // draw the finish line - if (legOfLeadingCompetitor > 0 && legOfLeadingCompetitor == numberOfLegs && + if (oneBasedLegOfLeadingCompetitor > 0 && oneBasedLegOfLeadingCompetitor == numberOfLegs && settings.getHelpLinesSettings().isVisible(HelpLineTypes.FINISHLINE) && courseDTO.finishMarkPositions != null && courseDTO.finishMarkPositions.size() == 2) { LatLng finishLinePoint1 = coordinateSystem.toLatLng(courseDTO.finishMarkPositions.get(0)); LatLng finishLinePoint2 = coordinateSystem.toLatLng(courseDTO.finishMarkPositions.get(1)); @@ -1519,9 +1521,9 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe finishLine = null; } } - final int zeroBasedIndexOfStartWaypoint = legOfLeadingCompetitor-1; + final int zeroBasedIndexOfStartWaypoint = oneBasedLegOfLeadingCompetitor-1; // draw the course middle line - final boolean showCourseMiddleLine = legOfLeadingCompetitor > 0 && courseDTO.waypointPositions.size() > legOfLeadingCompetitor && + final boolean showCourseMiddleLine = oneBasedLegOfLeadingCompetitor > 0 && courseDTO.waypointPositions.size() > oneBasedLegOfLeadingCompetitor && settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEMIDDLELINE); courseMiddleLine = showCourseMiddleLine(courseDTO, courseMiddleLine, zeroBasedIndexOfStartWaypoint, showCourseMiddleLine); @@ -1598,8 +1600,8 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe * still in the pre-start phase, show a {@link SmallTransparentInfoOverlay} at the * start line that shows the count down. */ - private void updateCountdownCanvas(List startMarkPositions) { - if (!settings.isShowSelectedCompetitorsInfo() || startMarkPositions == null || startMarkPositions.isEmpty() + private void updateCountdownCanvas(WaypointDTO startWaypoint) { + if (!settings.isShowSelectedCompetitorsInfo() || startWaypoint == null || Util.isEmpty(startWaypoint.controlPoint.getMarks()) || lastRaceTimesInfo.startOfRace == null || timer.getTime().after(lastRaceTimesInfo.startOfRace)) { if (countDownOverlay != null) { countDownOverlay.removeFromMap(); @@ -1616,7 +1618,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe } else { countDownOverlay.setInfoText(countDownText); } - countDownOverlay.setPosition(startMarkPositions.get(startMarkPositions.size() - 1), -1); + countDownOverlay.setPosition(startWaypoint.controlPoint.getMarks().iterator().next().position, /* transition time */ -1); countDownOverlay.draw(); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java index 7d9e1c75e65..0453c7aac17 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java @@ -58,6 +58,7 @@ public class RaceBoardEntryPoint extends AbstractSailingEntryPoint { @Override protected void doOnModuleLoad() { + GWT.debugger(); // TODO remove again super.doOnModuleLoad(); EntryPointHelper.registerASyncService((ServiceDefTarget) mediaService, RemoteServiceMappingConstants.mediaServiceRemotePath); // read mandatory parameters From 997eea8a4f8f01daed10f5ae3b5edd1a288ccdf4 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Jul 2015 10:32:49 +0200 Subject: [PATCH 184/219] use same code to draw start, finish and course middle lines --- .../gwt/ui/client/shared/racemap/RaceMap.java | 238 ++++++++---------- .../gwt/ui/server/SailingServiceImpl.java | 17 -- .../gwt/ui/shared/CoursePositionsDTO.java | 23 +- 3 files changed, 119 insertions(+), 159 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 9874be75005..08901f75699 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -1304,8 +1304,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe } private void showCourseGeometryMetrics(final CoursePositionsDTO courseDTO) { - if (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) - && courseDTO.startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1) { + if (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE)) { // based on the courseDTO, find the symmetrical pairs of marks that form legs, regardless the to/from // direction, draw those } @@ -1315,18 +1314,19 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe private final StringBuilder leewardStartLineMarkToFirstMarkLineText = new StringBuilder(); private void showStartLineToFirstMarkTriangle(final CoursePositionsDTO courseDTO){ + final List startMarkPositions = courseDTO.getStartMarkPositions(); if (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) - && courseDTO.startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1) { - LatLng windwardStartLinePoint = coordinateSystem.toLatLng(courseDTO.startMarkPositions.get(0)); - LatLng leewardStartLinePoint = coordinateSystem.toLatLng(courseDTO.startMarkPositions.get(1)); + && startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1) { + LatLng windwardStartLinePoint = coordinateSystem.toLatLng(startMarkPositions.get(0)); + LatLng leewardStartLinePoint = coordinateSystem.toLatLng(startMarkPositions.get(1)); LatLng firstMarkPoint = coordinateSystem.toLatLng(courseDTO.waypointPositions.get(1)); windwardStartLineMarkToFirstMarkLineText.replace(0, windwardStartLineMarkToFirstMarkLineText.length(), stringMessages.startLineToFirstMarkTriangle(numberFormatOneDecimal - .format(courseDTO.startMarkPositions.get(0).getDistance(courseDTO.waypointPositions.get(1)) + .format(startMarkPositions.get(0).getDistance(courseDTO.waypointPositions.get(1)) .getMeters()))); leewardStartLineMarkToFirstMarkLineText.replace(0, leewardStartLineMarkToFirstMarkLineText.length(), stringMessages.startLineToFirstMarkTriangle(numberFormatOneDecimal - .format(courseDTO.startMarkPositions.get(1).getDistance(courseDTO.waypointPositions.get(1)) + .format(startMarkPositions.get(1).getDistance(courseDTO.waypointPositions.get(1)) .getMeters()))); if (windwardStartLineMarkToFirstMarkLine == null && leewardStartLineMarkToFirstMarkLine == null) { PolylineOptions options = PolylineOptions.newInstance(); @@ -1408,133 +1408,113 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe int oneBasedLegOfLeadingCompetitor = leadingVisibleCompetitorInfo == null ? -1 : leadingVisibleCompetitorInfo.getA(); int numberOfLegs = courseDTO.course.waypoints.size()-1; // draw the start line - updateCountdownCanvas(courseDTO.course.waypoints.get(0)); - if (oneBasedLegOfLeadingCompetitor <= 1 && - settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINE) && courseDTO.startMarkPositions != null && courseDTO.startMarkPositions.size() == 2) { - LatLng startLinePoint1 = coordinateSystem.toLatLng(courseDTO.startMarkPositions.get(0)); - LatLng startLinePoint2 = coordinateSystem.toLatLng(courseDTO.startMarkPositions.get(1)); - if (courseDTO.startLineAngleToCombinedWind != null) { - startLineAdvantageText.replace(0, startLineAdvantageText.length(), " "+stringMessages.lineAngleToWindAndAdvantage( - NumberFormat.getFormat("0.0").format(courseDTO.startLineLengthInMeters), - NumberFormat.getFormat("0.0").format(Math.abs(courseDTO.startLineAngleToCombinedWind)), - courseDTO.startLineAdvantageousSide.name().charAt(0)+courseDTO.startLineAdvantageousSide.name().substring(1).toLowerCase(), - NumberFormat.getFormat("0.0").format(courseDTO.startLineAdvantageInMeters))); - } else { - startLineAdvantageText.delete(0, startLineAdvantageText.length()); - } - if (startLine == null) { - PolylineOptions options = PolylineOptions.newInstance(); - options.setClickable(true); - options.setGeodesic(true); - options.setStrokeColor("#FFFFFF"); - options.setStrokeWeight(1); - options.setStrokeOpacity(1.0); - - MVCArray pointsAsArray = MVCArray.newInstance(); - pointsAsArray.insertAt(0, startLinePoint1); - pointsAsArray.insertAt(1, startLinePoint2); - - startLine = Polyline.newInstance(options); - startLine.setPath(pointsAsArray); - - startLine.addMouseOverHandler(new MouseOverMapHandler() { - @Override - public void onEvent(MouseOverMapEvent event) { - map.setTitle(stringMessages.startLine()+startLineAdvantageText); - } - }); - startLine.addMouseOutMoveHandler(new MouseOutMapHandler() { - @Override - public void onEvent(MouseOutMapEvent event) { - map.setTitle(""); - } - }); - startLine.setMap(map); - } else { - startLine.getPath().removeAt(1); - startLine.getPath().removeAt(0); - startLine.getPath().insertAt(0, startLinePoint1); - startLine.getPath().insertAt(1, startLinePoint2); - } + final WaypointDTO startWaypoint = courseDTO.course.waypoints.get(0); + updateCountdownCanvas(startWaypoint); + final Position startLineLeftPosition = courseDTO.getStartMarkPositions().get(0); + final Position startLineRightPosition = courseDTO.getStartMarkPositions().get(1); + if (courseDTO.startLineAngleToCombinedWind != null) { + startLineAdvantageText.replace(0, startLineAdvantageText.length(), " "+stringMessages.lineAngleToWindAndAdvantage( + NumberFormat.getFormat("0.0").format(courseDTO.startLineLengthInMeters), + NumberFormat.getFormat("0.0").format(Math.abs(courseDTO.startLineAngleToCombinedWind)), + courseDTO.startLineAdvantageousSide.name().charAt(0)+courseDTO.startLineAdvantageousSide.name().substring(1).toLowerCase(), + NumberFormat.getFormat("0.0").format(courseDTO.startLineAdvantageInMeters))); } else { - if (startLine != null) { - startLine.setMap(null); - startLine = null; - } + startLineAdvantageText.delete(0, startLineAdvantageText.length()); } + final MouseOverMapHandler startLineTooltipHandler = new MouseOverMapHandler() { + @Override + public void onEvent(MouseOverMapEvent event) { + map.setTitle(stringMessages.startLine()+startLineAdvantageText); + } + }; + startLine = showOrRemoveOrUpdateLine(startLine, /* showLine */ oneBasedLegOfLeadingCompetitor <= 1 && + settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINE) && + courseDTO.getStartMarkPositions().size() == 2, startLineLeftPosition, startLineRightPosition, startLineTooltipHandler, "#ffffff"); // TODO bug3027: also show advantage information for all other gates/lines; generalize CoursePositionsDTO line structures to provide this info // TODO bug3027: show SmallTransparentInfoOverlay in addition to tooltip if course geometry option is true; remove it if option is false // TODO bug3027: show *all* course middle lines if course geometry option is true // draw the finish line - if (oneBasedLegOfLeadingCompetitor > 0 && oneBasedLegOfLeadingCompetitor == numberOfLegs && - settings.getHelpLinesSettings().isVisible(HelpLineTypes.FINISHLINE) && courseDTO.finishMarkPositions != null && courseDTO.finishMarkPositions.size() == 2) { - LatLng finishLinePoint1 = coordinateSystem.toLatLng(courseDTO.finishMarkPositions.get(0)); - LatLng finishLinePoint2 = coordinateSystem.toLatLng(courseDTO.finishMarkPositions.get(1)); - if (courseDTO.startLineAngleToCombinedWind != null) { - finishLineAdvantageText.replace(0, finishLineAdvantageText.length(), " "+stringMessages.lineAngleToWindAndAdvantage( - NumberFormat.getFormat("0.0").format(courseDTO.finishLineLengthInMeters), - NumberFormat.getFormat("0.0").format(Math.abs(courseDTO.finishLineAngleToCombinedWind)), - courseDTO.finishLineAdvantageousSide.name().charAt(0)+courseDTO.finishLineAdvantageousSide.name().substring(1).toLowerCase(), - NumberFormat.getFormat("0.0").format(courseDTO.finishLineAdvantageInMeters))); - } else { - finishLineAdvantageText.delete(0, finishLineAdvantageText.length()); - } - if (finishLine == null) { - PolylineOptions options = PolylineOptions.newInstance(); - options.setClickable(true); - options.setGeodesic(true); - options.setStrokeColor("#000000"); - options.setStrokeWeight(1); - options.setStrokeOpacity(1.0); - - MVCArray pointsAsArray = MVCArray.newInstance(); - pointsAsArray.insertAt(0, finishLinePoint1); - pointsAsArray.insertAt(1, finishLinePoint2); - - finishLine = Polyline.newInstance(options); - finishLine.setPath(pointsAsArray); - - finishLine.addMouseOverHandler(new MouseOverMapHandler() { - @Override - public void onEvent(MouseOverMapEvent event) { - map.setTitle(stringMessages.finishLine()+finishLineAdvantageText); - } - }); - finishLine.addMouseOutMoveHandler(new MouseOutMapHandler() { - @Override - public void onEvent(MouseOutMapEvent event) { - map.setTitle(""); - } - }); - finishLine.setMap(map); - } else { - finishLine.getPath().removeAt(1); - finishLine.getPath().removeAt(0); - finishLine.getPath().insertAt(0, finishLinePoint1); - finishLine.getPath().insertAt(1, finishLinePoint2); - } + final Position finishLineLeftPosition = courseDTO.getFinishMarkPositions().get(0); + final Position finishLineRightPosition = courseDTO.getFinishMarkPositions().get(1); + if (courseDTO.startLineAngleToCombinedWind != null) { + finishLineAdvantageText.replace(0, finishLineAdvantageText.length(), " "+stringMessages.lineAngleToWindAndAdvantage( + NumberFormat.getFormat("0.0").format(courseDTO.finishLineLengthInMeters), + NumberFormat.getFormat("0.0").format(Math.abs(courseDTO.finishLineAngleToCombinedWind)), + courseDTO.finishLineAdvantageousSide.name().charAt(0)+courseDTO.finishLineAdvantageousSide.name().substring(1).toLowerCase(), + NumberFormat.getFormat("0.0").format(courseDTO.finishLineAdvantageInMeters))); + } else { + finishLineAdvantageText.delete(0, finishLineAdvantageText.length()); } - else { - if (finishLine != null) { - finishLine.setMap(null); - finishLine = null; + final MouseOverMapHandler finishLineTooltipHandler = new MouseOverMapHandler() { + @Override + public void onEvent(MouseOverMapEvent event) { + map.setTitle(stringMessages.finishLine()+finishLineAdvantageText); } - } + }; + finishLine = showOrRemoveOrUpdateLine(finishLine, /* showLine */ oneBasedLegOfLeadingCompetitor > 0 && oneBasedLegOfLeadingCompetitor == numberOfLegs && + settings.getHelpLinesSettings().isVisible(HelpLineTypes.FINISHLINE) && courseDTO.getFinishMarkPositions() != null && courseDTO.getFinishMarkPositions().size() == 2, + finishLineLeftPosition, finishLineRightPosition, finishLineTooltipHandler, "#000000"); + final int zeroBasedIndexOfStartWaypoint = oneBasedLegOfLeadingCompetitor-1; // draw the course middle line final boolean showCourseMiddleLine = oneBasedLegOfLeadingCompetitor > 0 && courseDTO.waypointPositions.size() > oneBasedLegOfLeadingCompetitor && settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEMIDDLELINE); - courseMiddleLine = showCourseMiddleLine(courseDTO, courseMiddleLine, - zeroBasedIndexOfStartWaypoint, showCourseMiddleLine); + courseMiddleLine = showOrRemoveCourseMiddleLine(courseDTO, courseMiddleLine, zeroBasedIndexOfStartWaypoint, showCourseMiddleLine); } } - private Polyline showCourseMiddleLine(final CoursePositionsDTO courseDTO, Polyline lineToShowOrRemoveOrUpdate, + /** + * @param showLine + * tells whether or not to show the line; if the lineToShowOrRemoveOrUpdate references a + * line but the line shall not be shown, the line is removed from the map; conversely, if the line is not + * yet shown but shall be, a new line is created, added to the map and returned. If the line is shown and + * shall continue to be shown, the line is returned after updating its vertex coordinates. + * @return null if the line is not shown; the polyline object representing the line being displayed + * otherwise + */ + private Polyline showOrRemoveCourseMiddleLine(final CoursePositionsDTO courseDTO, Polyline lineToShowOrRemoveOrUpdate, final int zeroBasedIndexOfStartWaypoint, final boolean showLine) { + final Position position1DTO = courseDTO.waypointPositions.get(zeroBasedIndexOfStartWaypoint); + final Position position2DTO = courseDTO.waypointPositions.get(zeroBasedIndexOfStartWaypoint+1); + final MouseOverMapHandler tooltipHandler = new MouseOverMapHandler() { + @Override + public void onEvent(MouseOverMapEvent event) { + final StringBuilder sb = new StringBuilder(); + sb.append(stringMessages.courseMiddleLine()); + sb.append('\n'); + sb.append(NumberFormat.getFormat("0").format( + Math.abs(position1DTO.getDistance(position2DTO).getMeters()))+stringMessages.metersUnit()); + if (lastCombinedWindTrackInfoDTO != null) { + final WindTrackInfoDTO windTrackAtLegMiddle = lastCombinedWindTrackInfoDTO.getCombinedWindOnLegMiddle(zeroBasedIndexOfStartWaypoint); + if (windTrackAtLegMiddle != null && windTrackAtLegMiddle.windFixes != null && !windTrackAtLegMiddle.windFixes.isEmpty()) { + WindDTO windAtLegMiddle = windTrackAtLegMiddle.windFixes.get(0); + final double legBearingDeg = position1DTO.getBearingGreatCircle(position2DTO).getDegrees(); + final String diff = NumberFormat.getFormat("0.0").format( + Math.min(Math.abs(windAtLegMiddle.dampenedTrueWindBearingDeg-legBearingDeg), + Math.abs(windAtLegMiddle.dampenedTrueWindFromDeg-legBearingDeg))); + sb.append(", "); + sb.append(stringMessages.degreesToWind(diff)); + } + } + map.setTitle(sb.toString()); + } + }; + return showOrRemoveOrUpdateLine(lineToShowOrRemoveOrUpdate, showLine, position1DTO, position2DTO, tooltipHandler, "#2268a0"); + } + + /** + * @param showLine + * tells whether or not to show the line; if the lineToShowOrRemoveOrUpdate references a + * line but the line shall not be shown, the line is removed from the map; conversely, if the line is not + * yet shown but shall be, a new line is created, added to the map and returned. If the line is shown and + * shall continue to be shown, the line is returned after updating its vertex coordinates. + * @return null if the line is not shown; the polyline object representing the line being displayed + * otherwise + */ + private Polyline showOrRemoveOrUpdateLine(Polyline lineToShowOrRemoveOrUpdate, final boolean showLine, + final Position position1DTO, final Position position2DTO, final MouseOverMapHandler tooltipHandler, String lineColorRGB) { if (showLine) { - final Position position1DTO = courseDTO.waypointPositions.get(zeroBasedIndexOfStartWaypoint); - final Position position2DTO = courseDTO.waypointPositions.get(zeroBasedIndexOfStartWaypoint+1); LatLng courseMiddleLinePoint1 = coordinateSystem.toLatLng(position1DTO); LatLng courseMiddleLinePoint2 = coordinateSystem.toLatLng(position2DTO); final MVCArray pointsAsArray; @@ -1542,35 +1522,13 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe PolylineOptions options = PolylineOptions.newInstance(); options.setClickable(true); options.setGeodesic(true); - options.setStrokeColor("#2268a0"); + options.setStrokeColor(lineColorRGB); options.setStrokeWeight(1); options.setStrokeOpacity(1.0); pointsAsArray = MVCArray.newInstance(); lineToShowOrRemoveOrUpdate = Polyline.newInstance(options); lineToShowOrRemoveOrUpdate.setPath(pointsAsArray); - lineToShowOrRemoveOrUpdate.addMouseOverHandler(new MouseOverMapHandler() { - @Override - public void onEvent(MouseOverMapEvent event) { - final StringBuilder sb = new StringBuilder(); - sb.append(stringMessages.courseMiddleLine()); - sb.append('\n'); - sb.append(NumberFormat.getFormat("0").format( - Math.abs(position1DTO.getDistance(position2DTO).getMeters()))+stringMessages.metersUnit()); - if (lastCombinedWindTrackInfoDTO != null) { - final WindTrackInfoDTO windTrackAtLegMiddle = lastCombinedWindTrackInfoDTO.getCombinedWindOnLegMiddle(zeroBasedIndexOfStartWaypoint); - if (windTrackAtLegMiddle != null && windTrackAtLegMiddle.windFixes != null && !windTrackAtLegMiddle.windFixes.isEmpty()) { - WindDTO windAtLegMiddle = windTrackAtLegMiddle.windFixes.get(0); - final double legBearingDeg = position1DTO.getBearingGreatCircle(position2DTO).getDegrees(); - final String diff = NumberFormat.getFormat("0.0").format( - Math.min(Math.abs(windAtLegMiddle.dampenedTrueWindBearingDeg-legBearingDeg), - Math.abs(windAtLegMiddle.dampenedTrueWindFromDeg-legBearingDeg))); - sb.append(", "); - sb.append(stringMessages.degreesToWind(diff)); - } - } - map.setTitle(sb.toString()); - } - }); + lineToShowOrRemoveOrUpdate.addMouseOverHandler(tooltipHandler); lineToShowOrRemoveOrUpdate.addMouseOutMoveHandler(new MouseOutMapHandler() { @Override public void onEvent(MouseOutMapEvent event) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 209fe1a6c89..98539073afe 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -1878,8 +1878,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S if (firstWaypoint != null && Util.size(firstWaypoint.getMarks()) == 2) { final LineDetails markPositionDTOsAndLineAdvantage = trackedRace.getStartLine(dateAsTimePoint); if (markPositionDTOsAndLineAdvantage != null) { - final List startMarkPositionDTOs = getMarkPositionDTOs(dateAsTimePoint, trackedRace, firstWaypoint); - result.startMarkPositions = startMarkPositionDTOs; result.startLineLengthInMeters = markPositionDTOsAndLineAdvantage.getLength().getMeters(); Bearing absoluteAngleDifferenceToTrueWind = markPositionDTOsAndLineAdvantage .getAbsoluteAngleDifferenceToTrueWind(); @@ -1895,8 +1893,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S if (lastWaypoint != null && Util.size(lastWaypoint.getMarks()) == 2) { final LineDetails markPositionDTOsAndLineAdvantage = trackedRace.getFinishLine(dateAsTimePoint); if (markPositionDTOsAndLineAdvantage != null) { - final List finishMarkPositionDTOs = getMarkPositionDTOs(dateAsTimePoint, trackedRace, lastWaypoint); - result.finishMarkPositions = finishMarkPositionDTOs; result.finishLineLengthInMeters = markPositionDTOsAndLineAdvantage.getLength().getMeters(); Bearing absoluteAngleDifferenceToTrueWind = markPositionDTOsAndLineAdvantage .getAbsoluteAngleDifferenceToTrueWind(); @@ -1996,19 +1992,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } } - private List getMarkPositionDTOs( - TimePoint timePoint, TrackedRace trackedRace, Waypoint waypoint) { - List markPositionDTOs = new ArrayList<>(); - for (Mark startMark : waypoint.getMarks()) { - final Position estimatedMarkPosition = trackedRace.getOrCreateTrack(startMark) - .getEstimatedPosition(timePoint, /* extrapolate */false); - if (estimatedMarkPosition != null) { - markPositionDTOs.add(estimatedMarkPosition); - } - } - return markPositionDTOs; - } - /** * @param timePoint * null means "live" and is then replaced by "now" minus the tracked race's diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java index 20f948cd99c..f5014136ab8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/CoursePositionsDTO.java @@ -1,5 +1,6 @@ package com.sap.sailing.gwt.ui.shared; +import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -10,8 +11,6 @@ import com.sap.sailing.domain.common.Position; public class CoursePositionsDTO implements IsSerializable { public RaceCourseDTO course; public List waypointPositions; - public List startMarkPositions; - public List finishMarkPositions; public Set marks; public int totalLegsCount; @@ -36,4 +35,24 @@ public class CoursePositionsDTO implements IsSerializable { public NauticalSide finishLineAdvantageousSide; public Double finishLineAdvantageInMeters; public Double finishLineLengthInMeters; + + public List getStartMarkPositions() { + final List result = new ArrayList<>(); + if (course != null && course.waypoints != null && !course.waypoints.isEmpty()) { + for (final MarkDTO mark : course.waypoints.get(0).controlPoint.getMarks()) { + result.add(mark.position); + } + } + return result; + } + + public List getFinishMarkPositions() { + final List result = new ArrayList<>(); + if (course != null && course.waypoints != null && !course.waypoints.isEmpty()) { + for (final MarkDTO mark : course.waypoints.get(course.waypoints.size()-1).controlPoint.getMarks()) { + result.add(mark.position); + } + } + return result; + } } From a2fec2155edb76a2ae4ce20039c93f416df38d5d Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Wed, 15 Jul 2015 11:59:35 +0200 Subject: [PATCH 185/219] Adjusted calculation of wind sources to match the algorithm of the old UI --- .../sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index a0cbad0385c..c06e5d9f08c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -380,7 +380,7 @@ public class RaceContext { private int getWindSourceCount() { if (trackedRace != null) { - return trackedRace.getWindSources().size() - trackedRace.getWindSourcesToExclude().size(); + return Util.size(trackedRace.getWindSources(WindSourceType.EXPEDITION)); } return 0; } From f45d29c5e82a93f7d7fe29701764b6f2753bb43c Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Wed, 15 Jul 2015 12:04:12 +0200 Subject: [PATCH 186/219] Using start/finish time of a race from racelog with higher priority than the one from tracked race --- .../gwt/ui/shared/dispatch/event/RaceContext.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index c06e5d9f08c..89b875a53df 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -302,12 +302,12 @@ public class RaceContext { public TimePoint getStartTime() { if (!startTimeCalculated) { - if (trackedRace != null) { - startTime = trackedRace.getStartOfRace(); - } - if (startTime == null && state != null) { + if (state != null) { startTime = state.getStartTime(); } + if (startTime == null && trackedRace != null) { + startTime = trackedRace.getStartOfRace(); + } startTimeCalculated = true; } return startTime; @@ -315,11 +315,12 @@ public class RaceContext { private TimePoint getFinishTime() { if (!finishTimeCalculated) { - if (trackedRace != null) { - finishTime = trackedRace.getEndOfRace(); - } else if (state != null) { + if (state != null) { finishTime = state.getFinishedTime(); } + if (finishTime == null && trackedRace != null) { + finishTime = trackedRace.getEndOfRace(); + } finishTimeCalculated = true; } return finishTime; From 99bc03e153ce832f63ab439a7a7dae52c35d60f2 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Wed, 15 Jul 2015 12:13:19 +0200 Subject: [PATCH 187/219] Fixed wind calculation for finished races --- .../sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 89b875a53df..701c67cbbe3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -202,7 +202,7 @@ public class RaceContext { } if (lowerBoundWindInKnots != null && upperBoundWindInKnots != null) { BearingWithConfidence average = bwcc.getAverage(middleOfRace); - return new WindStatisticsDTO(average.getObject().getDegrees(), lowerBoundWindInKnots, + return new WindStatisticsDTO(average.getObject().reverse().getDegrees(), lowerBoundWindInKnots, upperBoundWindInKnots); } } From 84ac953d6cd1c2367c1e7a46afc8e9520b45aa84 Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 15 Jul 2015 12:26:51 +0200 Subject: [PATCH 188/219] Regatta/races list - Fixed layout for old contents --- .../multiregatta/tabs/MultiregattaOverviewTabView.java | 6 ++++++ .../multiregatta/tabs/MultiregattaOverviewTabView.ui.xml | 4 ++-- .../multiregatta/tabs/MultiregattaRegattasTabView.java | 6 ++++++ .../multiregatta/tabs/MultiregattaRegattasTabView.ui.xml | 4 ++-- .../place/event/regatta/tabs/RegattaRacesTabView.java | 3 +++ .../place/event/regatta/tabs/RegattaRacesTabView.ui.xml | 2 +- 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java index 744b7117b12..3eee58b4506 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -22,6 +23,7 @@ import com.sap.sailing.gwt.home.client.place.event.partials.eventregatta.EventRe import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.DropdownFilter; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.DropdownFilter.DropdownFilterList; import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaList; +import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaListStepsLegend; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshManager; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; @@ -49,7 +51,9 @@ public class MultiregattaOverviewTabView extends Composite implements Multiregat @UiField SimplePanel content; @UiField(provided = true) EventOverviewStage stage; @UiField(provided = true) RacesListLive racesListLive; + @UiField DivElement newContentContainerUi; @UiField(provided = true) DropdownFilter boatCategoryFilterUi; + @UiField MultiRegattaListStepsLegend regattaProgressLegendUi; @UiField(provided = true) MultiRegattaList regattaListUi; private Presenter currentPresenter; @@ -89,7 +93,9 @@ public class MultiregattaOverviewTabView extends Composite implements Multiregat content.removeFromParent(); } else { boatCategoryFilterUi.removeFromParent(); + regattaProgressLegendUi.removeFromParent(); regattaListUi.removeFromParent(); + newContentContainerUi.removeFromParent(); // TODO: understand, and than move this into appropiate place (probably context) currentPresenter.ensureRegattaStructure(new AsyncCallback>() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.ui.xml index 65bff5ac77e..5579f0e180b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaOverviewTabView.ui.xml @@ -14,11 +14,11 @@ -
+
- +
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java index 68d1346bc56..2162f1f7626 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -21,6 +22,7 @@ import com.sap.sailing.gwt.home.client.place.event.partials.eventregatta.EventRe import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.DropdownFilter; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.DropdownFilter.DropdownFilterList; import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaList; +import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaListStepsLegend; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshManager; import com.sap.sailing.gwt.home.client.place.event.regatta.tabs.reload.RefreshableWidget; @@ -46,8 +48,10 @@ public class MultiregattaRegattasTabView extends Composite implements Multiregat private static MyBinder ourUiBinder = GWT.create(MyBinder.class); @UiField SimplePanel content; + @UiField DivElement newContentContainerUi; @UiField(provided = true) RacesListLive racesListLiveUi; @UiField(provided = true) DropdownFilter boatCategoryFilterUi; + @UiField MultiRegattaListStepsLegend regattaProgressLegendUi; @UiField(provided = true) MultiRegattaList regattaListUi; private Presenter currentPresenter; @@ -85,7 +89,9 @@ public class MultiregattaRegattasTabView extends Composite implements Multiregat content.removeFromParent(); } else { boatCategoryFilterUi.removeFromParent(); + regattaProgressLegendUi.removeFromParent(); regattaListUi.removeFromParent(); + newContentContainerUi.removeFromParent(); // TODO: understand, and than move this into appropiate place (probably context) currentPresenter.ensureRegattaStructure(new AsyncCallback>() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml index 5c09f742e01..b12d3120001 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/multiregatta/tabs/MultiregattaRegattasTabView.ui.xml @@ -12,11 +12,11 @@ } -
+
- +
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index 4fbafa79738..cd9618a3605 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -23,6 +23,7 @@ import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListN import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.ListNavigationPanel.SelectionCallback; import com.sap.sailing.gwt.home.client.place.event.partials.listNavigation.RaceStateLegend; import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaListItem; +import com.sap.sailing.gwt.home.client.place.event.partials.multiRegattaList.MultiRegattaListStepsLegend; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLive; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.AbstractRaceList; import com.sap.sailing.gwt.home.client.place.event.partials.racelist.RaceListColumnFactory; @@ -83,6 +84,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView listNavigationPanelUi; @UiField FlowPanel listFormatContainerUi; @@ -130,6 +132,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView
- +
From 8e45794f723000f53b5aacc6601bff3fb294416b Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Wed, 15 Jul 2015 14:30:20 +0200 Subject: [PATCH 189/219] Introduced new parameter ignoreLocalSettings in RegattaOverview to explicitly ignore settings from local storage --- .../regattaoverview/client/RegattaOverviewEntryPoint.java | 8 +++++++- .../gwt/regattaoverview/client/RegattaOverviewPanel.java | 5 +++-- .../client/RegattaRaceStatesComponent.java | 6 ++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewEntryPoint.java index 4571c89fdd0..66bfacb9f73 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewEntryPoint.java @@ -28,6 +28,7 @@ public class RegattaOverviewEntryPoint extends AbstractSailingEntryPoint { private final static String PARAM_ONLY_RACES_OF_SAME_DAY = "onlyracesofsameday"; private final static String PARAM_REGATTA = "regatta"; private final static String PARAM_COURSE_AREA = "coursearea"; + private final static String PARAM_IGNORE_LOCAL_SETTINGS = "ignoreLocalSettings"; private DockLayoutPanel containerPanel; private RaceDetailPanel detailPanel; @@ -96,7 +97,8 @@ public class RegattaOverviewEntryPoint extends AbstractSailingEntryPoint { private void createAndAddRegattaPanel(UUID eventId) { RegattaRaceStatesSettings settings = createRegattaRaceStatesSettingsFromURL(); - regattaPanel = new RegattaOverviewPanel(sailingService, this, getStringMessages(), eventId, settings, userAgent); + boolean ignoreLocalSettings = getIgnoreLocalSettingsFromURL(); + regattaPanel = new RegattaOverviewPanel(sailingService, this, getStringMessages(), eventId, settings, userAgent, ignoreLocalSettings); regattaPanel.addHandler(new EventDTOLoadedEvent.Handler() { @Override @@ -120,6 +122,10 @@ public class RegattaOverviewEntryPoint extends AbstractSailingEntryPoint { containerPanel.add(scrollPanel); } + private boolean getIgnoreLocalSettingsFromURL() { + return Boolean.parseBoolean(Window.Location.getParameter(PARAM_IGNORE_LOCAL_SETTINGS)); + } + private void createAndAddDetailPanel() { detailPanel = new RaceDetailPanel(getStringMessages(), new ClickHandler() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewPanel.java index 46fe03b9a73..4d4de5230a4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaOverviewPanel.java @@ -81,7 +81,8 @@ public class RegattaOverviewPanel extends SimplePanel { final StringMessages stringMessages, UUID eventId, RegattaRaceStatesSettings settings, - UserAgentDetails userAgent) { + UserAgentDetails userAgent, + boolean ignoreLocalSettings) { this.sailingService = sailingService; this.stringMessages = stringMessages; @@ -102,7 +103,7 @@ public class RegattaOverviewPanel extends SimplePanel { mainPanel.setWidth("100%"); mainPanel.addStyleName(style.contentWrapper()); - regattaRaceStatesComponent = new RegattaRaceStatesComponent(sailingService, errorReporter, stringMessages, eventId, settings, uiUpdateTimer); + regattaRaceStatesComponent = new RegattaRaceStatesComponent(sailingService, errorReporter, stringMessages, eventId, settings, uiUpdateTimer, ignoreLocalSettings); this.eventRaceGroupListeners.add(regattaRaceStatesComponent); regattaRaceStatesComponent.setWidth("100%"); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaRaceStatesComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaRaceStatesComponent.java index e089c73e226..f18b9d02735 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaRaceStatesComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaRaceStatesComponent.java @@ -137,7 +137,7 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component */ public RegattaRaceStatesComponent(final SailingServiceAsync sailingService, ErrorReporter errorReporter, final StringMessages stringMessages, final UUID eventId, RegattaRaceStatesSettings settings, - Timer timerToSynchronize) { + Timer timerToSynchronize, boolean ignoreLocalSettings) { this.sailingService = sailingService; this.stringMessages = stringMessages; this.eventId = eventId; @@ -148,7 +148,9 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component this.localStorageRegattaOverviewEventKey = LOCAL_STORAGE_REGATTA_OVERVIEW_KEY + eventId.toString(); this.flagInterpreter = new RaceStateFlagsInterpreter(stringMessages); this.settings = new RegattaRaceStatesSettings(); - loadAndSetSettings(settings); + if(!ignoreLocalSettings) { + loadAndSetSettings(settings); + } mainPanel = new VerticalPanel(); mainPanel.getElement().getStyle().setWidth(100, Unit.PCT); getElement().getStyle().setWidth(100, Unit.PCT); From 468d23c355e5357632a49d2204c5dca05eb59b97 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Wed, 15 Jul 2015 14:49:05 +0200 Subject: [PATCH 190/219] Fixed handling of parameter ignoreLocalSettings in RegattaOverview to not lose settings --- .../client/RegattaRaceStatesComponent.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaRaceStatesComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaRaceStatesComponent.java index f18b9d02735..e805f6eb416 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaRaceStatesComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaRaceStatesComponent.java @@ -125,6 +125,7 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component private CellTable table; boolean hasAnyRaceGroupASeries = false; boolean hasAnyRaceGroupAFleet = false; + private final boolean ignoreLocalSettings; public void setEntryClickedHandler(EntryHandler handler) { this.entryClickedHandler = handler; @@ -148,9 +149,8 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component this.localStorageRegattaOverviewEventKey = LOCAL_STORAGE_REGATTA_OVERVIEW_KEY + eventId.toString(); this.flagInterpreter = new RaceStateFlagsInterpreter(stringMessages); this.settings = new RegattaRaceStatesSettings(); - if(!ignoreLocalSettings) { - loadAndSetSettings(settings); - } + this.ignoreLocalSettings = ignoreLocalSettings; + loadAndSetSettings(settings); mainPanel = new VerticalPanel(); mainPanel.getElement().getStyle().setWidth(100, Unit.PCT); getElement().getStyle().setWidth(100, Unit.PCT); @@ -162,9 +162,11 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component } private void loadAndSetSettings(RegattaRaceStatesSettings settings) { - RegattaRaceStatesSettings loadedSettings = loadRegattaRaceStatesSettings(); - if (loadedSettings != null) { - settings = loadedSettings; + if(!ignoreLocalSettings) { + RegattaRaceStatesSettings loadedSettings = loadRegattaRaceStatesSettings(); + if (loadedSettings != null) { + settings = loadedSettings; + } } updateSettings(settings); } From a021ff7201ba98281b29f8621a2a27dbc87c9e7d Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Wed, 15 Jul 2015 15:37:42 +0200 Subject: [PATCH 191/219] Hiding winner column if there isn't any winner shown --- .../event/partials/racelist/RaceListDataUtil.java | 10 ++++++++++ .../place/event/regatta/tabs/RegattaRacesTabView.java | 1 + 2 files changed, 11 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java index e9ba187f4f3..aa3dfb86716 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListDataUtil.java @@ -3,6 +3,7 @@ package com.sap.sailing.gwt.home.client.place.event.partials.racelist; import java.util.Collection; import com.sap.sailing.gwt.ui.shared.dispatch.event.RaceListRaceDTO; +import com.sap.sailing.gwt.ui.shared.dispatch.event.SimpleCompetitorDTO; import com.sap.sailing.gwt.ui.shared.race.FleetMetadataDTO; import com.sap.sailing.gwt.ui.shared.race.RaceMetadataDTO; import com.sap.sailing.gwt.ui.shared.race.wind.AbstractWindDTO; @@ -120,6 +121,15 @@ public class RaceListDataUtil { }); } + public static boolean hasWinner(Collection data) { + return hasValues(data, new ValueProvider() { + @Override + public SimpleCompetitorDTO getValue(T object) { + return object.getWinner(); + } + }); + } + private static final long DAY_IN_MILLIS = 1000 * 60 * 60 * 24; public static > boolean hasDifferentStartDates(Collection data) { return hasDifferentValues(data, new ValueProvider() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java index cd9618a3605..230705c8bb2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regatta/tabs/RegattaRacesTabView.java @@ -231,6 +231,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView Date: Wed, 15 Jul 2015 15:38:47 +0200 Subject: [PATCH 192/219] changed IntelliJ IDEA Code Styles - static imports at first --- java/CodeFormatter_IntelliJ.jar | Bin 1829 -> 2439 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/java/CodeFormatter_IntelliJ.jar b/java/CodeFormatter_IntelliJ.jar index 5b4f7c50d7575d9f1b052b2adc805dfd1b41d209..1df4afba95626db8ea51b983eb3c2f2168d11edf 100644 GIT binary patch delta 1890 zcmaKtc{E#j8^^B(u@^x*rqe|&trB5Mno+M%OOq67Rb#8ZmXyqdSfaGl9VPY(jip0c z+G6xrY6-d^)YMoj(MlV_D>BoT7{*v)Ms(ijd(O~*-sgAj`Q3Bw{XOUVxzFdETd9!_ z%UgzAPF&1ivjp*!QPVoFtPt(pO~y7&!@g^XV<~D)4(Lq&ILI#5Jm=_`98NwXhW)~m z_?L+`g!mZ5mx`ueYRFUod?kb1<{yRf_E_r&hB|7IFPvNdJO9# zN~r!hXz3`@gpiiICz*Si^{A(NPFZ)Mn_9m(iBRE@iG3Cyk)X+ZD0oXMzc6X}edyAM zy$wmnb3%o`@8zWMSN1kQgG#FV%wXn>#*$(IDX!uV1jUxsCnUVLAYgKeO()$=^j?>8 zBp?GV@0-p&(*K}fdUUkmnxmD6vO(pkiTmh_I4{_5UDg!4HjM*A14iNGRaI%bPUgh} zN1#^F(m;Kfy}miR_n7FbB>K&#k#AC|g<|}DU*@zJ3jY#IxMSvG6k4yXjhoR5+owT` zaIj)+2KvIQ-uys6El1upnG-yV_^Y9q073!pA>(x0);_=9%o+3Cy2%BN7SB$-H2?U) zS7#naRgCeok6*cC;}tMc=x&^_=j}Bo?as25(gmgxPo&2m@uMc+y)k?ReRK%5kP?zh z1y&(K)8I>`FIUk|zV$lTRx3J;MtAhgTkF17Pe0TqmcPIfuBVzkV^X3HwcWz|fv@Aq zss^^q$$c{oDp78KA#*06&Zs^U!tnF@np%yt9>HMUulS*jtl0jh=Sicuila(pI_pI> zoB1he&DYJ=TRm&u@mlTDxrmJ8gG@$HXMqKl)3k5gFKr~-8wit=T)XaH*hcsJwUWZC z!W*$NO^4${v(sz>Chpz)sh0H;^fU@9Jwm~yY;;J!JDtp>2fwutxE{Xfl(C0Vo&g=f zAiULQo)^{oAipQgiMt<@ap{&V$nbx=QGOhLHfxB5FWcVCwDOB3ee!bS>qngJ?%BPsJ)It@hURVU@!bHT5HDqR`<=-Zr%TPQHs>IBF>QMv%fM|UHz~dnDI)IXF zJ<76n0d|z^AwY?wk|+@|7J(5V(G*gMa|nq_iH?EChm&LJ4k|qeHTlJ>v?Zui4#_z+ z3%NGyh0)RMD{3rkXJ28YaYn@p^B`P&$f!!Iz;Nx3Wl}+&VbFQlq3IU^q5@jggp=u$ zx4q}F=TzrUpT!IA%uV_zPP@YF$Kwo$OiOzRrG;19g&VWB2)ntl$L}GhD}MUxNYwJw zCOM(ax}E(*S1%}G)L~5jd3x3A5e+Lus6AV0<5<(7(Gb?X5{(~>AoQti~JHWD4)+eJGEpX^*3?@ zAEuo$-u%$7Z*Hw=Zan*nvtl)ttsj8L0F~*qg@fSz-UVK_SMdzD*R80-hUj~kc|+kbh6sMrbz}jFT1u!T9CNNcqxAnbWqu4 zspc#}y-Os-uP>)@l3|9#^_DP^k7w?`lc#?ps2x*4wkL@?9DWbj_5d+)BHZR7JJ}z*f>*3O&lQ zpN7jPJsAOtNN`KZos->Ca=X~_|4&dnPHvYD@ISR>9=PoMLR%VaSH8k_pUQ7~1P21i|^`K-~fW^*0RqTFhGh;wPv z9uZPd+2dHcewQ*KDUlBL5pj&hZ7^BD+P80whFOIm$j844k+1hqpY{L*f3-ZE?G@H# zj?3@xG!F*fg3*f7*WflV8h4={^Tp@GMC9%%}eICJ3{)1wOvx= z@cHYPt0YEC;cuoB8|sbgfBT8zO6xEhC3%z*Tv{4-j|=Kcj)ibZn-{2So3qRvxYmvD z)!~C#dbo}3eu1BtB6jKnzf9D4P*wn#?JGSsU z%CKZDhV0$$E^$)6HiBGu$I?u=c7@&9i!}1wHj#eM6K*DZ7ufn(V78z1o9+yA+G94} z&zpCFo`lVIKqVssiZ~^rrW-?=6o6hw>xoTA)udL$(KtR1ioi!EYHG?6y>jYM` z;rO^HyS(1wf^P&Se-5wl*cL=|7`;BkVHM&E_pd2)4vKP+Pp+DcJWtvk1c$koTgxSg z^(F1%Wrh8s7f(|VJ_+zGSNj784QKmM@NK77&8=;F4x^!pG|iloV!V_uO3<=g(p!el zie6(4W|!HtK{W}`PT(q`F0wJX_RD5qvl7`dD_gY8G7-zHkUcW}vloxUJk6wd zsN!a;pFzQOe=B=D5pm95T*@E#NpL?~Xn7Y7_4uh7Y!_&(!qHeiDYRXo zy=&_)t8@A_c*4bZ`r@5(VV=BtPqH0Twshf%$gy0oE_zotH(u6j|0c0C=Ko}B{s2%* z2MD6Dnte&rG30q@>q?@?C{+xJ5 z7ohIuQd2*J4W~eP)i304r4b&i2wiqvH$=8P)h>@3IG5A004Mc=aXOu!wC#n=SHHi zbYX04Wn?aNcyv%p0RjpD3IG5A004Mc z=SBbk00000000000012T000000000000000g$0vu2O$&%1^@s600jUA08aq`0Kf$R G0000gH8i^b From 19208aa6f4420ed254834b3275d4f1f003d865ce Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Jul 2015 16:22:06 +0200 Subject: [PATCH 193/219] use Duration.NULL for target time initialization --- .../com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 076898280e9..3a5e35dbc8c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -139,7 +139,6 @@ import com.sap.sse.common.TimePoint; import com.sap.sse.common.Timed; import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; -import com.sap.sse.common.impl.MillisecondsDurationImpl; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.concurrent.LockUtil; import com.sap.sse.concurrent.NamedReentrantReadWriteLock; @@ -3669,7 +3668,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl if (polarDataService == null) { throw new NotEnoughDataHasBeenAddedException("Target time estimation failed. No polar service available."); } - Duration durationOfAllLegs = new MillisecondsDurationImpl(0); + Duration durationOfAllLegs = Duration.NULL; for (TrackedLeg leg : trackedLegs.values()) { Duration durationOfLeg = leg.getEstimatedTimeToComplete(polarDataService, timepoint); durationOfAllLegs = durationOfAllLegs.plus(durationOfLeg); From 52cb82ce59ba3829f1d38a159b5408a409803354 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Jul 2015 16:22:15 +0200 Subject: [PATCH 194/219] added equals/hashCode for GateDTO that considers left and right MarkDTO as well as name and idAsString --- .../sap/sailing/gwt/ui/shared/GateDTO.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/GateDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/GateDTO.java index 5c2930674f7..0762ea23537 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/GateDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/GateDTO.java @@ -27,4 +27,47 @@ public class GateDTO extends ControlPointDTO { public Iterable getMarks() { return Arrays.asList(left, right); } + + @Override + public int hashCode() { + final int prime = 31; + int result = prime * getIdAsString().hashCode() * getName().hashCode(); + result = prime * result + ((left == null) ? 0 : left.hashCode()); + result = prime * result + ((right == null) ? 0 : right.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + GateDTO other = (GateDTO) obj; + if (getIdAsString() == null) { + if (other.getIdAsString() != null) + return false; + } else if (!getIdAsString().equals(other.getIdAsString())) + return false; + if (getName() == null) { + if (other.getName() != null) + return false; + } else if (!getName().equals(other.getName())) + return false; + if (left == null) { + if (other.left != null) + return false; + } else if (!left.equals(other.left)) + return false; + if (right == null) { + if (other.right != null) + return false; + } else if (!right.equals(other.right)) + return false; + return true; + } + + } From 92728c77ebdfdd94445ba8dd044d2d6a043e029c Mon Sep 17 00:00:00 2001 From: fmittag Date: Wed, 15 Jul 2015 16:34:27 +0200 Subject: [PATCH 195/219] fixed formatting of all time formatters (was broken for all times > 1hour) --- .../ui/common/client/DateAndTimeFormatterUtil.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/common/client/DateAndTimeFormatterUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/common/client/DateAndTimeFormatterUtil.java index e62fdecddc1..88b4b5207be 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/common/client/DateAndTimeFormatterUtil.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/common/client/DateAndTimeFormatterUtil.java @@ -4,9 +4,12 @@ import java.util.Date; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat; +import com.google.gwt.i18n.client.TimeZone; import com.google.gwt.text.client.DateTimeFormatRenderer; public class DateAndTimeFormatterUtil { + public static TimeZone timeZoneWithoutOffset = TimeZone.createTimeZone(0); + public static DateTimeFormatRenderer defaultDateFormatter = new DateTimeFormatRenderer( DateTimeFormat.getFormat(PredefinedFormat.DATE_SHORT)); public static DateTimeFormatRenderer defaultTimeFormatter = new DateTimeFormatRenderer( @@ -15,14 +18,14 @@ public class DateAndTimeFormatterUtil { public static DateTimeFormatRenderer longDateFormatter = new DateTimeFormatRenderer( DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.DATE_LONG)); public static DateTimeFormatRenderer longTimeFormatter = new DateTimeFormatRenderer( - DateTimeFormat.getFormat("HH:mm:ss zzz")); + DateTimeFormat.getFormat("HH:mm:ss zzz"), timeZoneWithoutOffset); private static DateTimeFormatRenderer secondsTimeFormatter = new DateTimeFormatRenderer( - DateTimeFormat.getFormat("m:ss")); + DateTimeFormat.getFormat("m:ss"), timeZoneWithoutOffset); private static DateTimeFormatRenderer minutesAndSecondsTimeFormatter = new DateTimeFormatRenderer( - DateTimeFormat.getFormat("mm:ss")); + DateTimeFormat.getFormat("mm:ss"), timeZoneWithoutOffset); private static DateTimeFormatRenderer hoursAndMinutesAndSecondsTimeFormatter = new DateTimeFormatRenderer( - DateTimeFormat.getFormat("HH:mm:ss")); + DateTimeFormat.getFormat("HH:mm:ss"), timeZoneWithoutOffset); public static String formatDateRange(Date startDate, Date endDate) { return defaultDateFormatter.render(startDate) + " - " + defaultDateFormatter.render(endDate); From 9f8a134474b7778725bfa2a7b61943aa7829f2c1 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Jul 2015 16:51:11 +0200 Subject: [PATCH 196/219] course middle lines are now maintained in a map; start to first mark triangle is drawn with the same showOrRemoveOrUpdateLine method --- .../gwt/ui/client/shared/racemap/RaceMap.java | 144 ++++++++---------- 1 file changed, 60 insertions(+), 84 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 08901f75699..c44460f65cf 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -100,12 +100,14 @@ import com.sap.sailing.gwt.ui.client.shared.filter.QuickRankProvider; import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapHelpLinesSettings.HelpLineTypes; import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapZoomSettings.ZoomTypes; import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil; +import com.sap.sailing.gwt.ui.shared.ControlPointDTO; import com.sap.sailing.gwt.ui.shared.CoursePositionsDTO; import com.sap.sailing.gwt.ui.shared.GPSFixDTO; import com.sap.sailing.gwt.ui.shared.LegInfoDTO; import com.sap.sailing.gwt.ui.shared.ManeuverDTO; import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sailing.gwt.ui.shared.QuickRankDTO; +import com.sap.sailing.gwt.ui.shared.RaceCourseDTO; import com.sap.sailing.gwt.ui.shared.RaceMapDataDTO; import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO; import com.sap.sailing.gwt.ui.shared.SidelineDTO; @@ -210,11 +212,15 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe private AdvantageLineMouseOverMapHandler advantageLineMouseOverHandler; /** - * Polyline for the course middle line. + * Polylines for the course middle lines; keys are the two control points delimiting the leg for which the + * {@link Polyline} value shows the course middle line. As only one course middle line is shown even if there + * are multiple legs using the same control points in different directions, using a {@link Set} makes this + * independent of the order of the two control points. If no course middle line is currently being shown for + * a pair of control points, the map will not contain a value for this pair. */ - private Polyline courseMiddleLine; + private final Map, Polyline> courseMiddleLines; - private Map courseSidelines; + private final Map courseSidelines; /** * Wind data used to display the advantage line. Retrieved by a {@link GetWindInfoAction} execution and used in @@ -395,7 +401,8 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe timer.addTimeListener(this); raceMapImageManager = new RaceMapImageManager(); markDTOs = new HashMap(); - courseSidelines = new HashMap(); + courseSidelines = new HashMap<>(); + courseMiddleLines = new HashMap<>(); boatOverlays = new HashMap(); competitorInfoOverlays = new HashMap(); windSensorOverlays = new HashMap(); @@ -1315,87 +1322,39 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe private void showStartLineToFirstMarkTriangle(final CoursePositionsDTO courseDTO){ final List startMarkPositions = courseDTO.getStartMarkPositions(); - if (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) - && startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1) { - LatLng windwardStartLinePoint = coordinateSystem.toLatLng(startMarkPositions.get(0)); - LatLng leewardStartLinePoint = coordinateSystem.toLatLng(startMarkPositions.get(1)); - LatLng firstMarkPoint = coordinateSystem.toLatLng(courseDTO.waypointPositions.get(1)); - windwardStartLineMarkToFirstMarkLineText.replace(0, windwardStartLineMarkToFirstMarkLineText.length(), - stringMessages.startLineToFirstMarkTriangle(numberFormatOneDecimal - .format(startMarkPositions.get(0).getDistance(courseDTO.waypointPositions.get(1)) - .getMeters()))); - leewardStartLineMarkToFirstMarkLineText.replace(0, leewardStartLineMarkToFirstMarkLineText.length(), - stringMessages.startLineToFirstMarkTriangle(numberFormatOneDecimal - .format(startMarkPositions.get(1).getDistance(courseDTO.waypointPositions.get(1)) - .getMeters()))); - if (windwardStartLineMarkToFirstMarkLine == null && leewardStartLineMarkToFirstMarkLine == null) { - PolylineOptions options = PolylineOptions.newInstance(); - options.setGeodesic(true); - options.setStrokeColor("grey"); - options.setStrokeWeight(1); - options.setStrokeOpacity(1.0); - - MVCArray windwardLinePoints = MVCArray.newInstance(); - windwardLinePoints.insertAt(0, windwardStartLinePoint); - windwardLinePoints.insertAt(1, firstMarkPoint); - - MVCArray leewardLinePoints = MVCArray.newInstance(); - leewardLinePoints.insertAt(0, leewardStartLinePoint); - leewardLinePoints.insertAt(1, firstMarkPoint); - - windwardStartLineMarkToFirstMarkLine = Polyline.newInstance(options); - windwardStartLineMarkToFirstMarkLine.setPath(windwardLinePoints); - windwardStartLineMarkToFirstMarkLine.addMouseOverHandler(new MouseOverMapHandler() { - @Override - public void onEvent(MouseOverMapEvent event) { - map.setTitle(windwardStartLineMarkToFirstMarkLineText.toString()); - } - }); - windwardStartLineMarkToFirstMarkLine.addMouseOutMoveHandler(new MouseOutMapHandler() { - @Override - public void onEvent(MouseOutMapEvent event) { - map.setTitle(""); - } - }); - leewardStartLineMarkToFirstMarkLine = Polyline.newInstance(options); - leewardStartLineMarkToFirstMarkLine.setPath(leewardLinePoints); - leewardStartLineMarkToFirstMarkLine.addMouseOverHandler(new MouseOverMapHandler() { - @Override - public void onEvent(MouseOverMapEvent event) { - map.setTitle(leewardStartLineMarkToFirstMarkLineText.toString()); - } - }); - leewardStartLineMarkToFirstMarkLine.addMouseOutMoveHandler(new MouseOutMapHandler() { - @Override - public void onEvent(MouseOutMapEvent event) { - map.setTitle(""); - } - }); - - windwardStartLineMarkToFirstMarkLine.setMap(map); - leewardStartLineMarkToFirstMarkLine.setMap(map); - - } else { - windwardStartLineMarkToFirstMarkLine.getPath().removeAt(1); - windwardStartLineMarkToFirstMarkLine.getPath().removeAt(0); - windwardStartLineMarkToFirstMarkLine.getPath().insertAt(0, windwardStartLinePoint); - windwardStartLineMarkToFirstMarkLine.getPath().insertAt(1, firstMarkPoint); - - leewardStartLineMarkToFirstMarkLine.getPath().removeAt(1); - leewardStartLineMarkToFirstMarkLine.getPath().removeAt(0); - leewardStartLineMarkToFirstMarkLine.getPath().insertAt(0, leewardStartLinePoint); - leewardStartLineMarkToFirstMarkLine.getPath().insertAt(1, firstMarkPoint); + final Position windwardStartLinePosition = startMarkPositions.get(0); + final Position leewardStartLinePosition = startMarkPositions.get(1); + final Position firstMarkPosition = courseDTO.waypointPositions.get(1); + windwardStartLineMarkToFirstMarkLineText.replace(0, windwardStartLineMarkToFirstMarkLineText.length(), + stringMessages.startLineToFirstMarkTriangle(numberFormatOneDecimal + .format(windwardStartLinePosition.getDistance(firstMarkPosition) + .getMeters()))); + leewardStartLineMarkToFirstMarkLineText.replace(0, leewardStartLineMarkToFirstMarkLineText.length(), + stringMessages.startLineToFirstMarkTriangle(numberFormatOneDecimal + .format(leewardStartLinePosition.getDistance(firstMarkPosition) + .getMeters()))); + final MouseOverMapHandler windwardStartLineMarkToFirstMarkLineTooltipHandler = new MouseOverMapHandler() { + @Override + public void onEvent(MouseOverMapEvent event) { + map.setTitle(windwardStartLineMarkToFirstMarkLineText.toString()); } - } else { - if (windwardStartLineMarkToFirstMarkLine != null) { - windwardStartLineMarkToFirstMarkLine.setMap(null); - windwardStartLineMarkToFirstMarkLine = null; + }; + final MouseOverMapHandler leewardStartLineMarkToFirstMarkLineTooltipHandler = new MouseOverMapHandler() { + @Override + public void onEvent(MouseOverMapEvent event) { + map.setTitle(leewardStartLineMarkToFirstMarkLineText.toString()); } - if (leewardStartLineMarkToFirstMarkLine != null) { - leewardStartLineMarkToFirstMarkLine.setMap(null); - leewardStartLineMarkToFirstMarkLine = null; - } - } + }; + windwardStartLineMarkToFirstMarkLine = showOrRemoveOrUpdateLine(windwardStartLineMarkToFirstMarkLine, /* showLine */ + settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) + && startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1, + windwardStartLinePosition, firstMarkPosition, windwardStartLineMarkToFirstMarkLineTooltipHandler, + "grey"); + leewardStartLineMarkToFirstMarkLine = showOrRemoveOrUpdateLine(leewardStartLineMarkToFirstMarkLine, /* showLine */ + settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) + && startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1, + leewardStartLinePosition, firstMarkPosition, leewardStartLineMarkToFirstMarkLineTooltipHandler, + "grey"); } private final StringBuilder startLineAdvantageText = new StringBuilder(); @@ -1457,13 +1416,30 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe finishLineLeftPosition, finishLineRightPosition, finishLineTooltipHandler, "#000000"); final int zeroBasedIndexOfStartWaypoint = oneBasedLegOfLeadingCompetitor-1; + final Set key = getCourseMiddleLinesKey(courseDTO, zeroBasedIndexOfStartWaypoint); // draw the course middle line final boolean showCourseMiddleLine = oneBasedLegOfLeadingCompetitor > 0 && courseDTO.waypointPositions.size() > oneBasedLegOfLeadingCompetitor && settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEMIDDLELINE); - courseMiddleLine = showOrRemoveCourseMiddleLine(courseDTO, courseMiddleLine, zeroBasedIndexOfStartWaypoint, showCourseMiddleLine); + courseMiddleLines.put(key, showOrRemoveCourseMiddleLine(courseDTO, courseMiddleLines.get(key), + zeroBasedIndexOfStartWaypoint, showCourseMiddleLine)); } } + /** + * Given a zero-based index into courseDTO's {@link RaceCourseDTO#waypoints waypoints list} that denotes the start + * waypoint of the leg in question, returns a key that can be used for the {@link #courseMiddleLines} map, consisting of a set + * that holds the two {@link ControlPointDTO}s representing the start and finish control point of that leg. + */ + private Set getCourseMiddleLinesKey(final CoursePositionsDTO courseDTO, + final int zeroBasedIndexOfStartWaypoint) { + ControlPointDTO startControlPoint = courseDTO.course.waypoints.get(zeroBasedIndexOfStartWaypoint).controlPoint; + ControlPointDTO endControlPoint = courseDTO.course.waypoints.get(zeroBasedIndexOfStartWaypoint+1).controlPoint; + final Set key = new HashSet<>(); + key.add(startControlPoint); + key.add(endControlPoint); + return key; + } + /** * @param showLine * tells whether or not to show the line; if the lineToShowOrRemoveOrUpdate references a From f147e3748f5c212257a27c72aab894071eca0585 Mon Sep 17 00:00:00 2001 From: "Christopher Ronnewinkel (D036654)" Date: Wed, 15 Jul 2015 17:03:22 +0200 Subject: [PATCH 197/219] add wind-cache to simulation to avoid wind-updates during a simulation run (which may take 20 seconds on a busy server/replica); fix algorithm-timeout again; --- .../impl/PathGeneratorTreeGrow360.java | 2 +- .../impl/WindFieldTrackedRaceImpl.java | 26 ++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/impl/PathGeneratorTreeGrow360.java b/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/impl/PathGeneratorTreeGrow360.java index 52dea1533a1..50b63d9d7c5 100644 --- a/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/impl/PathGeneratorTreeGrow360.java +++ b/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/impl/PathGeneratorTreeGrow360.java @@ -827,7 +827,7 @@ public class PathGeneratorTreeGrow360 extends PathGeneratorBase { // check for time-out if (this.isTimedOut()) { - //reachedEnd = true; + reachedEnd = true; } } // main while-loop diff --git a/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/windfield/impl/WindFieldTrackedRaceImpl.java b/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/windfield/impl/WindFieldTrackedRaceImpl.java index ad170127b1c..442633e8388 100644 --- a/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/windfield/impl/WindFieldTrackedRaceImpl.java +++ b/java/com.sap.sailing.simulator/src/com/sap/sailing/simulator/windfield/impl/WindFieldTrackedRaceImpl.java @@ -1,11 +1,14 @@ package com.sap.sailing.simulator.windfield.impl; +import java.util.concurrent.ConcurrentHashMap; + import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.MeterDistance; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.simulator.TimedPosition; +import com.sap.sailing.simulator.impl.TimedPositionImpl; import com.sap.sailing.simulator.windfield.WindFieldGenerator; import com.sap.sse.common.TimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint; @@ -21,13 +24,22 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; public class WindFieldTrackedRaceImpl extends WindFieldGeneratorImpl implements WindFieldGenerator { private static final long serialVersionUID = -7005970781594631010L; - private static final double EPSILON_DISTANCE_METER = 20; - private static final long EPSILON_TIME_MILLIS = 5000; + private static final double EPSILON_DISTANCE_METER = 20; + private static final long EPSILON_TIME_MILLIS = 5000; private TrackedRace race; + private final ConcurrentHashMap cache; + private TimePoint startSimulationTime = null; + public WindFieldTrackedRaceImpl(TrackedRace race) { super(null, null); this.race = race; + this.cache = new ConcurrentHashMap<>(); + if (race.isLive(MillisecondsTimePoint.now())) { + startSimulationTime = MillisecondsTimePoint.now(); + } else { + startSimulationTime = null; + } } @Override @@ -38,10 +50,18 @@ public class WindFieldTrackedRaceImpl extends WindFieldGeneratorImpl implements double epsLng = epsLat / Math.cos(qLat * Math.PI / 180.0); double qLng = Math.floor(pos.getLngDeg() / epsLng) * epsLng; TimePoint time = timedPosition.getTimePoint(); + if ((startSimulationTime != null) && (time.after(startSimulationTime))) { + time = startSimulationTime; + } long epsTime = EPSILON_TIME_MILLIS; TimePoint qTime = new MillisecondsTimePoint((long) (Math.floor(time.asMillis() / epsTime) * epsTime)); Position qPosition = new DegreePosition(qLat, qLng); - Wind wind = this.race.getWind(qPosition, qTime); + TimedPosition qTimedPosition = new TimedPositionImpl(qTime, qPosition); + Wind wind = cache.get(qTimedPosition); + if (wind == null) { + wind = this.race.getWind(qPosition, qTime); + cache.put(qTimedPosition, wind); + } return wind; } From 4a77fd89ce3a636f1ac9da71598ea3170b8466ab Mon Sep 17 00:00:00 2001 From: Benjamin Barth Date: Wed, 15 Jul 2015 17:19:14 +0200 Subject: [PATCH 198/219] Races list - Fixed initial sorting and restoring sort order after update --- .../partials/racelist/AbstractRaceList.java | 24 +++++++++++++++---- .../racelist/RaceListColumnFactory.java | 2 +- .../racelist/SortableRaceListColumn.java | 4 ++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java index cf941d70edd..623dc8c5dca 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/AbstractRaceList.java @@ -3,10 +3,13 @@ package com.sap.sailing.gwt.home.client.place.event.partials.racelist; import java.util.Collection; import com.google.gwt.user.cellview.client.Column; +import com.google.gwt.user.cellview.client.ColumnSortList; +import com.google.gwt.user.cellview.client.ColumnSortList.ColumnSortInfo; import com.google.gwt.user.cellview.client.Header; import com.google.gwt.user.cellview.client.RowStyles; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.SimplePanel; +import com.sap.sailing.domain.common.InvertibleComparator; import com.sap.sailing.gwt.home.client.place.event.EventView; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources; import com.sap.sailing.gwt.home.client.place.event.partials.raceListLive.RacesListLiveResources.LocalCss; @@ -38,15 +41,24 @@ public abstract class AbstractRaceList data) { - Column sortColumn = (this.cellTable == null ? null : this.cellTable.getCurrentlySortedColumn()); + ColumnSortList sortList = this.cellTable == null ? null : this.cellTable.getColumnSortList(); this.cellTable = new SortedCellTable(data.size(), CleanCellTableResources.INSTANCE); this.cellTableContainer.setWidget(this.cellTable); this.initTableStyle(); this.initTableColumns(); this.cellTable.setList(data); - if (sortColumn != null && this.cellTable.getColumnIndex(sortColumn) >= 0) { - this.cellTable.sortColumn(sortColumn); + if (sortList != null && sortList.size() > 0) { + for (int i = sortList.size() - 1; i >= 0; i--) { + ColumnSortInfo sortInfo = sortList.get(i); + Column column = (Column) sortInfo.getColumn(); + if(this.cellTable.getColumnIndex(column) >= 0) { + this.cellTable.sortColumn(column, sortInfo.isAscending()); + } + } + } else { + this.cellTable.sortColumn(startTimeColumn); } } @@ -73,7 +85,11 @@ public abstract class AbstractRaceList comperator = column.getComparator(); + if (comperator != null) { + comperator.setAscending(ascending); + } + this.cellTable.addColumn(column, header, comperator, ascending); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java index a892aa2e38c..c9f620d4c90 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/RaceListColumnFactory.java @@ -542,7 +542,7 @@ public class RaceListColumnFactory { public static class SortableRaceListStartTimeColumn> extends SortableRaceListColumn { protected SortableRaceListStartTimeColumn(InvertibleComparator comparator) { - super(I18N.start(), new StartTimeCell(), comparator); + super(I18N.start(), new StartTimeCell(), comparator, SortingOrder.DESCENDING); } public void setShowTimeOnly(boolean showTimeOnly) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java index 69ffa9c2d0f..79239a0c831 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/partials/racelist/SortableRaceListColumn.java @@ -19,6 +19,10 @@ public abstract class SortableRaceListColumn extends SortableColumn this(new TextHeader(headerText), cell, comparator); } + protected SortableRaceListColumn(String headerText, Cell cell, InvertibleComparator comparator, SortingOrder preferredSortingOrder) { + this(new TextHeader(headerText), cell, comparator, preferredSortingOrder); + } + protected SortableRaceListColumn(Header header, Cell cell, InvertibleComparator comparator) { this(header, cell, comparator, SortingOrder.ASCENDING); } From 6ac0ffbe8f3332c557c90b9c8b2b78b05c68e7ff Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Jul 2015 18:16:30 +0200 Subject: [PATCH 199/219] fixed consolidated display of either all course middle lines or one or none; start/finish line are displayed when COURSEGEOMETRY is selected --- .../gwt/ui/client/shared/racemap/RaceMap.java | 84 +++++++++++-------- .../sap/sailing/gwt/ui/shared/GateDTO.java | 2 - 2 files changed, 48 insertions(+), 38 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index c44460f65cf..18f6770770a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -121,6 +121,7 @@ import com.sap.sailing.gwt.ui.shared.racemap.GoogleMapStyleHelper; import com.sap.sailing.gwt.ui.shared.racemap.RaceSimulationOverlay; import com.sap.sailing.gwt.ui.shared.racemap.WindStreamletsRaceboardOverlay; import com.sap.sse.common.Util; +import com.sap.sse.common.Util.Pair; import com.sap.sse.common.Util.Triple; import com.sap.sse.common.filter.Filter; import com.sap.sse.common.filter.FilterSet; @@ -895,9 +896,8 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe updateCoordinateSystemFromSettings(); } showCourseSidelinesOnMap(raceMapDataDTO.courseSidelines); - showStartAndFinishLines(raceMapDataDTO.coursePositions); + showStartAndFinishAndCourseMiddleLines(raceMapDataDTO.coursePositions); showStartLineToFirstMarkTriangle(raceMapDataDTO.coursePositions); - showCourseGeometryMetrics(raceMapDataDTO.coursePositions); // even though the wind data is retrieved by a separate call, re-draw the advantage line because it needs to // adjust to new boat positions showAdvantageLine(competitorsToShow, newTime); @@ -1310,13 +1310,6 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe } } - private void showCourseGeometryMetrics(final CoursePositionsDTO courseDTO) { - if (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE)) { - // based on the courseDTO, find the symmetrical pairs of marks that form legs, regardless the to/from - // direction, draw those - } - } - private final StringBuilder windwardStartLineMarkToFirstMarkLineText = new StringBuilder(); private final StringBuilder leewardStartLineMarkToFirstMarkLineText = new StringBuilder(); @@ -1359,8 +1352,20 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe private final StringBuilder startLineAdvantageText = new StringBuilder(); private final StringBuilder finishLineAdvantageText = new StringBuilder(); + final MouseOverMapHandler startLineTooltipHandler = new MouseOverMapHandler() { + @Override + public void onEvent(MouseOverMapEvent event) { + map.setTitle(stringMessages.startLine()+startLineAdvantageText); + } + }; + final MouseOverMapHandler finishLineTooltipHandler = new MouseOverMapHandler() { + @Override + public void onEvent(MouseOverMapEvent event) { + map.setTitle(stringMessages.finishLine()+finishLineAdvantageText); + } + }; - private void showStartAndFinishLines(final CoursePositionsDTO courseDTO) { + private void showStartAndFinishAndCourseMiddleLines(final CoursePositionsDTO courseDTO) { if (map != null && courseDTO != null && courseDTO.course != null && courseDTO.course.waypoints != null && !courseDTO.course.waypoints.isEmpty() && lastRaceTimesInfo != null) { com.sap.sse.common.Util.Pair leadingVisibleCompetitorInfo = getFarthestAheadVisibleCompetitorWithOneBasedLegNumber(getCompetitorsToShow()); @@ -1380,16 +1385,12 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe } else { startLineAdvantageText.delete(0, startLineAdvantageText.length()); } - final MouseOverMapHandler startLineTooltipHandler = new MouseOverMapHandler() { - @Override - public void onEvent(MouseOverMapEvent event) { - map.setTitle(stringMessages.startLine()+startLineAdvantageText); - } - }; - startLine = showOrRemoveOrUpdateLine(startLine, /* showLine */ oneBasedLegOfLeadingCompetitor <= 1 && - settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINE) && - courseDTO.getStartMarkPositions().size() == 2, startLineLeftPosition, startLineRightPosition, startLineTooltipHandler, "#ffffff"); - // TODO bug3027: also show advantage information for all other gates/lines; generalize CoursePositionsDTO line structures to provide this info + startLine = showOrRemoveOrUpdateLine(startLine, /* showLine */ courseDTO.getStartMarkPositions() != null && + courseDTO.getStartMarkPositions().size() == 2 && + ((oneBasedLegOfLeadingCompetitor <= 1 && + settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINE)) || + settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEGEOMETRY)), + startLineLeftPosition, startLineRightPosition, startLineTooltipHandler, "#ffffff"); // TODO bug3027: show SmallTransparentInfoOverlay in addition to tooltip if course geometry option is true; remove it if option is false // TODO bug3027: show *all* course middle lines if course geometry option is true @@ -1405,23 +1406,34 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe } else { finishLineAdvantageText.delete(0, finishLineAdvantageText.length()); } - final MouseOverMapHandler finishLineTooltipHandler = new MouseOverMapHandler() { - @Override - public void onEvent(MouseOverMapEvent event) { - map.setTitle(stringMessages.finishLine()+finishLineAdvantageText); - } - }; - finishLine = showOrRemoveOrUpdateLine(finishLine, /* showLine */ oneBasedLegOfLeadingCompetitor > 0 && oneBasedLegOfLeadingCompetitor == numberOfLegs && - settings.getHelpLinesSettings().isVisible(HelpLineTypes.FINISHLINE) && courseDTO.getFinishMarkPositions() != null && courseDTO.getFinishMarkPositions().size() == 2, + finishLine = showOrRemoveOrUpdateLine(finishLine, /* showLine */ courseDTO.getFinishMarkPositions() != null && courseDTO.getFinishMarkPositions().size() == 2 && + (oneBasedLegOfLeadingCompetitor > 0 && oneBasedLegOfLeadingCompetitor == numberOfLegs && settings.getHelpLinesSettings().isVisible(HelpLineTypes.FINISHLINE)) + || settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEGEOMETRY), finishLineLeftPosition, finishLineRightPosition, finishLineTooltipHandler, "#000000"); - - final int zeroBasedIndexOfStartWaypoint = oneBasedLegOfLeadingCompetitor-1; - final Set key = getCourseMiddleLinesKey(courseDTO, zeroBasedIndexOfStartWaypoint); - // draw the course middle line - final boolean showCourseMiddleLine = oneBasedLegOfLeadingCompetitor > 0 && courseDTO.waypointPositions.size() > oneBasedLegOfLeadingCompetitor && - settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEMIDDLELINE); - courseMiddleLines.put(key, showOrRemoveCourseMiddleLine(courseDTO, courseMiddleLines.get(key), - zeroBasedIndexOfStartWaypoint, showCourseMiddleLine)); + // the control point pairs for which we already decided whether or not + // to show a course middle line for; values tell whether to show the line and for which zero-based + // start waypoint index to do so; when for an equal control point pair multiple decisions with different + // outcome are made, a decision to show the line overrules the decision to not show it (OR-semantics) + final Map, Pair> keysAlreadyHandled = new HashMap<>(); + for (int zeroBasedIndexOfStartWaypoint = 0; zeroBasedIndexOfStartWaypoint key = getCourseMiddleLinesKey(courseDTO, zeroBasedIndexOfStartWaypoint); + boolean showCourseMiddleLine = keysAlreadyHandled.containsKey(key) && keysAlreadyHandled.get(key).getA() || + settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEGEOMETRY) || + (settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEMIDDLELINE) + && oneBasedLegOfLeadingCompetitor > 0 + && oneBasedLegOfLeadingCompetitor-1 == zeroBasedIndexOfStartWaypoint); + keysAlreadyHandled.put(key, new Pair<>(showCourseMiddleLine, zeroBasedIndexOfStartWaypoint)); + } + // TODO after a course change there may be stale keys and stale course middle lines; make sure they are removed in this process + Set> keysToConsider = new HashSet<>(keysAlreadyHandled.keySet()); + keysToConsider.addAll(courseMiddleLines.keySet()); + for (final Set key : keysToConsider) { + final int zeroBasedIndexOfStartWaypoint = keysAlreadyHandled.containsKey(key) ? + keysAlreadyHandled.get(key).getB() : 0; // if not handled, the line will be removed, so the waypoint index doesn't matter + final Pair showLineAndZeroBasedIndexOfStartWaypoint = keysAlreadyHandled.get(key); + final boolean showCourseMiddleLine = showLineAndZeroBasedIndexOfStartWaypoint != null && showLineAndZeroBasedIndexOfStartWaypoint.getA(); + courseMiddleLines.put(key, showOrRemoveCourseMiddleLine(courseDTO, courseMiddleLines.get(key), zeroBasedIndexOfStartWaypoint, showCourseMiddleLine)); + } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/GateDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/GateDTO.java index 0762ea23537..79f777fe846 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/GateDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/GateDTO.java @@ -41,8 +41,6 @@ public class GateDTO extends ControlPointDTO { public boolean equals(Object obj) { if (this == obj) return true; - if (!super.equals(obj)) - return false; if (getClass() != obj.getClass()) return false; GateDTO other = (GateDTO) obj; From 1c4a2b0d837be5e8448bceabe5aebe58b10094e2 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Jul 2015 18:18:47 +0200 Subject: [PATCH 200/219] show start line / first mark triangle also when COURSEGEOMETRY is selected --- .../sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 18f6770770a..1971c20fbc8 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -1339,12 +1339,14 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe } }; windwardStartLineMarkToFirstMarkLine = showOrRemoveOrUpdateLine(windwardStartLineMarkToFirstMarkLine, /* showLine */ - settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) + (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) || + settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEGEOMETRY)) && startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1, windwardStartLinePosition, firstMarkPosition, windwardStartLineMarkToFirstMarkLineTooltipHandler, "grey"); leewardStartLineMarkToFirstMarkLine = showOrRemoveOrUpdateLine(leewardStartLineMarkToFirstMarkLine, /* showLine */ - settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) + (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) || + settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEGEOMETRY)) && startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1, leewardStartLinePosition, firstMarkPosition, leewardStartLineMarkToFirstMarkLineTooltipHandler, "grey"); From 7959a30e04cb9d01102aeab880aeda0344f1c2f3 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Jul 2015 18:30:16 +0200 Subject: [PATCH 201/219] prepared to use the tooltip text also for a short text bubble in case COURSEGEOMETRY is selected --- .../gwt/ui/client/StringMessages.properties | 2 +- .../ui/client/StringMessages_de.properties | 2 +- .../ui/client/StringMessages_ru.properties | 2 +- .../ui/client/StringMessages_zh.properties | 2 +- .../gwt/ui/client/shared/racemap/RaceMap.java | 53 +++++++++++-------- 5 files changed, 35 insertions(+), 26 deletions(-) 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 0835fd88800..1d3bf251118 100644 --- 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 @@ -881,7 +881,7 @@ errorRunningDataMiningQuery=An error occured running the query hideToolbar=Hide toolbar showSeriesLeaderboards=Show series leaderboards showOverallLeaderboard=Show overall leaderboard -lineAngleToWindAndAdvantage=length: {0}m; angle to wind: {1}deg; {2} side has {3}m advantage +lineAngleToWindAndAdvantage=length: {0}m\nangle to wind: {1}deg\n{2} side has {3}m advantage doYouReallyWantToRemoveEvents=Do you really want to remove the events? doYouReallyWantToRemoveEvent=Do you really want to remove event {0}? line=Line 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 d97c6d59d94..1d320fc8864 100644 --- 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 @@ -877,7 +877,7 @@ errorRunningDataMiningQuery=Es ist ein Felher bei der Datenabfrage aufgetreten hideToolbar=Toolbar ausblenden showSeriesLeaderboards=Ergebnisse der Serie anzeigen showOverallLeaderboard=Gesamtergebnisse anzeigen -lineAngleToWindAndAdvantage=Länge: {0}m; Winkel zum Wind: {1}°; {2}-Seite ist {3}m bevorteilt +lineAngleToWindAndAdvantage=Länge: {0}m\nWinkel zum Wind: {1}°\n{2}-Seite ist {3}m bevorteilt doYouReallyWantToRemoveEvents=Möchten Sie diese Veranstaltungen wirklich entfernen? doYouReallyWantToRemoveEvent=Möchten Sie wirklich die Veranstaltung {0} entfernen? line=Linie diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index cc45af0d8dd..5cf58d144df 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -870,7 +870,7 @@ errorRunningDataMiningQuery=Ошибка при выполнении запро hideToolbar=Скрыть панель инструментов showSeriesLeaderboards=Показать таблицу лидеров серии showOverallLeaderboard=Показать общую таблицу лидеров -lineAngleToWindAndAdvantage=длина: {0}м; угол к ветру: {1}градус; {2} борт {3}м имеет преимущество +lineAngleToWindAndAdvantage=длина: {0}м\nугол к ветру: {1}градус\n{2} борт {3}м имеет преимущество doYouReallyWantToRemoveEvents=Вы действительно хотите удалить все события? doYouReallyWantToRemoveEvent=Вы действительно хотите удалить событие {0}? line=Строка diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index 4f6f97527ef..ec8d8db01e3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -391,7 +391,7 @@ listRaces=List Races dropReplicaConnection=Drop connection errorTryingToObtainOverallLeaderboards=Error trying to obtain overall leaderboards: {0} distanceTraveled=行驶距离 -lineAngleToWindAndAdvantage=length: {0}m; angle to wind: {1}deg; {2} side has {3}m advantage +lineAngleToWindAndAdvantage=length: {0}m\nangle to wind: {1}deg\n{2} side has {3}m advantage mapDevices=Map Devices to Competitors and Marks scoringSchemeHighPointFirstGetsTenOrEight=High Point, winner gets 10 points (or 8) playModeLive=Live diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 1971c20fbc8..280ea0a8c25 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -1326,44 +1326,44 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe stringMessages.startLineToFirstMarkTriangle(numberFormatOneDecimal .format(leewardStartLinePosition.getDistance(firstMarkPosition) .getMeters()))); - final MouseOverMapHandler windwardStartLineMarkToFirstMarkLineTooltipHandler = new MouseOverMapHandler() { + final LineInfoProvider windwardStartLineMarkToFirstMarkLineInfoProvider = new LineInfoProvider() { @Override - public void onEvent(MouseOverMapEvent event) { - map.setTitle(windwardStartLineMarkToFirstMarkLineText.toString()); + public String getLineInfo() { + return windwardStartLineMarkToFirstMarkLineText.toString(); } }; - final MouseOverMapHandler leewardStartLineMarkToFirstMarkLineTooltipHandler = new MouseOverMapHandler() { + final LineInfoProvider leewardStartLineMarkToFirstMarkLineInfoProvider = new LineInfoProvider() { @Override - public void onEvent(MouseOverMapEvent event) { - map.setTitle(leewardStartLineMarkToFirstMarkLineText.toString()); + public String getLineInfo() { + return leewardStartLineMarkToFirstMarkLineText.toString(); } }; windwardStartLineMarkToFirstMarkLine = showOrRemoveOrUpdateLine(windwardStartLineMarkToFirstMarkLine, /* showLine */ (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) || settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEGEOMETRY)) && startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1, - windwardStartLinePosition, firstMarkPosition, windwardStartLineMarkToFirstMarkLineTooltipHandler, + windwardStartLinePosition, firstMarkPosition, windwardStartLineMarkToFirstMarkLineInfoProvider, "grey"); leewardStartLineMarkToFirstMarkLine = showOrRemoveOrUpdateLine(leewardStartLineMarkToFirstMarkLine, /* showLine */ (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) || settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEGEOMETRY)) && startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1, - leewardStartLinePosition, firstMarkPosition, leewardStartLineMarkToFirstMarkLineTooltipHandler, + leewardStartLinePosition, firstMarkPosition, leewardStartLineMarkToFirstMarkLineInfoProvider, "grey"); } private final StringBuilder startLineAdvantageText = new StringBuilder(); private final StringBuilder finishLineAdvantageText = new StringBuilder(); - final MouseOverMapHandler startLineTooltipHandler = new MouseOverMapHandler() { + final LineInfoProvider startLineInfoProvider = new LineInfoProvider() { @Override - public void onEvent(MouseOverMapEvent event) { - map.setTitle(stringMessages.startLine()+startLineAdvantageText); + public String getLineInfo() { + return stringMessages.startLine()+startLineAdvantageText; } }; - final MouseOverMapHandler finishLineTooltipHandler = new MouseOverMapHandler() { + final LineInfoProvider finishLineInfoProvider = new LineInfoProvider() { @Override - public void onEvent(MouseOverMapEvent event) { - map.setTitle(stringMessages.finishLine()+finishLineAdvantageText); + public String getLineInfo() { + return stringMessages.finishLine()+finishLineAdvantageText; } }; @@ -1392,7 +1392,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe ((oneBasedLegOfLeadingCompetitor <= 1 && settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINE)) || settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEGEOMETRY)), - startLineLeftPosition, startLineRightPosition, startLineTooltipHandler, "#ffffff"); + startLineLeftPosition, startLineRightPosition, startLineInfoProvider, "#ffffff"); // TODO bug3027: show SmallTransparentInfoOverlay in addition to tooltip if course geometry option is true; remove it if option is false // TODO bug3027: show *all* course middle lines if course geometry option is true @@ -1411,7 +1411,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe finishLine = showOrRemoveOrUpdateLine(finishLine, /* showLine */ courseDTO.getFinishMarkPositions() != null && courseDTO.getFinishMarkPositions().size() == 2 && (oneBasedLegOfLeadingCompetitor > 0 && oneBasedLegOfLeadingCompetitor == numberOfLegs && settings.getHelpLinesSettings().isVisible(HelpLineTypes.FINISHLINE)) || settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEGEOMETRY), - finishLineLeftPosition, finishLineRightPosition, finishLineTooltipHandler, "#000000"); + finishLineLeftPosition, finishLineRightPosition, finishLineInfoProvider, "#000000"); // the control point pairs for which we already decided whether or not // to show a course middle line for; values tell whether to show the line and for which zero-based // start waypoint index to do so; when for an equal control point pair multiple decisions with different @@ -1467,9 +1467,9 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe final int zeroBasedIndexOfStartWaypoint, final boolean showLine) { final Position position1DTO = courseDTO.waypointPositions.get(zeroBasedIndexOfStartWaypoint); final Position position2DTO = courseDTO.waypointPositions.get(zeroBasedIndexOfStartWaypoint+1); - final MouseOverMapHandler tooltipHandler = new MouseOverMapHandler() { + final LineInfoProvider lineInfoProvider = new LineInfoProvider() { @Override - public void onEvent(MouseOverMapEvent event) { + public String getLineInfo() { final StringBuilder sb = new StringBuilder(); sb.append(stringMessages.courseMiddleLine()); sb.append('\n'); @@ -1487,12 +1487,16 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe sb.append(stringMessages.degreesToWind(diff)); } } - map.setTitle(sb.toString()); + return sb.toString(); } }; - return showOrRemoveOrUpdateLine(lineToShowOrRemoveOrUpdate, showLine, position1DTO, position2DTO, tooltipHandler, "#2268a0"); + return showOrRemoveOrUpdateLine(lineToShowOrRemoveOrUpdate, showLine, position1DTO, position2DTO, lineInfoProvider, "#2268a0"); } + private interface LineInfoProvider { + String getLineInfo(); + } + /** * @param showLine * tells whether or not to show the line; if the lineToShowOrRemoveOrUpdate references a @@ -1503,7 +1507,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe * otherwise */ private Polyline showOrRemoveOrUpdateLine(Polyline lineToShowOrRemoveOrUpdate, final boolean showLine, - final Position position1DTO, final Position position2DTO, final MouseOverMapHandler tooltipHandler, String lineColorRGB) { + final Position position1DTO, final Position position2DTO, final LineInfoProvider lineInfoProvider, String lineColorRGB) { if (showLine) { LatLng courseMiddleLinePoint1 = coordinateSystem.toLatLng(position1DTO); LatLng courseMiddleLinePoint2 = coordinateSystem.toLatLng(position2DTO); @@ -1518,7 +1522,12 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe pointsAsArray = MVCArray.newInstance(); lineToShowOrRemoveOrUpdate = Polyline.newInstance(options); lineToShowOrRemoveOrUpdate.setPath(pointsAsArray); - lineToShowOrRemoveOrUpdate.addMouseOverHandler(tooltipHandler); + lineToShowOrRemoveOrUpdate.addMouseOverHandler(new MouseOverMapHandler() { + @Override + public void onEvent(MouseOverMapEvent event) { + map.setTitle(lineInfoProvider.getLineInfo()); + } + }); lineToShowOrRemoveOrUpdate.addMouseOutMoveHandler(new MouseOutMapHandler() { @Override public void onEvent(MouseOutMapEvent event) { From 01d153755daa6f1b7b721313a27537bcedccae4e Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 15 Jul 2015 21:57:02 +0200 Subject: [PATCH 202/219] adjusted EmbeddedMapAndWindChart entry point's style and architecture to the changes merged from design2015 --- .../EmbeddedMapAndWindChart.html | 5 --- .../gwt/ui/EmbeddedMapAndWindChart.gwt.xml | 34 ++++++++----------- 2 files changed, 14 insertions(+), 25 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html index 5f7d119372e..440a01f45c2 100644 --- a/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html +++ b/java/com.sap.sailing.gwt.ui/EmbeddedMapAndWindChart.html @@ -18,14 +18,9 @@ - - - - - diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/EmbeddedMapAndWindChart.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/EmbeddedMapAndWindChart.gwt.xml index a37175fe492..8085c4deb08 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/EmbeddedMapAndWindChart.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/EmbeddedMapAndWindChart.gwt.xml @@ -2,12 +2,9 @@ - - - + - @@ -19,30 +16,27 @@ - + - - + + - - - - - - - - - - - - - + + + + + + + + + + From 01241ded43559c321e0479068539628b3e4261ed Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Thu, 16 Jul 2015 09:36:37 +0200 Subject: [PATCH 203/219] Changed the calculation of the RaceViewState to also be based on score corrections if available --- .../ui/shared/dispatch/event/RaceContext.java | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 6b97d4f7ba6..85ebec3156c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -30,6 +30,7 @@ import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; +import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.WindWithConfidence; @@ -323,33 +324,43 @@ public class RaceContext { private RaceViewState getLiveRaceViewState() { if(raceViewState == null) { - raceViewState = calculateLiveRaceViewState(); + raceViewState = calculateRaceViewState(); } return raceViewState; } - - private RaceViewState calculateLiveRaceViewState() { + + private RaceViewState calculateRaceViewState() { TimePoint startTime = getStartTime(); TimePoint finishTime = getFinishTime(); - RaceViewState raceState = RaceViewState.RUNNING; if (startTime != null && now.before(startTime)) { - raceState = RaceViewState.SCHEDULED; - } else if (finishTime != null && now.after(finishTime)) { - raceState = RaceViewState.FINISHED; - } else if(raceLog != null) { + return RaceViewState.SCHEDULED; + } + if (finishTime != null && now.after(finishTime)) { + return RaceViewState.FINISHED; + } + if(raceLog != null) { RaceLogFlagEvent abortingFlagEvent = checkForAbortFlagEvent(); if (abortingFlagEvent != null) { Flags upperFlag = abortingFlagEvent.getUpperFlag(); if(upperFlag.equals(Flags.AP)) { - raceState = RaceViewState.POSTPONED; - } else if(upperFlag.equals(Flags.NOVEMBER)) { - raceState = RaceViewState.ABANDONED; - } else if(upperFlag.equals(Flags.FIRSTSUBSTITUTE)) { - raceState = RaceViewState.ABANDONED; + return RaceViewState.POSTPONED; + } + if(upperFlag.equals(Flags.NOVEMBER)) { + return RaceViewState.ABANDONED; + } + if(upperFlag.equals(Flags.FIRSTSUBSTITUTE)) { + return RaceViewState.ABANDONED; } } } - return raceState; + SettableScoreCorrection scoreCorrection = leaderboard.getScoreCorrection(); + if(trackedRace == null && scoreCorrection != null && scoreCorrection.hasCorrectionFor(raceColumn)) { + return RaceViewState.FINISHED; + } + if(startTime != null) { + return RaceViewState.RUNNING; + } + return RaceViewState.PLANNED; } private Wind checkForWindFixesFromRaceLog() { From 5db3698a509f2f579ea04058d3de8da15e164bd5 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Thu, 16 Jul 2015 09:47:05 +0200 Subject: [PATCH 204/219] Simplified calculation if a race is live --- .../sailing/gwt/ui/shared/dispatch/event/RaceContext.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 999405a2fc2..f160e4186f5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -576,12 +576,6 @@ public class RaceContext { } public boolean isLive() { - if(getStartTime() == null) { - return false; - } - if (trackedRace != null && trackedRace.hasGPSData() && trackedRace.hasWindData()) { - return trackedRace.isLive(now); - } return getLiveRaceViewState() == RaceViewState.RUNNING; } } From 9be3c6e51127e7a77747205a5360efdfcaddd8c1 Mon Sep 17 00:00:00 2001 From: Simon Pamies Date: Thu, 16 Jul 2015 10:00:53 +0200 Subject: [PATCH 205/219] XML exporter now exporting empty race columns with RDG'ed competitors --- .../sailing/xmlexport/LeaderboardData.java | 83 ++++++++++++++----- 1 file changed, 61 insertions(+), 22 deletions(-) diff --git a/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java b/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java index 86e78215568..53a318f1747 100644 --- a/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java +++ b/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java @@ -202,6 +202,35 @@ public class LeaderboardData extends ExportAction { return windElements; } + private Element createRaceXMLWithoutRaceData(final Fleet fleet, final RaceColumn column, final Leaderboard leaderboard, int sameDayGroupIndex, int raceCounter, Util.Pair> raceConfidenceAndErrorMessages) throws NoWindException, IOException, ServletException { + Element raceElement = new Element("race"); + addNamedElementWithValue(raceElement, "name", column.getName()+'-'+fleet.getName()); + addNamedElementWithValue(raceElement, "race_index_in_leaderboard", raceCounter); + addNamedElementWithValue(raceElement, "fleet_name", fleet.getName()); + addNamedElementWithValue(raceElement, "same_day_index", sameDayGroupIndex); + addNamedElementWithValue(raceElement, "is_live", "false"); + TimePoint timepointToBeUsed = MillisecondsTimePoint.now(); + List competitors = leaderboard.getCompetitorsFromBestToWorst(column, timepointToBeUsed); + for (Competitor competitorInLeaderboard : competitors) { + MaxPointsReason mpr = leaderboard.getScoreCorrection().getMaxPointsReason(competitorInLeaderboard, column, timepointToBeUsed); + if (mpr != null && !mpr.equals(MaxPointsReason.NONE)) { + // add this competitor to the list to have him evaluated + Element competitorElement = createCompetitorXML(competitorInLeaderboard, leaderboard, /*shortVersion*/ true, null); + Element competitorRaceDataElement = new Element("competitor_race_data"); + MaxPointsReason maxPointsReason = leaderboard.getMaxPointsReason(competitorInLeaderboard, column, timepointToBeUsed); + addNamedElementWithValue(competitorRaceDataElement, "max_points_reason", maxPointsReason.toString()); + boolean isDiscardedForCompetitor = leaderboard.isDiscarded(competitorInLeaderboard, column, timepointToBeUsed); + addNamedElementWithValue(competitorRaceDataElement, "is_discarded", isDiscardedForCompetitor == true ? "true" : "false"); + Double finalRaceScore = leaderboard.getTotalPoints(competitorInLeaderboard, column, timepointToBeUsed); + addNamedElementWithValue(competitorRaceDataElement, "final_race_score", finalRaceScore); + competitorElement.addContent(competitorRaceDataElement); + raceElement.addContent(competitorElement); + raceConfidenceAndErrorMessages = updateConfidence("Competitor " + competitorInLeaderboard.getName() + " has no valid data for this race!", 0.2, raceConfidenceAndErrorMessages); + } + } + return raceElement; + } + /** * Creates elements containing information about a race */ @@ -784,24 +813,29 @@ public class LeaderboardData extends ExportAction { private Util.Pair> checkData(TrackedRace race) throws Exception { double simpleConfidence = 1.0; Vector messages = new Vector(); TimePoint dateAtYear2000 = new MillisecondsTimePoint(946681200000l); - if (race.getStartOfRace() == null || race.getStartOfRace().before(dateAtYear2000)) { - messages.add("Start time of race " + race.getRaceIdentifier().getRaceName() + " is either null or not valid!"); + if (race == null) { + messages.add("Tracked race is null - no race seems to be connected!"); simpleConfidence -= 1; - } - if (race.getEndOfRace() == null || race.getEndOfRace().before(dateAtYear2000)) { - messages.add("End time of race " + race.getRaceIdentifier().getRaceName() + " is either null or not valid!"); - simpleConfidence -= 1; - } - if (race.getStartOfTracking() == null || race.getStartOfTracking().before(dateAtYear2000)) { - messages.add("Start tracking time of race " + race.getRaceIdentifier().getRaceName() + " is either null or not valid!"); - simpleConfidence -= 0.2; - } - if (race.getEndOfTracking() == null || race.getEndOfTracking().before(dateAtYear2000)) { - messages.add("End tracking time of race " + race.getRaceIdentifier().getRaceName() + " is either null or not valid!"); - simpleConfidence -= 0.2; - } - if (race.isLive(MillisecondsTimePoint.now())) { - messages.add("This race is live - data for this race will not be available until the race has been finished!"); + } else { + if (race.getStartOfRace() == null || race.getStartOfRace().before(dateAtYear2000)) { + messages.add("Start time of race " + race.getRaceIdentifier().getRaceName() + " is either null or not valid!"); + simpleConfidence -= 1; + } + if (race.getEndOfRace() == null || race.getEndOfRace().before(dateAtYear2000)) { + messages.add("End time of race " + race.getRaceIdentifier().getRaceName() + " is either null or not valid!"); + simpleConfidence -= 1; + } + if (race.getStartOfTracking() == null || race.getStartOfTracking().before(dateAtYear2000)) { + messages.add("Start tracking time of race " + race.getRaceIdentifier().getRaceName() + " is either null or not valid!"); + simpleConfidence -= 0.2; + } + if (race.getEndOfTracking() == null || race.getEndOfTracking().before(dateAtYear2000)) { + messages.add("End tracking time of race " + race.getRaceIdentifier().getRaceName() + " is either null or not valid!"); + simpleConfidence -= 0.2; + } + if (race.isLive(MillisecondsTimePoint.now())) { + messages.add("This race is live - data for this race will not be available until the race has been finished!"); + } } return new Util.Pair>(simpleConfidence, messages); } @@ -899,11 +933,13 @@ public class LeaderboardData extends ExportAction { for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { for (Fleet fleet : raceColumn.getFleets()) { TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); - if (trackedRace != null && trackedRace.hasGPSData()) { + if (trackedRace != null) { sameDayGroupIndex += getSameDayGroupIndex(raceColumn.getTrackedRace(fleet), raceBefore); - TimePoint timeSpentForRace = MillisecondsTimePoint.now(); - Util.Pair> raceConfidenceAndErrorMessages = checkData(trackedRace); - final List legs = new ArrayList(); + } + TimePoint timeSpentForRace = MillisecondsTimePoint.now(); + Util.Pair> raceConfidenceAndErrorMessages = checkData(trackedRace); + final List legs = new ArrayList(); + if (trackedRace != null && trackedRace.hasGPSData()) { int legCounter = 0; for (TrackedLeg leg : trackedRace.getTrackedLegs()) { Util.Pair> legConfidenceAndErrorMessages = checkData(leg); @@ -914,8 +950,11 @@ public class LeaderboardData extends ExportAction { addNamedElementWithValue(raceElement, "generation_time_in_milliseconds", elapsedTimeForRace.asMillis()); racesElements.add(raceElement); log.info("Exported complete race " + trackedRace.getRace().getName() + " in " + elapsedTimeForRace.asMillis() + " milliseconds!"); - raceBefore = trackedRace; + } else { + racesElements.add(createRaceXMLWithoutRaceData(fleet, raceColumn, leaderboard, sameDayGroupIndex, ++raceCounter, raceConfidenceAndErrorMessages)); + log.info("Exported empty race in race column " + raceColumn.getName() + " with fleet " + fleet.getName()); } + raceBefore = trackedRace; } } log.info("Finished XML export of leaderboard " + leaderboard.getName() + " in " + MillisecondsTimePoint.now().minus(timeSpent.asMillis()).asMillis() + " milliseconds"); From a9be120ca6594731e373bc8edc1d408b5739081e Mon Sep 17 00:00:00 2001 From: Simon Pamies Date: Thu, 16 Jul 2015 10:05:36 +0200 Subject: [PATCH 206/219] XML exporter now getting the startline length at the time of the start of the race --- .../src/com/sap/sailing/xmlexport/LeaderboardData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java b/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java index 53a318f1747..418d41d1664 100644 --- a/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java +++ b/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java @@ -262,7 +262,7 @@ public class LeaderboardData extends ExportAction { addNamedElementWithValue(raceElement, "start_of_tracking_time_as_millis", handleValue(race.getStartOfTracking())); addNamedElementWithValue(raceElement, "end_of_tracking_time_as_millis", handleValue(race.getEndOfTracking())); - LineDetails start = race.getStartLine(race.getStartOfTracking()); + LineDetails start = race.getStartLine(race.getStartOfRace()); if (start != null) { if (start.getLength() != null) { addNamedElementWithValue(raceElement, "start_line_length_in_meters", start.getLength().getMeters()); From 4f9d08ac4360fab9f16dad27e96e9aa18b5d3942 Mon Sep 17 00:00:00 2001 From: Simon Pamies Date: Thu, 16 Jul 2015 10:17:47 +0200 Subject: [PATCH 207/219] XML exporter now makes sure to first take the time of the latest leaderboard change for rank calculation --- .../com/sap/sailing/xmlexport/LeaderboardData.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java b/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java index 418d41d1664..628b51d72e9 100644 --- a/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java +++ b/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java @@ -597,13 +597,16 @@ public class LeaderboardData extends ExportAction { // will kick in } } - if (endOfRaceForLastTrackedRaceInLeaderboard != null) { - timePointOfLatestModification = endOfRaceForLastTrackedRaceInLeaderboard; + // first look for latest modification of leaderboard + // if there is no latest modification then take the last races time + if (leaderboard.getTimePointOfLatestModification() != null) { + timePointOfLatestModification = leaderboard.getTimePointOfLatestModification(); } else { - if (leaderboard.getTimePointOfLatestModification() != null) { - timePointOfLatestModification = leaderboard.getTimePointOfLatestModification(); + if (endOfRaceForLastTrackedRaceInLeaderboard != null) { + timePointOfLatestModification = endOfRaceForLastTrackedRaceInLeaderboard; } else { - timePointOfLatestModification = MillisecondsTimePoint.now(); + // make sure that the timepoint is far in the future - could be that the export is called too early + timePointOfLatestModification = MillisecondsTimePoint.now().plus(Duration.ONE_YEAR); } } Duration totalTimeSailed = leaderboard.getTotalTimeSailed(competitor, timePointOfLatestModification); From c40f36cd02f67cdea79fb416448967ede7c7bb5b Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Thu, 16 Jul 2015 10:19:37 +0200 Subject: [PATCH 208/219] Improved calculation of RaceViewState for cases when there are multiple fleets and not all are being tracked that leaded to false recognition of "FINISHED" state --- .../gwt/ui/shared/dispatch/event/RaceContext.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 85ebec3156c..d0204581431 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -354,7 +354,7 @@ public class RaceContext { } } SettableScoreCorrection scoreCorrection = leaderboard.getScoreCorrection(); - if(trackedRace == null && scoreCorrection != null && scoreCorrection.hasCorrectionFor(raceColumn)) { + if(!hasTrackingForRaceColumn() && scoreCorrection != null && scoreCorrection.hasCorrectionFor(raceColumn)) { return RaceViewState.FINISHED; } if(startTime != null) { @@ -362,6 +362,15 @@ public class RaceContext { } return RaceViewState.PLANNED; } + + private boolean hasTrackingForRaceColumn() { + for(Fleet fleetOfRaceColumn : raceColumn.getFleets()) { + if(raceColumn.getTrackedRace(fleetOfRaceColumn) != null) { + return true; + } + } + return false; + } private Wind checkForWindFixesFromRaceLog() { WindFixesFinder windFixesFinder = new WindFixesFinder(raceLog); From 67c0c7841ce3077059bd577f31b7933fe8cade8a Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Thu, 16 Jul 2015 10:22:24 +0200 Subject: [PATCH 209/219] Fixed potential NPE when calculating the winner for a finished race --- .../java/com/sap/sailing/gwt/server/HomeServiceUtil.java | 6 ++++++ .../sailing/gwt/ui/shared/dispatch/event/RaceContext.java | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java index 3124314e649..0f1d8f5538c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/server/HomeServiceUtil.java @@ -38,8 +38,10 @@ import com.sap.sailing.gwt.ui.shared.media.SailingVideoDTO; import com.sap.sailing.gwt.ui.shared.start.EventStageDTO; import com.sap.sailing.gwt.ui.shared.start.StageEventType; import com.sap.sailing.server.RacingEventService; +import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; +import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.media.ImageDescriptor; import com.sap.sse.common.media.MediaDescriptor; import com.sap.sse.common.media.MediaTagConstants; @@ -466,6 +468,10 @@ public final class HomeServiceUtil { return !liveRaces.isEmpty(); } + public static TimePoint getLiveTimePoint() { + return new MillisecondsTimePoint(getLiveTimePointInMillis()); + } + private static long getLiveTimePointInMillis() { // TODO better solution long livePlayDelayInMillis = 15_000; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index df297586abf..79b5eea0e3f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -394,7 +394,11 @@ public class RaceContext { } // TODO do not calculate the winner if the blue flag is currently shown. try { - competitors = leaderboard.getCompetitorsFromBestToWorst(raceColumn, getFinishTime()); + TimePoint finishTime = getFinishTime(); + if(finishTime == null) { + finishTime = HomeServiceUtil.getLiveTimePoint(); + } + competitors = leaderboard.getCompetitorsFromBestToWorst(raceColumn, finishTime); if (competitors == null || competitors.isEmpty()) { return null; } From 10d3ad53ee3ad617ece848870615fa700bb5955b Mon Sep 17 00:00:00 2001 From: Simon Pamies Date: Thu, 16 Jul 2015 11:01:30 +0200 Subject: [PATCH 210/219] XML exporter now extracting wind information --- .../sailing/xmlexport/LeaderboardData.java | 47 +++++++++++++++++-- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java b/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java index 628b51d72e9..60fe96a9e8b 100644 --- a/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java +++ b/java/com.sap.sailing.xmlexport/src/com/sap/sailing/xmlexport/LeaderboardData.java @@ -34,8 +34,11 @@ import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.Speed; import com.sap.sailing.domain.common.Tack; +import com.sap.sailing.domain.common.WindSource; +import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.impl.KnotSpeedImpl; import com.sap.sailing.domain.common.impl.MeterDistance; +import com.sap.sailing.domain.common.impl.WindSourceImpl; import com.sap.sailing.domain.common.tracking.GPSFixMoving; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.ranking.RankingMetric.RankingInfo; @@ -46,6 +49,8 @@ import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.WindPositionMode; +import com.sap.sailing.domain.tracking.WindTrack; +import com.sap.sailing.domain.tracking.WindWithConfidence; import com.sap.sailing.server.RacingEventService; import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; @@ -97,7 +102,7 @@ public class LeaderboardData extends ExportAction { * * */ - private Element createLeaderboardXML(Leaderboard leaderboard, List competitors, List races, Util.Pair> leaderboardConfidenceAndErrorMessages) { + private Element createLeaderboardXML(Leaderboard leaderboard, List windData, List competitors, List races, Util.Pair> leaderboardConfidenceAndErrorMessages) { Element leaderboardElement = new Element("leaderboard"); addNamedElementWithValue(leaderboardElement, "name", leaderboard.getName()); addNamedElementWithValue(leaderboardElement, "display_name", leaderboard.getDisplayName()); @@ -106,6 +111,9 @@ public class LeaderboardData extends ExportAction { addNamedElementWithValue(leaderboardElement, "boat_class", getBoatClassName(leaderboard)); leaderboardElement.addContent(createTimedXML("last_modification_", leaderboard.getTimePointOfLatestModification())); leaderboardElement.addContent(createDataConfidenceXML(leaderboardConfidenceAndErrorMessages)); + Element windContainer = new Element("wind"); + windContainer.addContent(windData); + leaderboardElement.addContent(windContainer); leaderboardElement.addContent(competitors); leaderboardElement.addContent(races); return leaderboardElement; @@ -740,6 +748,36 @@ public class LeaderboardData extends ExportAction { return legElement; } + private List createFullWindDataXML(TrackedRace race, Fleet fleet, int sameDayIndex) { + List windElements = new ArrayList<>(); + List windSourcesToDeliver = new ArrayList(); + WindSourceImpl windSource = new WindSourceImpl(WindSourceType.COMBINED); + windSourcesToDeliver.add(windSource); + TimePoint fromTimePoint = race.getStartOfRace(); + TimePoint toTimePoint = race.getEndOfRace(); + int numberOfFixes = (int) ((toTimePoint.asMillis() - fromTimePoint.asMillis()) / /*resolutionInMillis*/ 1000*60*5); + WindTrack windTrack = race.getOrCreateWindTrack(windSource); + TimePoint timePoint = fromTimePoint; + for (int i = 0; i < numberOfFixes && toTimePoint != null && timePoint.compareTo(toTimePoint) < 0; i++) { + WindWithConfidence> averagedWindWithConfidence = windTrack + .getAveragedWindWithConfidence(null, timePoint); + if (averagedWindWithConfidence != null) { + Element windElement = new Element("windFix"); + addNamedElementWithValue(windElement, "same_day_index", sameDayIndex); + addNamedElementWithValue(windElement, "race_name", race.getRace().getName()); + addNamedElementWithValue(windElement, "fleet_name", fleet.getName()); + windElement.addContent(createTimedXML("", averagedWindWithConfidence.getObject().getTimePoint())); + addNamedElementWithValue(windElement, "bearingInDegrees", averagedWindWithConfidence.getObject().getBearing().getDegrees()); + addNamedElementWithValue(windElement, "directionFromInDegrees", averagedWindWithConfidence.getObject().getBearing().reverse().getDegrees()); + windElement.addContent(createWindXML("", new SpeedWithConfidenceImpl(new KnotSpeedImpl(averagedWindWithConfidence.getObject().getKnots()), + averagedWindWithConfidence.getConfidence(), toTimePoint))); + windElements.add(windElement); + } + timePoint = new MillisecondsTimePoint(timePoint.asMillis() + 1000*60*5); + } + return windElements; + } + /** * Creates xml elements that indicate confidence. */ @@ -923,15 +961,13 @@ public class LeaderboardData extends ExportAction { TimePoint timeSpent = MillisecondsTimePoint.now(); log.info("Starting XML export of " + leaderboard.getName()); Util.Pair> leaderboardConfidenceAndErrorMessages = checkData(leaderboard); - final List racesElements = new ArrayList(); final List competitorElements = new ArrayList(); - for (Competitor competitor : leaderboard.getAllCompetitors()) { Util.Pair> competitorConfidenceAndErrorMessages = checkData(competitor); competitorElements.add(createCompetitorXML(competitor, leaderboard, /*shortVersion*/ false, competitorConfidenceAndErrorMessages)); } - + List windData = new ArrayList(); TrackedRace raceBefore = null; int sameDayGroupIndex = 0; int raceCounter = 0; for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { for (Fleet fleet : raceColumn.getFleets()) { @@ -943,6 +979,7 @@ public class LeaderboardData extends ExportAction { Util.Pair> raceConfidenceAndErrorMessages = checkData(trackedRace); final List legs = new ArrayList(); if (trackedRace != null && trackedRace.hasGPSData()) { + windData.addAll(createFullWindDataXML(trackedRace, fleet, sameDayGroupIndex)); int legCounter = 0; for (TrackedLeg leg : trackedRace.getTrackedLegs()) { Util.Pair> legConfidenceAndErrorMessages = checkData(leg); @@ -961,7 +998,7 @@ public class LeaderboardData extends ExportAction { } } log.info("Finished XML export of leaderboard " + leaderboard.getName() + " in " + MillisecondsTimePoint.now().minus(timeSpent.asMillis()).asMillis() + " milliseconds"); - Element dataToExport = createLeaderboardXML(leaderboard, competitorElements, racesElements, leaderboardConfidenceAndErrorMessages); + Element dataToExport = createLeaderboardXML(leaderboard, windData, competitorElements, racesElements, leaderboardConfidenceAndErrorMessages); sendDocument(dataToExport, leaderboard.getName() + ".xml"); } } From fb9046ec94545658ae142764e751ee3a46b88fc4 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Thu, 16 Jul 2015 11:11:14 +0200 Subject: [PATCH 211/219] Using ScoreCorrection instead of SettableScoreCorrection as we do not need to set anything --- .../sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index d0204581431..1dc05840110 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -30,7 +30,7 @@ import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; -import com.sap.sailing.domain.leaderboard.SettableScoreCorrection; +import com.sap.sailing.domain.leaderboard.ScoreCorrection; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.WindTrack; import com.sap.sailing.domain.tracking.WindWithConfidence; @@ -353,7 +353,7 @@ public class RaceContext { } } } - SettableScoreCorrection scoreCorrection = leaderboard.getScoreCorrection(); + ScoreCorrection scoreCorrection = leaderboard.getScoreCorrection(); if(!hasTrackingForRaceColumn() && scoreCorrection != null && scoreCorrection.hasCorrectionFor(raceColumn)) { return RaceViewState.FINISHED; } From 0b448cf2fdbafa3b57f486c7bc60454aba952c10 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 16 Jul 2015 11:26:05 +0200 Subject: [PATCH 212/219] fixed course middle line displays --- .../gwt/ui/client/shared/racemap/RaceMap.java | 56 ++++++++++++++++--- .../racemap/RaceMapHelpLinesSettings.java | 5 ++ .../EmbeddedMapAndWindChartEntryPoint.java | 10 ++++ .../gwt/ui/raceboard/RaceBoardEntryPoint.java | 1 - .../Manage2SailEventResultsParserImpl.java | 2 +- 5 files changed, 63 insertions(+), 11 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java index 280ea0a8c25..6b5d10c274d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMap.java @@ -223,6 +223,15 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe private final Map courseSidelines; + /** + * When the {@link HelpLineTypes#COURSEGEOMETRY} option is selected, little markers will be displayed on the + * lines that show the tooltip text in a little info box linked to the line. When the line is removed by + * {@link #showOrRemoveOrUpdateLine(Polyline, boolean, Position, Position, LineInfoProvider, String)}, these + * overlays need to be removed as well. Also, when the {@link HelpLineTypes#COURSEGEOMETRY} setting is + * deactivated, all these overlays need to go. + */ + private final Map infoOverlaysForLinesForCourseGeometry; + /** * Wind data used to display the advantage line. Retrieved by a {@link GetWindInfoAction} execution and used in * {@link #showAdvantageLine(Iterable, Date)}. @@ -404,6 +413,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe markDTOs = new HashMap(); courseSidelines = new HashMap<>(); courseMiddleLines = new HashMap<>(); + infoOverlaysForLinesForCourseGeometry = new HashMap<>(); boatOverlays = new HashMap(); competitorInfoOverlays = new HashMap(); windSensorOverlays = new HashMap(); @@ -1339,14 +1349,12 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe } }; windwardStartLineMarkToFirstMarkLine = showOrRemoveOrUpdateLine(windwardStartLineMarkToFirstMarkLine, /* showLine */ - (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) || - settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEGEOMETRY)) + (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE)) && startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1, windwardStartLinePosition, firstMarkPosition, windwardStartLineMarkToFirstMarkLineInfoProvider, "grey"); leewardStartLineMarkToFirstMarkLine = showOrRemoveOrUpdateLine(leewardStartLineMarkToFirstMarkLine, /* showLine */ - (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE) || - settings.getHelpLinesSettings().isVisible(HelpLineTypes.COURSEGEOMETRY)) + (settings.getHelpLinesSettings().isVisible(HelpLineTypes.STARTLINETOFIRSTMARKTRIANGLE)) && startMarkPositions.size() > 1 && courseDTO.waypointPositions.size() > 1, leewardStartLinePosition, firstMarkPosition, leewardStartLineMarkToFirstMarkLineInfoProvider, "grey"); @@ -1369,7 +1377,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe private void showStartAndFinishAndCourseMiddleLines(final CoursePositionsDTO courseDTO) { if (map != null && courseDTO != null && courseDTO.course != null && courseDTO.course.waypoints != null && - !courseDTO.course.waypoints.isEmpty() && lastRaceTimesInfo != null) { + !courseDTO.course.waypoints.isEmpty()) { com.sap.sse.common.Util.Pair leadingVisibleCompetitorInfo = getFarthestAheadVisibleCompetitorWithOneBasedLegNumber(getCompetitorsToShow()); int oneBasedLegOfLeadingCompetitor = leadingVisibleCompetitorInfo == null ? -1 : leadingVisibleCompetitorInfo.getA(); int numberOfLegs = courseDTO.course.waypoints.size()-1; @@ -1426,7 +1434,6 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe && oneBasedLegOfLeadingCompetitor-1 == zeroBasedIndexOfStartWaypoint); keysAlreadyHandled.put(key, new Pair<>(showCourseMiddleLine, zeroBasedIndexOfStartWaypoint)); } - // TODO after a course change there may be stale keys and stale course middle lines; make sure they are removed in this process Set> keysToConsider = new HashSet<>(keysAlreadyHandled.keySet()); keysToConsider.addAll(courseMiddleLines.keySet()); for (final Set key : keysToConsider) { @@ -1535,22 +1542,53 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe } }); lineToShowOrRemoveOrUpdate.setMap(map); + } else { pointsAsArray = lineToShowOrRemoveOrUpdate.getPath(); pointsAsArray.removeAt(1); pointsAsArray.removeAt(0); } + adjustInfoOverlayForVisibleLine(lineToShowOrRemoveOrUpdate, position1DTO, position2DTO, lineInfoProvider); pointsAsArray.insertAt(0, courseMiddleLinePoint1); pointsAsArray.insertAt(1, courseMiddleLinePoint2); - } - else { + } else { if (lineToShowOrRemoveOrUpdate != null) { lineToShowOrRemoveOrUpdate.setMap(null); + adjustInfoOverlayForRemovedLine(lineToShowOrRemoveOrUpdate); lineToShowOrRemoveOrUpdate = null; } } return lineToShowOrRemoveOrUpdate; } + + private void adjustInfoOverlayForRemovedLine(Polyline lineToShowOrRemoveOrUpdate) { + SmallTransparentInfoOverlay infoOverlay = infoOverlaysForLinesForCourseGeometry.remove(lineToShowOrRemoveOrUpdate); + if (infoOverlay != null) { + infoOverlay.removeFromMap(); + } + } + + private void adjustInfoOverlayForVisibleLine(Polyline lineToShowOrRemoveOrUpdate, final Position position1DTO, + final Position position2DTO, final LineInfoProvider lineInfoProvider) { + SmallTransparentInfoOverlay infoOverlay = infoOverlaysForLinesForCourseGeometry.get(lineToShowOrRemoveOrUpdate); + if (getSettings().getHelpLinesSettings().isVisible(HelpLineTypes.COURSEGEOMETRY)) { + if (infoOverlay == null) { + infoOverlay = new SmallTransparentInfoOverlay(map, RaceMapOverlaysZIndexes.INFO_OVERLAY_ZINDEX, lineInfoProvider.getLineInfo(), coordinateSystem); + infoOverlaysForLinesForCourseGeometry.put(lineToShowOrRemoveOrUpdate, infoOverlay); + infoOverlay.addToMap(); + } else { + infoOverlay.setInfoText(lineInfoProvider.getLineInfo()); + } + infoOverlay.setPosition(position1DTO.translateGreatCircle(position1DTO.getBearingGreatCircle(position2DTO), + position1DTO.getDistance(position2DTO).scale(0.5)), /* transition time */ -1); + infoOverlay.draw(); + } else { + if (infoOverlay != null) { + infoOverlay.removeFromMap(); + infoOverlaysForLinesForCourseGeometry.remove(lineToShowOrRemoveOrUpdate); + } + } + } /** * If, according to {@link #lastRaceTimesInfo} and {@link #timer} the race is @@ -1559,7 +1597,7 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe */ private void updateCountdownCanvas(WaypointDTO startWaypoint) { if (!settings.isShowSelectedCompetitorsInfo() || startWaypoint == null || Util.isEmpty(startWaypoint.controlPoint.getMarks()) - || lastRaceTimesInfo.startOfRace == null || timer.getTime().after(lastRaceTimesInfo.startOfRace)) { + || lastRaceTimesInfo == null || lastRaceTimesInfo.startOfRace == null || timer.getTime().after(lastRaceTimesInfo.startOfRace)) { if (countDownOverlay != null) { countDownOverlay.removeFromMap(); countDownOverlay = null; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapHelpLinesSettings.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapHelpLinesSettings.java index 2884234d212..78e928cc084 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapHelpLinesSettings.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapHelpLinesSettings.java @@ -1,6 +1,7 @@ package com.sap.sailing.gwt.ui.client.shared.racemap; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -35,6 +36,10 @@ public class RaceMapHelpLinesSettings { return visibleHelpLines.contains(helpLineType); } + public Iterable getVisibleHelpLineTypes() { + return Collections.unmodifiableCollection(visibleHelpLines); + } + @Override public int hashCode() { final int prime = 31; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java index e21f2aa2de6..25741adac15 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/EmbeddedMapAndWindChartEntryPoint.java @@ -3,7 +3,9 @@ package com.sap.sailing.gwt.ui.raceboard; import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.UUID; import com.google.gwt.core.client.GWT; @@ -30,12 +32,15 @@ import com.sap.sailing.gwt.ui.client.TimePanelSettings; import com.sap.sailing.gwt.ui.client.shared.charts.WindChart; import com.sap.sailing.gwt.ui.client.shared.charts.WindChartSettings; import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMap; +import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapHelpLinesSettings; +import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapHelpLinesSettings.HelpLineTypes; import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapResources; import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapSettings; import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapZoomSettings; import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapZoomSettings.ZoomTypes; import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sse.common.Duration; +import com.sap.sse.common.Util; import com.sap.sse.common.filter.Filter; import com.sap.sse.common.filter.FilterSet; import com.sap.sse.gwt.client.async.AsyncActionsExecutor; @@ -61,6 +66,7 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint @Override protected void doOnModuleLoad() { + GWT.debugger(); // TODO remove again super.doOnModuleLoad(); // read mandatory parameters regattaLikeName = Window.Location.getParameter(PARAM_REGATTA_LIKE_NAME); @@ -164,6 +170,10 @@ public class EmbeddedMapAndWindChartEntryPoint extends AbstractSailingEntryPoint }; final RaceMapSettings mapSettings = raceMap.getSettings(); mapSettings.setZoomSettings(new RaceMapZoomSettings(Arrays.asList(ZoomTypes.BUOYS), /* zoom to selection */ false)); + Set helpLineTypes = new HashSet<>(); + Util.addAll(mapSettings.getHelpLinesSettings().getVisibleHelpLineTypes(), helpLineTypes); + helpLineTypes.add(HelpLineTypes.COURSEGEOMETRY); + mapSettings.setHelpLinesSettings(new RaceMapHelpLinesSettings(helpLineTypes)); raceMap.updateSettings(mapSettings); raceMap.onRaceSelectionChange(raceList); final WindChart windChart; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java index 0453c7aac17..7d9e1c75e65 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java @@ -58,7 +58,6 @@ public class RaceBoardEntryPoint extends AbstractSailingEntryPoint { @Override protected void doOnModuleLoad() { - GWT.debugger(); // TODO remove again super.doOnModuleLoad(); EntryPointHelper.registerASyncService((ServiceDefTarget) mediaService, RemoteServiceMappingConstants.mediaServiceRemotePath); // read mandatory parameters diff --git a/java/com.sap.sailing.manage2sail/src/com/sap/sailing/manage2sail/Manage2SailEventResultsParserImpl.java b/java/com.sap.sailing.manage2sail/src/com/sap/sailing/manage2sail/Manage2SailEventResultsParserImpl.java index f5c0a9f1b80..00dc355df69 100644 --- a/java/com.sap.sailing.manage2sail/src/com/sap/sailing/manage2sail/Manage2SailEventResultsParserImpl.java +++ b/java/com.sap.sailing.manage2sail/src/com/sap/sailing/manage2sail/Manage2SailEventResultsParserImpl.java @@ -43,7 +43,7 @@ public class Manage2SailEventResultsParserImpl implements Manage2SailEventResult result.setName((String) jsonRoot.get("Name")); result.setXrrUrl(parseURL(jsonRoot, "XrrUrl")); JSONObject jsonTracking = (JSONObject) jsonRoot.get("Tracking"); - if(jsonTracking != null) { + if (jsonTracking != null) { result.setTrackingDataHost((String) jsonTracking.get("Host")); result.setTrackingDataPort(parseInteger(jsonTracking, "Port")); } From 2cc687d54728c99abc790fe6cc0bead7cc4c2310 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 16 Jul 2015 11:26:44 +0200 Subject: [PATCH 213/219] added ScoreCorrection method to detect score corrections in untracked fleets within a race column --- .../domain/base/impl/RaceDefinitionImpl.java | 9 +++++++-- .../domain/leaderboard/ScoreCorrection.java | 8 ++++++++ .../leaderboard/impl/ScoreCorrectionImpl.java | 15 +++++++++++++-- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceDefinitionImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceDefinitionImpl.java index b4ac93865e0..7b297db56cf 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceDefinitionImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RaceDefinitionImpl.java @@ -1,7 +1,10 @@ package com.sap.sailing.domain.base.impl; import java.io.Serializable; +import java.util.Collections; +import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.Set; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; @@ -13,6 +16,7 @@ public class RaceDefinitionImpl extends NamedImpl implements RaceDefinition { private static final long serialVersionUID = -1900955198751393727L; private final Course course; private final LinkedHashMap competitorsById; + private final Set competitors; private final BoatClass boatClass; private final Serializable id; @@ -23,11 +27,12 @@ public class RaceDefinitionImpl extends NamedImpl implements RaceDefinition { public RaceDefinitionImpl(String name, Course course, BoatClass boatClass, Iterable competitors, Serializable id) { super(name); assert name != null; - this.course = course; + this.competitors = new HashSet<>(); this.competitorsById = new LinkedHashMap<>(); for (Competitor competitor : competitors) { Competitor competitorWithEqualID = competitorsById.put(competitor.getId(), competitor); + this.competitors.add(competitor); if (competitorWithEqualID != null && competitorWithEqualID != competitor) { throw new IllegalArgumentException("Two distinct competitors with equal ID "+competitor.getId()+" are not allowed within the single race "+name); } @@ -48,7 +53,7 @@ public class RaceDefinitionImpl extends NamedImpl implements RaceDefinition { @Override public Iterable getCompetitors() { - return competitorsById.values(); + return Collections.unmodifiableSet(competitors); } @Override diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoreCorrection.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoreCorrection.java index 1fd99932582..3182d990e1a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoreCorrection.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/ScoreCorrection.java @@ -99,6 +99,14 @@ public interface ScoreCorrection extends Serializable { */ boolean hasCorrectionFor(RaceColumn raceInLeaderboard); + /** + * Similar to {@link #hasCorrectionFor(RaceColumn)}, but returns true only if score corrections are found + * for any competitor who in raceInLeaderboard is not in a tracked race and hence the fleet assignment + * cannot be determined. This is helpful, e.g., for progress detection. If score corrections are present for such + * untracked competitors then all untracked fleets need to be assumed as finished. + */ + boolean hasCorrectionForNonTrackedFleet(RaceColumn raceInLeaderboard); + /** * @return all race columns for which this score corrections object has at least one correction; note that this * object may hold corrections also for competitors that are not currently returned by diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java index b58f433eb1d..a0891127129 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/ScoreCorrectionImpl.java @@ -472,19 +472,30 @@ public class ScoreCorrectionImpl implements SettableScoreCorrection { @Override public boolean hasCorrectionFor(RaceColumn raceInLeaderboard) { + return internalHasScoreCorrectionFor(raceInLeaderboard, /* considerOnlyUntrackedRaces */ false); + } + + private boolean internalHasScoreCorrectionFor(RaceColumn raceInLeaderboard, boolean considerOnlyUntrackedRaces) { for (com.sap.sse.common.Util.Pair correctedScoresKey : correctedScores.keySet()) { - if (correctedScoresKey.getB() == raceInLeaderboard) { + if (correctedScoresKey.getB() == raceInLeaderboard && + (!considerOnlyUntrackedRaces || raceInLeaderboard.getTrackedRace(correctedScoresKey.getA()) == null)) { return true; } } for (com.sap.sse.common.Util.Pair maxPointsReasonsKey : maxPointsReasons.keySet()) { - if (maxPointsReasonsKey.getB() == raceInLeaderboard) { + if (maxPointsReasonsKey.getB() == raceInLeaderboard && + (!considerOnlyUntrackedRaces || raceInLeaderboard.getTrackedRace(maxPointsReasonsKey.getA()) == null)) { return true; } } return false; } + @Override + public boolean hasCorrectionForNonTrackedFleet(RaceColumn raceInLeaderboard) { + return internalHasScoreCorrectionFor(raceInLeaderboard, /* considerOnlyUntrackedRaces */ true); + } + @Override public TimePoint getTimePointOfLastCorrectionsValidity() { return timePointOfLastCorrectionsValidity; From d20f6eaebc56ffa4e6ae82bd2f5521957302ffdc Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Thu, 16 Jul 2015 11:33:52 +0200 Subject: [PATCH 214/219] Using ScoreCorrection.hasCorrectionForNonTrackedFleet to better calculate if a non tracked race is finished even if there is some tracking in a sibling fleet --- .../gwt/ui/shared/dispatch/event/RaceContext.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 1dc05840110..00ce08219e3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -354,7 +354,7 @@ public class RaceContext { } } ScoreCorrection scoreCorrection = leaderboard.getScoreCorrection(); - if(!hasTrackingForRaceColumn() && scoreCorrection != null && scoreCorrection.hasCorrectionFor(raceColumn)) { + if(trackedRace == null && scoreCorrection != null && scoreCorrection.hasCorrectionForNonTrackedFleet(raceColumn)) { return RaceViewState.FINISHED; } if(startTime != null) { @@ -362,15 +362,6 @@ public class RaceContext { } return RaceViewState.PLANNED; } - - private boolean hasTrackingForRaceColumn() { - for(Fleet fleetOfRaceColumn : raceColumn.getFleets()) { - if(raceColumn.getTrackedRace(fleetOfRaceColumn) != null) { - return true; - } - } - return false; - } private Wind checkForWindFixesFromRaceLog() { WindFixesFinder windFixesFinder = new WindFixesFinder(raceLog); From bfdb957bafbab14f01c0b10007a0ebfa8e7ecd0d Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Thu, 16 Jul 2015 12:02:39 +0200 Subject: [PATCH 215/219] Introduced hover state vor "live" button state. Bug 3111 --- .../event/regattaleaderboard/EventRegattaLeaderboard.gss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regattaleaderboard/EventRegattaLeaderboard.gss b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regattaleaderboard/EventRegattaLeaderboard.gss index 073eec8b81a..84b86a3f74a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regattaleaderboard/EventRegattaLeaderboard.gss +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/event/regattaleaderboard/EventRegattaLeaderboard.gss @@ -112,6 +112,11 @@ .regattaleaderboard_meta_reload:hover { background-color: #909090; } + +.regattaleaderboard_meta_reload_live:hover { + background-color: #ffa4a4; +} + .regattaleaderboard_meta_settings { display: inline-block; text-align: right; From c327260fecef075360482753e961695b5fef8275 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 16 Jul 2015 12:52:08 +0200 Subject: [PATCH 216/219] multi-line SmallTransparentTextOverlay that scales font size with map size --- .../SailingGWT sdm.launch | 154 +++++++++--------- java/com.sap.sailing.gwt.ui/SailingGWT.launch | 152 ++++++++--------- .../racemap/SmallTransparentInfoOverlay.java | 36 +++- 3 files changed, 182 insertions(+), 160 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch index e9c02e8b626..9b40edf5a0f 100644 --- a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch @@ -1,77 +1,77 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT.launch b/java/com.sap.sailing.gwt.ui/SailingGWT.launch index 1690e01f416..07ca62c8e6b 100755 --- a/java/com.sap.sailing.gwt.ui/SailingGWT.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT.launch @@ -1,76 +1,76 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/SmallTransparentInfoOverlay.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/SmallTransparentInfoOverlay.java index 9369fb24265..7846cd7f2b8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/SmallTransparentInfoOverlay.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/SmallTransparentInfoOverlay.java @@ -52,19 +52,35 @@ public class SmallTransparentInfoOverlay extends CanvasOverlayV3 { @Override protected void draw() { + final int LINE_SPACING = 3; + final int BOTTOM_MARGIN = 8; + final int LEFT_MARGIN = 8; + final int RIGHT_MARGIN = 9; + final int POLE_LENGTH = 25; if (mapProjection != null && position != null) { LatLng latLngPosition = coordinateSystem.toLatLng(position); Context2d context2d = getCanvas().getContext2d(); CssColor grayTransparentColor = CssColor.make("rgba(255,255,255,0.75)"); - - context2d.setFont("12px bold Verdana sans-serif"); - TextMetrics measureText = context2d.measureText(infoText); - double textWidth = measureText.getWidth(); - - canvasWidth = (int) textWidth + 17; + final int fontSizeInPx = 12+2*Math.max(0, map.getZoom()-15); + final int LINE_HEIGHT = fontSizeInPx+LINE_SPACING; + context2d.setFont(""+fontSizeInPx+"px Roboto, Arial, sans-serif"); +// context2d.setFont(""+fontSizeInPx+"px bold Verdana sans-serif"); + double textWidth = 0; + infoBoxHeight = BOTTOM_MARGIN; + for (final String line : infoText.split("\n")) { + TextMetrics measureText = context2d.measureText(line); + if (measureText.getWidth() > textWidth) { + textWidth = measureText.getWidth(); + } + infoBoxHeight += LINE_HEIGHT; + } + canvasWidth = (int) textWidth + LEFT_MARGIN + RIGHT_MARGIN; infoBoxWidth = canvasWidth; + canvasHeight = infoBoxHeight + POLE_LENGTH; getCanvas().setWidth(String.valueOf(canvasWidth)); getCanvas().setCoordinateSpaceWidth(canvasWidth); + getCanvas().setHeight(String.valueOf(canvasHeight)); + getCanvas().setCoordinateSpaceHeight(canvasHeight); // Change origin and dimensions to match true size (a stroke makes the shape a bit larger) context2d.setFillStyle(grayTransparentColor); @@ -83,7 +99,13 @@ public class SmallTransparentInfoOverlay extends CanvasOverlayV3 { context2d.beginPath(); context2d.setFillStyle("black"); - context2d.fillText(infoText, 8, 14); +// context2d.setFont(""+fontSizeInPx+"px bold Verdana sans-serif"); + context2d.setFont(""+fontSizeInPx+"px Roboto, Arial, sans-serif"); + int y = LINE_HEIGHT; + for (final String line : infoText.split("\n")) { + context2d.fillText(line, LEFT_MARGIN, y); + y += LINE_HEIGHT; + } context2d.stroke(); Point objectPositionInPx = mapProjection.fromLatLngToDivPixel(latLngPosition); From b362a7c23cf8d1470ea93775970001bba84ab999 Mon Sep 17 00:00:00 2001 From: Papick Garcia Taboada Date: Thu, 16 Jul 2015 12:53:33 +0200 Subject: [PATCH 217/219] Introduced fine grained highcharts injection Modules that require more than just base+theme must ensure required resources injected at startup. --- .../gwt/client/RibDashboardEntryPoint.java | 1 + .../com/sap/sailing/gwt/ui/AdminConsole.gwt.xml | 2 +- .../ui/adminconsole/AdminConsoleEntryPoint.java | 2 ++ .../gwt/ui/datamining/DataMiningEntryPoint.java | 2 ++ .../gwt/ui/polarsheets/PolarSheetsEntryPoint.java | 2 ++ .../gwt/ui/simulator/SimulatorEntryPoint.java | 2 ++ .../com/sap/sailing/gwt/ui/DataMining.gwt.xml | 2 +- .../com/sap/sailing/gwt/ui/PolarSheets.gwt.xml | 2 +- .../com/sap/sailing/gwt/ui/Simulator.gwt.xml | 2 +- .../src/com/sap/sse/gwt/resources/Highcharts.java | 15 ++++++++++++++- 10 files changed, 27 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/RibDashboardEntryPoint.java b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/RibDashboardEntryPoint.java index 564c84d4e51..ea17424f04e 100644 --- a/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/RibDashboardEntryPoint.java +++ b/java/com.sap.sailing.dashboards.gwt/src/main/java/com/sap/sailing/dashboards/gwt/client/RibDashboardEntryPoint.java @@ -29,6 +29,7 @@ public class RibDashboardEntryPoint extends AbstractEntryPoint { @Override public void doOnModuleLoad() { + SailingServiceAsync sailingService = GWT.create(SailingService.class); EntryPointHelper.registerASyncService((ServiceDefTarget) sailingService, RemoteServiceMappingConstants.WEB_CONTEXT_PATH, RemoteServiceMappingConstants.sailingServiceRemotePath); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml index c328c0935d3..52d0969c97e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml @@ -9,7 +9,7 @@ - + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java index 7140acfc830..288e06bbe1b 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java @@ -33,6 +33,7 @@ import com.sap.sse.gwt.client.EntryPointHelper; import com.sap.sse.gwt.client.async.AsyncActionsExecutor; import com.sap.sse.gwt.client.async.MarkedAsyncCallback; import com.sap.sse.gwt.client.controls.filestorage.FileStoragePanel; +import com.sap.sse.gwt.resources.Highcharts; import com.sap.sse.security.ui.client.component.UserManagementPanel; import com.sap.sse.security.ui.client.i18n.StringMessages; @@ -45,6 +46,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements @Override protected void doOnModuleLoad() { + Highcharts.ensureInjectedWithMore(); super.doOnModuleLoad(); EntryPointHelper.registerASyncService((ServiceDefTarget) mediaService, RemoteServiceMappingConstants.mediaServiceRemotePath); createUI(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningEntryPoint.java index 63927ae091d..95a986a0d3f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningEntryPoint.java @@ -27,6 +27,7 @@ import com.sap.sse.datamining.shared.impl.UUIDDataMiningSession; import com.sap.sse.gwt.client.EntryPointHelper; import com.sap.sse.gwt.client.shared.components.ComponentResources; import com.sap.sse.gwt.client.shared.components.SettingsDialog; +import com.sap.sse.gwt.resources.Highcharts; import com.sap.sse.gwt.shared.GwtHttpRequestUtils; public class DataMiningEntryPoint extends AbstractSailingEntryPoint { @@ -38,6 +39,7 @@ public class DataMiningEntryPoint extends AbstractSailingEntryPoint { @Override protected void doOnModuleLoad() { + Highcharts.ensureInjectedWithMore(); super.doOnModuleLoad(); session = new UUIDDataMiningSession(UUID.randomUUID()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/polarsheets/PolarSheetsEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/polarsheets/PolarSheetsEntryPoint.java index 9662192b872..e8828077ec1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/polarsheets/PolarSheetsEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/polarsheets/PolarSheetsEntryPoint.java @@ -10,6 +10,7 @@ import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint; import com.sap.sailing.gwt.ui.client.RegattaRefresher; import com.sap.sailing.gwt.ui.client.RegattasDisplayer; import com.sap.sailing.gwt.ui.shared.RegattaDTO; +import com.sap.sse.gwt.resources.Highcharts; public class PolarSheetsEntryPoint extends AbstractSailingEntryPoint implements RegattaRefresher { @@ -17,6 +18,7 @@ public class PolarSheetsEntryPoint extends AbstractSailingEntryPoint implements @Override protected void doOnModuleLoad() { + Highcharts.ensureInjectedWithMore(); super.doOnModuleLoad(); regattaDisplayers = new HashSet(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorEntryPoint.java index b9865de34c4..5128e0248f2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/simulator/SimulatorEntryPoint.java @@ -16,6 +16,7 @@ import com.sap.sailing.gwt.ui.client.SimulatorService; import com.sap.sailing.gwt.ui.client.SimulatorServiceAsync; import com.sap.sailing.simulator.util.SailingSimulatorConstants; import com.sap.sse.gwt.client.EntryPointHelper; +import com.sap.sse.gwt.resources.Highcharts; public class SimulatorEntryPoint extends AbstractSailingEntryPoint { @@ -45,6 +46,7 @@ public class SimulatorEntryPoint extends AbstractSailingEntryPoint { @Override protected void doOnModuleLoad() { + Highcharts.ensureInjectedWithExport(); super.doOnModuleLoad(); EntryPointHelper.registerASyncService((ServiceDefTarget) simulatorService, RemoteServiceMappingConstants.simulatorServiceRemotePath); checkUrlParameters(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml index e098ff0fd05..6f0e1c83121 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml @@ -4,7 +4,7 @@ - + diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/PolarSheets.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/PolarSheets.gwt.xml index 84d10e354f5..a4d8c7aa077 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/PolarSheets.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/PolarSheets.gwt.xml @@ -9,7 +9,7 @@ - + diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/Simulator.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/Simulator.gwt.xml index cdb1604cf67..7fe26ecafdf 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/Simulator.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/Simulator.gwt.xml @@ -13,7 +13,7 @@ - + diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/resources/Highcharts.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/resources/Highcharts.java index 70e47a0a54e..8d765e9caf3 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/resources/Highcharts.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/resources/Highcharts.java @@ -13,9 +13,22 @@ public class Highcharts { public static LegacyResources LEGACY = GWT.create(LegacyResources.class); public static void ensureInjected() { ScriptInjector.fromString(LEGACY.highcharts().getText()).setWindow(ScriptInjector.TOP_WINDOW).inject(); - ScriptInjector.fromString(LEGACY.highchartsMore().getText()).setWindow(ScriptInjector.TOP_WINDOW).inject(); ScriptInjector.fromString(LEGACY.highchartsThemeGrid().getText()).setWindow(ScriptInjector.TOP_WINDOW).inject(); + } + + public static void ensureInjectedWithMore() { + ensureInjected(); + ScriptInjector.fromString(LEGACY.highchartsMore().getText()).setWindow(ScriptInjector.TOP_WINDOW).inject(); ScriptInjector.fromString(LEGACY.highchartsModuleExport().getText()).setWindow(ScriptInjector.TOP_WINDOW) .inject(); } + + public static void ensureInjectedWithExport() { + ensureInjected(); + ensureInjectedWithMore(); + ScriptInjector.fromString(LEGACY.highchartsMore().getText()).setWindow(ScriptInjector.TOP_WINDOW).inject(); + ScriptInjector.fromString(LEGACY.highchartsModuleExport().getText()).setWindow(ScriptInjector.TOP_WINDOW) + .inject(); + } + } From 11b522ab3da6180b8b548221b43da9f6c779e880 Mon Sep 17 00:00:00 2001 From: fmittag Date: Thu, 16 Jul 2015 13:38:52 +0200 Subject: [PATCH 218/219] increased the time before a live race is shown in the live races view from 15 min to 1hour --- .../sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java index 6b97d4f7ba6..490c981b190 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/RaceContext.java @@ -45,7 +45,7 @@ import com.sap.sse.common.impl.MillisecondsTimePoint; @GwtIncompatible public class RaceContext { - private static final long TIME_BEFORE_START_TO_SHOW_RACES_AS_LIVE = 15 * 60 * 1000; // 15 min + private static final long TIME_BEFORE_START_TO_SHOW_RACES_AS_LIVE = 60 * 60 * 1000; // 1 hour private static final long TIME_TO_SHOW_CANCELED_RACES_AS_LIVE = 5 * 60 * 1000; // 5 min private final TimePoint now = MillisecondsTimePoint.now(); From 4d22e6d3ea151848d0a9b3df988a2406d2b8e161 Mon Sep 17 00:00:00 2001 From: Steffen Schaefer Date: Thu, 16 Jul 2015 14:11:58 +0200 Subject: [PATCH 219/219] Bug 3109: linking to leaderboard tab instead of the vintage leaderboard from RegattaOverview --- .../regattaoverview/client/RegattaRaceStatesComponent.java | 7 ++----- .../sap/sailing/gwt/ui/client/EntryPointLinkFactory.java | 4 ++++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaRaceStatesComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaRaceStatesComponent.java index e089c73e226..c53f0778c5a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaRaceStatesComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RegattaRaceStatesComponent.java @@ -897,11 +897,8 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component return null; } private String createRegattaLink(RegattaOverviewEntryDTO entryDTO) { - Map leaderboardLinkParameters = new HashMap(); - leaderboardLinkParameters.put("name", entryDTO.regattaName); - leaderboardLinkParameters.put("showRaceDetails", String.valueOf(true)); - leaderboardLinkParameters.put("displayName", entryDTO.regattaDisplayName); - String leaderboardLink = EntryPointLinkFactory.createLeaderboardLink(leaderboardLinkParameters); + Map leaderboardLinkParameters = Collections.emptyMap(); + String leaderboardLink = EntryPointLinkFactory.createLeaderboardTabLink(eventId.toString(), entryDTO.regattaName, leaderboardLinkParameters); return leaderboardLink; } public void setRepeatedInfoLabel(FlowPanel repeatedInfoLabel) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/EntryPointLinkFactory.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/EntryPointLinkFactory.java index 7c5ba55e83b..66840bcf631 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/EntryPointLinkFactory.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/EntryPointLinkFactory.java @@ -17,6 +17,10 @@ public class EntryPointLinkFactory extends AbstractEntryPointLinkFactory { return createEntryPointLink("/gwt/Leaderboard.html", parameters); } + public static String createLeaderboardTabLink(String eventId, String regattaId, Map parameters) { + return createEntryPointLink("/gwt/Home.html#/regatta/leaderboard/:eventId=" + eventId + "®attaId=" + regattaId, parameters); + } + public static String createLeaderboardGroupLink(Map parameters) { return createEntryPointLink("/gwt/Spectator.html", parameters); }