diff --git a/java/com.sap.sailing.gwt.ui/.classpath b/java/com.sap.sailing.gwt.ui/.classpath
index dd566e6861a..6b39732388a 100755
--- a/java/com.sap.sailing.gwt.ui/.classpath
+++ b/java/com.sap.sailing.gwt.ui/.classpath
@@ -7,5 +7,10 @@
+
+
+
+
+
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LeaderboardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LeaderboardPanel.java
index 3a1fd63fe37..de26a4afa3d 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LeaderboardPanel.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/LeaderboardPanel.java
@@ -26,6 +26,8 @@ import com.google.gwt.user.cellview.client.Header;
import com.google.gwt.user.cellview.client.TextHeader;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
@@ -70,6 +72,8 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
private final StringConstants stringConstants;
private final CellTable leaderboardTable;
+
+ private final MultiSelectionModel leaderboardSelectionModel;
private ListDataProvider data;
@@ -728,7 +732,8 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
leaderboardTable = new CellTableWithStylableHeaders(
/* pageSize */100, resources);
getLeaderboardTable().setWidth("100%");
- getLeaderboardTable().setSelectionModel(new MultiSelectionModel() {});
+ leaderboardSelectionModel = new MultiSelectionModel() {};
+ getLeaderboardTable().setSelectionModel(leaderboardSelectionModel);
setData(new ListDataProvider());
getData().addDataDisplay(getLeaderboardTable());
listHandler = new ListHandler(getData().getList());
@@ -775,6 +780,15 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
dockPanel.add(refreshAndSettingsPanel, DockPanel.EAST);
vp.add(dockPanel);
vp.add(getLeaderboardTable());
+ Button chartButton = new Button("Compare competitors");
+ chartButton.addClickHandler(new ClickHandler() {
+
+ @Override
+ public void onClick(ClickEvent event) {
+ compareCompetitors();
+ }
+ });
+ vp.add(chartButton);
setWidget(vp);
}
@@ -1278,4 +1292,22 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
playPause.setHTML(getPlayPauseImgHtml(isPlaying));
playPause.setTitle(isPlaying ? stringConstants.pauseAutomaticRefresh() : stringConstants.autoRefresh());
}
+
+ private void compareCompetitors(){
+ String raceName = this.selectedRaceColumns.get(0);
+ final DialogBox chartBox = new DialogBox();
+ final Runnable close = new Runnable() {
+
+ @Override
+ public void run() {
+ chartBox.hide();
+ }
+ };
+ //chartBox.setSize("800", "800");
+ chartBox.setAnimationEnabled(true);
+ chartBox.add(new CompareCompetitorsPanel(sailingService, new ArrayList(leaderboardSelectionModel.getSelectedSet()), raceName,close));
+ chartBox.setTitle("Compare competitors");
+ chartBox.center();
+ chartBox.show();
+ }
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java
index 6e277364785..84713c9e50f 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java
@@ -7,11 +7,13 @@ import java.util.Map;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
+import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.gwt.ui.shared.CompetitorDAO;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.GPSFixDAO;
import com.sap.sailing.gwt.ui.shared.LeaderboardDAO;
import com.sap.sailing.gwt.ui.shared.LeaderboardEntryDAO;
+import com.sap.sailing.gwt.ui.shared.LeaderboardRowDAO;
import com.sap.sailing.gwt.ui.shared.MarkDAO;
import com.sap.sailing.gwt.ui.shared.Pair;
import com.sap.sailing.gwt.ui.shared.QuickRankDAO;
@@ -120,4 +122,6 @@ public interface SailingService extends RemoteService {
void stressTestLeaderboardByName(String leaderboardName, int times) throws Exception;
String[] getCountryCodes();
+
+ List getLeaderboardRowDAOOfRace(String eventName, String raceName, List competitors, int timeStep) throws Exception;
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java
index 34cbede9770..260546562e1 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java
@@ -7,6 +7,7 @@ import java.util.Map;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.base.Course;
+import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.RaceInLeaderboard;
import com.sap.sailing.domain.tracking.WindSource;
import com.sap.sailing.gwt.ui.shared.CompetitorDAO;
@@ -14,6 +15,7 @@ import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.GPSFixDAO;
import com.sap.sailing.gwt.ui.shared.LeaderboardDAO;
import com.sap.sailing.gwt.ui.shared.LeaderboardEntryDAO;
+import com.sap.sailing.gwt.ui.shared.LeaderboardRowDAO;
import com.sap.sailing.gwt.ui.shared.MarkDAO;
import com.sap.sailing.gwt.ui.shared.Pair;
import com.sap.sailing.gwt.ui.shared.QuickRankDAO;
@@ -183,4 +185,7 @@ public interface SailingServiceAsync {
void stressTestLeaderboardByName(String leaderboardName, int times, AsyncCallback callback);
void getCountryCodes(AsyncCallback callback);
+
+ void getLeaderboardRowDAOOfRace(String eventName, String raceName, List competitors, int timeStep,
+ AsyncCallback> callback);
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
index 5ab33876a9b..f61d5883601 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
@@ -52,12 +52,14 @@ import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.domain.persistence.MongoWindStoreFactory;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingConfiguration;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
+import com.sap.sailing.domain.swisstimingadapter.impl.CompetitorImpl;
import com.sap.sailing.domain.swisstimingadapter.persistence.SwissTimingAdapterPersistence;
import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.NoWindException;
import com.sap.sailing.domain.tracking.RaceHandle;
+import com.sap.sailing.domain.tracking.TrackedLeg;
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.Wind;
@@ -1108,4 +1110,37 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
Collections.sort(countryCodes);
return countryCodes.toArray(new String[0]);
}
+
+ @Override
+ public List getLeaderboardRowDAOOfRace(String eventName, String raceName, List competitors, int timeStep) throws NoWindException {
+ List entries = new ArrayList();
+ Event event = getService().getEventByName(eventName);
+ RaceDefinition race = getRaceByName(event, raceName);
+ TrackedRace trackedRace = getService().getTrackedRace(event, race);
+ for (long time = trackedRace.getStart().asMillis(); time < trackedRace.getTimePointOfNewestEvent().asMillis(); time += timeStep){
+ MillisecondsTimePoint timePoint = new MillisecondsTimePoint(time);
+ for (CompetitorDAO competitorDAO : competitors){
+ Competitor competitor = (Competitor) new CompetitorImpl(competitorDAO.id, competitorDAO.threeLetterIocCountryCode, competitorDAO.name);
+ LeaderboardRowDAO row = new LeaderboardRowDAO();
+ row.competitor = competitorDAO;
+ row.fieldsByRaceName = new HashMap();
+ LeaderboardEntryDAO entryDAO = new LeaderboardEntryDAO();
+ entryDAO.legDetails = new ArrayList();
+ for (Leg leg : trackedRace.getRace().getCourse().getLegs()) {
+ TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(competitor, leg);
+ LegEntryDAO legEntry;
+ if (trackedLeg != null && trackedLeg.hasStartedLeg(timePoint)) {
+ legEntry = createLegEntry(trackedLeg, timePoint);
+ } else {
+ legEntry = null;
+ }
+ entryDAO.legDetails.add(legEntry);
+ }
+
+ row.fieldsByRaceName.put(raceName, entryDAO);
+ entries.add(row);
+ }
+ }
+ return null;
+ }
}
\ No newline at end of file
diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml
index faf3549accc..1334e2cc9bc 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml
+++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml
@@ -17,6 +17,9 @@
+
+
+