mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-04 11:23:50 +00:00
Merge branch 'charts' into gwt
Conflicts: java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LeaderboardConfigPanel.java java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringConstants.java java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringConstants.properties java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringConstants_de.properties
This commit is contained in:
commit
58e2b908a5
27 files changed
+783
-100
No files matched your search
+2
-2
@@ -119,8 +119,8 @@ public class TestColumnSwapping {
|
||||
}
|
||||
|
||||
// check if leaderboardDAO an dleaderboardOriginalDAO same
|
||||
List<String> leaderboardList = leaderboardDAO.getRaceList();
|
||||
List<String> leaderboardOriginalList = leaderboardOriginalDAO.getRaceList();
|
||||
List<String> leaderboardList = leaderboardDAO.getRaceColumnNameList();
|
||||
List<String> leaderboardOriginalList = leaderboardOriginalDAO.getRaceColumnNameList();
|
||||
|
||||
// ??????? assert races in list
|
||||
assertArrayEquals(leaderboardList.toArray(), leaderboardOriginalList.toArray());
|
||||
|
||||
@@ -6,5 +6,10 @@
|
||||
<classpathentry exported="true" kind="con" path="com.google.gwt.eclipse.core.GWT_CONTAINER"/>
|
||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||
<classpathentry kind="lib" path="lib/gwt-maps.jar"/>
|
||||
<classpathentry kind="lib" path="lib/gwt-visualization.jar" sourcepath="lib/gwt-visualization-noredist.jar">
|
||||
<attributes>
|
||||
<attribute name="javadoc_location" value="jar:platform:/resource/com.sap.sailing.gwt.ui/lib/gwt-visualization-javadoc.jar!/"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
Executable → Regular
+2
-2
@@ -1,7 +1,7 @@
|
||||
#Wed Nov 23 14:14:33 CET 2011
|
||||
#Tue Nov 29 17:19:34 CET 2011
|
||||
eclipse.preferences.version=1
|
||||
jarsExcludedFromWebInfLib=
|
||||
lastWarOutDir=C\:/Users/d056995/git/git/java/com.sap.sailing.gwt.ui/war
|
||||
lastWarOutDir=C\:/Users/d056866/git/git/java/com.sap.sailing.gwt.ui/war
|
||||
launchConfigExternalUrlPrefix=
|
||||
warSrcDir=war
|
||||
warSrcDirIsOutput=false
|
||||
@@ -1,5 +1,5 @@
|
||||
#Tue Nov 22 16:14:08 CET 2011
|
||||
#Tue Nov 29 17:28:42 CET 2011
|
||||
eclipse.preferences.version=1
|
||||
entryPointModules=
|
||||
filesCopiedToWebInfLib=gwt-servlet.jar
|
||||
gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBW11dPjwvZXh0cmEtYXJncz48dm0tYXJncz48IVtDREFUQVstWG14NTEybV1dPjwvdm0tYXJncz48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuTGVhZGVyYm9hcmQ8L2VudHJ5LXBvaW50LW1vZHVsZT48L2d3dC1jb21waWxlLXNldHRpbmdzPg\=\=
|
||||
gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBW11dPjwvZXh0cmEtYXJncz48dm0tYXJncz48IVtDREFUQVstWG14NTEybV1dPjwvdm0tYXJncz48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuQWRtaW5Db25zb2xlPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLkxlYWRlcmJvYXJkPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLkxlYWRlcmJvYXJkRWRpdGluZzwvZW50cnktcG9pbnQtbW9kdWxlPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5Vc2VyTWFuYWdlbWVudDwvZW50cnktcG9pbnQtbW9kdWxlPjwvZ3d0LWNvbXBpbGUtc2V0dGluZ3M+
|
||||
@@ -3,12 +3,6 @@
|
||||
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
|
||||
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.DevMode"/>
|
||||
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="true"/>
|
||||
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
|
||||
<listEntry value="com.sap.sailing.gwt.ui.UserManagement"/>
|
||||
<listEntry value="com.sap.sailing.gwt.ui.AdminConsole"/>
|
||||
<listEntry value="com.sap.sailing.gwt.ui.LeaderboardEditing"/>
|
||||
<listEntry value="com.sap.sailing.gwt.ui.Leaderboard"/>
|
||||
</listAttribute>
|
||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||
<listEntry value="/com.sap.sailing.gwt.ui"/>
|
||||
</listAttribute>
|
||||
@@ -21,7 +15,7 @@
|
||||
</listAttribute>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-war "${project_loc:com.sap.sailing.gwt.ui}/war" -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -logLevel INFO -codeServerPort 9997 com.sap.sailing.gwt.ui.AdminConsole com.sap.sailing.gwt.ui.Leaderboard com.sap.sailing.gwt.ui.LeaderboardEditing com.sap.sailing.gwt.ui.UserManagement"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-war "${project_loc:com.sap.sailing.gwt.ui}\war" -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -logLevel INFO -codeServerPort 9997 com.sap.sailing.gwt.ui.UserManagement com.sap.sailing.gwt.ui.AdminConsole com.sap.sailing.gwt.ui.LeaderboardEditing com.sap.sailing.gwt.ui.Leaderboard"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx1024m"/>
|
||||
</launchConfiguration>
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
package com.sap.sailing.gwt.ui.client;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gwt.dom.client.EventTarget;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
import com.google.gwt.user.client.Element;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.ui.Anchor;
|
||||
import com.google.gwt.user.client.ui.DialogBox;
|
||||
import com.google.gwt.user.client.ui.FlexTable;
|
||||
import com.google.gwt.user.client.ui.HTML;
|
||||
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
|
||||
import com.sap.sailing.gwt.ui.client.CompareCompetitorsPanel.DataLoadedEvent;
|
||||
import com.sap.sailing.gwt.ui.client.CompareCompetitorsPanel.DataLoadedHandler;
|
||||
import com.sap.sailing.gwt.ui.shared.CompetitorDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceIdentifier;
|
||||
|
||||
public class CompareCompetitorsChartDialog extends DialogBox {
|
||||
private Anchor closeAnchor;
|
||||
|
||||
public CompareCompetitorsChartDialog(SailingServiceAsync sailingService, List<CompetitorDAO> competitors, RaceIdentifier[] races, StringConstants stringConstants){
|
||||
super(true);
|
||||
CompareCompetitorsPanel ccp = new CompareCompetitorsPanel(sailingService, competitors, races, stringConstants, (int) (Window.getClientWidth()-300), (int) (Window.getClientHeight()-200));
|
||||
ccp.addDataLoadedHandler(new DataLoadedHandler() {
|
||||
|
||||
@Override
|
||||
public void onDataLoaded(DataLoadedEvent event) {
|
||||
CompareCompetitorsChartDialog.this.setPopupPosition(5, 5);
|
||||
//CompareCompetitorsChartDialog.this.setSize((int) (Window.getClientWidth()*0.9) + "px", (int) (Window.getClientHeight() * 0.9) + "px");
|
||||
CompareCompetitorsChartDialog.this.show();
|
||||
}
|
||||
});
|
||||
this.add(ccp);
|
||||
|
||||
this.setPopupPosition(5, 5);
|
||||
//this.setSize((int) (Window.getClientWidth()*0.9) + "px", (int) (Window.getClientHeight() * 0.9) + "px");
|
||||
closeAnchor = new Anchor("x");
|
||||
|
||||
FlexTable captionLayoutTable = new FlexTable();
|
||||
captionLayoutTable.setWidth("100%");
|
||||
captionLayoutTable.setText(0, 0, stringConstants.compareCompetitors());
|
||||
captionLayoutTable.setWidget(0, 1, closeAnchor);
|
||||
captionLayoutTable.getCellFormatter().setHorizontalAlignment(0, 1,HasHorizontalAlignment.ALIGN_RIGHT);
|
||||
|
||||
HTML caption = (HTML) getCaption();
|
||||
caption.getElement().appendChild(captionLayoutTable.getElement());
|
||||
|
||||
caption.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
EventTarget target = event.getNativeEvent().getEventTarget();
|
||||
Element targetElement = (Element) target.cast();
|
||||
|
||||
if (targetElement == closeAnchor.getElement()) {
|
||||
closeAnchor.fireEvent(event);
|
||||
}
|
||||
}
|
||||
});
|
||||
addCloseHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
hide();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
public void addCloseHandler(ClickHandler handler) {
|
||||
closeAnchor.addClickHandler(handler);
|
||||
}
|
||||
}
|
||||
+349
@@ -0,0 +1,349 @@
|
||||
package com.sap.sailing.gwt.ui.client;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gwt.event.dom.client.ChangeEvent;
|
||||
import com.google.gwt.event.dom.client.ChangeHandler;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
import com.google.gwt.event.shared.GwtEvent;
|
||||
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.AbsolutePanel;
|
||||
import com.google.gwt.user.client.ui.Anchor;
|
||||
import com.google.gwt.user.client.ui.Button;
|
||||
import com.google.gwt.user.client.ui.CaptionPanel;
|
||||
import com.google.gwt.user.client.ui.DeckPanel;
|
||||
import com.google.gwt.user.client.ui.FormPanel;
|
||||
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
|
||||
import com.google.gwt.user.client.ui.HorizontalPanel;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.ListBox;
|
||||
import com.google.gwt.user.client.ui.RadioButton;
|
||||
import com.google.gwt.user.client.ui.TextBox;
|
||||
import com.google.gwt.user.client.ui.VerticalPanel;
|
||||
import com.google.gwt.visualization.client.AbstractDataTable;
|
||||
import com.google.gwt.visualization.client.AbstractDataTable.ColumnType;
|
||||
import com.google.gwt.visualization.client.DataTable;
|
||||
import com.google.gwt.visualization.client.VisualizationUtils;
|
||||
import com.google.gwt.visualization.client.visualizations.corechart.AxisOptions;
|
||||
import com.google.gwt.visualization.client.visualizations.corechart.LineChart;
|
||||
import com.google.gwt.visualization.client.visualizations.corechart.Options;
|
||||
import com.sap.sailing.gwt.ui.shared.CompetitorDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.CompetitorWithRaceDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceIdentifier;
|
||||
|
||||
public class CompareCompetitorsPanel extends FormPanel {
|
||||
private final List<CompetitorDAO> competitors;
|
||||
private CompetitorWithRaceDAO[][] chartData = null;
|
||||
private LineChart chart;
|
||||
private final SailingServiceAsync sailingService;
|
||||
private HorizontalPanel mainPanel;
|
||||
private VerticalPanel chartPanel;
|
||||
private final DeckPanel deckPanel;
|
||||
private final RaceIdentifier[] races;
|
||||
private int selectedRace = 0;
|
||||
private int stepsToLoad = 100;
|
||||
private final StringConstants stringConstants;
|
||||
private boolean chartLoaded = false;
|
||||
private boolean dataLoaded = false;
|
||||
private int chartWidth;
|
||||
private int chartHeight;
|
||||
|
||||
public static final int DECK_PANEL_INDEX_LOADING = 0;
|
||||
public static final int DECK_PANEL_INDEX_CHART = 1;
|
||||
|
||||
public static final int SHOW_CURRENT_SPEED_OVER_GROUND = 0;
|
||||
public static final int SHOW_VELOCITY_MADE_GOOD = 1;
|
||||
public static final int SHOW_GAP_TO_LEADER = 2;
|
||||
public static final int SHOW_WINDWARD_DISTANCE_TO_GO = 3;
|
||||
public static final int SHOW_DISTANCE_TRAVELED = 4;
|
||||
private int dataToShow = SHOW_CURRENT_SPEED_OVER_GROUND;
|
||||
private AbsolutePanel loadingPanel;
|
||||
|
||||
public CompareCompetitorsPanel(SailingServiceAsync sailingService, final List<CompetitorDAO> competitors,
|
||||
RaceIdentifier[] races, StringConstants stringConstants, int chartWidth, int chartHeight) {
|
||||
this.sailingService = sailingService;
|
||||
this.competitors = competitors;
|
||||
this.races = races;
|
||||
this.stringConstants = stringConstants;
|
||||
this.chartWidth = chartWidth;
|
||||
this.chartHeight = chartHeight;
|
||||
mainPanel = new HorizontalPanel();
|
||||
mainPanel.setSpacing(5);
|
||||
chartPanel = new VerticalPanel();
|
||||
HorizontalPanel raceChooserPanel = new HorizontalPanel();
|
||||
raceChooserPanel.setSpacing(5);
|
||||
for (int i = 0; i < races.length; i++){
|
||||
RadioButton r = new RadioButton("chooseRace");
|
||||
r.setText(races[i].toString());
|
||||
raceChooserPanel.add(r);
|
||||
if (i == 0){
|
||||
r.setValue(true);
|
||||
}
|
||||
final int index = i;
|
||||
r.addClickHandler(new ClickHandler() {
|
||||
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
selectedRace = index;
|
||||
loadData();
|
||||
}
|
||||
});
|
||||
}
|
||||
chartPanel.add(raceChooserPanel);
|
||||
|
||||
loadingPanel = new AbsolutePanel ();
|
||||
loadingPanel.setSize(chartWidth + "px", chartHeight + "px");
|
||||
|
||||
Anchor a = new Anchor(new SafeHtmlBuilder().appendHtmlConstant(
|
||||
"<img src=\"/images/ajax-loader.gif\"/>").toSafeHtml());
|
||||
loadingPanel.add(a,chartWidth/2-32/2,chartHeight/2-32-2);
|
||||
chartPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
|
||||
chartPanel.setSpacing(5);
|
||||
deckPanel = new DeckPanel();
|
||||
|
||||
deckPanel.add(loadingPanel);
|
||||
final CaptionPanel configCaption = new CaptionPanel(stringConstants.configuration());
|
||||
configCaption.setHeight("100%");
|
||||
configCaption.setVisible(false);
|
||||
VerticalPanel configPanel = new VerticalPanel();
|
||||
configCaption.setContentWidget(configPanel);
|
||||
configPanel.setSpacing(5);
|
||||
|
||||
Label lblChart = new Label(stringConstants.chooseChart());
|
||||
configPanel.add(lblChart);
|
||||
final ListBox dataSelection = new ListBox();
|
||||
dataSelection.addItem(stringConstants.speedOverGroundLong(), "" + SHOW_CURRENT_SPEED_OVER_GROUND);
|
||||
dataSelection.addItem(stringConstants.distanceTraveled(), "" + SHOW_DISTANCE_TRAVELED);
|
||||
dataSelection.addItem(stringConstants.velocityMadeGoodLong(), "" + SHOW_VELOCITY_MADE_GOOD);
|
||||
dataSelection.addItem(stringConstants.gapToLeaderLong(), "" + SHOW_GAP_TO_LEADER);
|
||||
dataSelection.addItem(stringConstants.windwardDistanceToGoInMeters(), "" + SHOW_WINDWARD_DISTANCE_TO_GO);
|
||||
dataSelection.addChangeHandler(new ChangeHandler() {
|
||||
|
||||
@Override
|
||||
public void onChange(ChangeEvent event) {
|
||||
dataToShow = Integer.parseInt(dataSelection.getValue(dataSelection.getSelectedIndex()));
|
||||
if (chart != null) {
|
||||
chart.draw(prepareTableData(), getOptions());
|
||||
}
|
||||
}
|
||||
});
|
||||
configPanel.add(dataSelection);
|
||||
Label lblSteps = new Label("Points to load:");
|
||||
configPanel.add(lblSteps);
|
||||
final TextBox txtbSteps = new TextBox();
|
||||
txtbSteps.setText("" + stepsToLoad);
|
||||
configPanel.add(txtbSteps);
|
||||
Button bttSteps = new Button(stringConstants.refresh());
|
||||
bttSteps.addClickHandler(new ClickHandler() {
|
||||
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
stepsToLoad = Integer.parseInt(txtbSteps.getText());
|
||||
loadData();
|
||||
}
|
||||
});
|
||||
configPanel.add(bttSteps);
|
||||
|
||||
final Runnable onLoadCallback = new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
chart = new LineChart(prepareTableData(), getOptions());
|
||||
deckPanel.add(chart);
|
||||
if (chartLoaded && dataLoaded){
|
||||
deckPanel.showWidget(DECK_PANEL_INDEX_CHART);
|
||||
}
|
||||
chartLoaded = true;
|
||||
fireEvent(new DataLoadedEvent());
|
||||
|
||||
}
|
||||
};
|
||||
VisualizationUtils.loadVisualizationApi(onLoadCallback, LineChart.PACKAGE);
|
||||
loadData();
|
||||
chartPanel.add(deckPanel);
|
||||
mainPanel.add(chartPanel);
|
||||
Anchor showConfigAnchor = new Anchor(new SafeHtmlBuilder().appendHtmlConstant(
|
||||
"<img class=\"linkNoBorder\" src=\"/images/settings.png\"/>").toSafeHtml());
|
||||
showConfigAnchor.setTitle(stringConstants.configuration());
|
||||
showConfigAnchor.addClickHandler(new ClickHandler() {
|
||||
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
configCaption.setVisible(!configCaption.isVisible());
|
||||
}
|
||||
});
|
||||
mainPanel.add(showConfigAnchor);
|
||||
mainPanel.add(configCaption);
|
||||
this.add(mainPanel);
|
||||
}
|
||||
|
||||
private Options getOptions() {
|
||||
Options opt = Options.create();
|
||||
opt.setWidth(chartWidth);
|
||||
opt.setHeight(chartHeight);
|
||||
switch (dataToShow) {
|
||||
case SHOW_VELOCITY_MADE_GOOD:
|
||||
opt.setTitle(stringConstants.velocityMadeGoodLong());
|
||||
break;
|
||||
case SHOW_GAP_TO_LEADER:
|
||||
opt.setTitle(stringConstants.gapToLeaderLong());
|
||||
break;
|
||||
case SHOW_WINDWARD_DISTANCE_TO_GO:
|
||||
opt.setTitle(stringConstants.windwardDistanceToGoInMeters());
|
||||
break;
|
||||
case SHOW_DISTANCE_TRAVELED:
|
||||
opt.setTitle(stringConstants.distanceTraveled());
|
||||
break;
|
||||
default:
|
||||
opt.setTitle(stringConstants.speedOverGroundLong());
|
||||
}
|
||||
AxisOptions hAxisOptions = AxisOptions.create();
|
||||
hAxisOptions.setTitle("time");
|
||||
opt.setHAxisOptions(hAxisOptions);
|
||||
|
||||
AxisOptions vAxisOptions = AxisOptions.create();
|
||||
switch (dataToShow) {
|
||||
case SHOW_VELOCITY_MADE_GOOD:
|
||||
vAxisOptions.setTitle(stringConstants.speed() + " " + stringConstants.in() + " " + stringConstants.velocityMadeGoodInKnotsUnit());
|
||||
break;
|
||||
case SHOW_GAP_TO_LEADER:
|
||||
vAxisOptions.setTitle(stringConstants.time() + " " + stringConstants.in() + " " + stringConstants.secondsUnit());
|
||||
break;
|
||||
case SHOW_WINDWARD_DISTANCE_TO_GO:
|
||||
vAxisOptions.setTitle(stringConstants.distance() + " " + stringConstants.in() + " " + stringConstants.metersUnit());
|
||||
break;
|
||||
case SHOW_DISTANCE_TRAVELED:
|
||||
vAxisOptions.setTitle(stringConstants.distance() + " " + stringConstants.in() + " " + stringConstants.metersUnit());
|
||||
break;
|
||||
default:
|
||||
vAxisOptions.setTitle(stringConstants.speed() + " " + stringConstants.in() + " " + stringConstants.currentSpeedOverGroundInKnotsUnit());
|
||||
break;
|
||||
}
|
||||
opt.setVAxisOptions(vAxisOptions);
|
||||
return opt;
|
||||
}
|
||||
|
||||
private void loadData(){
|
||||
deckPanel.showWidget(DECK_PANEL_INDEX_LOADING);
|
||||
dataLoaded = false;
|
||||
this.sailingService.getCompetitorRaceData(races[selectedRace], stepsToLoad,
|
||||
new AsyncCallback<CompetitorWithRaceDAO[][]>() {
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
Window.alert(stringConstants.failedToLoadRaceData());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(CompetitorWithRaceDAO[][] result) {
|
||||
fireEvent(new DataLoadedEvent());
|
||||
chartData = result;
|
||||
dataLoaded = true;
|
||||
if (chartLoaded && dataLoaded){
|
||||
deckPanel.showWidget(DECK_PANEL_INDEX_CHART);
|
||||
chart.draw(prepareTableData(), getOptions());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private AbstractDataTable prepareTableData() {
|
||||
DataTable data = DataTable.create();
|
||||
data.addColumn(ColumnType.STRING, stringConstants.time());
|
||||
|
||||
|
||||
if (chartData == null) {
|
||||
return data;
|
||||
}
|
||||
if (chartData[0] != null) {
|
||||
for (int i = 0; i < chartData.length; i++) {
|
||||
data.addColumn(ColumnType.NUMBER, chartData[i][0].getCompetitor().name);
|
||||
}
|
||||
int length = 0;
|
||||
for (int i = 0; i < chartData.length; i++) {
|
||||
length = (length < chartData[i].length) ? chartData[i].length : length;
|
||||
}
|
||||
data.addRows(length);
|
||||
long startTime = chartData[0][0].getStartTime();
|
||||
for (int n = 0; n < chartData[0].length; n++) {
|
||||
long time = chartData[0][n].getLegEntry().timeInMilliseconds - startTime;
|
||||
String minutes = "" + Math.abs((time/60000));
|
||||
if (minutes.length() < 2){
|
||||
minutes = ((time < 0)? "-" : "") +"0" + minutes;
|
||||
}
|
||||
String seconds = "" + Math.abs((time/1000)%60);
|
||||
if (seconds.length() < 2){
|
||||
seconds= "0" + seconds;
|
||||
}
|
||||
data.setValue(n, 0, minutes + ":" + seconds);
|
||||
}
|
||||
for (int i = 0; i < chartData.length; i++) {
|
||||
double distanceTraveledOnPreviousLegs = 0;
|
||||
double lastTraveledDistance = 0;
|
||||
for (int j = 0; j < chartData[i].length; j++) {
|
||||
Double value = null;
|
||||
switch (dataToShow) {
|
||||
case SHOW_GAP_TO_LEADER:
|
||||
value = chartData[i][j].getLegEntry().gapToLeaderInSeconds;
|
||||
break;
|
||||
case SHOW_VELOCITY_MADE_GOOD:
|
||||
value = chartData[i][j].getLegEntry().velocityMadeGoodInKnots;
|
||||
break;
|
||||
case SHOW_WINDWARD_DISTANCE_TO_GO:
|
||||
value = chartData[i][j].getLegEntry().windwardDistanceToGoInMeters;
|
||||
break;
|
||||
case SHOW_DISTANCE_TRAVELED:
|
||||
value = chartData[i][j].getLegEntry().distanceTraveledInMeters;
|
||||
if (value != null){
|
||||
if (lastTraveledDistance > value){
|
||||
distanceTraveledOnPreviousLegs += lastTraveledDistance;
|
||||
}
|
||||
lastTraveledDistance = value;
|
||||
value += distanceTraveledOnPreviousLegs;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
value = chartData[i][j].getLegEntry().currentSpeedOverGroundInKnots;
|
||||
}
|
||||
if (value != null) {
|
||||
data.setValue(j, (i + 1), value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
// DataLoaded event handling.
|
||||
public void addDataLoadedHandler(DataLoadedHandler handler) {
|
||||
this.addHandler(handler, DataLoadedEvent.TYPE);
|
||||
}
|
||||
|
||||
interface DataLoadedHandler extends com.google.gwt.event.shared.EventHandler {
|
||||
public void onDataLoaded(DataLoadedEvent event);
|
||||
}
|
||||
|
||||
public static class DataLoadedEvent extends GwtEvent<DataLoadedHandler> {
|
||||
public static Type<DataLoadedHandler> TYPE = new Type<DataLoadedHandler>();
|
||||
|
||||
public DataLoadedEvent() {
|
||||
super();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dispatch(DataLoadedHandler handler) {
|
||||
handler.onDataLoaded(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public com.google.gwt.event.shared.GwtEvent.Type<DataLoadedHandler> getAssociatedType() {
|
||||
return TYPE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+12
-12
@@ -37,7 +37,7 @@ public class CreateSwissTimingRacePanel extends FormPanel {
|
||||
private final SailingServiceAsync service;
|
||||
private ErrorReporter errorReporter;
|
||||
|
||||
public CreateSwissTimingRacePanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter, StringConstants stringConstants){
|
||||
public CreateSwissTimingRacePanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter, final StringConstants stringConstants){
|
||||
this.service = sailingService;
|
||||
this.errorReporter = errorReporter;
|
||||
competitors = new ArrayList<CreateSwissTimingRacePanel.Competitor>();
|
||||
@@ -55,23 +55,23 @@ public class CreateSwissTimingRacePanel extends FormPanel {
|
||||
mainGrid.setWidget(0, 0, raceDataPanel);
|
||||
Grid grid = new Grid(2,2);
|
||||
raceDataPanel.add(grid);
|
||||
Label lblRaceName = new Label("Race name:");
|
||||
Label lblRaceName = new Label(stringConstants.race() + " " + stringConstants.name() + ":");
|
||||
grid.setWidget(0, 0, lblRaceName);
|
||||
txtbRaceName = new TextBox();
|
||||
grid.setWidget(0, 1, txtbRaceName);
|
||||
Label lblRaceDesc = new Label("Race description:");
|
||||
Label lblRaceDesc = new Label(stringConstants.race() + " " + stringConstants.description()+":");
|
||||
grid.setWidget(1, 0, lblRaceDesc);
|
||||
txtbRaceDesc = new TextBox();
|
||||
grid.setWidget(1, 1, txtbRaceDesc);
|
||||
|
||||
//Competitor panel
|
||||
CaptionPanel competitorPanel = new CaptionPanel("Competitors");
|
||||
CaptionPanel competitorPanel = new CaptionPanel(stringConstants.competitor());
|
||||
competitorPanel.setSize("90%", "90%");
|
||||
mainGrid.setWidget(1, 0, competitorPanel);
|
||||
grid = new Grid(3,3);
|
||||
competitorPanel.add(grid);
|
||||
|
||||
Label lblCompetitorListTitle = new Label("Competitors:");
|
||||
Label lblCompetitorListTitle = new Label(stringConstants.competitor());
|
||||
grid.setWidget(0, 0, lblCompetitorListTitle);
|
||||
listbCompetitorList = new ListBox(false);
|
||||
listbCompetitorList.setVisibleItemCount(10);
|
||||
@@ -89,7 +89,7 @@ public class CreateSwissTimingRacePanel extends FormPanel {
|
||||
grid.setWidget(1, 1, compData);
|
||||
Grid subGrid = new Grid(3,2);
|
||||
compData.add(subGrid);
|
||||
Label lblName = new Label("Name:");
|
||||
Label lblName = new Label(stringConstants.name() + ":");
|
||||
subGrid.setWidget(0, 0, lblName);
|
||||
txtbCompName = new TextBox();
|
||||
txtbCompName.addValueChangeHandler(new ValueChangeHandler<String>() {
|
||||
@@ -100,7 +100,7 @@ public class CreateSwissTimingRacePanel extends FormPanel {
|
||||
}
|
||||
});
|
||||
subGrid.setWidget(0, 1, txtbCompName);
|
||||
Label lblSailNr = new Label("Sail number:");
|
||||
Label lblSailNr = new Label(stringConstants.sailNumber()+":");
|
||||
subGrid.setWidget(1, 0, lblSailNr);
|
||||
txtbCompSailNr = new TextBox();
|
||||
txtbCompSailNr.addValueChangeHandler(new ValueChangeHandler<String>() {
|
||||
@@ -111,14 +111,14 @@ public class CreateSwissTimingRacePanel extends FormPanel {
|
||||
}
|
||||
});
|
||||
subGrid.setWidget(1, 1, txtbCompSailNr);
|
||||
Label lblCountr = new Label("Country:");
|
||||
Label lblCountr = new Label(stringConstants.country()+":");
|
||||
subGrid.setWidget(2, 0, lblCountr);
|
||||
suggestionsCompCountr = new MultiWordSuggestOracle();
|
||||
service.getCountryCodes(new AsyncCallback<String[]>() {
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
CreateSwissTimingRacePanel.this.errorReporter.reportError("Unable to find the IOC 3-letter-codes.");
|
||||
CreateSwissTimingRacePanel.this.errorReporter.reportError(stringConstants.no3LetterCodes());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -141,7 +141,7 @@ public class CreateSwissTimingRacePanel extends FormPanel {
|
||||
HorizontalPanel horizontalPanel = new HorizontalPanel();
|
||||
grid.setWidget(2, 0, horizontalPanel);
|
||||
|
||||
Button bttAddCompetitor = new Button("Add");
|
||||
Button bttAddCompetitor = new Button(stringConstants.add());
|
||||
bttAddCompetitor.setWidth("100px");
|
||||
bttAddCompetitor.addClickHandler(new ClickHandler() {
|
||||
|
||||
@@ -152,7 +152,7 @@ public class CreateSwissTimingRacePanel extends FormPanel {
|
||||
});
|
||||
horizontalPanel.add(bttAddCompetitor);
|
||||
|
||||
Button bttDeleteCompetitor = new Button("Delete");
|
||||
Button bttDeleteCompetitor = new Button(stringConstants.delete());
|
||||
bttDeleteCompetitor.setWidth("100px");
|
||||
bttDeleteCompetitor.addClickHandler(new ClickHandler() {
|
||||
|
||||
@@ -163,7 +163,7 @@ public class CreateSwissTimingRacePanel extends FormPanel {
|
||||
});
|
||||
horizontalPanel.add(bttDeleteCompetitor);
|
||||
|
||||
Button bttAddRace = new Button("Add race");
|
||||
Button bttAddRace = new Button(stringConstants.add() + " " + stringConstants.race());
|
||||
bttAddRace.addClickHandler(new ClickHandler() {
|
||||
|
||||
@Override
|
||||
|
||||
Regular → Executable
+1
-1
@@ -590,7 +590,7 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer,
|
||||
selectedLeaderboard = result;
|
||||
|
||||
raceColumnList.getList().clear();
|
||||
for (String race : result.getRaceList())
|
||||
for(String race: result.getRaceColumnNameList())
|
||||
raceColumnList.getList().add(race);
|
||||
|
||||
selectedLeaderBoardPanel.setVisible(true);
|
||||
|
||||
+42
-5
@@ -37,10 +37,14 @@ import com.google.gwt.view.client.ListDataProvider;
|
||||
import com.google.gwt.view.client.MultiSelectionModel;
|
||||
import com.sap.sailing.gwt.ui.client.DataEntryDialog.Validator;
|
||||
import com.sap.sailing.gwt.ui.client.LegDetailColumn.LegDetailField;
|
||||
import com.sap.sailing.gwt.ui.shared.CompetitorDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.LeaderboardDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.LeaderboardEntryDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.LeaderboardNameAndRaceColumnName;
|
||||
import com.sap.sailing.gwt.ui.shared.LeaderboardRowDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.LegEntryDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceIdentifier;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceInLeaderboardDAO;
|
||||
|
||||
/**
|
||||
* A leaderboard essentially consists of a table widget that in its columns displays the entries.
|
||||
@@ -69,6 +73,8 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
|
||||
private final StringConstants stringConstants;
|
||||
|
||||
private final CellTable<LeaderboardRowDAO> leaderboardTable;
|
||||
|
||||
private final MultiSelectionModel<LeaderboardRowDAO> leaderboardSelectionModel;
|
||||
|
||||
private ListDataProvider<LeaderboardRowDAO> data;
|
||||
|
||||
@@ -121,7 +127,7 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
|
||||
public void onClick(ClickEvent event) {
|
||||
new LeaderboardSettingsPanel(Collections.unmodifiableList(selectedLegDetails),
|
||||
Collections.unmodifiableList(selectedRaceDetails), /* All races to select */
|
||||
leaderboard.getRaceList(), selectedRaceColumns, timer.getDelayBetweenAutoAdvancesInMilliseconds(),
|
||||
leaderboard.getRaceColumnNameList(), selectedRaceColumns, timer.getDelayBetweenAutoAdvancesInMilliseconds(),
|
||||
stringConstants.leaderboardSettings(), stringConstants.selectLegDetails(), stringConstants.ok(),
|
||||
stringConstants.cancel(), new Validator<LeaderboardSettingsPanel.Result>() {
|
||||
@Override
|
||||
@@ -732,7 +738,8 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
|
||||
leaderboardTable = new CellTableWithStylableHeaders<LeaderboardRowDAO>(
|
||||
/* pageSize */100, resources);
|
||||
getLeaderboardTable().setWidth("100%");
|
||||
getLeaderboardTable().setSelectionModel(new MultiSelectionModel<LeaderboardRowDAO>() {});
|
||||
leaderboardSelectionModel = new MultiSelectionModel<LeaderboardRowDAO>() {};
|
||||
getLeaderboardTable().setSelectionModel(leaderboardSelectionModel);
|
||||
setData(new ListDataProvider<LeaderboardRowDAO>());
|
||||
getData().addDataDisplay(getLeaderboardTable());
|
||||
listHandler = new ListHandler<LeaderboardRowDAO>(getData().getList());
|
||||
@@ -773,10 +780,21 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
|
||||
playPause.addClickHandler(playPauseHandler);
|
||||
playStateChanged(timer.isPlaying());
|
||||
refreshPanel.add(playPause);
|
||||
Anchor chartsAnchor = new Anchor(new SafeHtmlBuilder().appendHtmlConstant(
|
||||
"<img class=\"linkNoBorder\" src=\"/images/chart_small.png\"/>").toSafeHtml());
|
||||
chartsAnchor.setTitle("Show charts");
|
||||
chartsAnchor.addClickHandler(new ClickHandler() {
|
||||
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
compareCompetitors();
|
||||
}
|
||||
});
|
||||
Anchor settingsAnchor = new Anchor(new SafeHtmlBuilder().appendHtmlConstant(
|
||||
"<img class=\"linkNoBorder\" src=\"/images/settings.png\"/>").toSafeHtml());
|
||||
settingsAnchor.setTitle(stringConstants.settings());
|
||||
settingsAnchor.addClickHandler(new SettingsClickHandler(stringConstants));
|
||||
refreshAndSettingsPanel.add(chartsAnchor);
|
||||
refreshAndSettingsPanel.add(refreshPanel);
|
||||
refreshAndSettingsPanel.add(settingsAnchor);
|
||||
dockPanel02.add(refreshAndSettingsPanel, DockPanel.EAST);
|
||||
@@ -979,8 +997,8 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
|
||||
|
||||
private List<String> getRacesAddedNew(LeaderboardDAO oldLeaderboard, LeaderboardDAO newLeaderboard){
|
||||
List<String> result = new ArrayList<String>();
|
||||
for (String s : newLeaderboard.getRaceList()) {
|
||||
if (oldLeaderboard == null || !oldLeaderboard.getRaceList().contains(s)) {
|
||||
for (String s : newLeaderboard.getRaceColumnNameList()) {
|
||||
if (oldLeaderboard == null || !oldLeaderboard.getRaceColumnNameList().contains(s)) {
|
||||
result.add(s);
|
||||
}
|
||||
}
|
||||
@@ -1114,7 +1132,7 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
|
||||
private void createMissingAndAdjustExistingRaceColumns(LeaderboardDAO leaderboard) {
|
||||
// Correct order of races in selectedRaceColum
|
||||
List<String> correctedOrderSelectedRaces = new ArrayList<String>();
|
||||
for (String string : leaderboard.getRaceList()) {
|
||||
for (String string : leaderboard.getRaceColumnNameList()) {
|
||||
if (selectedRaceColumns.contains(string)) {
|
||||
correctedOrderSelectedRaces.add(string);
|
||||
}
|
||||
@@ -1285,4 +1303,23 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
|
||||
playPause.setHTML(getPlayPauseImgHtml(isPlaying));
|
||||
playPause.setTitle(isPlaying ? stringConstants.pauseAutomaticRefresh() : stringConstants.autoRefresh());
|
||||
}
|
||||
|
||||
private void compareCompetitors(){
|
||||
List<CompetitorDAO> competitors = new ArrayList<CompetitorDAO>();
|
||||
List<RaceIdentifier> races = new ArrayList<RaceIdentifier>();
|
||||
for (RaceInLeaderboardDAO race : getLeaderboard().getRaceList()) {
|
||||
races.add(new LeaderboardNameAndRaceColumnName(leaderboardName, race.getRaceColumnName()));
|
||||
}
|
||||
if (leaderboardSelectionModel.getSelectedSet().size() > 0){
|
||||
for (LeaderboardRowDAO leaderboardRowDAO : leaderboardSelectionModel.getSelectedSet()) {
|
||||
competitors.add(leaderboardRowDAO.competitor);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (LeaderboardRowDAO leaderboardRowDAO : leaderboardTable.getVisibleItems()){
|
||||
competitors.add(leaderboardRowDAO.competitor);
|
||||
}
|
||||
}
|
||||
new CompareCompetitorsChartDialog(sailingService, competitors, races.toArray(new LeaderboardNameAndRaceColumnName[0]), stringConstants);
|
||||
}
|
||||
}
|
||||
+2
@@ -8,6 +8,7 @@ import java.util.Map;
|
||||
import com.google.gwt.user.client.rpc.RemoteService;
|
||||
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
|
||||
import com.sap.sailing.gwt.ui.shared.CompetitorDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.CompetitorWithRaceDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.EventAndRaceIdentifier;
|
||||
import com.sap.sailing.gwt.ui.shared.EventDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.EventIdentifier;
|
||||
@@ -129,6 +130,7 @@ public interface SailingService extends RemoteService {
|
||||
|
||||
String[] getCountryCodes();
|
||||
|
||||
CompetitorWithRaceDAO[][] getCompetitorRaceData(RaceIdentifier race, int steps) throws Exception;
|
||||
Map<CompetitorDAO, List<GPSFixDAO>> getDouglasPoints(RaceIdentifier raceIdentifier,
|
||||
Map<CompetitorDAO, Date> from, Map<CompetitorDAO, Date> to, double meters);
|
||||
|
||||
|
||||
+2
@@ -9,6 +9,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.sap.sailing.domain.base.Course;
|
||||
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
|
||||
import com.sap.sailing.gwt.ui.shared.CompetitorDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.CompetitorWithRaceDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.EventAndRaceIdentifier;
|
||||
import com.sap.sailing.gwt.ui.shared.EventDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.GPSFixDAO;
|
||||
@@ -176,6 +177,7 @@ public interface SailingServiceAsync {
|
||||
|
||||
void getCountryCodes(AsyncCallback<String[]> callback);
|
||||
|
||||
void getCompetitorRaceData(RaceIdentifier race, int steps, AsyncCallback<CompetitorWithRaceDAO[][]> callback);
|
||||
void getDouglasPoints(RaceIdentifier raceIdentifier, Map<CompetitorDAO, Date> from, Map<CompetitorDAO, Date> to,
|
||||
double meters, AsyncCallback<Map<CompetitorDAO, List<GPSFixDAO>>> callback);
|
||||
|
||||
|
||||
Regular → Executable
+20
-1
@@ -127,5 +127,24 @@ public interface StringConstants extends Constants {
|
||||
String penaltyCircles();
|
||||
String medalRaceIsNull();
|
||||
String maneuverTypes();
|
||||
String raceNameEmpty();
|
||||
String chooseChart();
|
||||
String distanceTraveled();
|
||||
String velocityMadeGoodLong();
|
||||
String speedOverGroundLong();
|
||||
String gapToLeaderLong();
|
||||
String pointsToLoad();
|
||||
String speed();
|
||||
String distance();
|
||||
String in();
|
||||
String secondsUnit();
|
||||
String metersUnit();
|
||||
String failedToLoadRaceData();
|
||||
String close();
|
||||
String compareCompetitors();
|
||||
String description();
|
||||
String sailNumber();
|
||||
String country();
|
||||
String no3LetterCodes();
|
||||
String add();
|
||||
String delete();
|
||||
}
|
||||
Regular → Executable
+21
-1
@@ -122,4 +122,24 @@ jibes=Jibes
|
||||
penaltyCircles=Penalty Circles
|
||||
medalRaceIsNull=Medalrace value not allowed
|
||||
maneuverTypes=Maneuver types
|
||||
raceNameEmpty=Racename empty
|
||||
raceNameEmpty=Racename empty
|
||||
chooseChart=Choose chart
|
||||
distanceTraveled=Distance Traveled
|
||||
velocityMadeGoodLong=Velocity Made Good
|
||||
speedOverGroundLong=Speed Over Ground
|
||||
gapToLeaderLong=Gap To Leader
|
||||
pointsToLoad=Points to load
|
||||
speed=Speed
|
||||
distance=Distance
|
||||
in=in
|
||||
secondsUnit=[s]
|
||||
metersUnit=[m]
|
||||
failedToLoadRaceData=Failed to laod race data.
|
||||
close=Close
|
||||
compareCompetitors=Compare competitors
|
||||
description=description
|
||||
sailNumber=Sail number
|
||||
country=Country
|
||||
no3LetterCodes=Unable to find the IOC 3-letter-codes.
|
||||
add=Add
|
||||
delete=Delete
|
||||
Regular → Executable
+22
-2
@@ -15,7 +15,7 @@ map=Map
|
||||
race=Race
|
||||
races=Races
|
||||
tracked=tracked
|
||||
time=Time
|
||||
time=Zeit
|
||||
acceleration=Acceleration
|
||||
accelerationHelp=Use "1" for regular play-back speed, "2" for double-speed playback and so on
|
||||
delay=Delay (s)
|
||||
@@ -122,4 +122,24 @@ jibes=Halsen
|
||||
penaltyCircles=Strafkringel
|
||||
medalRaceIsNull=Medialienwert nicht erlaubt
|
||||
maneuverTypes=Manövertypen
|
||||
raceNameEmpty=Rennname leer
|
||||
chooseChart=Diagramm wählen
|
||||
raceNameEmpty=Rennname leer
|
||||
distanceTraveled=Zurückgelegte Strecke
|
||||
velocityMadeGoodLong=Velocity Made Good
|
||||
speedOverGroundLong=Speed Over Ground
|
||||
gapToLeaderLong=Abstand zum führenden Boot
|
||||
pointsToLoad=Points to load
|
||||
speed=Geschwindigkeit
|
||||
distance=Strecke
|
||||
in=in
|
||||
secondsUnit=[s]
|
||||
metersUnit=[m]
|
||||
failedToLoadRaceData=Failed to laod race data.
|
||||
close=Close
|
||||
compareCompetitors=Kompetitoren vergleichen
|
||||
description=Beschreibung
|
||||
sailNumber=Segelnummer
|
||||
country=Land
|
||||
no3LetterCodes=IOC 3-Buchstaben-Codes können nicht gefunden werden.
|
||||
add=Hinzufügen
|
||||
delete=Löschen
|
||||
+31
-2
@@ -76,6 +76,7 @@ import com.sap.sailing.domain.tractracadapter.TracTracConfiguration;
|
||||
import com.sap.sailing.gwt.ui.client.SailingService;
|
||||
import com.sap.sailing.gwt.ui.shared.BoatClassDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.CompetitorDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.CompetitorWithRaceDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.EventAndRaceIdentifier;
|
||||
import com.sap.sailing.gwt.ui.shared.EventDAO;
|
||||
import com.sap.sailing.gwt.ui.shared.EventFetcher;
|
||||
@@ -1161,9 +1162,37 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
|
||||
Collections.sort(countryCodes);
|
||||
return countryCodes.toArray(new String[0]);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Map<CompetitorDAO, List<GPSFixDAO>> getDouglasPoints(RaceIdentifier raceIdentifier,
|
||||
public CompetitorWithRaceDAO[][] getCompetitorRaceData(RaceIdentifier race, int steps) throws NoWindException {
|
||||
List<CompetitorWithRaceDAO[]> competitorData;
|
||||
TrackedRace trackedRace = getTrackedRace(race);
|
||||
Iterable<Competitor> competitors = trackedRace.getRace().getCompetitors();
|
||||
|
||||
competitorData = new ArrayList<CompetitorWithRaceDAO[]>();
|
||||
for (Competitor c : competitors){
|
||||
List<CompetitorWithRaceDAO> entries = new ArrayList<CompetitorWithRaceDAO>();
|
||||
for (long time = trackedRace.getStart().asMillis()-20000; time < trackedRace.getTimePointOfNewestEvent().asMillis(); time += (trackedRace.getTimePointOfNewestEvent().asMillis()-trackedRace.getStart().asMillis()-20000)/steps){
|
||||
MillisecondsTimePoint timePoint = new MillisecondsTimePoint(time);
|
||||
CompetitorWithRaceDAO competitorWithRaceEntry = new CompetitorWithRaceDAO();
|
||||
competitorWithRaceEntry.setCompetitor(getCompetitorDAO(c));
|
||||
competitorWithRaceEntry.setStartTime(trackedRace.getStart().asMillis());
|
||||
if (trackedRace != null){
|
||||
LegEntryDAO legEntry = createLegEntry(trackedRace.getTrackedLeg(c, timePoint), timePoint);
|
||||
if (legEntry == null){
|
||||
legEntry = new LegEntryDAO();
|
||||
}
|
||||
legEntry.timeInMilliseconds = time;
|
||||
competitorWithRaceEntry.setLegEntry(legEntry);
|
||||
}
|
||||
entries.add(competitorWithRaceEntry);
|
||||
}
|
||||
competitorData.add(entries.toArray(new CompetitorWithRaceDAO[0]));
|
||||
}
|
||||
return competitorData.toArray(new CompetitorWithRaceDAO[0][0]);
|
||||
}
|
||||
|
||||
public Map<CompetitorDAO, List<GPSFixDAO>> getDouglasPoints(RaceIdentifier raceIdentifier,
|
||||
Map<CompetitorDAO, Date> from, Map<CompetitorDAO, Date> to,
|
||||
double meters) {
|
||||
Map<CompetitorDAO, List<GPSFixDAO>> result = new HashMap<CompetitorDAO, List<GPSFixDAO>>();
|
||||
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
package com.sap.sailing.gwt.ui.shared;
|
||||
|
||||
import com.google.gwt.user.client.rpc.IsSerializable;
|
||||
|
||||
public class CompetitorWithRaceDAO implements IsSerializable {
|
||||
private CompetitorDAO competitor;
|
||||
private LegEntryDAO legEntry;
|
||||
private long startTime;
|
||||
|
||||
public long getStartTime() {
|
||||
return startTime;
|
||||
}
|
||||
public void setStartTime(long startTime) {
|
||||
this.startTime = startTime;
|
||||
}
|
||||
public CompetitorDAO getCompetitor() {
|
||||
return competitor;
|
||||
}
|
||||
public void setCompetitor(CompetitorDAO competitor) {
|
||||
this.competitor = competitor;
|
||||
}
|
||||
public LegEntryDAO getLegEntry() {
|
||||
return legEntry;
|
||||
}
|
||||
public void setLegEntry(LegEntryDAO legEntry) {
|
||||
this.legEntry = legEntry;
|
||||
}
|
||||
|
||||
/* Updates the legEntry. Only updates a value if the value of {@link: legEntry} is not 0.
|
||||
*
|
||||
* @param legEntry The LegEntryDAO providing the update information.
|
||||
*/
|
||||
public void updateLegEntry(LegEntryDAO legEntry){
|
||||
if (!this.legEntry.started & legEntry.started){
|
||||
this.legEntry.started = legEntry.started;
|
||||
}
|
||||
if (!this.legEntry.finished & legEntry.finished){
|
||||
this.legEntry.finished = legEntry.finished;
|
||||
}
|
||||
if (legEntry.averageSpeedOverGroundInKnots != 0){
|
||||
this.legEntry.averageSpeedOverGroundInKnots = legEntry.averageSpeedOverGroundInKnots;
|
||||
}
|
||||
if (legEntry.currentSpeedOverGroundInKnots != 0){
|
||||
this.legEntry.currentSpeedOverGroundInKnots = legEntry.currentSpeedOverGroundInKnots;
|
||||
}
|
||||
if (legEntry.distanceTraveledInMeters != 0){
|
||||
this.legEntry.distanceTraveledInMeters = legEntry.distanceTraveledInMeters;
|
||||
}
|
||||
if (legEntry.estimatedTimeToNextWaypointInSeconds != 0){
|
||||
this.legEntry.estimatedTimeToNextWaypointInSeconds = legEntry.estimatedTimeToNextWaypointInSeconds;
|
||||
}
|
||||
if (legEntry.gapToLeaderInSeconds != 0){
|
||||
this.legEntry.gapToLeaderInSeconds = legEntry.gapToLeaderInSeconds;
|
||||
}
|
||||
if (legEntry.rank != 0){
|
||||
this.legEntry.rank = legEntry.rank;
|
||||
}
|
||||
if (legEntry.timeInMilliseconds != 0){
|
||||
this.legEntry.timeInMilliseconds = legEntry.timeInMilliseconds;
|
||||
}
|
||||
if (legEntry.velocityMadeGoodInKnots != 0){
|
||||
this.legEntry.velocityMadeGoodInKnots = legEntry.velocityMadeGoodInKnots;
|
||||
}
|
||||
if (legEntry.windwardDistanceToGoInMeters != 0){
|
||||
this.legEntry.windwardDistanceToGoInMeters = legEntry.windwardDistanceToGoInMeters;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+7
@@ -34,4 +34,11 @@ public class EventNameAndRaceName implements EventAndRaceIdentifier {
|
||||
public Object getEvent(EventFetcher eventFetcher) {
|
||||
return eventFetcher.getEvent(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return raceName;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+71
-63
@@ -3,7 +3,6 @@ package com.sap.sailing.gwt.ui.shared;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -20,9 +19,7 @@ import com.google.gwt.user.client.rpc.IsSerializable;
|
||||
public class LeaderboardDAO implements IsSerializable {
|
||||
public String name;
|
||||
public List<CompetitorDAO> competitors;
|
||||
private List<String> raceNames;
|
||||
private Map<String, Boolean> racesMedalRace;
|
||||
private Map<String, Boolean> racesTracked;
|
||||
private List<RaceInLeaderboardDAO> races;
|
||||
public Map<CompetitorDAO, String> displayNames;
|
||||
public Map<CompetitorDAO, LeaderboardRowDAO> rows;
|
||||
public boolean hasCarriedPoints;
|
||||
@@ -35,9 +32,7 @@ public class LeaderboardDAO implements IsSerializable {
|
||||
public LeaderboardDAO() {
|
||||
totalRankingComparator = new TotalRankingComparator();
|
||||
competitorsOrderedAccordingToTotalRank = false;
|
||||
raceNames = new ArrayList<String>();
|
||||
racesMedalRace = new HashMap<String, Boolean>();
|
||||
racesTracked = new HashMap<String, Boolean>();
|
||||
races = new ArrayList<RaceInLeaderboardDAO>();
|
||||
}
|
||||
|
||||
public String getDisplayName(CompetitorDAO competitor) {
|
||||
@@ -76,8 +71,8 @@ public class LeaderboardDAO implements IsSerializable {
|
||||
*/
|
||||
public boolean scoredInMedalRace(CompetitorDAO competitor) {
|
||||
LeaderboardRowDAO row = rows.get(competitor);
|
||||
for (String race : raceNames) {
|
||||
if (raceIsMedalRace(race) && row.fieldsByRaceName.get(race).totalPoints > 0) {
|
||||
for (RaceInLeaderboardDAO race : races) {
|
||||
if (race.isMedalRace() && row.fieldsByRaceName.get(race.getRaceColumnName()).totalPoints > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -189,9 +184,9 @@ public class LeaderboardDAO implements IsSerializable {
|
||||
private int getMedalRaceScore(CompetitorDAO competitor) {
|
||||
int result = 0;
|
||||
LeaderboardRowDAO row = rows.get(competitor);
|
||||
for (String race : raceNames) {
|
||||
if (raceIsMedalRace(race) && row.fieldsByRaceName.containsKey(race)) {
|
||||
result += row.fieldsByRaceName.get(race).netPoints;
|
||||
for (RaceInLeaderboardDAO race : races) {
|
||||
if (race.isMedalRace() && row.fieldsByRaceName.containsKey(race.getRaceColumnName())) {
|
||||
result += row.fieldsByRaceName.get(race.getRaceColumnName()).netPoints;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@@ -215,12 +210,12 @@ public class LeaderboardDAO implements IsSerializable {
|
||||
*/
|
||||
private String getNameOfLastRaceSoFar(CompetitorDAO c1, CompetitorDAO c2) {
|
||||
String nameOfLastRaceSoFar = null;
|
||||
for (String race : raceNames) {
|
||||
for (RaceInLeaderboardDAO race : races) {
|
||||
for (LeaderboardRowDAO row : rows.values()) {
|
||||
if (row.competitor.equals(c1) || row.competitor.equals(c2)) {
|
||||
LeaderboardEntryDAO leaderboardEntryDAO = row.fieldsByRaceName.get(race);
|
||||
LeaderboardEntryDAO leaderboardEntryDAO = row.fieldsByRaceName.get(race.getRaceColumnName());
|
||||
if (leaderboardEntryDAO != null && leaderboardEntryDAO.netPoints != 0) {
|
||||
nameOfLastRaceSoFar = race;
|
||||
nameOfLastRaceSoFar = race.getRaceColumnName();
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -233,8 +228,8 @@ public class LeaderboardDAO implements IsSerializable {
|
||||
int result = 0;
|
||||
LeaderboardRowDAO row = rows.get(competitor);
|
||||
if (row != null) {
|
||||
for (String race : raceNames) {
|
||||
LeaderboardEntryDAO field = row.fieldsByRaceName.get(race);
|
||||
for (RaceInLeaderboardDAO race : races) {
|
||||
LeaderboardEntryDAO field = row.fieldsByRaceName.get(race.getRaceColumnName());
|
||||
if (field != null && field.netPoints == 1) {
|
||||
result++;
|
||||
}
|
||||
@@ -256,81 +251,94 @@ public class LeaderboardDAO implements IsSerializable {
|
||||
return competitors.indexOf(competitor)+1;
|
||||
};
|
||||
|
||||
public boolean raceIsTracked(String raceName){
|
||||
return racesTracked.get(raceName);
|
||||
public boolean raceIsTracked(String raceColumnName){
|
||||
for (RaceInLeaderboardDAO race : races){
|
||||
if (race.getRaceColumnName().equals(raceColumnName)){
|
||||
return race.isTrackedRace();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
public boolean raceIsMedalRace(String raceName){
|
||||
return racesMedalRace.get(raceName);
|
||||
public boolean raceIsMedalRace(String raceColumnName){
|
||||
return getRaceInLeaderboardByName(raceColumnName).isMedalRace();
|
||||
}
|
||||
|
||||
public void addRace(String name, boolean isMedalRace, boolean isTracked){
|
||||
raceNames.add(name);
|
||||
racesMedalRace.put(name, isMedalRace);
|
||||
racesTracked.put(name, isTracked);
|
||||
public void addRace(String raceColumnName, boolean medalRace, boolean trackedRace){
|
||||
RaceInLeaderboardDAO raceInLeaderboardDAO = new RaceInLeaderboardDAO();
|
||||
raceInLeaderboardDAO.setRaceColumnName(raceColumnName);
|
||||
raceInLeaderboardDAO.setMedalRace(medalRace);
|
||||
raceInLeaderboardDAO.setTrackedRace(trackedRace);
|
||||
races.add(raceInLeaderboardDAO);
|
||||
}
|
||||
|
||||
public void addRaceAt(String name, boolean isMedalRace, boolean isTracked, int index){
|
||||
raceNames.add(index, name);
|
||||
racesMedalRace.put(name, isMedalRace);
|
||||
racesTracked.put(name, isTracked);
|
||||
public void addRaceAt(String raceColumnName, boolean medalRace, boolean trackedRace, int index){
|
||||
RaceInLeaderboardDAO raceInLeaderboardDAO = new RaceInLeaderboardDAO();
|
||||
raceInLeaderboardDAO.setRaceColumnName(raceColumnName);
|
||||
raceInLeaderboardDAO.setMedalRace(medalRace);
|
||||
raceInLeaderboardDAO.setTrackedRace(trackedRace);
|
||||
races.add(index, raceInLeaderboardDAO);
|
||||
}
|
||||
|
||||
public void removeRace(String name){
|
||||
racesMedalRace.remove(name);
|
||||
racesTracked.remove(name);
|
||||
raceNames.remove(getRaceIdByName(name));
|
||||
public void removeRace(String raceColumnName){
|
||||
races.remove(getRaceInLeaderboardByName(raceColumnName));
|
||||
}
|
||||
|
||||
public void renameRace(String oldName, String newName){
|
||||
int index = getRaceIdByName(oldName);
|
||||
racesMedalRace.put(newName, racesMedalRace.get(oldName));
|
||||
racesTracked.put(newName, racesTracked.get(oldName));
|
||||
racesMedalRace.remove(oldName);
|
||||
racesTracked.remove(oldName);
|
||||
raceNames.set(index, newName);
|
||||
RaceInLeaderboardDAO race = getRaceInLeaderboardByName(oldName);
|
||||
race.setRaceColumnName(newName);
|
||||
}
|
||||
|
||||
public List<String> getRaceList(){
|
||||
return raceNames;
|
||||
}
|
||||
|
||||
public boolean raceListContains(String raceName) {
|
||||
return getRaceIdByName(raceName) != -1;
|
||||
}
|
||||
|
||||
public int getRaceIdByName(String raceName) {
|
||||
for (int i = 0; i < raceNames.size(); i++) {
|
||||
if (raceNames.get(i).equals(raceName)) {
|
||||
return i;
|
||||
private RaceInLeaderboardDAO getRaceInLeaderboardByName(String raceColumnName) {
|
||||
for (RaceInLeaderboardDAO race : races){
|
||||
if (race.getRaceColumnName().equals(raceColumnName)){
|
||||
return race;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
return null;
|
||||
}
|
||||
|
||||
public void moveRaceUp(String raceName) {
|
||||
int index = getRaceIdByName(raceName);
|
||||
public List<String> getRaceColumnNameList(){
|
||||
List<String> raceColumnNames = new ArrayList<String>();
|
||||
for (RaceInLeaderboardDAO raceInLeaderboardDAO : races){
|
||||
raceColumnNames.add(raceInLeaderboardDAO.getRaceColumnName());
|
||||
}
|
||||
return raceColumnNames;
|
||||
}
|
||||
|
||||
public List<RaceInLeaderboardDAO> getRaceList(){
|
||||
return races;
|
||||
}
|
||||
|
||||
public boolean raceListContains(String raceColumnName) {
|
||||
return getRaceInLeaderboardByName(raceColumnName) != null;
|
||||
}
|
||||
|
||||
public void moveRaceUp(String raceColumnName) {
|
||||
RaceInLeaderboardDAO race = getRaceInLeaderboardByName(raceColumnName);
|
||||
int index = races.indexOf(race);
|
||||
index--;
|
||||
if (index >= 0) {
|
||||
raceNames.remove(index + 1);
|
||||
raceNames.add(index, raceName);
|
||||
races.remove(index + 1);
|
||||
races.add(index, race);
|
||||
}
|
||||
}
|
||||
|
||||
public void moveRaceDown(String raceName) {
|
||||
int index = getRaceIdByName(raceName);
|
||||
public void moveRaceDown(String raceColumnName) {
|
||||
RaceInLeaderboardDAO race = getRaceInLeaderboardByName(raceColumnName);
|
||||
int index = races.indexOf(race);
|
||||
if (index != -1) {
|
||||
index++;
|
||||
if (index < raceNames.size()) {
|
||||
raceNames.remove(index - 1);
|
||||
raceNames.add(index, raceName);
|
||||
if (index < races.size()) {
|
||||
races.remove(index - 1);
|
||||
races.add(index, race);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setIsMedalRace(String raceName, boolean isMedalRace){
|
||||
racesMedalRace.put(raceName, isMedalRace);
|
||||
public void setIsMedalRace(String raceColumnName, boolean medalRace){
|
||||
getRaceInLeaderboardByName(raceColumnName).setMedalRace(medalRace);
|
||||
}
|
||||
|
||||
}
|
||||
+7
@@ -32,4 +32,11 @@ public class LeaderboardNameAndRaceColumnName implements RaceIdentifier {
|
||||
public Object getExistingTrackedRace(RaceFetcher raceFetcher) {
|
||||
return raceFetcher.getExistingTrackedRace(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return raceColumnName;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
package com.sap.sailing.gwt.ui.shared;
|
||||
|
||||
import com.google.gwt.user.client.rpc.IsSerializable;
|
||||
|
||||
public class RaceInLeaderboardDAO implements IsSerializable {
|
||||
private String raceColumnName;
|
||||
private boolean medalRace;
|
||||
private boolean trackedRace;
|
||||
public String getRaceColumnName() {
|
||||
return raceColumnName;
|
||||
}
|
||||
public void setRaceColumnName(String raceColumnName) {
|
||||
this.raceColumnName = raceColumnName;
|
||||
}
|
||||
public boolean isMedalRace() {
|
||||
return medalRace;
|
||||
}
|
||||
public void setMedalRace(boolean medalRace) {
|
||||
this.medalRace = medalRace;
|
||||
}
|
||||
public boolean isTrackedRace() {
|
||||
return trackedRace;
|
||||
}
|
||||
public void setTrackedRace(boolean trackedRace) {
|
||||
this.trackedRace = trackedRace;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+3
@@ -17,6 +17,9 @@
|
||||
<!-- Google Maps API -->
|
||||
<inherits name='com.google.gwt.maps.GoogleMaps' />
|
||||
|
||||
<!-- Google Visualization API -->
|
||||
<inherits name='com.google.gwt.visualization.Visualization'/>
|
||||
|
||||
<!-- Phoenix Stuff -->
|
||||
<inherits name='com.sap.ui.commons.Module' />
|
||||
|
||||
|
||||
+3
@@ -18,6 +18,9 @@
|
||||
<!-- Google Maps API -->
|
||||
<inherits name='com.google.gwt.maps.GoogleMaps' />
|
||||
|
||||
<!-- Google Visualization API -->
|
||||
<inherits name='com.google.gwt.visualization.Visualization'/>
|
||||
|
||||
<!-- Phoenix Stuff -->
|
||||
<inherits name='com.sap.ui.commons.Module' />
|
||||
|
||||
|
||||
+3
@@ -17,6 +17,9 @@
|
||||
<!-- Google Maps API -->
|
||||
<inherits name='com.google.gwt.maps.GoogleMaps' />
|
||||
|
||||
<!-- Google Visualization API -->
|
||||
<inherits name='com.google.gwt.visualization.Visualization'/>
|
||||
|
||||
<!-- Phoenix Stuff -->
|
||||
<inherits name='com.sap.ui.commons.Module' />
|
||||
|
||||
|
||||
+3
@@ -17,6 +17,9 @@
|
||||
<!-- Google Maps API -->
|
||||
<inherits name='com.google.gwt.maps.GoogleMaps' />
|
||||
|
||||
<!-- Google Visualization API -->
|
||||
<inherits name='com.google.gwt.visualization.Visualization'/>
|
||||
|
||||
<!-- Phoenix Stuff -->
|
||||
<inherits name='com.sap.ui.commons.Module' />
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 296 B |
Reference in new issue
Block a user