diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleResources.java index 98001abd179..d4814a0bdeb 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleResources.java @@ -35,6 +35,9 @@ interface AdminConsoleResources extends ClientBundle { @Source("com/sap/sailing/gwt/ui/client/images/reddot.png") ImageResource reddotIcon(); + @Source("com/sap/sailing/gwt/ui/client/images/winddirection.png") + ImageResource windDirectionIcon(); + @Source("com/sap/sailing/gwt/ui/client/images/boats/Blue_Port.png") ImageResource lowlightedBoatIcon_Port(); @@ -47,7 +50,6 @@ interface AdminConsoleResources extends ClientBundle { @Source("com/sap/sailing/gwt/ui/client/images/boats/Blue_DW_Starbord.png") ImageResource lowlightedBoatIconDW_Starboard(); - @Source("com/sap/sailing/gwt/ui/client/images/boats/Blue_Port_Selected.png") ImageResource highlightedBoatIcon_Port(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMap.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMap.java index 72408470777..497127dbe16 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMap.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceMap.java @@ -69,6 +69,7 @@ import com.sap.sailing.gwt.ui.shared.MarkDTO; import com.sap.sailing.gwt.ui.shared.PositionDTO; import com.sap.sailing.gwt.ui.shared.QuickRankDTO; import com.sap.sailing.gwt.ui.shared.SpeedWithBearingDTO; +import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO; import com.sap.sailing.gwt.ui.shared.components.Component; import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; @@ -295,7 +296,8 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele final ParallelExecutionCallback>> getBoatsCallback = new ParallelExecutionCallback>>(); final ParallelExecutionCallback> getMarksCallback = new ParallelExecutionCallback>(); final ParallelExecutionCallback> getQuickRanksCallback = new ParallelExecutionCallback>(); - new ParallelExecutionHolder(getBoatsCallback, getMarksCallback, getQuickRanksCallback) { + final ParallelExecutionCallback getWindCallback = new ParallelExecutionCallback(); + new ParallelExecutionHolder(getBoatsCallback, getMarksCallback, getQuickRanksCallback, getWindCallback) { @Override protected void handleSuccess() { quickRanks = getQuickRanksCallback.getData(); @@ -336,19 +338,21 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele mapZoomedOrPannedSinceLastRaceSelectionChange = false; } } + showWindOnMap(getWindCallback.getData()); } else { lastTimeChangeBeforeInitialization = date; } } - + @Override protected void handleFailure(Throwable t) { - errorReporter.reportError("Error trying to obtain mark and/or boat positions: " + t.getMessage()); + errorReporter.reportError("Error trying to obtain data for the map: " + t.getMessage()); } }; sailingService.getBoatPositions(race, fromAndToAndOverlap.getA(), fromAndToAndOverlap.getB(), true, getBoatsCallback); sailingService.getMarkPositions(race, date, getMarksCallback); sailingService.getQuickRanks(race, date, getQuickRanksCallback); + sailingService.getWindInfo(race, date, date, null, getWindCallback); } } } @@ -444,6 +448,23 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele } } + protected void showWindOnMap(WindInfoForRaceDTO windInfo) { + // DON'T DELETE... THIS WILL BE IMPLEMENTED SOON +// System.out.println("Windsources: " + windInfo.windTrackInfoByWindSource.size()); +// for(WindSource windSource: windInfo.windTrackInfoByWindSource.keySet()) { +// switch (windSource) { +// case COURSE_BASED: +// case EXPEDITION: +// case TRACK_BASED_ESTIMATION: +// case WEB: +// WindTrackInfoDTO windTrackInfoDTO = windInfo.windTrackInfoByWindSource.get(windSource); +// for(WindDTO windDTO: windTrackInfoDTO.windFixes) { +// Long timepoint = windDTO.timepoint; +// } +// } +// } + } + protected void showMarksOnMap(List result) { if (map != null) { Set toRemove = new HashSet(buoyMarkers.keySet()); @@ -1049,7 +1070,7 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele @Override public Widget getEntryWidget() { - return map; + return this; } @Override 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 20583284f12..423ee7d177f 100644 --- 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 @@ -33,16 +33,22 @@ public class RaceBoardEntryPoint extends AbstractEntryPoint { @Override public void onModuleLoad() { super.onModuleLoad(); - String viewModeParamValue = Window.Location.getParameter("viewMode"); - try { - viewMode = RaceBoardViewMode.valueOf(RaceBoardViewMode.class, viewModeParamValue); - } catch (Exception e) { - viewMode = RaceBoardViewMode.ONE_SCREEN; - } eventName = Window.Location.getParameter("eventName"); raceName = Window.Location.getParameter("raceName"); String leaderboardNameParamValue = Window.Location.getParameter("leaderboardName"); String leaderboardGroupNameParamValue = Window.Location.getParameter("leaderboardGroupName"); + String viewModeParamValue = Window.Location.getParameter("viewMode"); + // set the view mode for the race board + if(viewModeParamValue != null && !viewModeParamValue.isEmpty()) { + try { + + viewMode = RaceBoardViewMode.valueOf(viewModeParamValue); + } catch (IllegalArgumentException e) { + viewMode = RaceBoardViewMode.ONE_SCREEN; + } + } else { + viewMode = RaceBoardViewMode.ONE_SCREEN; + } if(leaderboardNameParamValue == null || leaderboardNameParamValue.isEmpty()) { leaderboardName = DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME; } else { @@ -146,7 +152,8 @@ public class RaceBoardEntryPoint extends AbstractEntryPoint { FlowPanel raceBoardHeaderPanel = new FlowPanel(); raceBoardHeaderPanel.addStyleName("RaceBoardHeaderPanel"); - raceBoardHeaderPanel.add(raceBoardPanel.getBreadcrumbWidget()); + if(raceBoardPanel.getBreadcrumbWidget() != null) + raceBoardHeaderPanel.add(raceBoardPanel.getBreadcrumbWidget()); FlowPanel contentOuterPanel = new FlowPanel(); // outer div which centered page content contentOuterPanel.addStyleName("contentOuterPanel"); 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 3a9fe01ace5..eeef87277f3 100644 --- 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 @@ -12,7 +12,6 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FormPanel; -import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.WindSourceType; @@ -70,7 +69,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel */ private int scrollOffset; - private final List> collapsableViewers; + private final List componentViewers; private FlowPanel componentsNavigationPanel; private BreadcrumbPanel breadcrumbPanel; private RaceTimePanel timePanel; @@ -97,32 +96,62 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel setWidget(mainPanel); timer = new Timer(PlayModes.Replay, /* delayBetweenAutoAdvancesInMilliseconds */1000); - collapsableViewers = new ArrayList>(); + componentViewers = new ArrayList(); competitorSelectionModel = new CompetitorSelectionModel(/* hasMultiSelection */ true); switch (viewMode) { - case CASCADING: - createCascadingView(leaderboardName, leaderboardGroupName, mainPanel); - break; - case ONE_SCREEN: - createOneScreenView(); - break; - case TV_MODE: - createTVView(); - break; + case CASCADING: + createCascadingView(leaderboardName, leaderboardGroupName, mainPanel); + break; + case ONE_SCREEN: + createOneScreenView(leaderboardName, leaderboardGroupName, mainPanel); + break; } + + for (ComponentViewer componentViewer : componentViewers) { + mainPanel.add(componentViewer.getViewerWidget()); + addComponentViewerMenuEntry(componentViewer); + } + + timePanel = new RaceTimePanel(sailingService, timer, errorReporter, stringMessages); + raceSelectionProvider.addRaceSelectionChangeListener(timePanel); + timePanel.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces()); + } + + private void createOneScreenView(String leaderboardName, String leaderboardGroupName, FlowPanel mainPanel) { + componentsNavigationPanel = new FlowPanel(); + componentsNavigationPanel.addStyleName("raceBoardNavigation"); + + // create the default leaderboard and select the right race + + LeaderboardSettings leaderBoardSettings = LeaderboardSettingsFactory.getInstance().createNewSettingsForPlayMode(timer.getPlayMode()); + LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, leaderBoardSettings, selectedRaceIdentifier, competitorSelectionModel, + timer, leaderboardName, leaderboardGroupName, errorReporter, stringMessages, userAgentType); + RaceMap raceMap = new RaceMap(sailingService, errorReporter, timer, competitorSelectionModel, stringMessages); + + SideBySideComponentViewer leaderboardAndMapViewer = new SideBySideComponentViewer(leaderboardPanel, raceMap, "auto", "500px"); + componentViewers.add(leaderboardAndMapViewer); + + raceMap.onRaceSelectionChange(Collections.singletonList(selectedRaceIdentifier)); + + WindChartSettings windChartSettings = new WindChartSettings(WindSource.values()); + WindChart windChart = new WindChart(sailingService, raceSelectionProvider, timer, windChartSettings, + stringMessages, errorReporter); + SimpleComponentViewer windChartViewer = new SimpleComponentViewer( + windChart, "auto", "200px"); + windChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces()); + componentViewers.add(windChartViewer); + + MultiChartPanel competitorCharts = new MultiChartPanel(sailingService, competitorSelectionModel, raceSelectionProvider, + timer, stringMessages, errorReporter); + SimpleComponentViewer chartViewer = new SimpleComponentViewer( + competitorCharts, "auto", "200px"); + + competitorCharts.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces()); + componentViewers.add(chartViewer); } - private void createTVView() { - // TODO Auto-generated method stub - } - - private void createOneScreenView() { - // TODO Auto-generated method stub - - } - - private void createCascadingView(String leaderboardName, String leaderboardGroupName, FlowPanel mainPanel) { + private void createCascadingView(String leaderboardName, String leaderboardGroupName, FlowPanel mainPanel) { // create the breadcrumb navigation breadcrumbPanel = createBreadcrumbPanel(leaderboardGroupName); mainPanel.add(breadcrumbPanel); @@ -141,7 +170,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel CollapsableComponentViewer leaderboardViewer = new CollapsableComponentViewer( leaderboardPanel, "100%", "100%", stringMessages, ViewerPanelTypes.SCROLL_PANEL); - collapsableViewers.add(leaderboardViewer); + componentViewers.add(leaderboardViewer); } // create the race map @@ -150,9 +179,9 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel CollapsableComponentViewer raceMapViewer = new CollapsableComponentViewer( raceMap, "auto", "500px", stringMessages); - ((Panel) raceMapViewer.getViewerWidget().getContent()).add(raceMap); + //((Panel) raceMapViewer.getViewerWidget().getContent()).add(raceMap); raceMap.onRaceSelectionChange(Collections.singletonList(selectedRaceIdentifier)); - collapsableViewers.add(raceMapViewer); + componentViewers.add(raceMapViewer); } WindChartSettings windChartSettings = new WindChartSettings(WindSourceType.values()); @@ -161,7 +190,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel CollapsableComponentViewer windChartViewer = new CollapsableComponentViewer( windChart, "auto", "400px", stringMessages); windChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces()); - collapsableViewers.add(windChartViewer); + componentViewers.add(windChartViewer); if (showCompetitorCharts) { // DON'T DELETE -> this is temporary for testing of different chart types // ChartPanel competitorCharts = new ChartPanel(sailingService, competitorSelectionModel, raceSelectionProvider, @@ -175,17 +204,9 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel competitorCharts, "auto", "400px", stringMessages); competitorCharts.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces()); - collapsableViewers.add(chartViewer); + componentViewers.add(chartViewer); } - for (CollapsableComponentViewer componentViewer : collapsableViewers) { - mainPanel.add(componentViewer.getViewerWidget()); - addComponentViewerMenuEntry(componentViewer); - } - - timePanel = new RaceTimePanel(sailingService, timer, errorReporter, stringMessages); - raceSelectionProvider.addRaceSelectionChangeListener(timePanel); - timePanel.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces()); } private BreadcrumbPanel createBreadcrumbPanel(String leaderboardGroupName) { @@ -271,71 +292,5 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel @Override public void onRaceSelectionChange(List selectedRaces) { } -// -// if (selectedRaces != null && !selectedRaces.isEmpty()) { -// RaceDTO selectedRace = racesByIdentifier.get(selectedRaces.iterator().next()); -// -// Date min = null; -// Date max = null; -// -// if (selectedRace.startOfTracking != null) { -// min = selectedRace.startOfTracking; -// } -// if (selectedRace.endOfRace != null) { -// max = selectedRace.endOfRace; -// } else if (selectedRace.timePointOfNewestEvent != null) { -// max = selectedRace.timePointOfNewestEvent; -// timer.setPlayMode(PlayModes.Live); -// } -// -// if(min != null && max != null) -// timePanel.setMinMax(min, max); -// -// // set initial timer position -// switch(timer.getPlayMode()) { -// case Live: -// if(selectedRace.timePointOfNewestEvent != null) { -// timer.setTime(selectedRace.timePointOfNewestEvent.getTime()); -// } -// break; -// case Replay: -// if(selectedRace.endOfRace != null) { -// timer.setTime(selectedRace.endOfRace.getTime()); -// } else { -// timer.setTime(selectedRace.startOfRace.getTime()); -// } -// break; -// } -// -// sailingService.getRaceTimesInfo(selectedRace.getRaceIdentifier(), -// new AsyncCallback() { -// @Override -// public void onFailure(Throwable caught) { -// errorReporter.reportError("Error obtaining leg timepoints: " + caught.getMessage()); -// } -// -// @Override -// public void onSuccess(RaceTimesInfoDTO raceTimesInfo) { -// // raceTimesInfo can be null if the race is not tracked anymore -// if (raceTimesInfo != null) { -// timePanel.setLegMarkers(raceTimesInfo.getLegTimes()); -// if (raceTimesInfo.getStartOfRace() != null) { -// // set the new start time -// Date startOfRace = raceTimesInfo.getStartOfRace(); -// Date startOfTimeslider = new Date(startOfRace.getTime() - 5 * 60 * 1000); -// -// timePanel.changeMin(startOfTimeslider); -// } -// // set time to end of race -// if(raceTimesInfo.getLastLegTimes() != null) { -// timer.setTime(raceTimesInfo.getLastLegTimes().firstPassingDate.getTime()); -// } -// } else { -// timePanel.reset(); -// } -// } -// }); -// } -// } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardViewMode.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardViewMode.java index f72ae99193c..de005aee392 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardViewMode.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardViewMode.java @@ -2,6 +2,6 @@ package com.sap.sailing.gwt.ui.raceboard; public enum RaceBoardViewMode { - CASCADING, ONE_SCREEN, TV_MODE - + CASCADING, ONE_SCREEN + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SideBySideComponentViewer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SideBySideComponentViewer.java new file mode 100644 index 00000000000..9b39019b0c1 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SideBySideComponentViewer.java @@ -0,0 +1,31 @@ +package com.sap.sailing.gwt.ui.raceboard; + +import com.google.gwt.user.client.ui.HorizontalSplitPanel; +import com.google.gwt.user.client.ui.Panel; +import com.sap.sailing.gwt.ui.shared.components.Component; +import com.sap.sailing.gwt.ui.shared.components.ComponentViewer; + +@SuppressWarnings("deprecation") +public class SideBySideComponentViewer implements ComponentViewer { + /** there is no easy replacement for the HorizontalSplitPanel available */ + private final HorizontalSplitPanel mainPanel; + + public SideBySideComponentViewer(Component leftComponent, Component rightComponent, String defaultWidth, String defaultHeight) { + mainPanel = new HorizontalSplitPanel(); + mainPanel.setSize(defaultWidth, defaultHeight); + mainPanel.setLeftWidget(leftComponent.getEntryWidget()); + mainPanel.setRightWidget(rightComponent.getEntryWidget()); + } + + public Panel getViewerWidget() { + return mainPanel; + } + + public Component getRootComponent() { + return null; + } + + public String getViewerName() { + return ""; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SimpleComponentViewer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SimpleComponentViewer.java new file mode 100644 index 00000000000..04ed9811142 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/SimpleComponentViewer.java @@ -0,0 +1,30 @@ +package com.sap.sailing.gwt.ui.raceboard; + +import com.google.gwt.user.client.ui.Panel; +import com.google.gwt.user.client.ui.SimplePanel; +import com.sap.sailing.gwt.ui.shared.components.Component; +import com.sap.sailing.gwt.ui.shared.components.ComponentViewer; + +public class SimpleComponentViewer implements ComponentViewer { + private final SimplePanel mainPanel; + private final Component component; + + public SimpleComponentViewer(Component component, String defaultWidth, String defaultHeight) { + this.component = component; + mainPanel = new SimplePanel(); + mainPanel.setSize(defaultWidth, defaultHeight); + mainPanel.setWidget(component.getEntryWidget()); + } + + public Panel getViewerWidget() { + return mainPanel; + } + + public Component getRootComponent() { + return component; + } + + public String getViewerName() { + return component.getLocalizedShortName(); + } +} 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 e019f7617ba..167de9571fc 100644 --- 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 @@ -292,7 +292,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS entryDTO.legDetails.add(legEntry); } } - final Distance windwardDistanceToOverallLeader = trackedRace.getWindwardDistanceToOverallLeader(competitor, timePoint); + final Distance windwardDistanceToOverallLeader = trackedRace == null ? null : trackedRace.getWindwardDistanceToOverallLeader(competitor, timePoint); entryDTO.windwardDistanceToOverallLeaderInMeters = windwardDistanceToOverallLeader == null ? null : windwardDistanceToOverallLeader.getMeters(); return entryDTO; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/client/images/winddirection.png b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/client/images/winddirection.png new file mode 100644 index 00000000000..3aa004fadb4 Binary files /dev/null and b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/client/images/winddirection.png differ