add "whats new" button & tab, "start simulator" button and update solution description for simulator;

This commit is contained in:
Christopher Ronnewinkel (D036654) committed 2015-01-30 20:34:18 +01:00
1 parent 3c0c41ba33
commit 3232c45f6e
11 files changed
+99 -22

No files matched your search

Binary file not shown.

Before

Width:  |  Height:  |  Size: 281 KiB

After

Width:  |  Height:  |  Size: 286 KiB

@@ -40,6 +40,7 @@ public interface TextMessages extends Messages {
String overview(); String overview();
String sapSailing(); String sapSailing();
String search(); String search();
String startSimulator();
String countdownDays(); String countdownDays();
String countdownHours(); String countdownHours();
@@ -32,6 +32,7 @@ whatsNew=What''s new
overview=Overview overview=Overview
sapSailing=SAP Sailing sapSailing=SAP Sailing
search=Search search=Search
startSimulator=Start Simulator
countdownDays=Days countdownDays=Days
countdownHours=Hrs countdownHours=Hrs
@@ -32,6 +32,7 @@ whatsNew=Neuigkeiten
overview=Übersicht overview=Übersicht
sapSailing=SAP Sailing sapSailing=SAP Sailing
search=Suche search=Suche
startSimulator=Simulator starten
countdownDays=Tage countdownDays=Tage
countdownHours=Std. countdownHours=Std.
@@ -1,5 +1,8 @@
package com.sap.sailing.gwt.home.client.app; 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.google.gwt.place.shared.PlaceController;
import com.sap.sailing.gwt.home.client.place.aboutus.AboutUsPlace; import com.sap.sailing.gwt.home.client.place.aboutus.AboutUsPlace;
import com.sap.sailing.gwt.home.client.place.contact.ContactPlace; 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.start.StartPlace;
import com.sap.sailing.gwt.home.client.place.whatsnew.WhatsNewPlace; 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.home.client.place.whatsnew.WhatsNewPlace.WhatsNewNavigationTabs;
import com.sap.sailing.gwt.ui.client.EntryPointLinkFactory;
public class HomePlacesNavigator extends AbstractPlaceNavigator { public class HomePlacesNavigator extends AbstractPlaceNavigator {
@@ -40,6 +44,11 @@ public class HomePlacesNavigator extends AbstractPlaceNavigator {
return createLocalPlaceNavigation(new WhatsNewPlace(navigationTab), new WhatsNewPlace.Tokenizer()); return createLocalPlaceNavigation(new WhatsNewPlace(navigationTab), new WhatsNewPlace.Tokenizer());
} }
public String getSimulatorURL() {
Map<String, String> parameters = new HashMap<String, String>();
return EntryPointLinkFactory.createSimulatorLink(parameters);
}
public PlaceNavigation<SponsoringPlace> getSponsoringNavigation() { public PlaceNavigation<SponsoringPlace> getSponsoringNavigation() {
return createGlobalPlaceNavigation(new SponsoringPlace(), new SponsoringPlace.Tokenizer()); return createGlobalPlaceNavigation(new SponsoringPlace(), new SponsoringPlace.Tokenizer());
} }
@@ -28,15 +28,15 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV
private static final HyperlinkImpl HYPERLINK_IMPL = GWT.create(HyperlinkImpl.class); private static final HyperlinkImpl HYPERLINK_IMPL = GWT.create(HyperlinkImpl.class);
@UiField HTML sailingAnalyticsNotes; @UiField HTML sailingAnalyticsNotes;
// @UiField HTML sailingSimulatorNotes; @UiField HTML sailingSimulatorNotes;
@UiField HTML raceCommitteeAppNotes; @UiField HTML raceCommitteeAppNotes;
@UiField Anchor sailingAnalyticsNotesAnchor; @UiField Anchor sailingAnalyticsNotesAnchor;
// @UiField Anchor sailingSimulatorNotesAnchor; @UiField Anchor sailingSimulatorNotesAnchor;
@UiField Anchor raceCommitteeAppNotesAnchor; @UiField Anchor raceCommitteeAppNotesAnchor;
private final PlaceNavigation<WhatsNewPlace> sailingAnalyticNotesNavigation; private final PlaceNavigation<WhatsNewPlace> sailingAnalyticNotesNavigation;
// private final PlaceNavigation<WhatsNewPlace> sailingSimulatorNoteNavigation; private final PlaceNavigation<WhatsNewPlace> sailingSimulatorNoteNavigation;
private final PlaceNavigation<WhatsNewPlace> raceCommitteeAppNotesNavigation; private final PlaceNavigation<WhatsNewPlace> raceCommitteeAppNotesNavigation;
private final List<Anchor> links; private final List<Anchor> links;
@@ -49,19 +49,19 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV
initWidget(uiBinder.createAndBindUi(this)); initWidget(uiBinder.createAndBindUi(this));
sailingAnalyticsNotes.setHTML(WhatsNewResources.INSTANCE.getSailingAnalyticsNotesHtml().getText()); sailingAnalyticsNotes.setHTML(WhatsNewResources.INSTANCE.getSailingAnalyticsNotesHtml().getText());
// sailingSimulatorNotes.setHTML(WhatsNewResources.INSTANCE.getSailingSimulatorNotesHtml().getText()); sailingSimulatorNotes.setHTML(WhatsNewResources.INSTANCE.getSailingSimulatorNotesHtml().getText());
raceCommitteeAppNotes.setHTML(WhatsNewResources.INSTANCE.getRaceCommitteeAppNotesHtml().getText()); raceCommitteeAppNotes.setHTML(WhatsNewResources.INSTANCE.getRaceCommitteeAppNotesHtml().getText());
sailingAnalyticNotesNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingAnalytics); sailingAnalyticNotesNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingAnalytics);
// sailingSimulatorNoteNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingSimulator); sailingSimulatorNoteNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingSimulator);
raceCommitteeAppNotesNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.RaceCommiteeApp); raceCommitteeAppNotesNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.RaceCommiteeApp);
sailingAnalyticsNotesAnchor.setHref(sailingAnalyticNotesNavigation.getTargetUrl()); sailingAnalyticsNotesAnchor.setHref(sailingAnalyticNotesNavigation.getTargetUrl());
// sailingSimulatorNotesAnchor.setHref(sailingSimulatorNoteNavigation.getTargetUrl()); sailingSimulatorNotesAnchor.setHref(sailingSimulatorNoteNavigation.getTargetUrl());
raceCommitteeAppNotesAnchor.setHref(raceCommitteeAppNotesNavigation.getTargetUrl()); raceCommitteeAppNotesAnchor.setHref(raceCommitteeAppNotesNavigation.getTargetUrl());
links = Arrays.asList(new Anchor[] { sailingAnalyticsNotesAnchor, /*sailingSimulatorNotesAnchor,*/ raceCommitteeAppNotesAnchor }); links = Arrays.asList(new Anchor[] { sailingAnalyticsNotesAnchor, sailingSimulatorNotesAnchor, raceCommitteeAppNotesAnchor });
contentWidgets = Arrays.asList(new HTML[] { sailingAnalyticsNotes, /*sailingSimulatorNotes,*/ raceCommitteeAppNotes }); contentWidgets = Arrays.asList(new HTML[] { sailingAnalyticsNotes, sailingSimulatorNotes, raceCommitteeAppNotes });
switch(navigationTab) { switch(navigationTab) {
case PostRaceAnalytics: case PostRaceAnalytics:
@@ -73,7 +73,7 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV
setActiveContent(sailingAnalyticsNotes, sailingAnalyticsNotesAnchor); setActiveContent(sailingAnalyticsNotes, sailingAnalyticsNotesAnchor);
break; break;
case SailingSimulator: case SailingSimulator:
// setActiveContent(sailingSimulatorNotes, sailingSimulatorNotesAnchor); setActiveContent(sailingSimulatorNotes, sailingSimulatorNotesAnchor);
break; break;
case TrainingDiary: case TrainingDiary:
break; break;
@@ -85,13 +85,13 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV
setActiveContent(sailingAnalyticsNotes, sailingAnalyticsNotesAnchor); setActiveContent(sailingAnalyticsNotes, sailingAnalyticsNotesAnchor);
handleClickEventWithLocalNavigation(event, sailingAnalyticNotesNavigation); handleClickEventWithLocalNavigation(event, sailingAnalyticNotesNavigation);
} }
/*
@UiHandler("sailingSimulatorNotesAnchor") @UiHandler("sailingSimulatorNotesAnchor")
void featuresClicked(ClickEvent event) { void featuresClicked(ClickEvent event) {
setActiveContent(sailingSimulatorNotes, sailingSimulatorNotesAnchor); setActiveContent(sailingSimulatorNotes, sailingSimulatorNotesAnchor);
handleClickEventWithLocalNavigation(event, sailingSimulatorNoteNavigation); handleClickEventWithLocalNavigation(event, sailingSimulatorNoteNavigation);
} }
*/
@UiHandler("raceCommitteeAppNotesAnchor") @UiHandler("raceCommitteeAppNotesAnchor")
void releaseNotesClicked(ClickEvent event) { void releaseNotesClicked(ClickEvent event) {
setActiveContent(raceCommitteeAppNotes, raceCommitteeAppNotesAnchor); setActiveContent(raceCommitteeAppNotes, raceCommitteeAppNotesAnchor);
@@ -10,9 +10,7 @@
<div class="{res.mainCss.grid}"> <div class="{res.mainCss.grid}">
<div class="{res.mediaCss.small12} {res.mediaCss.columns}"> <div class="{res.mediaCss.small12} {res.mediaCss.columns}">
<g:Anchor ui:field="sailingAnalyticsNotesAnchor" href="javascript:;" styleName="{local_res.css.whatsnew_nav_link}"><ui:text from='{i18n.solutionsSAPHeadline}'/></g:Anchor> <g:Anchor ui:field="sailingAnalyticsNotesAnchor" href="javascript:;" styleName="{local_res.css.whatsnew_nav_link}"><ui:text from='{i18n.solutionsSAPHeadline}'/></g:Anchor>
<!-- <g:Anchor ui:field="sailingSimulatorNotesAnchor" href="javascript:;" styleName="{local_res.css.whatsnew_nav_link}"><ui:text from='{i18n.solutionsSimulatorHeadline}'/></g:Anchor>
<g:Anchor ui:field="sailingSimulatorNotesAnchor" href="javascript:;" styleName="{local_res.css.whatsnew_nav_link}"><ui:text from='{i18n.solutionsSimulatorHeadline}'/></g:Anchor>
-->
<g:Anchor ui:field="raceCommitteeAppNotesAnchor" href="javascript:;" styleName="{local_res.css.whatsnew_nav_link}"><ui:text from='{i18n.solutionsRaceHeadline}'/></g:Anchor> <g:Anchor ui:field="raceCommitteeAppNotesAnchor" href="javascript:;" styleName="{local_res.css.whatsnew_nav_link}"><ui:text from='{i18n.solutionsRaceHeadline}'/></g:Anchor>
</div> </div>
</div> </div>
@@ -20,9 +18,7 @@
<div class="{res.mainCss.grid}"> <div class="{res.mainCss.grid}">
<div class="{res.mediaCss.small12} {res.mediaCss.columns}"> <div class="{res.mediaCss.small12} {res.mediaCss.columns}">
<g:HTML ui:field="sailingAnalyticsNotes" /> <g:HTML ui:field="sailingAnalyticsNotes" />
<!--
<g:HTML ui:field="sailingSimulatorNotes" /> <g:HTML ui:field="sailingSimulatorNotes" />
-->
<g:HTML ui:field="raceCommitteeAppNotes" /> <g:HTML ui:field="raceCommitteeAppNotes" />
</div> </div>
</div> </div>
@@ -45,6 +45,8 @@ public class Solutions extends Composite {
@UiField Anchor sailingAnalyticsDetailsAnchor; @UiField Anchor sailingAnalyticsDetailsAnchor;
@UiField Anchor raceCommitteeAppDetailsAnchor; @UiField Anchor raceCommitteeAppDetailsAnchor;
@UiField Anchor simulatorStartAnchor;
@UiField Anchor simulatorAppDetailsAnchor;
private final PlaceNavigation<SolutionsPlace> sailingAnalyticsNavigation; private final PlaceNavigation<SolutionsPlace> sailingAnalyticsNavigation;
private final PlaceNavigation<SolutionsPlace> raceCommitteeAppNavigation; private final PlaceNavigation<SolutionsPlace> raceCommitteeAppNavigation;
@@ -56,6 +58,7 @@ public class Solutions extends Composite {
private final PlaceNavigation<WhatsNewPlace> sailingAnalyticsDetailsNavigation; private final PlaceNavigation<WhatsNewPlace> sailingAnalyticsDetailsNavigation;
private final PlaceNavigation<WhatsNewPlace> raceCommitteeAppDetailsNavigation; private final PlaceNavigation<WhatsNewPlace> raceCommitteeAppDetailsNavigation;
private final PlaceNavigation<WhatsNewPlace> simulatorAppDetailsNavigation;
private final HomePlacesNavigator placesNavigator; private final HomePlacesNavigator placesNavigator;
public Solutions(SolutionsNavigationTabs navigationTab, HomePlacesNavigator placesNavigator) { public Solutions(SolutionsNavigationTabs navigationTab, HomePlacesNavigator placesNavigator) {
@@ -71,9 +74,12 @@ public class Solutions extends Composite {
sailingAnalyticsDetailsNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingAnalytics); sailingAnalyticsDetailsNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingAnalytics);
raceCommitteeAppDetailsNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.RaceCommiteeApp); raceCommitteeAppDetailsNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.RaceCommiteeApp);
simulatorAppDetailsNavigation = placesNavigator.getWhatsNewNavigation(WhatsNewNavigationTabs.SailingSimulator);
sailingAnalyticsDetailsAnchor.setHref(sailingAnalyticsDetailsNavigation.getTargetUrl()); sailingAnalyticsDetailsAnchor.setHref(sailingAnalyticsDetailsNavigation.getTargetUrl());
raceCommitteeAppDetailsAnchor.setHref(raceCommitteeAppDetailsNavigation.getTargetUrl()); raceCommitteeAppDetailsAnchor.setHref(raceCommitteeAppDetailsNavigation.getTargetUrl());
simulatorAppDetailsAnchor.setHref(simulatorAppDetailsNavigation.getTargetUrl());
simulatorStartAnchor.setHref(placesNavigator.getSimulatorURL());
sailingAnalyticsNavigation = placesNavigator.getSolutionsNavigation(SolutionsNavigationTabs.SailingAnalytics); sailingAnalyticsNavigation = placesNavigator.getSolutionsNavigation(SolutionsNavigationTabs.SailingAnalytics);
raceCommitteeAppNavigation = placesNavigator.getSolutionsNavigation(SolutionsNavigationTabs.RaceCommiteeApp); raceCommitteeAppNavigation = placesNavigator.getSolutionsNavigation(SolutionsNavigationTabs.RaceCommiteeApp);
@@ -131,7 +137,12 @@ public class Solutions extends Composite {
public void sailingAnalyticsDetailsClicked(ClickEvent e) { public void sailingAnalyticsDetailsClicked(ClickEvent e) {
handleClickEventWithPlaceController(e, sailingAnalyticsDetailsNavigation); handleClickEventWithPlaceController(e, sailingAnalyticsDetailsNavigation);
} }
@UiHandler("simulatorAppDetailsAnchor")
public void simulatorAppDetailsAnchorClicked(ClickEvent e) {
handleClickEventWithPlaceController(e, simulatorAppDetailsNavigation);
}
private void scrollToView(SolutionsNavigationTabs navigationTab) { private void scrollToView(SolutionsNavigationTabs navigationTab) {
switch (navigationTab) { switch (navigationTab) {
case SailingAnalytics: case SailingAnalytics:
@@ -67,7 +67,9 @@
<div class="{res.mediaCss.small5} {res.mediaCss.smalloffset7} {res.mediaCss.columns}"> <div class="{res.mediaCss.small5} {res.mediaCss.smalloffset7} {res.mediaCss.columns}">
<h2><ui:text from='{i18n.solutionsSimulatorHeadline}'/></h2> <h2><ui:text from='{i18n.solutionsSimulatorHeadline}'/></h2>
<p><ui:text from='{i18n.solutionsSimulatorText}'/></p> <p><ui:text from='{i18n.solutionsSimulatorText}'/></p>
<!-- <a href="#" class="{res.mainCss.button}">Learn More</a> --> <g:Anchor ui:field="simulatorAppDetailsAnchor" styleName="{res.mainCss.button}"><ui:text from='{i18n.whatsNew}'/></g:Anchor>
<span>&nbsp;&nbsp;</span>
<g:Anchor ui:field="simulatorStartAnchor" target="_blank" styleName="{res.mainCss.button}"><ui:text from='{i18n.startSimulator}'/></g:Anchor>
</div> </div>
</div> </div>
</div> </div>
@@ -9,6 +9,10 @@ public class EntryPointLinkFactory extends AbstractEntryPointLinkFactory {
return createEntryPointLink("/gwt/RaceBoard.html", parameters); return createEntryPointLink("/gwt/RaceBoard.html", parameters);
} }
public static String createSimulatorLink(Map<String, String> parameters) {
return createEntryPointLink("/gwt/Simulator.html", parameters);
}
public static String createLeaderboardLink(Map<String, String> parameters) { public static String createLeaderboardLink(Map<String, String> parameters) {
return createEntryPointLink("/gwt/Leaderboard.html", parameters); return createEntryPointLink("/gwt/Leaderboard.html", parameters);
} }
@@ -4,12 +4,64 @@
<div id="mainContent"> <div id="mainContent">
<h4 class="articleHeadline">What's New - Strategy Simulator</h4> <h4 class="articleHeadline">What's New - Strategy Simulator</h4>
<div class="innerContent"> <div class="innerContent">
<h5 class="articleSubheadline">September 2014</h5> <h5 class="articleSubheadline">October 2014</h5>
<ul class="bulletList"> <ul class="bulletList">
<li>Point 1... <li>Simulation is being integrated into the race board (see What's New in Sailing Analytics)</li>
</li>
</ul> </ul>
<h5 class="articleSubheadline">August 2014</h5>
<ul class="bulletList">
<li>Accuracy of optimal course calculation has been improved</li>
<li>Streamlet motion is now calibrated to physical reality on large zoom levels of the map</li>
</ul>
<h5 class="articleSubheadline">April 2014</h5>
<ul class="bulletList">
<li>Wind is visualized using animated streamlets based on a swarm of particles which locally follow the wind</li>
</ul>
<h5 class="articleSubheadline">September 2013</h5>
<ul class="bulletList">
<li>Windbot based on RaspberryPi to construct real, spatially resolved wind vector fields from wind measurements</li>
</ul>
<h5 class="articleSubheadline">June 2013</h5>
<ul class="bulletList">
<li>Optimal courses shown as "Omniscient" are determined by an heuristic search algorithm greatly improving accuracy and runtime performance</li>
<li>Sailing angles are represented with full numeric accuracy</li>
<li>Water current is taken into account</li>
<li>Support up- and downwind legs</li>
<li>1-Click Simulation simplifies the user interaction</li>
<li>Race course map for Kieler Woche and Travemuender Woche</li>
</ul>
<h5 class="articleSubheadline">March 2013</h5>
<ul class="bulletList">
<li>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?</li>
</ul>
<h5 class="articleSubheadline">February 2013</h5>
<ul class="bulletList">
<li>Strategy Simulator becomes a part of SAP's Sailing Analytics suite</li>
</ul>
<h5 class="articleSubheadline">December 2012</h5>
<ul class="bulletList">
<li>Polar diagram chart is available</li>
<li>Multiple boat classes are supported based on polar diagrams in tabular format provided as CSV-files</li>
<li>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)</li>
</ul>
<h5 class="articleSubheadline">June 2012</h5>
<ul class="bulletList">
<li>First upwind-only prototype of sailing simulation is available</li>
<li>Optimal courses shown as "Omniscient" are calculated with an implementation of Dijkstra's algorithm on a rectangular spatial grid</li>
<li>Wind is visualized by arrows which scale with wind speed</li>
<li>Race course definition with 2 mouse clicks for start and end</li>
</ul>
</div> </div>
</div> </div>
</body> </body>