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 @@ + + +