Merge remote-tracking branch 'origin/gwt' into gwt

Conflicts:
	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:
Fabian Schwarz-Fritz committed 2011-12-02 08:56:30 +01:00
commit d241862e8a
34 files changed
+845 -121

No files matched your search

@@ -76,14 +76,14 @@ public class DomainFactoryImpl implements DomainFactory {
SAM007000 Men's Keelboat = Starboot Männer
SAW010000 Women's Match Racing = Matchrace Damen Elliott 6M (modified)
*/
olympicClassesByID.put("102", new BoatClassImpl("RS:X"));
olympicClassesByID.put("004", new BoatClassImpl("Laser"));
olympicClassesByID.put("103", new BoatClassImpl("Laser Radial"));
olympicClassesByID.put("002", new BoatClassImpl("Finn"));
olympicClassesByID.put("005", new BoatClassImpl("470"));
olympicClassesByID.put("009", new BoatClassImpl("49er"));
olympicClassesByID.put("007", new BoatClassImpl("Star"));
olympicClassesByID.put("010", new BoatClassImpl("Elliott 6M"));
olympicClassesByID.put("102", baseDomainFactory.getOrCreateBoatClass("RS:X"));
olympicClassesByID.put("004", baseDomainFactory.getOrCreateBoatClass("Laser"));
olympicClassesByID.put("103", baseDomainFactory.getOrCreateBoatClass("Laser Radial"));
olympicClassesByID.put("002", baseDomainFactory.getOrCreateBoatClass("Finn"));
olympicClassesByID.put("005", baseDomainFactory.getOrCreateBoatClass("470"));
olympicClassesByID.put("009", baseDomainFactory.getOrCreateBoatClass("49er"));
olympicClassesByID.put("007", baseDomainFactory.getOrCreateBoatClass("Star"));
olympicClassesByID.put("010", baseDomainFactory.getOrCreateBoatClass("Elliott 6M"));
unknownBoatClass = new BoatClassImpl("Unknown");
}
@@ -27,7 +27,6 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Team;
import com.sap.sailing.domain.base.TimePoint;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.domain.base.impl.BoatImpl;
import com.sap.sailing.domain.base.impl.CompetitorImpl;
import com.sap.sailing.domain.base.impl.CourseImpl;
@@ -79,8 +78,6 @@ public class DomainFactoryImpl implements DomainFactory {
private final Map<String, Team> teamCache = new HashMap<String, Team>();
private final Map<CompetitorClass, BoatClass> boatClassCache = new HashMap<CompetitorClass, BoatClass>();
/**
* Caches events by their name and their boat class's name
*/
@@ -195,14 +192,7 @@ public class DomainFactoryImpl implements DomainFactory {
@Override
public BoatClass getOrCreateBoatClass(CompetitorClass competitorClass) {
synchronized (boatClassCache) {
BoatClass result = boatClassCache.get(competitorClass);
if (result == null) {
result = new BoatClassImpl(competitorClass == null ? "" : competitorClass.getName());
boatClassCache.put(competitorClass, result);
}
return result;
}
return baseDomainFactory.getOrCreateBoatClass(competitorClass == null ? "" : competitorClass.getName());
}
@Override
@@ -19,4 +19,6 @@ public interface DomainFactory {
Waypoint createWaypoint(ControlPoint controlPoint);
MarkPassing createMarkPassing(TimePoint timePoint, Waypoint waypoint, Competitor competitor);
BoatClass getOrCreateBoatClass(String name);
}
@@ -4,6 +4,7 @@ import java.awt.TrayIcon.MessageType;
import java.util.HashMap;
import java.util.Map;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Buoy;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
@@ -23,10 +24,13 @@ public class DomainFactoryImpl implements DomainFactory {
private final Map<String, Nationality> nationalityCache;
private final Map<String, Buoy> buoyCache;
private final Map<String, BoatClass> boatClassCache;
public DomainFactoryImpl() {
nationalityCache = new HashMap<String, Nationality>();
buoyCache = new HashMap<String, Buoy>();
boatClassCache = new HashMap<String, BoatClass>();
}
@Override
@@ -71,4 +75,16 @@ public class DomainFactoryImpl implements DomainFactory {
return new MarkPassingImpl(timePoint, waypoint, competitor);
}
@Override
public BoatClass getOrCreateBoatClass(String name) {
synchronized (boatClassCache) {
BoatClass result = boatClassCache.get(name);
if (result == null) {
result = new BoatClassImpl(name);
boatClassCache.put(name, result);
}
return result;
}
}
}
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gwt.eclipse.core.launch.gwtJUnit">
<stringAttribute key="com.google.gwt.eclipse.core.LOG_LEVEL" value="INFO"/>
<booleanAttribute key="com.google.gwt.eclipse.core.NOT_HEADLESS" value="false"/>
<stringAttribute key="com.google.gwt.eclipse.core.OUT_DIR" value="www-test"/>
<booleanAttribute key="com.google.gwt.eclipse.core.STANDARDS_MODE" value="false"/>
<stringAttribute key="com.google.gwt.eclipse.core.STYLE" value="OBFUSCATED"/>
<stringAttribute key="com.google.gwt.eclipse.core.WEB_MODE" value="false"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/GwtTestCaseColumnToggling.java"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="1"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
<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.sap.sailing.gwt.ui.test.GwtTestCaseColumnToggling"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.gwt.ui.test"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080 -XX:+UseParallelGC -Dtractrac.tunnel=true"/>
</launchConfiguration>
@@ -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());
+5
View File
@@ -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>
+2 -2
View File
@@ -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 &quot;${project_loc:com.sap.sailing.gwt.ui}/war&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -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 &quot;${project_loc:com.sap.sailing.gwt.ui}\war&quot; -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -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>
+7
View File
@@ -39,6 +39,13 @@
<version>1.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<!-- This dependency is required because the GWT Maven Plugin searches other GWT modules only in Maven dependencies -->
<groupId>com.google.code</groupId>
<artifactId>gwt-visualization</artifactId>
<version>1.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
@@ -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);
}
}
@@ -0,0 +1,347 @@
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 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.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;
}
}
}
@@ -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
@@ -618,7 +618,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);
@@ -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(stringConstants.showCharts());
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);
}
}
@@ -12,8 +12,6 @@ public class RaceDialog extends DataEntryDialog<Pair<String, Boolean>>{
private final TextBox raceNameBox;
private final CheckBox isMedalRace;
private final StringConstants stringConstants;
private Pair<String, Boolean> raceDaoAndIsMedalRace;
private static class RaceDialogValidator implements Validator<Pair<String, Boolean>>{
@@ -52,7 +50,6 @@ public class RaceDialog extends DataEntryDialog<Pair<String, Boolean>>{
raceNameBox = createTextBox(raceDaoAndIsMedalRace.getA());
isMedalRace = createCheckbox(stringConstants.medalRace());
isMedalRace.setValue(raceDaoAndIsMedalRace.getB().booleanValue());
this.stringConstants = stringConstants;
}
@Override
@@ -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;
@@ -131,6 +132,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);
@@ -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;
@@ -178,6 +179,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);
@@ -128,4 +128,26 @@ public interface StringConstants extends Constants {
String medalRaceIsNull();
String maneuverTypes();
String raceNameEmpty();
String configuration();
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();
String showCharts();
}
@@ -121,5 +121,27 @@ tacks=Tacks
jibes=Jibes
penaltyCircles=Penalty Circles
medalRaceIsNull=Medalrace value not allowed
configuration=Configuration
maneuverTypes=Maneuver types
raceNameEmpty=The name of the race is empty
raceNameEmpty=The name of the race is 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
showCharts=Show charts
@@ -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,27 @@ jibes=Halsen
penaltyCircles=Strafkringel
medalRaceIsNull=Medialienwert nicht erlaubt
maneuverTypes=Manövertypen
raceNameEmpty=Der Name des Rennens ist leer
raceNameEmpty=Der Name des Rennens ist leer
configuration=Konfiguration
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
showCharts=Grafische Ansicht
@@ -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;
@@ -1175,9 +1176,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>>();
@@ -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;
}
}
}
@@ -34,4 +34,11 @@ public class EventNameAndRaceName implements EventAndRaceIdentifier {
public Object getEvent(EventFetcher eventFetcher) {
return eventFetcher.getEvent(this);
}
@Override
public String toString() {
return raceName;
}
}
@@ -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);
}
}
@@ -32,4 +32,11 @@ public class LeaderboardNameAndRaceColumnName implements RaceIdentifier {
public Object getExistingTrackedRace(RaceFetcher raceFetcher) {
return raceFetcher.getExistingTrackedRace(this);
}
@Override
public String toString() {
return raceColumnName;
}
}
@@ -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;
}
}
@@ -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' />
@@ -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' />
@@ -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' />
@@ -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