adoption of sizes, fonts, and colors to all widgets to new dashboard design

This commit is contained in:
Alexander Ries committed 2016-02-02 15:57:48 +01:00
1 parent 15982503ed
commit bfc45b50a5
39 files changed
+585 -393

No files matched your search

@@ -47,44 +47,41 @@
.collumnthree {
left: 66.8%;
right: 0pt;
right: 0px;
}
.left {
left: 0pt;
left: 0px;
right: 50%;
}
.right {
left: 50%;
right: 0pt;
right: 0px;
}
.startline_advantage_by_wind_container {
position: absolute;
background-color: white;
top: 27%;
right: 0pt;
left: 0pt;
top: 163px;
right: 0px;
left: 0px;
bottom: 0%;
}
.startline_advantage_by_geometry_container {
position: absolute;
background-color: white;
top: 0%;
right: 0pt;
left: 0pt;
bottom: 73%;
margin-bottom: 10pt;
top: 0px;
right: 0px;
left: 0px;
height: 150px
}
.windcharthint {
position: absolute;
bottom: 0pt;
bottom: 0px;
height: 15pt;
line-height: 15pt;
margin-top: 0pt;
margin-top: 0px;
vertical-align: middle;
font-size: 12pt;
font-family: DASHBOARD_FONT_FAMILY;
@@ -105,7 +102,7 @@
.windloadinghinttext {
position: absolute;
bottom: 0pt;
bottom: 0px;
height: 15pt;
line-height: 15pt;
margin-top: 0pt;
@@ -26,7 +26,7 @@ import com.sap.sailing.dashboards.gwt.client.eventlogo.EventLogo;
import com.sap.sailing.dashboards.gwt.client.notifications.orientation.WrongDeviceOrientationNotification;
import com.sap.sailing.dashboards.gwt.client.widgets.PollsLiveDataEvery5Seconds;
import com.sap.sailing.dashboards.gwt.client.widgets.startanalysis.StartAnalysisWidget;
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.course.StartLineAdvantageByGeometryWidget;
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.course.StartlineAdvantageByGeometryWidget;
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.StartlineAdvantagesByWindWidget;
import com.sap.sailing.dashboards.gwt.client.widgets.windbot.WindBotWidget;
import com.sap.sailing.dashboards.gwt.shared.DashboardURLParameters;
@@ -81,7 +81,7 @@ public class DashboardPanel extends Composite implements NumberOfWindBotsChangeL
public StartAnalysisWidget startanalysisComponent;
@UiField(provided = true)
public StartLineAdvantageByGeometryWidget startlineAdvantageByGeometryComponent;
public StartlineAdvantageByGeometryWidget startlineAdvantageByGeometryWidget;
private List<WindBotWidget> windBotComponents;
private StringMessages stringConstants;
@@ -94,7 +94,7 @@ public class DashboardPanel extends Composite implements NumberOfWindBotsChangeL
windBotComponents = new ArrayList<WindBotWidget>();
startanalysisComponent = new StartAnalysisWidget(this.dashboardClientFactory);
startlineAdvantagesByWindComponent = new StartlineAdvantagesByWindWidget(this.dashboardClientFactory);
startlineAdvantageByGeometryComponent = new StartLineAdvantageByGeometryWidget(this.dashboardClientFactory);
startlineAdvantageByGeometryWidget = new StartlineAdvantageByGeometryWidget(this.dashboardClientFactory);
stringConstants = StringMessages.INSTANCE;
initWidget(uiBinder.createAndBindUi(this));
initLogos();
@@ -136,12 +136,12 @@ public class DashboardPanel extends Composite implements NumberOfWindBotsChangeL
windBotComponents.clear();
for (String windBotID : windBotIDs) {
if (windBotAddedCounterTOConsiderForPanels == 0) {
WindBotWidget leftwindBotComponent = new WindBotWidget(windBotID);
WindBotWidget leftwindBotComponent = new WindBotWidget(windBotID, dashboardClientFactory);
leftwindbotcontainer.add(leftwindBotComponent);
windBotComponents.add(leftwindBotComponent);
windloadinghintleft.getStyle().setOpacity(0.0);
} else if (windBotAddedCounterTOConsiderForPanels == 1) {
WindBotWidget rightwindBotComponent = new WindBotWidget(windBotID);
WindBotWidget rightwindBotComponent = new WindBotWidget(windBotID, dashboardClientFactory);
rightwindbotcontainer.add(rightwindBotComponent);
windBotComponents.add(rightwindBotComponent);
windloadinghintright.getStyle().setOpacity(0.0);
@@ -36,7 +36,7 @@
</g:HTMLPanel>
<g:HTMLPanel styleName="{resources.style.collumn} {resources.style.collumnthree}">
<g:HTMLPanel styleName="{resources.style.startline_advantage_by_geometry_container}">
<startlineadvantagegeometry:StartLineAdvantageByGeometryWidget ui:field="startlineAdvantageByGeometryComponent"></startlineadvantagegeometry:StartLineAdvantageByGeometryWidget>
<startlineadvantagegeometry:StartlineAdvantageByGeometryWidget ui:field="startlineAdvantageByGeometryWidget"></startlineadvantagegeometry:StartlineAdvantageByGeometryWidget>
</g:HTMLPanel>
<g:HTMLPanel styleName="{resources.style.startline_advantage_by_wind_container}">
<startlineadvantagewind:StartlineAdvantagesByWindWidget
@@ -9,7 +9,7 @@ public class Sizes {
public static final String DASHBOARD_FONT_SIZE_SMALL = "13px";
public static final String DASHBOARD_FONT_SIZE_MEDIUM = "14px";
public static final String DASHBOARD_FONT_SIZE_LARGE = "18px";
public static final String DASHBOARD_FONT_SIZE_VERY_LARGE = "25px";
public static final String DASHBOARD_FONT_SIZE_VERY_LARGE = "33px";
public static final String DASHBOARD_SPACE_VERY_SMALL = "10px";
public static final String DASHBOARD_SPACE_SMALL = "30px";
@@ -14,9 +14,11 @@
@def DASHBOARD_FONT_FAMILY eval("com.sap.sailing.dashboards.gwt.client.theme.Fonts.DASHBOARD_FONT_FAMILY");
/*Sizes*/
@def DASHBOARD_FONT_SIZE_VERY_SMALL eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_FONT_SIZE_VERY_SMALL");
@def DASHBOARD_FONT_SIZE_SMALL eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_FONT_SIZE_SMALL");
@def DASHBOARD_FONT_SIZE_MEDIUM eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_FONT_SIZE_MEDIUM");
@def DASHBOARD_FONT_SIZE_LARGE eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_FONT_SIZE_LARGE");
@def DASHBOARD_FONT_SIZE_VERY_LARGE eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_FONT_SIZE_VERY_LARGE");
@def DASHBOARD_SPACE_VERY_SMALL eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_SPACE_VERY_SMALL");
@def DASHBOARD_SPACE_SMALL eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_SPACE_SMALL");
@@ -0,0 +1,44 @@
@require 'theme';
.dashboard_widget_header {
position: absolute;
width: 100%;
height: DASHBOARD_SPACE_MEDIUM;
top: 0;
line-height: DASHBOARD_SPACE_MEDIUM;
vertical-align: middle;
font-size: DASHBOARD_FONT_SIZE_LARGE;
font-family: DASHBOARD_FONT_FAMILY;
text-align: center;
font-weight: bold;
overflow: visible;
background-color: WHITE;
border-bottom:solid LIGHT_GREY 1px;
z-index: 3;
}
.dashboard_widget_no_data_message_container {
position: absolute;
top: DASHBOARD_SPACE_MEDIUM;
bottom: 0px;
width: 100%;
font-size: DASHBOARD_FONT_SIZE_MEDIUM;
font-family: DASHBOARD_FONT_FAMILY;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
line-height: DASHBOARD_LINE_HEIGHT;
}
.dashboard_widget_no_data_message_header {
color: DARK_TEXT_COLOR;
font-weight: bold;
text-align: center;
display: inline-block;
}
.dashboard_widget_no_data_message {
color: LIGHT_TEXT_COLOR;
font-weight: normal;
}
@@ -0,0 +1,88 @@
package com.sap.sailing.dashboards.gwt.client.widgets.header;
import java.util.Iterator;
import com.google.gwt.core.client.GWT;
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.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
/**
* @author Alexander Ries (D062114)
*
*/
public class DashboardWidgetHeaderAndNoDataMessage extends Composite implements HasWidgets {
private static DashboardWidgetHeaderAndNoDataMessageUiBinder uiBinder = GWT.create(DashboardWidgetHeaderAndNoDataMessageUiBinder.class);
private static final int EXTRA_WIDTH_MESSAGE = 10;
interface DashboardWidgetHeaderAndNoDataMessageUiBinder extends UiBinder<Widget, DashboardWidgetHeaderAndNoDataMessage> {
}
@UiField
HTMLPanel header;
@UiField
DivElement noDataMessageHeader;
@UiField
DivElement noDataMessage;
public DashboardWidgetHeaderAndNoDataMessage() {
DashboardWidgetHeaderAndNoDataMessageResources.INSTANCE.gss().ensureInjected();
initWidget(uiBinder.createAndBindUi(this));
}
public void setHeaderText(String headerText) {
this.header.getElement().setInnerHTML(headerText);
}
public void showNoDataMessageWithHeaderAndMessage(String header, String message) {
noDataMessageHeader.setInnerText(header);
noDataMessage.setInnerText(message);
noDataMessage.getStyle().setWidth(noDataMessageHeader.getClientWidth()+EXTRA_WIDTH_MESSAGE, Unit.PX);
}
public void hideNoDataMessage() {
noDataMessageHeader.setInnerHTML("");
noDataMessage.setInnerHTML("");
}
public void adaptSizeOfNoDataMessageDiv() {
// Scheduler.get().scheduleDeferred(new Command() {
// public void execute () {
double widthOfNoDataMessageHeader = Double.parseDouble(noDataMessageHeader.getStyle().getWidth());
Window.alert("asdfasdfasfd");
Window.alert("widthOfNoDataMessageHeader "+widthOfNoDataMessageHeader);
noDataMessage.getStyle().setWidth(widthOfNoDataMessageHeader, Unit.PX);
// }
// });
}
@Override
public void add(Widget w) {
throw new UnsupportedOperationException("The method add(Widget w) is not supported.");
}
@Override
public void clear() {
throw new UnsupportedOperationException("The method clear() is not supported.");
}
@Override
public Iterator<Widget> iterator() {
return null;
}
@Override
public boolean remove(Widget w) {
return false;
}
}
@@ -0,0 +1,17 @@
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.header.DashboardWidgetHeaderAndNoDataMessageResources"/>
<g:HTMLPanel>
<g:HTMLPanel ui:field="header" styleName="{resources.gss.dashboard_widget_header}">
</g:HTMLPanel>
<div class="{resources.gss.dashboard_widget_no_data_message_container}">
<div>
<div ui:field="noDataMessageHeader" class="{resources.gss.dashboard_widget_no_data_message_header}"></div>
<div ui:field="noDataMessage" class="{resources.gss.dashboard_widget_no_data_message}"></div>
</div>
</div>
</g:HTMLPanel>
</ui:UiBinder>
@@ -0,0 +1,24 @@
package com.sap.sailing.dashboards.gwt.client.widgets.header;
import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
/**
* @author Alexander Ries (D062114)
*
*/
public interface DashboardWidgetHeaderAndNoDataMessageResources extends ClientBundle {
public static final DashboardWidgetHeaderAndNoDataMessageResources INSTANCE = GWT.create(DashboardWidgetHeaderAndNoDataMessageResources.class);
@Source({"com/sap/sailing/dashboards/gwt/client/theme/theme.gss", "DashboardWidgetHeaderAndNoDataMessage.gss"})
DashboardWidgetHeaderAndNoDataMessageGSS gss();
public interface DashboardWidgetHeaderAndNoDataMessageGSS extends CssResource {
String dashboard_widget_header();
String dashboard_widget_no_data_message_container();
String dashboard_widget_no_data_message_header();
String dashboard_widget_no_data_message();
}
}
@@ -10,47 +10,6 @@
bottom: 0pt;
}
.panel_header {
height: DASHBOARD_SPACE_MEDIUM;
margin-top: 0;
line-height: DASHBOARD_SPACE_MEDIUM;
vertical-align: middle;
font-size: DASHBOARD_FONT_SIZE_LARGE;
font-family: DASHBOARD_FONT_FAMILY;
width: 100%;
text-align: center;
font-weight: bold;
overflow: visible;
background-color: WHITE;
}
.no_data_message_container {
position: absolute;
top: DASHBOARD_SPACE_MEDIUM;
bottom: 0px;
width: 100%;
font-size: DASHBOARD_FONT_SIZE_MEDIUM;
font-family: DASHBOARD_FONT_FAMILY;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
line-height: DASHBOARD_LINE_HEIGHT;
}
.no_data_message_header {
color: DARK_TEXT_COLOR;
font-weight: bold;
text-align: center;
}
.no_data_message {
color: LIGHT_TEXT_COLOR;
max-width: 230px;
margin: auto;
font-weight: normal;
}
.current_start_panel {
height: DASHBOARD_SPACE_MEDIUM;
top: DASHBOARD_SPACE_MEDIUM;
@@ -8,7 +8,6 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
@@ -34,6 +33,7 @@ import com.sap.sailing.dashboards.gwt.client.popups.competitorselection.Competit
import com.sap.sailing.dashboards.gwt.client.popups.competitorselection.CompetitorSelectionPopup;
import com.sap.sailing.dashboards.gwt.client.popups.competitorselection.SettingsButtonWithSelectionIndicationLabel;
import com.sap.sailing.dashboards.gwt.client.widgets.PollsLiveDataEvery5Seconds;
import com.sap.sailing.dashboards.gwt.client.widgets.header.DashboardWidgetHeaderAndNoDataMessage;
import com.sap.sailing.dashboards.gwt.client.widgets.startanalysis.card.StartAnalysisCard;
import com.sap.sailing.dashboards.gwt.shared.DashboardURLParameters;
import com.sap.sailing.dashboards.gwt.shared.dto.LeaderboardCompetitorsDTO;
@@ -62,9 +62,9 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
interface StartlineAnalysis extends CssResource {
}
@UiField
HTMLPanel header;
@UiField(provided = true)
DashboardWidgetHeaderAndNoDataMessage dashboardWidgetHeaderAndNoDataMessage;
@UiField
HTMLPanel currentStartPanel;
@@ -93,12 +93,6 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
* */
@UiField
HTMLPanel startanalysis_card_container;
@UiField
DivElement noDataMessageHeader;
@UiField
DivElement noDataMessage;
/**
* The CSS "left" property from the {@link #startanalysis_card_container}.
@@ -136,13 +130,14 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
* Component that contains handles, displays and loads startanalysis cards.
* */
public StartAnalysisWidget(DashboardClientFactory dashboardClientFactory) {
dashboardWidgetHeaderAndNoDataMessage = new DashboardWidgetHeaderAndNoDataMessage();
StartAnalysisWidgetResources.INSTANCE.gss().ensureInjected();
raceMapResources.combinedWindPanelStyle().ensureInjected();
this.dashboardClientFactory = dashboardClientFactory;
pageChangeListener = new ArrayList<StartAnalysisCard>();
starts = new ArrayList<StartAnalysisDTO>();
initWidget(uiBinder.createAndBindUi(this));
header.getElement().setInnerText(StringMessages.INSTANCE.dashboardStartAnalysesHeader());
dashboardWidgetHeaderAndNoDataMessage.setHeaderText(StringMessages.INSTANCE.dashboardStartAnalysesHeader());
initCompetitorSelectionPopupAndAddCompetitorSelectionListener();
initLeftRightButtons();
initAndAddBottomNotification();
@@ -175,13 +170,14 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
@Override
public void onFailure(Throwable caught) {
logger.log(Level.INFO, "Failed to received startanalysis list, "+caught.getMessage());
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableMessage());
}
@Override
public void onSuccess(StartAnalysesDTO result) {
logger.log(Level.INFO, "Received startanalysis list");
if (result != null && !result.getStartAnalyses().isEmpty()) {
hideNoDataMessage();
dashboardWidgetHeaderAndNoDataMessage.hideNoDataMessage();
if (displayedStartAnalysisCompetitorDifferentToRequestedOne()) {
removeAllStartAnalysisCards();
}
@@ -194,7 +190,7 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
settingsButtonWithSelectionIndicationLabel.setSelectionIndicationTextOnLabel(result.getStartAnalyses().get(0).competitor.getName());
} else {
logger.log(Level.INFO, "Received startanalysis list is null or empty");
showNoDataMessageWithHeaderAndMessage(null, null);
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableMessage());
}
}
});
@@ -255,12 +251,14 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
}
} else {
logger.log(Level.INFO, "Received competitors are null or empty");
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableMessage());
}
}
@Override
public void onFailure(Throwable caught) {
logger.log(Level.INFO, "Failed to received competitors for leaderboard name, "+caught.getMessage());
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableMessage());
}
});
}
@@ -413,16 +411,6 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
}
}
private void showNoDataMessageWithHeaderAndMessage(String header, String message) {
noDataMessageHeader.setInnerHTML(StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableHeader());
noDataMessage.setInnerHTML(StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableMessage());
}
private void hideNoDataMessage() {
noDataMessageHeader.setInnerHTML("");
noDataMessage.setInnerHTML("");
}
@Override
public void timeChanged(Date newTime, Date oldTime) {
String selectedCompetitorId = Cookies.getCookie(SELECTED_COMPETITOR_ID_COOKIE_KEY);
@@ -1,19 +1,12 @@
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<ui:with field="resources"
type="com.sap.sailing.dashboards.gwt.client.widgets.startanalysis.StartAnalysisWidgetResources" />
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:header="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.header">
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.startanalysis.StartAnalysisWidgetResources" />
<g:HTMLPanel styleName="{resources.gss.startanalysis}">
<g:HTMLPanel ui:field="header" styleName="{resources.gss.panel_header}">
</g:HTMLPanel>
<div class="{resources.gss.no_data_message_container}">
<span>
<div ui:field="noDataMessageHeader" class="{resources.gss.no_data_message_header}"></div>
<div ui:field="noDataMessage" class="{resources.gss.no_data_message}"></div>
</span>
</div>
<header:DashboardWidgetHeaderAndNoDataMessage ui:field="dashboardWidgetHeaderAndNoDataMessage"></header:DashboardWidgetHeaderAndNoDataMessage>
<g:HTMLPanel ui:field="currentStartPanel" styleName="{resources.gss.current_start_panel}">
</g:HTMLPanel>
<g:HTMLPanel ui:field="leftButton"
@@ -26,10 +26,6 @@ public interface StartAnalysisWidgetResources extends ClientBundle {
public interface StartAnalysisGSS extends CssResource {
String startanalysis();
String panel_header();
String no_data_message_container();
String no_data_message_header();
String no_data_message();
String current_start_panel();
String controll_header_button();
String controll_header_button_visible();
@@ -101,9 +101,9 @@ public class StartAnalysisCard extends Composite implements HasWidgets, StartAna
final String startLineAdvantageType;
if (startAnalysisDTO.startAnalysisWindLineInfoDTO.startLineAdvantage.startLineAdvatageType
.equals(StartlineAdvantageType.GEOMETRIC)) {
startLineAdvantageType = stringMessages.dashboardStartlineAdvantageByGeometry();
startLineAdvantageType = stringMessages.dashboardStartlineAdvantageByGeometryHeader();
} else {
startLineAdvantageType = stringMessages.dashboardStartlineAdvantagesByWind();
startLineAdvantageType = stringMessages.dashboardStartlineAdvantagesByWindHeader();
}
startanalysis_card_line_advantage
.setInnerHTML(SafeHtmlUtils.fromString(startLineAdvantageType
@@ -1,31 +1,15 @@
@require 'theme';
.startLineAdvantageComponent_liveAveragePanel {
bottom: 5pt;
margin-top: 4pt;
.start_line_advantage_by_geometry_widget {
position: absolute;
height: 100%;
width: 100%;
background-color: LIGHT_GREY;
}
.startLineAdvantageComponent_header {
font-size: 14pt;
}
.startLineAdvantageComponent_livePanel {
top: 35%;
bottom: 20%;
}
.startLineAdvantageComponent_averagePanel {
top: 35%;
bottom: 20%;
}
.startLineAdvantageComponent_middleLine {
top: 35%;
bottom: 20%;
}
.startLineAdvantageComponent_wrapper {
.advantage_maximum_live_average {
position: absolute;
width: 100%;
height: 100%;
top: DASHBOARD_SPACE_MEDIUM;
height: auto;
}
@@ -1,51 +1,74 @@
package com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.course;
import java.util.Date;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.NumberFormat;
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.Composite;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.dashboards.gwt.client.DashboardClientFactory;
import com.sap.sailing.dashboards.gwt.client.actions.GetStartlineAdvantageByGeometryAction;
import com.sap.sailing.dashboards.gwt.client.widgets.PollsLiveDataEvery5Seconds;
import com.sap.sailing.dashboards.gwt.client.widgets.header.DashboardWidgetHeaderAndNoDataMessage;
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util.LiveAverageComponent;
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.StartlineAdvantagesByWindWidget;
import com.sap.sailing.dashboards.gwt.shared.DashboardURLParameters;
import com.sap.sailing.dashboards.gwt.shared.dto.StartLineAdvantageDTO;
import com.sap.sailing.gwt.ui.client.StringMessages;
/**
* The purpose of the class is to display the live and average start line advantage either by wind or by geometry. There
* is only one advantage display at once, so the user can switch between these following two
* {@link StartLineAdvantageComponentState}s {@link StartLineAdvantageComponentStateShowsAdvantageByWind} and
* {@link StartLineAdvantageComponentStateShowsAdvantageByGeometry} by tabing somewhere at the widget. The class extends
* from {@link LiveAverageComponent} to get necessary Ui Elements but customizes these with own CSS.
*
* @author Alexander Ries (D062114)
*
*/
public class StartLineAdvantageByGeometryWidget extends LiveAverageComponent implements PollsLiveDataEvery5Seconds {
public class StartlineAdvantageByGeometryWidget extends Composite implements HasWidgets, PollsLiveDataEvery5Seconds {
private DashboardClientFactory dashboardClientFactory;
private static StartlineAdvantageByGeometryWidgetUiBinder uiBinder = GWT
.create(StartlineAdvantageByGeometryWidgetUiBinder.class);
interface StartlineAdvantageByGeometryWidgetUiBinder extends UiBinder<Widget, StartlineAdvantageByGeometryWidget> {
}
private static StringMessages stringConstants = StringMessages.INSTANCE;
private static final Logger logger = Logger.getLogger(StartLineAdvantageByGeometryWidget.class.getName());
@UiField(provided = true)
DashboardWidgetHeaderAndNoDataMessage dashboardWidgetHeaderAndNoDataMessage;
public StartLineAdvantageByGeometryWidget(DashboardClientFactory dashboardClientFactory) {
super(stringConstants.dashboardStartlineAdvantageByGeometry(), "m");
this.dashboardClientFactory = dashboardClientFactory;
@UiField(provided = true)
LiveAverageComponent advantageMaximumLiveAverage;
@UiField
HTMLPanel contentContainer;
public DashboardClientFactory dashboardClientFactory;
private static final Logger logger = Logger.getLogger(StartlineAdvantagesByWindWidget.class.getName());
public StartlineAdvantageByGeometryWidget(DashboardClientFactory dashboardClientFactory) {
StartLineAdvantageByGeometryWidgetRessources.INSTANCE.gss().ensureInjected();
this.header.setInnerText(stringConstants.dashboardStartlineAdvantageByGeometry());
this.header.addClassName(StartLineAdvantageByGeometryWidgetRessources.INSTANCE.gss().startLineAdvantageComponent_header());
liveAveragePanel.getElement().addClassName(StartLineAdvantageByGeometryWidgetRessources.INSTANCE.gss().startLineAdvantageComponent_liveAveragePanel());
livePanel.getElement().addClassName(StartLineAdvantageByGeometryWidgetRessources.INSTANCE.gss().startLineAdvantageComponent_livePanel());
middleLine.getElement().addClassName(StartLineAdvantageByGeometryWidgetRessources.INSTANCE.gss().startLineAdvantageComponent_middleLine());
averagePanel.getElement().addClassName(StartLineAdvantageByGeometryWidgetRessources.INSTANCE.gss().startLineAdvantageComponent_averagePanel());
this.liveLabel.setInnerHTML(stringConstants.dashboardLiveWind());
this.averageLabel.setInnerHTML(stringConstants.dashboardAverageWind()+"<br>"+stringConstants.dashboardAverageWindMinutes(15));
this.dashboardClientFactory = dashboardClientFactory;
dashboardWidgetHeaderAndNoDataMessage = new DashboardWidgetHeaderAndNoDataMessage();
advantageMaximumLiveAverage = new LiveAverageComponent(StringMessages.INSTANCE.metersUnit());
advantageMaximumLiveAverage.liveLabel.setInnerHTML(StringMessages.INSTANCE.dashboardLiveWind());
advantageMaximumLiveAverage.averageLabel.setInnerHTML("<p>"+StringMessages.INSTANCE.dashboardAverageWind()+"</p><p>"+StringMessages.INSTANCE.dashboardAverageWindMinutes(15)+"</p>");
initWidget(uiBinder.createAndBindUi(this));
hideDataDisplayContainer();
dashboardWidgetHeaderAndNoDataMessage.setHeaderText(StringMessages.INSTANCE.dashboardStartlineAdvantageByGeometryHeader());
registerForDashboardFiveSecondsTimer(dashboardClientFactory);
}
private void showDataDisplayContainer(){
contentContainer.getElement().getStyle().setOpacity(1.0);
}
private void hideDataDisplayContainer(){
contentContainer.getElement().getStyle().setOpacity(0.0);
}
@Override
public void timeChanged(Date newTime, Date oldTime) {
String leaderboardNameParameterValue = DashboardURLParameters.LEADERBOARD_NAME.getValue();
@@ -57,26 +80,52 @@ public class StartLineAdvantageByGeometryWidget extends LiveAverageComponent imp
@Override
public void onFailure(Throwable caught) {
logger.log(Level.INFO, "Failed to received startline advantage by geometry");
hideDataDisplayContainer();
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByGeometryAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByGeometryAvailableMessage());
}
@Override
public void onSuccess(StartLineAdvantageDTO result) {
if (result.startLineAdvantage != null) {
logger.log(Level.INFO, "Updating UI with RibDashboardRaceInfoDTO.startLineAdvantageDTO");
setLiveValue(NumberFormat.getFormat("#0.0").format(result.startLineAdvantage.doubleValue()));
setAverageValue(NumberFormat.getFormat("#0.0").format(result.average.doubleValue()));
advantageMaximumLiveAverage.setLiveValue(NumberFormat.getFormat("#0.0").format(result.startLineAdvantage.doubleValue()));
advantageMaximumLiveAverage.setAverageValue(NumberFormat.getFormat("#0.0").format(result.average.doubleValue()));
showDataDisplayContainer();
dashboardWidgetHeaderAndNoDataMessage.hideNoDataMessage();
} else {
logger.log(Level.INFO, "RibDashboardRaceInfoDTO.startLineAdvantageDTO is 0");
hideDataDisplayContainer();
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByGeometryAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByGeometryAvailableMessage());
}
}
});
}
}
@Override
public void registerForDashboardFiveSecondsTimer(DashboardClientFactory dashboardClientFactory) {
if (dashboardClientFactory != null) {
dashboardClientFactory.getDashboardFiveSecondsTimer().addTimeListener(this);
}
}
}
@Override
public void add(Widget w) {
throw new UnsupportedOperationException("The method add(Widget w) is not supported.");
}
@Override
public void clear() {
throw new UnsupportedOperationException("The method clear() is not supported.");
}
@Override
public Iterator<Widget> iterator() {
return null;
}
@Override
public boolean remove(Widget w) {
return false;
}
}
@@ -14,16 +14,8 @@ public interface StartLineAdvantageByGeometryWidgetRessources extends ClientBund
@Shared
public interface StartLineAdvantageByGeometryGss extends CssResource {
public String startLineAdvantageComponent_liveAveragePanel();
public String startLineAdvantageComponent_header();
public String startLineAdvantageComponent_livePanel();
public String startLineAdvantageComponent_averagePanel();
public String startLineAdvantageComponent_middleLine();
public String startLineAdvantageComponent_wrapper();
String start_line_advantage_by_geometry_widget();
String advantage_maximum_live_average();
}
}
@@ -0,0 +1,17 @@
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:util="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util"
xmlns:header="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.header">
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.course.StartLineAdvantageByGeometryWidgetRessources" />
<g:HTMLPanel styleName="{resources.gss.start_line_advantage_by_geometry_widget}">
<header:DashboardWidgetHeaderAndNoDataMessage ui:field="dashboardWidgetHeaderAndNoDataMessage"></header:DashboardWidgetHeaderAndNoDataMessage>
<g:HTMLPanel ui:field="contentContainer">
<g:HTMLPanel styleName="{resources.gss.advantage_maximum_live_average}">
<util:LiveAverageComponent ui:field="advantageMaximumLiveAverage"></util:LiveAverageComponent>
</g:HTMLPanel>
</g:HTMLPanel>
</g:HTMLPanel>
</ui:UiBinder>
@@ -5,33 +5,14 @@
left: 0px;
right: 0px;
top: 0px;
bottom: 0px;
}
.header_container {
position: absolute;
left: 0px;
right: 0px;
top: 0px;
height: 35%;
}
.header {
height: 100%;
margin-top: 5pt;
line-height: 15pt;
vertical-align: middle;
font-size: 13pt;
font-family: DASHBOARD_FONT_FAMILY;
width: 100%;
text-align: center;
overflow: visible;
font-weight: bold;
height: 110px;
background-color: WHITE;
z-index: 2;
}
.live_container {
position: absolute;
top: 35%;
top: DASHBOARD_SPACE_VERY_SMALL;
bottom: 30%;
right: 52%;
left: 0%;
@@ -39,7 +20,7 @@
.average_container {
position: absolute;
top: 35%;
top: DASHBOARD_SPACE_VERY_SMALL;
bottom: 30%;
right: 0%;
left: 52%;
@@ -47,7 +28,7 @@
.middle_line {
position: absolute;
top: 35%;
top: 13px;
height: 30pt;
width: 1px;
left: 50%;
@@ -57,12 +38,13 @@
.panel_value_number {
font-family: DASHBOARD_FONT_FAMILY;
font-size: 26pt;
font-size: DASHBOARD_FONT_SIZE_VERY_LARGE;
height: DASHBOARD_FONT_SIZE_VERY_LARGE;
}
.panel_value_unit {
font-family: DASHBOARD_FONT_FAMILY;
font-size: 15pt;
font-size: DASHBOARD_FONT_SIZE_MEDIUM;
}
.panel_value_unit_degrees {
@@ -74,7 +56,6 @@
.value_panel {
margin: 0px;
width: 100%;
height: 90%;
text-align: center;
font-family: DASHBOARD_FONT_FAMILY;
font-weight: bolder;
@@ -85,23 +66,27 @@
width: 100%;
height: 100%;
text-align: center;
font-size: 11pt;
color: grey;
font-size: DASHBOARD_FONT_SIZE_MEDIUM;
color: LIGHT_TEXT_COLOR;
font-family: DASHBOARD_FONT_FAMILY;
}
.live_label_container {
position: absolute;
bottom: 0px;
top: 56px;
left: 0px;
right: 50%;
height: 35%;
height: 14px;
padding-left: DASHBOARD_SPACE_VERY_SMALL;
padding-right: DASHBOARD_SPACE_VERY_SMALL;
}
.average_label_container {
position: absolute;
bottom: 0px;
right: 0px;
top: 56px;
left: 50%;
height: 35%;
right: 0px;
height: 14px;
padding-left: DASHBOARD_SPACE_VERY_SMALL;
padding-right: DASHBOARD_SPACE_VERY_SMALL;
}
@@ -11,7 +11,6 @@ import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.course.StartLineAdvantageByGeometryWidget;
import com.sap.sailing.dashboards.gwt.client.widgets.windbot.WindBotWidget;
import com.sap.sailing.dashboards.gwt.client.widgets.windbot.charts.VerticalWindChartClickListener;
import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -34,9 +33,6 @@ public class LiveAverageComponent extends Composite implements HasWidgets, Verti
@UiField
public HTMLPanel liveAveragePanel;
@UiField
public DivElement header;
@UiField
SpanElement liveNumber;
@@ -78,12 +74,11 @@ public class LiveAverageComponent extends Composite implements HasWidgets, Verti
* sets a special size
*
* */
public LiveAverageComponent(String header, String unit) {
public LiveAverageComponent(String unit) {
LiveAverageComponentResources.INSTANCE.gss().ensureInjected();
stringConstants = StringMessages.INSTANCE;
initWidget(uiBinder.createAndBindUi(this));
liveAveragePanel.getElement().getStyle().setProperty("backgroundColor", "white");
this.header.setInnerText(header);
this.liveUnit.setInnerText(unit);
this.averageUnit.setInnerText(unit);
// Lifts the degrees unit string "°". Otherwise it would be too small.
@@ -2,40 +2,29 @@
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util.LiveAverageComponentResources"/>
<ui:with field="resources"
type="com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util.LiveAverageComponentResources" />
<g:HTMLPanel ui:field="liveAveragePanel" styleName="{resources.gss.live_average_component}">
<g:HTMLPanel styleName="{resources.gss.header_container}">
<div class="{resources.gss.header}" ui:field="header"></div>
</g:HTMLPanel>
<g:HTMLPanel ui:field="livePanel" styleName="{resources.gss.live_container}">
<div class="{resources.gss.value_panel}">
<span class="{resources.gss.panel_value_number}" ui:field="liveNumber"></span>
<span class="{resources.gss.panel_value_unit}" ui:field="liveUnit"></span>
</div>
<div class="{resources.gss.value_panel}">
<span class="{resources.gss.panel_value_number}" ui:field="liveNumber"></span>
<span class="{resources.gss.panel_value_unit}" ui:field="liveUnit"></span>
</div>
</g:HTMLPanel>
<g:HTMLPanel ui:field="middleLine" styleName="{resources.gss.middle_line}">
</g:HTMLPanel>
<g:HTMLPanel ui:field="averagePanel" styleName="{resources.gss.average_container}">
<div class="{resources.gss.value_panel}">
<span class="{resources.gss.panel_value_number}" ui:field="averageNumber"></span>
<span class="{resources.gss.panel_value_unit}" ui:field="averageUnit"></span>
</div>
<div class="{resources.gss.value_panel}">
<span class="{resources.gss.panel_value_number}" ui:field="averageNumber"></span>
<span class="{resources.gss.panel_value_unit}" ui:field="averageUnit"></span>
</div>
</g:HTMLPanel>
<g:HTMLPanel styleName="{resources.gss.live_label_container}">
<div class="{resources.gss.label_text}" ui:field="liveLabel"></div>
<div class="{resources.gss.label_text}" ui:field="liveLabel"></div>
</g:HTMLPanel>
<g:HTMLPanel styleName="{resources.gss.average_label_container}">
<div class="{resources.gss.label_text}" ui:field="averageLabel"></div>
<div class="{resources.gss.label_text}" ui:field="averageLabel"></div>
</g:HTMLPanel>
</g:HTMLPanel>
</ui:UiBinder>
@@ -17,8 +17,6 @@ public interface LiveAverageComponentResources extends ClientBundle {
interface LiveAverageComponentGss extends CssResource {
String live_average_component();
String header();
String header_container();
String live_container();
String average_container();
String middle_line();
@@ -1,21 +1,22 @@
@require 'theme';
.start_line_advantages_by_wind_component{
.start_line_advantages_by_wind_component {
position: absolute;
height: 100%;
width: 100%;
background-color: LIGHT_GREY;
}
.advantage_maximum_live_average{
.advantage_maximum_live_average {
position: absolute;
height: 30%;
width: 100%;
top: 4pt;
top: DASHBOARD_SPACE_MEDIUM;
height: auto;
}
.advantages_on_line_chart_container{
position: absolute;
height: 70%;
top: 30%;
.advantages_on_line_chart_container {
position: absolute;
top: 150px;
width: 100%;
bottom: 0px;
}
@@ -6,18 +6,19 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.resources.client.CssResource;
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.Composite;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.dashboards.gwt.client.DashboardClientFactory;
import com.sap.sailing.dashboards.gwt.client.actions.GetStartlineAdvantagesByWindAction;
import com.sap.sailing.dashboards.gwt.client.widgets.PollsLiveDataEvery5Seconds;
import com.sap.sailing.dashboards.gwt.client.widgets.header.DashboardWidgetHeaderAndNoDataMessage;
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util.LiveAverageComponent;
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.charts.StartlineAdvantagesOnLineChart;
import com.sap.sailing.dashboards.gwt.shared.DashboardURLParameters;
@@ -40,24 +41,33 @@ public class StartlineAdvantagesByWindWidget extends Composite implements HasWid
}
@UiField(provided = true)
DashboardWidgetHeaderAndNoDataMessage dashboardWidgetHeaderAndNoDataMessage;
@UiField(provided = true)
LiveAverageComponent advantageMaximumLiveAverage;
@UiField(provided = true)
StartlineAdvantagesOnLineChart startlineAdvantagesOnLineChart;
@UiField
HTMLPanel dataDisplayContainer;
public DashboardClientFactory dashboardClientFactory;
private static final Logger logger = Logger.getLogger(StartlineAdvantagesByWindWidget.class.getName());
public StartlineAdvantagesByWindWidget(DashboardClientFactory dashboardClientFactory) {
StartlineAdvantagesByWindWidgetResources.INSTANCE.gss().ensureInjected();
this.dashboardClientFactory = dashboardClientFactory;
dashboardWidgetHeaderAndNoDataMessage = new DashboardWidgetHeaderAndNoDataMessage();
advantageMaximumLiveAverage = new LiveAverageComponent(StringMessages.INSTANCE.metersUnit());
startlineAdvantagesOnLineChart = new StartlineAdvantagesOnLineChart();
advantageMaximumLiveAverage = new LiveAverageComponent(StringMessages.INSTANCE.dashboardStartlineAdvantagesByWind(), "m");
advantageMaximumLiveAverage.header.getStyle().setFontSize(14, Unit.PT);
advantageMaximumLiveAverage.liveLabel.setInnerHTML("advantage max.");
advantageMaximumLiveAverage.averageLabel.setInnerHTML("advantage max. average "+StringMessages.INSTANCE.dashboardAverageWindMinutes(15));
initWidget(uiBinder.createAndBindUi(this));
hideDataDisplayContainer();
dashboardWidgetHeaderAndNoDataMessage.setHeaderText(StringMessages.INSTANCE.dashboardStartlineAdvantagesByWindHeader());
dataDisplayContainer.getElement().getStyle().setOpacity(0.0);
registerForDashboardFiveSecondsTimer(dashboardClientFactory);
}
@@ -79,8 +89,10 @@ public class StartlineAdvantagesByWindWidget extends Composite implements HasWid
result.maximum.doubleValue()));
advantageMaximumLiveAverage.setAverageValue(NumberFormat.getFormat("#0.0").format(
result.average.doubleValue()));
showDataDisplayContainer();
} else {
logger.log(Level.INFO, "StartlineAdvantagesWithMaxAndAverageDTO is null");
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByWindAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByWindAvailableMessage());
}
}
@@ -88,11 +100,20 @@ public class StartlineAdvantagesByWindWidget extends Composite implements HasWid
public void onFailure(Throwable caught) {
logger.log(Level.INFO, "Failed to received StartlineAdvantagesWithMaxAndAverageDTO, "
+ caught.getMessage());
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByWindAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByWindAvailableMessage());
}
});
}
}
private void showDataDisplayContainer(){
dataDisplayContainer.getElement().getStyle().setOpacity(1.0);
}
private void hideDataDisplayContainer(){
dataDisplayContainer.getElement().getStyle().setOpacity(0.0);
}
@Override
public void timeChanged(Date newTime, Date oldTime) {
loadData();
@@ -2,16 +2,21 @@
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:util="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util"
xmlns:chart="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.charts">
xmlns:chart="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.charts"
xmlns:header="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.header">
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.StartlineAdvantagesByWindWidgetResources"/>
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.StartlineAdvantagesByWindWidgetResources" />
<g:HTMLPanel styleName="{resources.gss.start_line_advantages_by_wind_component}">
<g:HTMLPanel styleName="{resources.gss.advantage_maximum_live_average}">
<util:LiveAverageComponent ui:field="advantageMaximumLiveAverage"></util:LiveAverageComponent>
</g:HTMLPanel>
<g:HTMLPanel styleName="{resources.gss.advantages_on_line_chart_container}">
<chart:StartlineAdvantagesOnLineChart ui:field="startlineAdvantagesOnLineChart"></chart:StartlineAdvantagesOnLineChart>
<header:DashboardWidgetHeaderAndNoDataMessage
ui:field="dashboardWidgetHeaderAndNoDataMessage"></header:DashboardWidgetHeaderAndNoDataMessage>
<g:HTMLPanel ui:field="dataDisplayContainer">
<g:HTMLPanel styleName="{resources.gss.advantage_maximum_live_average}">
<util:LiveAverageComponent ui:field="advantageMaximumLiveAverage"></util:LiveAverageComponent>
</g:HTMLPanel>
<g:HTMLPanel styleName="{resources.gss.advantages_on_line_chart_container}">
<chart:StartlineAdvantagesOnLineChart ui:field="startlineAdvantagesOnLineChart"></chart:StartlineAdvantagesOnLineChart>
</g:HTMLPanel>
</g:HTMLPanel>
</g:HTMLPanel>
</ui:UiBinder>
@@ -7,17 +7,18 @@
z-index: 5;
}
.name_panel {
height: 45pt;
line-height: 45pt;
.live_average_header {
position: absolute;
height: 60px;
top: DASHBOARD_SPACE_MEDIUM;
line-height: 60px;
vertical-align: middle;
font-size: 14pt;
font-size: DASHBOARD_FONT_SIZE_LARGE;
font-family: DASHBOARD_FONT_FAMILY;
width: 100%;
text-align: center;
font-weight: bold;
overflow: visible;
background-color: white;
background-color: WHITE;
}
.live_average_container {
@@ -25,41 +26,34 @@
border: none;
border-radius: 0pt;
background-color: white;
top: 45pt;
bottom: 65%;
top: 90px;
}
.left {
left: 0pt;
left: 0px;
right: 50%;
}
.right {
left: 50%;
right: 0pt;
right: 0px;
}
.windchart_container {
position: absolute;
border: none;
border-radius: 0pt;
border-radius: 0px;
background-color: white;
top: 35%;
bottom: 0pt;
top: 190px;
bottom: 0px;
padding-bottom: 10px;
}
.windchart{
position: absolute;
left: 0pt;
right: 0pt;
top: 0pt;
bottom: 0pt;
}
.compass_container{
position: absolute;
height: 45pt;
width: 45pt;
top: 5pt;
right: 5pt;
}
left: 0px;
right: 0px;
top: 0px;
bottom: 0px;
padding-bottom: 10px;
}
@@ -7,15 +7,17 @@ import java.util.logging.Logger;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.resources.client.CssResource;
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.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.dashboards.gwt.client.DashboardClientFactory;
import com.sap.sailing.dashboards.gwt.client.dataretriever.WindBotDataRetrieverListener;
import com.sap.sailing.dashboards.gwt.client.widgets.header.DashboardWidgetHeaderAndNoDataMessage;
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util.LiveAverageComponent;
import com.sap.sailing.dashboards.gwt.client.widgets.windbot.charts.VerticalWindChart;
import com.sap.sailing.dashboards.gwt.client.widgets.windbot.compass.LocationPointerCompass;
@@ -49,18 +51,18 @@ public class WindBotWidget extends Composite implements HasWidgets, WindBotDataR
interface WindBotWidgetUiBinder extends UiBinder<Widget, WindBotWidget> {
}
interface WindBotComponentStyle extends CssResource {
}
@UiField
public HTMLPanel windBotComponent;
/**
* The header of the widget displaying the name of the wind bot.
* */
@UiField(provided = true)
DashboardWidgetHeaderAndNoDataMessage dashboardWidgetHeaderAndNoDataMessage;
@UiField
public HTMLPanel windBotNamePanel;
DivElement totalWindSpeedHeader;
@UiField
DivElement totalWindDirectionHeader;
/**
* One of two {@link LiveAverageComponent}s that display in big font the live and the average value of the measured
@@ -97,24 +99,28 @@ public class WindBotWidget extends Composite implements HasWidgets, WindBotDataR
@UiField
public LocationPointerCompass locationPointerCompass;
public DashboardClientFactory dashboardClientFactory;
private String windBotId;
private StringMessages stringConstants;
private final static String UNIT_WIND_DIRECTION = "°";
public WindBotWidget(String windBotId) {
public WindBotWidget(String windBotId, DashboardClientFactory dashboardClientFactory) {
WindBotWidgetResources.INSTANCE.gss().ensureInjected();
this.dashboardClientFactory = dashboardClientFactory;
dashboardWidgetHeaderAndNoDataMessage = new DashboardWidgetHeaderAndNoDataMessage();
this.windBotId = windBotId;
stringConstants = StringMessages.INSTANCE;
movingAverageSpeed = new MovingAverage(500);
movingAverageDirection = new MovingAverage(500);
trueWindSpeedLiveAverageComponent = new LiveAverageComponent(stringConstants.dashboardTrueWindSpeed(), stringConstants.dashboardTrueWindSpeedUnit());
trueWindDirectionLiveAverageComponent = new LiveAverageComponent(stringConstants.dashboardTrueWindDirection(), UNIT_WIND_DIRECTION);
trueWindSpeedLiveAverageComponent = new LiveAverageComponent(stringConstants.dashboardTrueWindSpeedUnit());
trueWindDirectionLiveAverageComponent = new LiveAverageComponent(stringConstants.degreesUnit());
trueWindSpeedVerticalWindChart = new VerticalWindChart("#008FFF", "#6ADBFF");
trueWindDirectionVerticalWindChart = new VerticalWindChart("#008FFF", "#6ADBFF");
initWidget(uiBinder.createAndBindUi(this));
windBotNamePanel.getElement().setInnerText(stringConstants.dashboardWindBot()+" "+ windBotId);
trueWindSpeedVerticalWindChart.addVerticalWindChartClickListener(trueWindSpeedLiveAverageComponent);
trueWindDirectionVerticalWindChart.addVerticalWindChartClickListener(trueWindDirectionLiveAverageComponent);
dashboardWidgetHeaderAndNoDataMessage.setHeaderText(stringConstants.dashboardWindBot()+" "+ windBotId);
totalWindSpeedHeader.setInnerHTML(stringConstants.dashboardTrueWindSpeed());
totalWindDirectionHeader.setInnerHTML(stringConstants.dashboardTrueWindDirection());
trueWindSpeedVerticalWindChart.addVerticalWindChartClickListener(trueWindSpeedLiveAverageComponent);
trueWindDirectionVerticalWindChart.addVerticalWindChartClickListener(trueWindDirectionLiveAverageComponent);
}
public WindTrackInfoDTO getWindTrackInfoDTOFromAndWindBotID(WindInfoForRaceDTO windInfoForRaceDTO, String id) {
@@ -128,26 +134,6 @@ public class WindBotWidget extends Composite implements HasWidgets, WindBotDataR
return windTrackInfo;
}
@Override
public void add(Widget w) {
throw new UnsupportedOperationException("The method add(Widget w) is not supported.");
}
@Override
public void clear() {
throw new UnsupportedOperationException("The method clear() is not supported.");
}
@Override
public Iterator<Widget> iterator() {
return null;
}
@Override
public boolean remove(Widget w) {
return false;
}
/**
* Updates the classes {@link LiveAverageComponent}s and {@link VerticalWindChart}s with data AND updates the
* {@link #locationPointerCompass} with a new wind bot position !!!
@@ -220,8 +206,7 @@ public class WindBotWidget extends Composite implements HasWidgets, WindBotDataR
}
private void updateLocationPointerCompass(final WindTrackInfoDTO windTrackInfoDTO) {
locationPointerCompass.windBotPositionChanged(windTrackInfoDTO.windFixes
.get(windTrackInfoDTO.windFixes.size() - 1).position);
locationPointerCompass.windBotPositionChanged(windTrackInfoDTO.windFixes.get(windTrackInfoDTO.windFixes.size() - 1).position);
}
private void updateMovingAverages(List<WindDTO> windFixes) {
@@ -230,4 +215,24 @@ public class WindBotWidget extends Composite implements HasWidgets, WindBotDataR
movingAverageDirection.add(windDTO.trueWindFromDeg);
}
}
@Override
public void add(Widget w) {
throw new UnsupportedOperationException("The method add(Widget w) is not supported.");
}
@Override
public void clear() {
throw new UnsupportedOperationException("The method clear() is not supported.");
}
@Override
public Iterator<Widget> iterator() {
return null;
}
@Override
public boolean remove(Widget w) {
return false;
}
}
@@ -3,12 +3,16 @@
xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:client="urn:import:com.sap.sailing.dashboards.gwt.client"
xmlns:util="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util"
xmlns:windchart="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.windbot.charts"
xmlns:compass="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.windbot.compass">
xmlns:compass="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.windbot.compass"
xmlns:header="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.header">
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.windbot.WindBotWidgetResources"/>
<g:HTMLPanel ui:field="windBotComponent" styleName="{resources.gss.wind_bot_component}">
<g:HTMLPanel ui:field="windBotNamePanel" styleName="{resources.gss.name_panel}"></g:HTMLPanel>
<header:DashboardWidgetHeaderAndNoDataMessage ui:field="dashboardWidgetHeaderAndNoDataMessage"></header:DashboardWidgetHeaderAndNoDataMessage>
<compass:LocationPointerCompass ui:field="locationPointerCompass"></compass:LocationPointerCompass>
<div ui:field="totalWindSpeedHeader" class="{resources.gss.live_average_header} {resources.gss.left}"></div>
<div ui:field="totalWindDirectionHeader" class="{resources.gss.live_average_header} {resources.gss.right}"></div>
<g:HTMLPanel
styleName="{resources.gss.live_average_container} {resources.gss.left}">
<util:LiveAverageComponent ui:field="trueWindSpeedLiveAverageComponent"></util:LiveAverageComponent>
@@ -27,9 +31,5 @@
<windchart:VerticalWindChart ui:field="trueWindDirectionVerticalWindChart"
styleName="{resources.gss.windchart}"></windchart:VerticalWindChart>
</g:HTMLPanel>
<g:HTMLPanel styleName="{resources.gss.compass_container}">
<compass:LocationPointerCompass
ui:field="locationPointerCompass"></compass:LocationPointerCompass>
</g:HTMLPanel>
</g:HTMLPanel>
</ui:UiBinder>
@@ -17,12 +17,11 @@ public interface WindBotWidgetResources extends ClientBundle {
public interface WindBotComponentGss extends CssResource {
String wind_bot_component();
String name_panel();
String live_average_header();
String live_average_container();
String left();
String right();
String windchart_container();
String windchart();
String compass_container();
}
}
@@ -37,6 +37,9 @@ import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.dashboards.gwt.client.theme.Colors;
import com.sap.sailing.dashboards.gwt.client.theme.Fonts;
import com.sap.sailing.dashboards.gwt.client.theme.Sizes;
import com.sap.sailing.dashboards.gwt.client.util.HighchartsUtil;
import com.sap.sailing.dashboards.gwt.shared.WindType;
import com.sap.sailing.gwt.ui.client.shared.charts.ChartPointRecalculator;
@@ -138,9 +141,8 @@ public class VerticalWindChart extends Composite implements HasWidgets {
.setType(Type.DATE_TIME)
.setReversed(false)
.setLabels(
new XAxisLabels().setStyle(new Style().setFontFamily("Arial").setFontSize("12")
.setColor("grey"))).setLineColor("grey").setTickWidth(0.5).setLineWidth(1)
.setTickWidth(1).setTickColor("grey").setOffset(0).setMinPadding(20).setGridLineColor("white")
new XAxisLabels().setStyle(new Style().setFontFamily(Fonts.DASHBOARD_FONT_FAMILY).setFontSize(Sizes.DASHBOARD_FONT_SIZE_SMALL).setColor(Colors.LIGHT_TEXT_COLOR))).setLineColor(Colors.LIGHT_TEXT_COLOR).setTickWidth(0.5).setLineWidth(1)
.setTickWidth(1).setTickColor(Colors.LIGHT_TEXT_COLOR).setOffset(0).setMinPadding(20).setGridLineColor(Colors.LIGHT_GREY)
.setGridLineWidth(0)
.setDateTimeLabelFormats(new DateTimeLabelFormats().setMonth("%e. %b").setYear("%b"));
}
@@ -148,12 +150,12 @@ public class VerticalWindChart extends Composite implements HasWidgets {
private void setYAxisOptions() {
verticalWindChart
.getYAxis()
.setLineColor("grey")
.setLineColor(Colors.LIGHT_TEXT_COLOR)
.setTickWidth(1)
.setTickColor("grey")
.setTickColor(Colors.LIGHT_TEXT_COLOR)
.setAxisTitleText(null)
.setGridLineWidth(0)
.setAlternateGridColor("#d4d4d4")
.setAlternateGridColor(Colors.LIGHT_GREY)
.setLineWidth(1)
.setEndOnTick(true)
.setStartOnTick(true)
@@ -163,7 +165,7 @@ public class VerticalWindChart extends Composite implements HasWidgets {
.setMaxPadding(0)
.setLabels(
new YAxisLabels().setStyle(
new Style().setFontFamily("Arial").setFontSize("12").setColor("grey")).setFormatter(
new Style().setFontFamily(Fonts.DASHBOARD_FONT_FAMILY).setFontSize(Sizes.DASHBOARD_FONT_SIZE_SMALL).setColor(Colors.LIGHT_TEXT_COLOR)).setFormatter(
new AxisLabelsFormatter() {
@Override
public String format(AxisLabelsData axisLabelsData) {
@@ -1,5 +1,16 @@
@require 'theme';
.location_pointer_compass {
position: absolute;
width: 70px;
height: 85px;
background-color: LIGHT_GREY;
top: 0px;
right: 13px;
z-index: 5;
/*border-bottom-left-radius: 2em;*/
}
.compass{
height: 100%;
width: 100%;
@@ -8,13 +19,13 @@
.needle{
position: absolute;
height: 100%;
width: 100%;
top: 0%;
left: 0%;
top: 10px;
left: 10px;
width: 50px;
height: 50px;
}
.angleToLocationLabel{
.angle_to_location {
position: absolute;
height: 10pt;
width: 100%;
@@ -23,22 +34,22 @@
text-align: center;
vertical-align: middle;
font-family: DASHBOARD_FONT_FAMILY;
font-size: 9pt;
font-size: DASHBOARD_FONT_SIZE_VERY_SMALL;
font-weight: bold;
color: white;
}
.distanceToLocationLabel{
.distance_to_location {
position: absolute;
height: 15pt;
height: DASHBOARD_FONT_SIZE_SMALL;
width: 100%;
bottom: -17pt;
top: 65px;
text-align: center;
vertical-align: middle;
font-family: DASHBOARD_FONT_FAMILY;
line-height: 10pt;
line-height: DASHBOARD_FONT_SIZE_SMALL;
font-weight: bold;
font-size: 9pt;
font-size: DASHBOARD_FONT_SIZE_SMALL;
color: black;
z-index: 10;
}
@@ -1,38 +1,45 @@
package com.sap.sailing.dashboards.gwt.client.widgets.windbot.compass;
import java.util.Iterator;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.ui.AbsolutePanel;
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.HasWidgets;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.Position;
/**
* The class is an UI component that should be used to display the direction and the distance from the users device to a
* certain pointed GPS location. The class needs an {@link LocationPointerCompassAngleDistance} instance and registers
* as an listener to it. It furthermore notifies its {@link LocationPointerCompassAngleDistance} instance about wind bot
* GPS location changes.
*
* @author Alexander Ries (D062114)
*
*/
public class LocationPointerCompass extends AbsolutePanel implements HasWidgets,
LocationPointerCompassAngleDistanceListener {
public class LocationPointerCompass extends Composite implements HasWidgets, LocationPointerCompassAngleDistanceListener {
private double angleOffset;
private static LocationPointerCompasssUiBinder uiBinder = GWT.create(LocationPointerCompasssUiBinder.class);
interface LocationPointerCompasssUiBinder extends UiBinder<Widget, LocationPointerCompass> {
}
private Image compassNeedle;
@UiField
Image compassNeedle;
/**
* The Label shows the distance the users device is away from the location it points to.
* */
private Label distanceToPointetLocationLabel;
@UiField
DivElement distanceToPointetLocation;
/**
* The Label shows the direction in degrees from north the users device is away from the location it points to.
* */
private Label angleToPointetLocationLabel;
@UiField
DivElement angleToPointetLocation;
private double angleOffset;
/**
* The {@link LocationPointerCompassAngleDistance} notifies the class about updates about angle and distance
* changes.
@@ -41,33 +48,10 @@ public class LocationPointerCompass extends AbsolutePanel implements HasWidgets,
public LocationPointerCompass() {
LocationPointerCompassRessources.INSTANCE.gss().ensureInjected();
this.getElement().addClassName(LocationPointerCompassRessources.INSTANCE.gss().compass());
initCompassNeedle();
initAngleToPointetLocationLabel();
initDistanceToPointedLocationLabel();
initWidget(uiBinder.createAndBindUi(this));
compassNeedle.setResource(LocationPointerCompassRessources.INSTANCE.compass());
locationPointerCompassAngleDistance = new LocationPointerCompassAngleDistance();
locationPointerCompassAngleDistance.addListener(this);
locationPointerCompassAngleDistance.triggerOrientationRead();
}
private void initCompassNeedle() {
compassNeedle = new Image();
compassNeedle.setResource(LocationPointerCompassRessources.INSTANCE.compass());
compassNeedle.getElement().addClassName(LocationPointerCompassRessources.INSTANCE.gss().needle());
LocationPointerCompass.this.add(compassNeedle);
}
private void initAngleToPointetLocationLabel() {
angleToPointetLocationLabel = new Label();
angleToPointetLocationLabel.getElement().addClassName(LocationPointerCompassRessources.INSTANCE.gss().angleToLocationLabel());
this.add(angleToPointetLocationLabel);
}
private void initDistanceToPointedLocationLabel() {
distanceToPointetLocationLabel = new Label();
distanceToPointetLocationLabel.getElement().addClassName(LocationPointerCompassRessources.INSTANCE.gss().distanceToLocationLabel());
distanceToPointetLocationLabel.setText("m");
this.add(distanceToPointetLocationLabel);
}
private void updateNeedleAngle(double newDirection) {
@@ -79,19 +63,19 @@ public class LocationPointerCompass extends AbsolutePanel implements HasWidgets,
compassNeedle.getElement().getStyle()
.setProperty("webkitTransform", "rotate(" + winddirectionformatted + "deg)");
String winddirectionFormattedForLabel = NumberFormat.getFormat("#0").format((newAngle < 0) ? 360+newAngle : newAngle);
angleToPointetLocationLabel.setText(winddirectionFormattedForLabel+"°");
angleToPointetLocation.setInnerHTML(winddirectionFormattedForLabel+"°");
}
}
private void updateDistanceToPointedLocationLabel(double distance, double angle) {
String distanceFormatted = NumberFormat.getFormat("#0").format(distance);
distanceToPointetLocationLabel.setText(distanceFormatted + " m");
distanceToPointetLocation.setInnerHTML(distanceFormatted + " m");
}
public void windBotPositionChanged(Position positionDTO) {
locationPointerCompassAngleDistance.windBotPositionChanged(positionDTO);
}
@Override
public void angleChanged(double angle) {
updateNeedleAngle(angle);
@@ -107,4 +91,24 @@ public class LocationPointerCompass extends AbsolutePanel implements HasWidgets,
public void setAngleOffset(double offset) {
angleOffset = offset;
}
@Override
public void add(Widget w) {
throw new UnsupportedOperationException("The method add(Widget w) is not supported.");
}
@Override
public void clear() {
throw new UnsupportedOperationException("The method clear() is not supported.");
}
@Override
public Iterator<Widget> iterator() {
return null;
}
@Override
public boolean remove(Widget w) {
return false;
}
}
@@ -0,0 +1,12 @@
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.windbot.compass.LocationPointerCompassRessources"/>
<g:HTMLPanel styleName="{resources.gss.location_pointer_compass}">
<g:Image ui:field="compassNeedle" styleName="{resources.gss.needle}"></g:Image>
<div ui:field="angleToPointetLocation" class="{resources.gss.angle_to_location}"></div>
<div ui:field="distanceToPointetLocation" class="{resources.gss.distance_to_location}"></div>
</g:HTMLPanel>
</ui:UiBinder>
@@ -18,9 +18,10 @@ public interface LocationPointerCompassRessources extends ClientBundle {
@Shared
public interface LocationPointerCompassGSS extends CssResource {
public String location_pointer_compass();
public String compass();
public String needle();
public String angleToLocationLabel();
public String distanceToLocationLabel();
public String angle_to_location();
public String distance_to_location();
}
}
@@ -1275,8 +1275,12 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c
String dashboardNewStartAnalysisAvailable();
String dashboardNoStartAnalysesAvailableHeader();
String dashboardNoStartAnalysesAvailableMessage();
String dashboardStartlineAdvantagesByWind();
String dashboardStartlineAdvantageByGeometry();
String dashboardNoStartlineAdvantagesByWindAvailableHeader();
String dashboardNoStartlineAdvantagesByWindAvailableMessage();
String dashboardNoStartlineAdvantagesByGeometryAvailableHeader();
String dashboardNoStartlineAdvantagesByGeometryAvailableMessage();
String dashboardStartlineAdvantagesByWindHeader();
String dashboardStartlineAdvantageByGeometryHeader();
String dashboardRankAtFirstMark();
String dashboardTeam();
String dashboardDistanceToLineInM();
@@ -1237,8 +1237,12 @@ dashboardStartAnalysesHeader=Start Analyses
dashboardNewStartAnalysisAvailable=New start analysis available
dashboardNoStartAnalysesAvailableHeader=No Start Analyses available yet.
dashboardNoStartAnalysesAvailableMessage=There is a Start Analysis created from each race start. Please stand by till racing has been started.
dashboardStartlineAdvantagesByWind=Startline advantage by wind
dashboardStartlineAdvantageByGeometry=Startline advantage by geometry
dashboardNoStartlineAdvantagesByWindAvailableHeader=No Startline Advantages available yet.
dashboardNoStartlineAdvantagesByWindAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
dashboardNoStartlineAdvantagesByGeometryAvailableHeader=No Startline Advantage available yet.
dashboardNoStartlineAdvantagesByGeometryAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
dashboardStartlineAdvantagesByWindHeader=Startline Advantages by Wind
dashboardStartlineAdvantageByGeometryHeader=Startline Advantage by Geometry
dashboardRankAtFirstMark=Rank at first mark
dashboardTeam=Team
dashboardDistanceToLineInM=Distance to line in m
@@ -1228,8 +1228,12 @@ dashboardStartAnalysesHeader=Start Analysen
dashboardNewStartAnalysisAvailable=Neue Start Analyse verfügbar.
dashboardNoStartAnalysesAvailableHeader=Noch keine Start Analysen verfügbar.
dashboardNoStartAnalysesAvailableMessage=Es wird eine Start Analyse für jeden Renn Start erstellt. Bitte warten bis die Rennen starten.
dashboardStartlineAdvantagesByWind=Startlininien Vorteil nach Wind
dashboardStartlineAdvantageByGeometry=Startlininien Vorteil nach Geometrie
dashboardNoStartlineAdvantagesByWindAvailableHeader=No Startline Advantages available yet.
dashboardNoStartlineAdvantagesByWindAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
dashboardNoStartlineAdvantagesByGeometryAvailableHeader=No Startline Advantage available yet.
dashboardNoStartlineAdvantagesByGeometryAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
dashboardStartlineAdvantagesByWindHeader=Startline Advantages by Wind
dashboardStartlineAdvantageByGeometryHeader=Startline Advantage by Geometry
dashboardRankAtFirstMark=Position an erster Bahnmarke
dashboardTeam=Team
dashboardDistanceToLineInM=Distanz zur Linie in m
@@ -1171,8 +1171,12 @@ dashboardStartAnalysesHeader=Start Analyses
dashboardNewStartAnalysisAvailable=New start analysis available
dashboardNoStartAnalysesAvailableHeader=No Start Analyses available yet.
dashboardNoStartAnalysesAvailableMessage=There is a Start Analysis created from each race start. Please stand by till racing has been started.
dashboardStartlineAdvantagesByWind=Startline advantage by wind
dashboardStartlineAdvantageByGeometry=Startline advantage by geometry
dashboardNoStartlineAdvantagesByWindAvailableHeader=No Startline Advantages available yet.
dashboardNoStartlineAdvantagesByWindAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
dashboardNoStartlineAdvantagesByGeometryAvailableHeader=No Startline Advantage available yet.
dashboardNoStartlineAdvantagesByGeometryAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
dashboardStartlineAdvantagesByWindHeader=Startline Advantages by Wind
dashboardStartlineAdvantageByGeometryHeader=Startline Advantage by Geometry
dashboardRankAtFirstMark=Rank at first mark
dashboardTeam=Team
dashboardDistanceToLineInM=Distance to line in m
@@ -159,7 +159,6 @@ explainReplicationServletPort=Servlet port number that is used to connect to reg
numberOfManeuvers=操作
successfullyAllowedCompetitorReset=Successfully allowed reload of competitor(s) {0}.
pleaseEnterAName=Please enter a name
dashboardStartlineAdvantageByGeometry=Startline advantage by geometry
confidence=Confidence
from=从
start=起航
@@ -1098,7 +1097,8 @@ windwardDistanceToGoInMetersTooltip=迎/顺风航段时参赛队的位置离开
papaDisplayed=Start mode flag - four minutes till start
sheetNameTooltip=You can name your polar sheet using the text field.nA name will be generated using the boat classnif no name is provided.
competitorsFilter=参赛队过滤
dashboardStartlineAdvantagesByWind=Startline advantage by wind
dashboardStartlineAdvantagesByWindHeader=Startline Advantages by Wind
dashboardStartlineAdvantageByGeometryHeader=Startline Advantage by Geometry
dashboardSecondsAbreviation=s
pleaseEnterNonEmptyDescription=Please enter a non-empty description
polarSheetChart=Polar Sheet
@@ -1257,6 +1257,10 @@ 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.
dashboardNoStartlineAdvantagesByWindAvailableHeader=No Startline Advantages available yet.
dashboardNoStartlineAdvantagesByWindAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
dashboardNoStartlineAdvantagesByGeometryAvailableHeader=No Startline Advantage available yet.
dashboardNoStartlineAdvantagesByGeometryAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
currentOfTotalLegs=航段 {0,number}/{1,number}
clone=Clone
changed=Changed