diff --git a/java/com.sap.sailing.gwt.ui/images/home/solutions-simulator.png b/java/com.sap.sailing.gwt.ui/images/home/solutions-simulator.png index 9123f6fccaf..a1e9beb92f0 100644 Binary files a/java/com.sap.sailing.gwt.ui/images/home/solutions-simulator.png and b/java/com.sap.sailing.gwt.ui/images/home/solutions-simulator.png differ diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages.java index c201c80ce34..c0a76315326 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages.java @@ -40,6 +40,7 @@ public interface TextMessages extends Messages { String overview(); String sapSailing(); String search(); + String startSimulator(); String countdownDays(); String countdownHours(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages.properties index 6a50d7fa2ce..7c8712a044a 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages.properties @@ -32,6 +32,7 @@ whatsNew=What''s new overview=Overview sapSailing=SAP Sailing search=Search +startSimulator=Start Simulator countdownDays=Days countdownHours=Hrs diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_de.properties index 3afbaca10ad..363e049fe3e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_de.properties @@ -32,6 +32,7 @@ whatsNew=Neuigkeiten overview=Übersicht sapSailing=SAP Sailing search=Suche +startSimulator=Simulator starten countdownDays=Tage countdownHours=Std. diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/app/HomePlacesNavigator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/app/HomePlacesNavigator.java index 689e9abe727..8f6048cad95 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/app/HomePlacesNavigator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/app/HomePlacesNavigator.java @@ -1,5 +1,8 @@ package com.sap.sailing.gwt.home.client.app; +import java.util.HashMap; +import java.util.Map; + import com.google.gwt.place.shared.PlaceController; import com.sap.sailing.gwt.home.client.place.aboutus.AboutUsPlace; import com.sap.sailing.gwt.home.client.place.contact.ContactPlace; @@ -17,6 +20,7 @@ import com.sap.sailing.gwt.home.client.place.sponsoring.SponsoringPlace; import com.sap.sailing.gwt.home.client.place.start.StartPlace; import com.sap.sailing.gwt.home.client.place.whatsnew.WhatsNewPlace; import com.sap.sailing.gwt.home.client.place.whatsnew.WhatsNewPlace.WhatsNewNavigationTabs; +import com.sap.sailing.gwt.ui.client.EntryPointLinkFactory; public class HomePlacesNavigator extends AbstractPlaceNavigator { @@ -40,6 +44,11 @@ public class HomePlacesNavigator extends AbstractPlaceNavigator { return createLocalPlaceNavigation(new WhatsNewPlace(navigationTab), new WhatsNewPlace.Tokenizer()); } + public String getSimulatorURL() { + Map parameters = new HashMap(); + return EntryPointLinkFactory.createSimulatorLink(parameters); + } + public PlaceNavigation getSponsoringNavigation() { return createGlobalPlaceNavigation(new SponsoringPlace(), new SponsoringPlace.Tokenizer()); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/whatsnew/TabletAndDesktopWhatsNewView.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/whatsnew/TabletAndDesktopWhatsNewView.java index 2580ee1b10c..b8d16132f99 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/whatsnew/TabletAndDesktopWhatsNewView.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/whatsnew/TabletAndDesktopWhatsNewView.java @@ -28,15 +28,15 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV private static final HyperlinkImpl HYPERLINK_IMPL = GWT.create(HyperlinkImpl.class); @UiField HTML sailingAnalyticsNotes; -// @UiField HTML sailingSimulatorNotes; + @UiField HTML sailingSimulatorNotes; @UiField HTML raceCommitteeAppNotes; @UiField Anchor sailingAnalyticsNotesAnchor; -// @UiField Anchor sailingSimulatorNotesAnchor; + @UiField Anchor sailingSimulatorNotesAnchor; @UiField Anchor raceCommitteeAppNotesAnchor; private final PlaceNavigation sailingAnalyticNotesNavigation; -// private final PlaceNavigation sailingSimulatorNoteNavigation; + private final PlaceNavigation sailingSimulatorNoteNavigation; private final PlaceNavigation raceCommitteeAppNotesNavigation; private final List links; @@ -49,19 +49,19 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV initWidget(uiBinder.createAndBindUi(this)); sailingAnalyticsNotes.setHTML(WhatsNewResources.INSTANCE.getSailingAnalyticsNotesHtml().getText()); -// sailingSimulatorNotes.setHTML(WhatsNewResources.INSTANCE.getSailingSimulatorNotesHtml().getText()); + sailingSimulatorNotes.setHTML(WhatsNewResources.INSTANCE.getSailingSimulatorNotesHtml().getText()); raceCommitteeAppNotes.setHTML(WhatsNewResources.INSTANCE.getRaceCommitteeAppNotesHtml().getText()); sailingAnalyticNotesNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingAnalytics); -// sailingSimulatorNoteNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingSimulator); + sailingSimulatorNoteNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingSimulator); raceCommitteeAppNotesNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.RaceCommiteeApp); sailingAnalyticsNotesAnchor.setHref(sailingAnalyticNotesNavigation.getTargetUrl()); -// sailingSimulatorNotesAnchor.setHref(sailingSimulatorNoteNavigation.getTargetUrl()); + sailingSimulatorNotesAnchor.setHref(sailingSimulatorNoteNavigation.getTargetUrl()); raceCommitteeAppNotesAnchor.setHref(raceCommitteeAppNotesNavigation.getTargetUrl()); - links = Arrays.asList(new Anchor[] { sailingAnalyticsNotesAnchor, /*sailingSimulatorNotesAnchor,*/ raceCommitteeAppNotesAnchor }); - contentWidgets = Arrays.asList(new HTML[] { sailingAnalyticsNotes, /*sailingSimulatorNotes,*/ raceCommitteeAppNotes }); + links = Arrays.asList(new Anchor[] { sailingAnalyticsNotesAnchor, sailingSimulatorNotesAnchor, raceCommitteeAppNotesAnchor }); + contentWidgets = Arrays.asList(new HTML[] { sailingAnalyticsNotes, sailingSimulatorNotes, raceCommitteeAppNotes }); switch(navigationTab) { case PostRaceAnalytics: @@ -73,7 +73,7 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV setActiveContent(sailingAnalyticsNotes, sailingAnalyticsNotesAnchor); break; case SailingSimulator: -// setActiveContent(sailingSimulatorNotes, sailingSimulatorNotesAnchor); + setActiveContent(sailingSimulatorNotes, sailingSimulatorNotesAnchor); break; case TrainingDiary: break; @@ -85,13 +85,13 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV setActiveContent(sailingAnalyticsNotes, sailingAnalyticsNotesAnchor); handleClickEventWithLocalNavigation(event, sailingAnalyticNotesNavigation); } -/* + @UiHandler("sailingSimulatorNotesAnchor") void featuresClicked(ClickEvent event) { setActiveContent(sailingSimulatorNotes, sailingSimulatorNotesAnchor); handleClickEventWithLocalNavigation(event, sailingSimulatorNoteNavigation); } -*/ + @UiHandler("raceCommitteeAppNotesAnchor") void releaseNotesClicked(ClickEvent event) { setActiveContent(raceCommitteeAppNotes, raceCommitteeAppNotesAnchor); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/whatsnew/TabletAndDesktopWhatsNewView.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/whatsnew/TabletAndDesktopWhatsNewView.ui.xml index ab4456dd416..5c26ebd925e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/whatsnew/TabletAndDesktopWhatsNewView.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/whatsnew/TabletAndDesktopWhatsNewView.ui.xml @@ -10,9 +10,7 @@
- +
@@ -20,9 +18,7 @@
-
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/shared/solutions/Solutions.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/shared/solutions/Solutions.java index 2504b8b6ff7..914e35e6bfa 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/shared/solutions/Solutions.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/shared/solutions/Solutions.java @@ -45,6 +45,8 @@ public class Solutions extends Composite { @UiField Anchor sailingAnalyticsDetailsAnchor; @UiField Anchor raceCommitteeAppDetailsAnchor; + @UiField Anchor simulatorStartAnchor; + @UiField Anchor simulatorAppDetailsAnchor; private final PlaceNavigation sailingAnalyticsNavigation; private final PlaceNavigation raceCommitteeAppNavigation; @@ -56,6 +58,7 @@ public class Solutions extends Composite { private final PlaceNavigation sailingAnalyticsDetailsNavigation; private final PlaceNavigation raceCommitteeAppDetailsNavigation; + private final PlaceNavigation simulatorAppDetailsNavigation; private final HomePlacesNavigator placesNavigator; public Solutions(SolutionsNavigationTabs navigationTab, HomePlacesNavigator placesNavigator) { @@ -71,9 +74,12 @@ public class Solutions extends Composite { sailingAnalyticsDetailsNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingAnalytics); raceCommitteeAppDetailsNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.RaceCommiteeApp); + simulatorAppDetailsNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingSimulator); sailingAnalyticsDetailsAnchor.setHref(sailingAnalyticsDetailsNavigation.getTargetUrl()); raceCommitteeAppDetailsAnchor.setHref(raceCommitteeAppDetailsNavigation.getTargetUrl()); + simulatorAppDetailsAnchor.setHref(simulatorAppDetailsNavigation.getTargetUrl()); + simulatorStartAnchor.setHref(placesNavigator.getSimulatorURL()); sailingAnalyticsNavigation = placesNavigator.getSolutionsNavigation(SolutionsNavigationTabs.SailingAnalytics); raceCommitteeAppNavigation = placesNavigator.getSolutionsNavigation(SolutionsNavigationTabs.RaceCommiteeApp); @@ -131,7 +137,12 @@ public class Solutions extends Composite { public void sailingAnalyticsDetailsClicked(ClickEvent e) { handleClickEventWithPlaceController(e, sailingAnalyticsDetailsNavigation); } - + + @UiHandler("simulatorAppDetailsAnchor") + public void simulatorAppDetailsAnchorClicked(ClickEvent e) { + handleClickEventWithPlaceController(e, simulatorAppDetailsNavigation); + } + private void scrollToView(SolutionsNavigationTabs navigationTab) { switch (navigationTab) { case SailingAnalytics: diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/shared/solutions/Solutions.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/shared/solutions/Solutions.ui.xml index 0bd3c08a0eb..e16aff7dfb3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/shared/solutions/Solutions.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/shared/solutions/Solutions.ui.xml @@ -67,7 +67,9 @@

- + +    +
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 371ed37cfee..d2dd9d65890 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 @@ -9,6 +9,10 @@ public class EntryPointLinkFactory extends AbstractEntryPointLinkFactory { return createEntryPointLink("/gwt/RaceBoard.html", parameters); } + public static String createSimulatorLink(Map parameters) { + return createEntryPointLink("/gwt/Simulator.html", parameters); + } + public static String createLeaderboardLink(Map parameters) { return createEntryPointLink("/gwt/Leaderboard.html", parameters); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingSimulatorNotes.html b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingSimulatorNotes.html index 6211f103fbe..96530aa0127 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingSimulatorNotes.html +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingSimulatorNotes.html @@ -4,12 +4,64 @@

What's New - Strategy Simulator

-
September 2014
- +
October 2014
    -
  • Point 1... -
  • +
  • Simulation is being integrated into the race board (see What's New in Sailing Analytics)
+ +
August 2014
+
    +
  • Accuracy of optimal course calculation has been improved
  • +
  • Streamlet motion is now calibrated to physical reality on large zoom levels of the map
  • +
+ +
April 2014
+
    +
  • Wind is visualized using animated streamlets based on a swarm of particles which locally follow the wind
  • +
+ +
September 2013
+
    +
  • Windbot based on RaspberryPi to construct real, spatially resolved wind vector fields from wind measurements
  • +
+ +
June 2013
+
    +
  • Optimal courses shown as "Omniscient" are determined by an heuristic search algorithm greatly improving accuracy and runtime performance
  • +
  • Sailing angles are represented with full numeric accuracy
  • +
  • Water current is taken into account
  • +
  • Support up- and downwind legs
  • +
  • 1-Click Simulation simplifies the user interaction
  • +
  • Race course map for Kieler Woche and Travemuender Woche
  • +
+ +
March 2013
+
    +
  • What-if simulation comparing sailed GPS-track and simulated course with changed locations of turns for + answering questions like: would it have been advantageous to do the second turn a bit later?
  • +
+ +
February 2013
+
    +
  • Strategy Simulator becomes a part of SAP's Sailing Analytics suite
  • +
+ +
December 2012
+
    +
  • Polar diagram chart is available
  • +
  • Multiple boat classes are supported based on polar diagrams in tabular format provided as CSV-files
  • +
  • Several wind visualization approaches are supported: arrows on a grid, as well as, heatmap combined with bearing lines (either grid or integrated across race course)
  • +
+ +
June 2012
+
    +
  • First upwind-only prototype of sailing simulation is available
  • +
  • Optimal courses shown as "Omniscient" are calculated with an implementation of Dijkstra's algorithm on a rectangular spatial grid
  • +
  • Wind is visualized by arrows which scale with wind speed
  • +
  • Race course definition with 2 mouse clicks for start and end
  • +
+ +