Leaderboard settings

This commit is contained in:
Kai Boernert committed 2017-02-01 17:39:12 +01:00
1 parent b44f5cc0d1
commit 40b76ed703
22 files changed
+638 -446

No files matched your search

@@ -28,7 +28,7 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings;
import com.sap.sailing.gwt.ui.leaderboard.MultiLeaderboardPanel;
import com.sap.sailing.gwt.ui.leaderboard.MultiLeaderboardProxyPanel;
import com.sap.sailing.gwt.ui.leaderboard.ScoringSchemeTypeFormatter;
import com.sap.sailing.gwt.ui.leaderboard.SelectedLeaderboardChangeListener;
import com.sap.sse.gwt.client.controls.busyindicator.BusyIndicator;
@@ -56,7 +56,7 @@ public class OldMultiLeaderboard extends Composite implements SelectedLeaderboar
@UiField BusyIndicator busyIndicator;
@UiField EventRegattaLeaderboardResources local_res;
private MultiLeaderboardPanel multiLeaderboardPanel;
private MultiLeaderboardProxyPanel multiLeaderboardPanel;
private Timer autoRefreshTimer;
private final OldMultiLeaderboardDelegate delegate;
private LeaderboardPanel lastSelectedLeaderboardPanel;
@@ -183,7 +183,7 @@ public class OldMultiLeaderboard extends Composite implements SelectedLeaderboar
}
}
public void setMultiLeaderboard(MultiLeaderboardPanel multiLeaderboardPanel, final Timer timer) {
public void setMultiLeaderboard(MultiLeaderboardProxyPanel multiLeaderboardPanel, final Timer timer) {
this.autoRefreshTimer = timer;
this.multiLeaderboardPanel = multiLeaderboardPanel;
this.multiLeaderboardPanel.addSelectedLeaderboardChangeListener(this);
@@ -240,6 +240,6 @@ public class OldMultiLeaderboard extends Composite implements SelectedLeaderboar
lastSelectedLeaderboardPanel = selectedLeaderboard;
}
public interface OldMultiLeaderboardDelegate extends LeaderboardDelegate<MultiLeaderboardPanel>{
public interface OldMultiLeaderboardDelegate extends LeaderboardDelegate<MultiLeaderboardProxyPanel>{
}
}
@@ -2,10 +2,10 @@ package com.sap.sailing.gwt.home.desktop.partials.old.multileaderboard;
import com.sap.sailing.gwt.home.desktop.partials.old.AbstractLeaderboardFullscreenViewer;
import com.sap.sailing.gwt.home.desktop.partials.old.multileaderboard.OldMultiLeaderboard.OldMultiLeaderboardDelegate;
import com.sap.sailing.gwt.ui.leaderboard.MultiLeaderboardPanel;
import com.sap.sailing.gwt.ui.leaderboard.MultiLeaderboardProxyPanel;
public class OldMultiLeaderboardDelegateFullscreenViewer extends
AbstractLeaderboardFullscreenViewer<MultiLeaderboardPanel> implements OldMultiLeaderboardDelegate {
AbstractLeaderboardFullscreenViewer<MultiLeaderboardProxyPanel> implements OldMultiLeaderboardDelegate {
public OldMultiLeaderboardDelegateFullscreenViewer() {
setHeaderWidget(createPanel(lastScoringComment, scoringScheme));
@@ -17,7 +17,7 @@ import com.sap.sailing.gwt.ui.client.shared.charts.MultiCompetitorLeaderboardCha
import com.sap.sailing.gwt.ui.client.shared.charts.MultiCompetitorLeaderboardChartSettings;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings;
import com.sap.sailing.gwt.ui.leaderboard.MultiLeaderboardPanel;
import com.sap.sailing.gwt.ui.leaderboard.MultiLeaderboardProxyPanel;
import com.sap.sse.common.Util;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.ErrorReporter;
@@ -38,7 +38,7 @@ import com.sap.sse.gwt.client.useragent.UserAgentDetails;
public class EventSeriesAnalyticsDataManager {
private LeaderboardPanel overallLeaderboardPanel;
private MultiCompetitorLeaderboardChart multiCompetitorChart;
private MultiLeaderboardPanel multiLeaderboardPanel;
private MultiLeaderboardProxyPanel multiLeaderboardPanel;
private final CompetitorSelectionModel competitorSelectionProvider;
private final AsyncActionsExecutor asyncActionsExecutor;
@@ -87,20 +87,20 @@ public class EventSeriesAnalyticsDataManager {
return multiCompetitorChart;
}
public MultiLeaderboardPanel createMultiLeaderboardPanel(Component<?> parent, ComponentContext<?, ?> context,
public MultiLeaderboardProxyPanel createMultiLeaderboardPanel(Component<?> parent, ComponentContext<?, ?> context,
LeaderboardSettings leaderboardSettings,
String preselectedLeaderboardName, RaceIdentifier preselectedRace, String leaderboardGroupName,
String metaLeaderboardName, boolean showRaceDetails, boolean autoExpandLastRaceColumn) {
if(multiLeaderboardPanel == null) {
multiLeaderboardPanel = new MultiLeaderboardPanel(parent, context, sailingService, metaLeaderboardName,
multiLeaderboardPanel = new MultiLeaderboardProxyPanel(parent, context, sailingService, metaLeaderboardName,
asyncActionsExecutor, timer, true /* isEmbedded */,
preselectedLeaderboardName, preselectedRace, errorReporter, StringMessages.INSTANCE,
userAgent, showRaceDetails, autoExpandLastRaceColumn);
userAgent, showRaceDetails, autoExpandLastRaceColumn, null);
}
return multiLeaderboardPanel;
}
public MultiLeaderboardPanel getMultiLeaderboardPanel() {
public MultiLeaderboardProxyPanel getMultiLeaderboardPanel() {
return multiLeaderboardPanel;
}
@@ -22,7 +22,7 @@ import com.sap.sailing.gwt.home.desktop.utils.EventParamUtils;
import com.sap.sailing.gwt.ui.client.LeaderboardUpdateListener;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardUrlSettings;
import com.sap.sailing.gwt.ui.leaderboard.MultiLeaderboardPanel;
import com.sap.sailing.gwt.ui.leaderboard.MultiLeaderboardProxyPanel;
import com.sap.sse.gwt.shared.GwtHttpRequestUtils;
public class EventSeriesLeaderboardsTabView extends Composite implements SeriesTabView<EventSeriesLeaderboardsPlace>,
@@ -68,7 +68,7 @@ public class EventSeriesLeaderboardsTabView extends Composite implements SeriesT
final LeaderboardSettings leaderboardSettings = EventParamUtils.createLeaderboardSettingsFromURLParameters(Window.Location.getParameterMap());
final RaceIdentifier preselectedRace = EventParamUtils.getPreselectedRace(Window.Location.getParameterMap());
MultiLeaderboardPanel leaderboardPanel = regattaAnalyticsManager.createMultiLeaderboardPanel(null, null,
MultiLeaderboardProxyPanel leaderboardPanel = regattaAnalyticsManager.createMultiLeaderboardPanel(null, null,
leaderboardSettings,
null, // TODO: preselectedLeaderboardName
preselectedRace,
@@ -6,11 +6,10 @@ import com.sap.sse.gwt.client.shared.perspective.AbstractPerspectiveLifecycle;
public abstract class AbstractLeaderboardPerspectiveLifecycle extends AbstractPerspectiveLifecycle<LeaderboardPerspectiveOwnSettings> {
private final LeaderboardPanelLifecycle leaderboardPanelLifecycle;
public AbstractLeaderboardPerspectiveLifecycle(StringMessages stringMessages) {
leaderboardPanelLifecycle = new LeaderboardPanelLifecycle(null, stringMessages);
componentLifecycles.add(leaderboardPanelLifecycle);
componentLifecycles.add(new LeaderboardPanelLifecycle(null, stringMessages));
componentLifecycles.add(new MultiLeaderboardPanelLifecycle(null, stringMessages));
componentLifecycles.add(new OverallLeaderboardPanelLifecycle(null, stringMessages));
}
@Override
@@ -18,10 +17,6 @@ public abstract class AbstractLeaderboardPerspectiveLifecycle extends AbstractPe
return new LeaderboardPerspectiveOwnSettings();
}
public LeaderboardPanelLifecycle getLeaderboardPanelLifecycle() {
return leaderboardPanelLifecycle;
}
@Override
public LeaderboardPerspectiveOwnSettings clonePerspectiveOwnSettings(LeaderboardPerspectiveOwnSettings settings) {
return settings;
@@ -77,7 +77,6 @@ public abstract class AbstractLeaderboardViewer<PL extends AbstractLeaderboardPe
componentsNavigationPanel = new FlowPanel();
componentsNavigationPanel.addStyleName(RES.css().viewerToolbar());
mainPanel.add(componentsNavigationPanel);
addChildComponent(leaderboardPanel);
}
return mainPanel;
}
@@ -133,25 +132,21 @@ public abstract class AbstractLeaderboardViewer<PL extends AbstractLeaderboardPe
@Override
public SettingsDialogComponent<LeaderboardPerspectiveOwnSettings> getPerspectiveOwnSettingsDialogComponent() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean hasPerspectiveOwnSettings() {
// TODO Auto-generated method stub
return true;
}
@Override
public String getId() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getDependentCssClassName() {
// TODO Auto-generated method stub
return null;
}
}
@@ -0,0 +1,5 @@
package com.sap.sailing.gwt.ui.leaderboard;
public class LeaderBoardPerspectiveSettings {
}
@@ -3,7 +3,8 @@ package com.sap.sailing.gwt.ui.leaderboard;
import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeSettings;
import com.sap.sse.gwt.client.shared.perspective.SettingsStorageManager;
public class LeaderboardComponentContext extends AbstractLeaderboardComponentContext<LeaderboardPerspectiveLifecycle> {
public class LeaderboardComponentContext
extends AbstractLeaderboardComponentContext<LeaderboardPerspectiveLifecycle> {
public LeaderboardComponentContext(LeaderboardPerspectiveLifecycle rootLifecycle,
SettingsStorageManager<PerspectiveCompositeSettings<LeaderboardPerspectiveOwnSettings>> settingsStorageManager) {
@@ -39,24 +39,28 @@ import com.sap.sse.gwt.settings.SettingsToUrlSerializer;
import com.sap.sse.gwt.shared.GwtHttpRequestUtils;
import com.sap.sse.security.ui.settings.UserSettingsStorageManager;
public class LeaderboardEntryPoint extends AbstractSailingEntryPoint {
public static final long DEFAULT_REFRESH_INTERVAL_MILLIS = 3000l;
private static final Logger logger = Logger.getLogger(LeaderboardEntryPoint.class.getName());
private final SettingsToUrlSerializer settingsToUrlSerializer = new SettingsToUrlSerializer();
private String leaderboardName;
private String leaderboardGroupName;
private LeaderboardType leaderboardType;
private EventDTO event;
private LeaderboardComponentContext context;
private UserSettingsStorageManager<PerspectiveCompositeSettings<LeaderboardPerspectiveOwnSettings>> settingsManager;
@Override
protected void doOnModuleLoad() {
super.doOnModuleLoad();
final LeaderboardContextSettings leaderboardContextSettings = settingsToUrlSerializer.deserializeFromCurrentLocation(new LeaderboardContextSettings());
final LeaderboardContextSettings leaderboardContextSettings = settingsToUrlSerializer
.deserializeFromCurrentLocation(new LeaderboardContextSettings());
final UUID eventId = leaderboardContextSettings.getEventId();
leaderboardName = leaderboardContextSettings.getLeaderboardName();
@@ -70,7 +74,8 @@ public class LeaderboardEntryPoint extends AbstractSailingEntryPoint {
new MarkedAsyncCallback<Util.Pair<String, LeaderboardType>>(
new AsyncCallback<Util.Pair<String, LeaderboardType>>() {
@Override
public void onSuccess(Util.Pair<String, LeaderboardType> leaderboardNameAndType) {
public void onSuccess(
Util.Pair<String, LeaderboardType> leaderboardNameAndType) {
if (leaderboardNameAndType != null
&& leaderboardName.equals(leaderboardNameAndType.getA())) {
Window.setTitle(leaderboardName);
@@ -92,11 +97,11 @@ public class LeaderboardEntryPoint extends AbstractSailingEntryPoint {
if (eventId == null) {
checkLeaderboardNameAndCreateUI.run(); // use null-initialized event field
} else {
sailingService.getEventById(eventId, /* withStatisticalData */false, new MarkedAsyncCallback<EventDTO>(
new AsyncCallback<EventDTO>() {
sailingService.getEventById(eventId, /* withStatisticalData */false,
new MarkedAsyncCallback<EventDTO>(new AsyncCallback<EventDTO>() {
@Override
public void onFailure(Throwable caught) {
reportError("Error trying to obtain event "+eventId+": " + caught.getMessage());
reportError("Error trying to obtain event " + eventId + ": " + caught.getMessage());
}
@Override
@@ -111,16 +116,24 @@ public class LeaderboardEntryPoint extends AbstractSailingEntryPoint {
}
final String zoomTo = leaderboardContextSettings.getZoomTo();
if (zoomTo != null) {
RootPanel.getBodyElement().setAttribute(
"style",
RootPanel.getBodyElement().setAttribute("style",
"zoom: " + zoomTo + ";-moz-transform: scale(" + zoomTo
+ ");-moz-transform-origin: 0 0;-o-transform: scale(" + zoomTo
+ ");-o-transform-origin: 0 0;-webkit-transform: scale(" + zoomTo
+ ");-webkit-transform-origin: 0 0;");
}
}
private void createUI(LeaderboardContextSettings leaderboardContextSettings, EventDTO event) {
LeaderboardPerspectiveLifecycle rootComponentLifeCycle = new LeaderboardPerspectiveLifecycle(
StringMessages.INSTANCE);
settingsManager = new UserSettingsStorageManager<>(getUserService(),
UserSettingsStorageManager.buildContextDefinitionId("LeaderboardEntryPoint"),
leaderboardContextSettings.getRegattaName());
context = new LeaderboardComponentContext(rootComponentLifeCycle, settingsManager);
DockLayoutPanel mainPanel = new DockLayoutPanel(Unit.PX);
RootLayoutPanel.get().add(mainPanel);
if (!leaderboardContextSettings.getEmbedded()) {
@@ -152,20 +165,17 @@ public class LeaderboardEntryPoint extends AbstractSailingEntryPoint {
final RegattaAndRaceIdentifier preselectedRace = getPreselectedRace(Window.Location.getParameterMap());
// make a single live request as the default but don't continue to play by default
if (leaderboardType.isMetaLeaderboard()) {
final MetaLeaderboardPerspectiveLifecycle lifecycle = new MetaLeaderboardPerspectiveLifecycle(getStringMessages());
final MetaLeaderboardComponentContext componentContext = new MetaLeaderboardComponentContext(lifecycle,
new UserSettingsStorageManager<>(getUserService(),
UserSettingsStorageManager.buildContextDefinitionId("LeaderboardEntryPoint", "Meta"),
leaderboardContextSettings.getRegattaName()));
componentContext.initInitialSettings(new OnSettingsLoadedCallback<PerspectiveCompositeSettings<LeaderboardPerspectiveOwnSettings>>() {
context.initInitialSettings(new OnSettingsLoadedCallback<PerspectiveCompositeSettings<LeaderboardPerspectiveOwnSettings>>() {
@Override
public void onSuccess(PerspectiveCompositeSettings<LeaderboardPerspectiveOwnSettings> defaultSettings) {
MetaLeaderboardViewer leaderboardViewer = new MetaLeaderboardViewer(null, componentContext,
lifecycle, defaultSettings, sailingService, new AsyncActionsExecutor(),
timer, null, preselectedRace, leaderboardGroupName, leaderboardName, LeaderboardEntryPoint.this, getStringMessages(),
userAgent, chartDetailType);
contentScrollPanel.setWidget(leaderboardViewer);
MetaLeaderboardViewer leaderboardViewer = new MetaLeaderboardViewer(null, context,
rootComponentLifeCycle, defaultSettings, sailingService, new AsyncActionsExecutor(),
timer, null, preselectedRace, leaderboardGroupName, leaderboardName, LeaderboardEntryPoint.this, getStringMessages(),
userAgent, chartDetailType);
contentScrollPanel.setWidget(leaderboardViewer);
}
@Override
@@ -176,16 +186,12 @@ public class LeaderboardEntryPoint extends AbstractSailingEntryPoint {
}
});
} else {
final LeaderboardPerspectiveLifecycle lifecycle = new LeaderboardPerspectiveLifecycle(getStringMessages());
final LeaderboardComponentContext componentContext = new LeaderboardComponentContext(lifecycle,
new UserSettingsStorageManager<>(getUserService(),
UserSettingsStorageManager.buildContextDefinitionId("LeaderboardEntryPoint", "Single"),
leaderboardContextSettings.getRegattaName()));
componentContext.initInitialSettings(new OnSettingsLoadedCallback<PerspectiveCompositeSettings<LeaderboardPerspectiveOwnSettings>>() {
context.initInitialSettings(
new OnSettingsLoadedCallback<PerspectiveCompositeSettings<LeaderboardPerspectiveOwnSettings>>() {
@Override
public void onSuccess(PerspectiveCompositeSettings<LeaderboardPerspectiveOwnSettings> defaultSettings) {
LeaderboardViewer leaderboardViewer = new LeaderboardViewer(null,
componentContext, lifecycle, defaultSettings, sailingService,
context, rootComponentLifeCycle, defaultSettings, sailingService,
new AsyncActionsExecutor(),
timer, preselectedRace, leaderboardGroupName, leaderboardName, LeaderboardEntryPoint.this, getStringMessages(),
userAgent, chartDetailType);
@@ -202,12 +208,15 @@ public class LeaderboardEntryPoint extends AbstractSailingEntryPoint {
}
mainPanel.add(contentScrollPanel);
}
private RegattaAndRaceIdentifier getPreselectedRace(Map<String, List<String>> parameterMap) {
RegattaAndRaceIdentifier result;
if (parameterMap.containsKey(LeaderboardUrlSettings.PARAM_RACE_NAME) && parameterMap.get(LeaderboardUrlSettings.PARAM_RACE_NAME).size() == 1 &&
parameterMap.containsKey(LeaderboardUrlSettings.PARAM_REGATTA_NAME) && parameterMap.get(LeaderboardUrlSettings.PARAM_REGATTA_NAME).size() == 1) {
result = new RegattaNameAndRaceName(parameterMap.get(LeaderboardUrlSettings.PARAM_REGATTA_NAME).get(0), parameterMap.get(LeaderboardUrlSettings.PARAM_RACE_NAME).get(0));
if (parameterMap.containsKey(LeaderboardUrlSettings.PARAM_RACE_NAME)
&& parameterMap.get(LeaderboardUrlSettings.PARAM_RACE_NAME).size() == 1
&& parameterMap.containsKey(LeaderboardUrlSettings.PARAM_REGATTA_NAME)
&& parameterMap.get(LeaderboardUrlSettings.PARAM_REGATTA_NAME).size() == 1) {
result = new RegattaNameAndRaceName(parameterMap.get(LeaderboardUrlSettings.PARAM_REGATTA_NAME).get(0),
parameterMap.get(LeaderboardUrlSettings.PARAM_RACE_NAME).get(0));
} else {
result = null;
}
@@ -219,44 +228,59 @@ public class LeaderboardEntryPoint extends AbstractSailingEntryPoint {
*/
private LeaderboardSettings createLeaderboardSettingsFromURLParameters(Map<String, List<String>> parameterMap) {
LeaderboardSettings result;
Long refreshIntervalMillis = parameterMap.containsKey(LeaderboardUrlSettings.PARAM_REFRESH_INTERVAL_MILLIS) ? Long
.valueOf(parameterMap.get(LeaderboardUrlSettings.PARAM_REFRESH_INTERVAL_MILLIS).get(0)) : null;
Long refreshIntervalMillis = parameterMap.containsKey(LeaderboardUrlSettings.PARAM_REFRESH_INTERVAL_MILLIS)
? Long.valueOf(parameterMap.get(LeaderboardUrlSettings.PARAM_REFRESH_INTERVAL_MILLIS).get(0)) : null;
RaceColumnSelectionStrategies raceColumnSelectionStrategy;
final Integer numberOfLastRacesToShow;
if (parameterMap.containsKey(LeaderboardUrlSettings.PARAM_NAME_LAST_N)) {
raceColumnSelectionStrategy = RaceColumnSelectionStrategies.LAST_N;
numberOfLastRacesToShow = Integer.valueOf(parameterMap.get(LeaderboardUrlSettings.PARAM_NAME_LAST_N).get(0));
numberOfLastRacesToShow = Integer
.valueOf(parameterMap.get(LeaderboardUrlSettings.PARAM_NAME_LAST_N).get(0));
} else if (isSmallWidth()) {
raceColumnSelectionStrategy = RaceColumnSelectionStrategies.LAST_N;
int width = Window.getClientWidth();
numberOfLastRacesToShow = (width-275)/40;
numberOfLastRacesToShow = (width - 275) / 40;
} else {
raceColumnSelectionStrategy = RaceColumnSelectionStrategies.EXPLICIT;
numberOfLastRacesToShow = null;
}
if (parameterMap.containsKey(LeaderboardUrlSettings.PARAM_RACE_NAME) || parameterMap.containsKey(LeaderboardUrlSettings.PARAM_RACE_DETAIL) ||
parameterMap.containsKey(LeaderboardUrlSettings.PARAM_LEG_DETAIL) || parameterMap.containsKey(LeaderboardUrlSettings.PARAM_MANEUVER_DETAIL) ||
parameterMap.containsKey(LeaderboardUrlSettings.PARAM_OVERALL_DETAIL) || parameterMap.containsKey(LeaderboardUrlSettings.PARAM_SHOW_ADDED_SCORES) ||
parameterMap.containsKey(LeaderboardUrlSettings.PARAM_SHOW_OVERALL_COLUMN_WITH_NUMBER_OF_RACES_COMPLETED)
if (parameterMap.containsKey(LeaderboardUrlSettings.PARAM_RACE_NAME)
|| parameterMap.containsKey(LeaderboardUrlSettings.PARAM_RACE_DETAIL)
|| parameterMap.containsKey(LeaderboardUrlSettings.PARAM_LEG_DETAIL)
|| parameterMap.containsKey(LeaderboardUrlSettings.PARAM_MANEUVER_DETAIL)
|| parameterMap.containsKey(LeaderboardUrlSettings.PARAM_OVERALL_DETAIL)
|| parameterMap.containsKey(LeaderboardUrlSettings.PARAM_SHOW_ADDED_SCORES) || parameterMap
.containsKey(LeaderboardUrlSettings.PARAM_SHOW_OVERALL_COLUMN_WITH_NUMBER_OF_RACES_COMPLETED)
|| parameterMap.containsKey(LeaderboardUrlSettings.PARAM_SHOW_COMPETITOR_NAME_COLUMNS)) {
List<DetailType> maneuverDetails = getDetailTypeListFromParamValue(parameterMap.get(LeaderboardUrlSettings.PARAM_MANEUVER_DETAIL));
List<DetailType> raceDetails = getDetailTypeListFromParamValue(parameterMap.get(LeaderboardUrlSettings.PARAM_RACE_DETAIL));
List<DetailType> overallDetails = getDetailTypeListFromParamValue(parameterMap.get(LeaderboardUrlSettings.PARAM_OVERALL_DETAIL));
List<DetailType> maneuverDetails = getDetailTypeListFromParamValue(
parameterMap.get(LeaderboardUrlSettings.PARAM_MANEUVER_DETAIL));
List<DetailType> raceDetails = getDetailTypeListFromParamValue(
parameterMap.get(LeaderboardUrlSettings.PARAM_RACE_DETAIL));
List<DetailType> overallDetails = getDetailTypeListFromParamValue(
parameterMap.get(LeaderboardUrlSettings.PARAM_OVERALL_DETAIL));
if (overallDetails.isEmpty()) {
overallDetails = Collections.singletonList(DetailType.REGATTA_RANK);
}
List<DetailType> legDetails = getDetailTypeListFromParamValue(parameterMap.get(LeaderboardUrlSettings.PARAM_LEG_DETAIL));
List<String> namesOfRacesToShow = getStringListFromParamValue(parameterMap.get(LeaderboardUrlSettings.PARAM_RACE_NAME));
boolean showAddedScores = parameterMap.containsKey(LeaderboardUrlSettings.PARAM_SHOW_ADDED_SCORES) ?
Boolean.valueOf(parameterMap.get(LeaderboardUrlSettings.PARAM_SHOW_ADDED_SCORES).get(0)) : false;
boolean showOverallColumnWithNumberOfRacesSailedPerCompetitor = parameterMap.containsKey(LeaderboardUrlSettings.PARAM_SHOW_OVERALL_COLUMN_WITH_NUMBER_OF_RACES_COMPLETED) ?
Boolean.valueOf(parameterMap.get(LeaderboardUrlSettings.PARAM_SHOW_OVERALL_COLUMN_WITH_NUMBER_OF_RACES_COMPLETED).get(0)) : false;
boolean autoExpandPreSelectedRace = parameterMap.containsKey(LeaderboardUrlSettings.PARAM_AUTO_EXPAND_PRESELECTED_RACE) ?
Boolean.valueOf(parameterMap.get(LeaderboardUrlSettings.PARAM_AUTO_EXPAND_PRESELECTED_RACE).get(0)) :
(namesOfRacesToShow != null && namesOfRacesToShow.size() == 1);
boolean showCompetitorSailIdColumn = true;
boolean showCompetitorFullNameColumn = true;
if (parameterMap.containsKey(LeaderboardUrlSettings.PARAM_SHOW_COMPETITOR_NAME_COLUMNS)) {
List<DetailType> legDetails = getDetailTypeListFromParamValue(
parameterMap.get(LeaderboardUrlSettings.PARAM_LEG_DETAIL));
List<String> namesOfRacesToShow = getStringListFromParamValue(
parameterMap.get(LeaderboardUrlSettings.PARAM_RACE_NAME));
boolean showAddedScores = parameterMap.containsKey(LeaderboardUrlSettings.PARAM_SHOW_ADDED_SCORES)
? Boolean.valueOf(parameterMap.get(LeaderboardUrlSettings.PARAM_SHOW_ADDED_SCORES).get(0)) : false;
boolean showOverallColumnWithNumberOfRacesSailedPerCompetitor = parameterMap
.containsKey(LeaderboardUrlSettings.PARAM_SHOW_OVERALL_COLUMN_WITH_NUMBER_OF_RACES_COMPLETED)
? Boolean.valueOf(parameterMap
.get(LeaderboardUrlSettings.PARAM_SHOW_OVERALL_COLUMN_WITH_NUMBER_OF_RACES_COMPLETED)
.get(0))
: false;
boolean autoExpandPreSelectedRace = parameterMap
.containsKey(LeaderboardUrlSettings.PARAM_AUTO_EXPAND_PRESELECTED_RACE)
? Boolean.valueOf(
parameterMap.get(LeaderboardUrlSettings.PARAM_AUTO_EXPAND_PRESELECTED_RACE).get(0))
: (namesOfRacesToShow != null && namesOfRacesToShow.size() == 1);
boolean showCompetitorSailIdColumn = true;
boolean showCompetitorFullNameColumn = true;
if (parameterMap.containsKey(LeaderboardUrlSettings.PARAM_SHOW_COMPETITOR_NAME_COLUMNS)) {
String value = parameterMap.get(LeaderboardUrlSettings.PARAM_SHOW_COMPETITOR_NAME_COLUMNS).get(0);
if (value.equals(LeaderboardUrlSettings.COMPETITOR_NAME_COLUMN_FULL_NAME)) {
showCompetitorSailIdColumn = false;
@@ -268,13 +292,13 @@ public class LeaderboardEntryPoint extends AbstractSailingEntryPoint {
}
}
result = new LeaderboardSettings(maneuverDetails, legDetails, raceDetails, overallDetails,
/* namesOfRaceColumnsToShow */ null,
namesOfRacesToShow, numberOfLastRacesToShow,
autoExpandPreSelectedRace, refreshIntervalMillis, /* sort by column */ (namesOfRacesToShow != null && !namesOfRacesToShow.isEmpty()) ?
namesOfRacesToShow.get(0) : null,
/* ascending */ true, /* updateUponPlayStateChange */ raceDetails.isEmpty() && legDetails.isEmpty(),
raceColumnSelectionStrategy, showAddedScores, showOverallColumnWithNumberOfRacesSailedPerCompetitor,
showCompetitorSailIdColumn, showCompetitorFullNameColumn);
/* namesOfRaceColumnsToShow */ null, namesOfRacesToShow, numberOfLastRacesToShow,
autoExpandPreSelectedRace, refreshIntervalMillis,
/* sort by column */ (namesOfRacesToShow != null && !namesOfRacesToShow.isEmpty())
? namesOfRacesToShow.get(0) : null,
/* ascending */ true, /* updateUponPlayStateChange */ raceDetails.isEmpty() && legDetails.isEmpty(),
raceColumnSelectionStrategy, showAddedScores, showOverallColumnWithNumberOfRacesSailedPerCompetitor,
showCompetitorSailIdColumn, showCompetitorFullNameColumn);
} else {
return new LeaderboardSettings(refreshIntervalMillis, numberOfLastRacesToShow, raceColumnSelectionStrategy);
@@ -289,7 +313,7 @@ public class LeaderboardEntryPoint extends AbstractSailingEntryPoint {
try {
result.add(DetailType.valueOf(entry));
} catch (IllegalArgumentException e) {
logger.info("Can't find detail type "+entry+". Ignoring.");
logger.info("Can't find detail type " + entry + ". Ignoring.");
}
}
}
@@ -303,19 +327,20 @@ public class LeaderboardEntryPoint extends AbstractSailingEntryPoint {
}
return result;
}
/**
* Assembles a dialog that other parts of the application can use to let the user parameterize a leaderboard and
* obtain the according URL for it. This keeps the "secrets" of which URL parameters have which meaning encapsulated
* within this class.<p>
* within this class.
* <p>
*
* The implementation by and large uses the {@link LeaderboardSettingsDialogComponent}'s widget and adds to it a checkbox
* for driving the {@link #LeaderboardUrlSettings.PARAM_EMBEDDED} field.
* The implementation by and large uses the {@link LeaderboardSettingsDialogComponent}'s widget and adds to it a
* checkbox for driving the {@link #LeaderboardUrlSettings.PARAM_EMBEDDED} field.
*
* @see LeaderboardEntryPoint#getUrl(String, LeaderboardSettings, boolean)
*/
public static DataEntryDialog<LeaderboardUrlSettings> getUrlConfigurationDialog(final AbstractLeaderboardDTO leaderboard,
final StringMessages stringMessages) {
public static DataEntryDialog<LeaderboardUrlSettings> getUrlConfigurationDialog(
final AbstractLeaderboardDTO leaderboard, final StringMessages stringMessages) {
return new LeaderboardUrlConfigurationDialog(stringMessages, leaderboard);
}
@@ -0,0 +1,38 @@
package com.sap.sailing.gwt.ui.leaderboard;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
import com.sap.sse.gwt.client.shared.perspective.AbstractPerspectiveComposite;
import com.sap.sse.gwt.client.shared.perspective.ComponentContext;
import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeSettings;
import com.sap.sse.gwt.client.shared.perspective.PerspectiveLifecycle;
public class LeaderboardPerspectiveComposite extends AbstractPerspectiveComposite {
public LeaderboardPerspectiveComposite(Component parent, ComponentContext componentContext,
PerspectiveLifecycle lifecycle, PerspectiveCompositeSettings settings) {
super(parent, componentContext, lifecycle, settings);
}
@Override
public SettingsDialogComponent getPerspectiveOwnSettingsDialogComponent() {
return null;
}
@Override
public boolean hasPerspectiveOwnSettings() {
return false;
}
@Override
public String getId() {
return null;
}
@Override
public String getDependentCssClassName() {
return null;
}
}
@@ -3,6 +3,7 @@ package com.sap.sailing.gwt.ui.leaderboard;
import com.sap.sailing.gwt.ui.client.StringMessages;
public class LeaderboardPerspectiveLifecycle extends AbstractLeaderboardPerspectiveLifecycle {
public static final String ID = "LeaderboardPerspectiveLifecycle";
public LeaderboardPerspectiveLifecycle(StringMessages stringMessages) {
super(stringMessages);
@@ -17,5 +18,4 @@ public class LeaderboardPerspectiveLifecycle extends AbstractLeaderboardPerspect
protected LeaderboardPerspectiveOwnSettings extractOwnContextSettings(LeaderboardPerspectiveOwnSettings settings) {
throw new IllegalStateException("Not supported");
}
}
@@ -93,7 +93,7 @@ public class LeaderboardViewer extends AbstractLeaderboardViewer<LeaderboardPers
public void onSuccess(List<String> result) {
if(result.size() == 1) {
String overallLeaderboardName = result.get(0);
overallLeaderboardPanel = new LeaderboardPanel(LeaderboardViewer.this,
overallLeaderboardPanel = new OverallLeaderboardPanel(LeaderboardViewer.this,
getComponentContext(), sailingService,
asyncActionsExecutor,
settings.findSettingsByComponentId(LeaderboardPanelLifecycle.ID),
@@ -103,6 +103,7 @@ public class LeaderboardViewer extends AbstractLeaderboardViewer<LeaderboardPers
false, /* adjustTimerDelay */ true, /* autoApplyTopNFilter */ false,
/* showCompetitorFilterStatus */ false, /* enableSyncScroller */ false);
mainPanel.add(overallLeaderboardPanel);
addChildComponent(overallLeaderboardPanel);
addComponentToNavigationMenu(overallLeaderboardPanel, true, stringMessages.seriesLeaderboard(),
/* hasSettingsWhenComponentIsInvisible*/ true);
}
@@ -1,12 +0,0 @@
package com.sap.sailing.gwt.ui.leaderboard;
import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeSettings;
import com.sap.sse.gwt.client.shared.perspective.SettingsStorageManager;
public class MetaLeaderboardComponentContext extends AbstractLeaderboardComponentContext<MetaLeaderboardPerspectiveLifecycle> {
public MetaLeaderboardComponentContext(MetaLeaderboardPerspectiveLifecycle rootLifecycle,
SettingsStorageManager<PerspectiveCompositeSettings<LeaderboardPerspectiveOwnSettings>> settingsStorageManager) {
super(rootLifecycle, settingsStorageManager);
}
}
@@ -1,21 +0,0 @@
package com.sap.sailing.gwt.ui.leaderboard;
import com.sap.sailing.gwt.ui.client.StringMessages;
public class MetaLeaderboardPerspectiveLifecycle extends AbstractLeaderboardPerspectiveLifecycle {
public MetaLeaderboardPerspectiveLifecycle(StringMessages stringMessages) {
super(stringMessages);
}
@Override
protected LeaderboardPerspectiveOwnSettings extractOwnGlobalSettings(LeaderboardPerspectiveOwnSettings settings) {
throw new IllegalStateException("Not supported");
}
@Override
protected LeaderboardPerspectiveOwnSettings extractOwnContextSettings(LeaderboardPerspectiveOwnSettings settings) {
throw new IllegalStateException("Not supported");
}
}
@@ -23,13 +23,13 @@ import com.sap.sse.gwt.client.useragent.UserAgentDetails;
* @author Frank Mittag (c163874)
* @author Axel Uhl (d043530)
*/
public class MetaLeaderboardViewer extends AbstractLeaderboardViewer<MetaLeaderboardPerspectiveLifecycle> {
private final MultiLeaderboardPanel multiLeaderboardPanel;
public class MetaLeaderboardViewer extends AbstractLeaderboardViewer<LeaderboardPerspectiveLifecycle> {
private final MultiLeaderboardProxyPanel multiLeaderboardPanel;
private final MultiCompetitorLeaderboardChart multiCompetitorChart;
public MetaLeaderboardViewer(Component<?> parent, MetaLeaderboardComponentContext componentContext,
MetaLeaderboardPerspectiveLifecycle lifecycle,
public MetaLeaderboardViewer(Component<?> parent, LeaderboardComponentContext componentContext,
LeaderboardPerspectiveLifecycle lifecycle,
PerspectiveCompositeSettings<LeaderboardPerspectiveOwnSettings> settings,
SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor,
Timer timer, String preselectedLeaderboardName, RegattaAndRaceIdentifier preselectedRace,
@@ -41,8 +41,8 @@ public class MetaLeaderboardViewer extends AbstractLeaderboardViewer<MetaLeaderb
errorReporter, stringMessages, userAgent, chartDetailType);
}
private MetaLeaderboardViewer(Component<?> parent, MetaLeaderboardComponentContext componentContext,
MetaLeaderboardPerspectiveLifecycle lifecycle,
private MetaLeaderboardViewer(Component<?> parent, LeaderboardComponentContext componentContext,
LeaderboardPerspectiveLifecycle lifecycle,
PerspectiveCompositeSettings<LeaderboardPerspectiveOwnSettings> settings,
CompetitorSelectionModel competitorSelectionModel, SailingServiceAsync sailingService,
AsyncActionsExecutor asyncActionsExecutor, Timer timer,
@@ -51,6 +51,8 @@ public class MetaLeaderboardViewer extends AbstractLeaderboardViewer<MetaLeaderb
UserAgentDetails userAgent, DetailType chartDetailType) {
super(parent, componentContext, lifecycle, settings, competitorSelectionModel, asyncActionsExecutor, timer,
stringMessages);
/**
* Cleanup one java8 suppliers can be used
*/
@@ -77,11 +79,13 @@ public class MetaLeaderboardViewer extends AbstractLeaderboardViewer<MetaLeaderb
multiCompetitorChart.setVisible(showCharts);
multiCompetitorChart.getElement().getStyle().setMarginTop(10, Unit.PX);
multiCompetitorChart.getElement().getStyle().setMarginBottom(10, Unit.PX);
multiLeaderboardPanel = new MultiLeaderboardPanel(this, componentContext, sailingService,
multiLeaderboardPanel = new MultiLeaderboardProxyPanel(this, componentContext, sailingService,
metaLeaderboardName,
asyncActionsExecutor, timer, false /* isEmbedded */,
preselectedLeaderboardName, preselectedRace, errorReporter, stringMessages,
userAgent, perspectiveSettings.isShowRaceDetails(), perspectiveSettings.isAutoExpandLastRaceColumn());
userAgent, perspectiveSettings.isShowRaceDetails(), perspectiveSettings.isAutoExpandLastRaceColumn(),
settings);
multiLeaderboardPanel.setVisible(perspectiveSettings.isShowSeriesLeaderboards());
mainPanel.add(getLeaderboardPanel());
mainPanel.add(multiCompetitorChart);
@@ -89,6 +93,14 @@ public class MetaLeaderboardViewer extends AbstractLeaderboardViewer<MetaLeaderb
addComponentToNavigationMenu(getLeaderboardPanel(), false, stringMessages.seriesLeaderboard(), /* hasSettingsWhenComponentIsInvisible*/ true);
addComponentToNavigationMenu(multiCompetitorChart, true, null, /* hasSettingsWhenComponentIsInvisible*/ true);
addComponentToNavigationMenu(multiLeaderboardPanel, true , stringMessages.regattaLeaderboards(), /* hasSettingsWhenComponentIsInvisible*/ false);
addChildComponent(multiLeaderboardPanel);
addChildComponent(multiCompetitorChart);
}
@Override
public String getId() {
return LeaderboardPerspectiveLifecycle.ID;
}
}
@@ -1,301 +1,37 @@
package com.sap.sailing.gwt.ui.leaderboard;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.LeaderboardUpdateListener;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.TimeListener;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.shared.components.AbstractLazyComponent;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
import com.sap.sse.gwt.client.shared.perspective.ComponentContext;
import com.sap.sse.gwt.client.useragent.UserAgentDetails;
/**
* A panel managing multiple {@link LeaderboardPanel}s (e.g. from a meta leaderboard) so that the user can switch between them.
* @author Frank
*/
public class MultiLeaderboardPanel extends AbstractLazyComponent<LeaderboardSettings> implements TimeListener, SelectedLeaderboardChangeProvider {
private LeaderboardPanel selectedLeaderboardPanel;
private FlowPanel selectedLeaderboardFlowPanel;
private final StringMessages stringMessages;
private final ErrorReporter errorReporter;
private final SailingServiceAsync sailingService;
private String selectedLeaderboardName;
private final AsyncActionsExecutor asyncActionsExecutor;
private final UserAgentDetails userAgent;
private final boolean showRaceDetails;
private final Timer timer;
private VerticalPanel mainPanel;
private final List<Util.Pair<String, String>> leaderboardNamesAndDisplayNames;
private final Map<String, LeaderboardSettings> leaderboardNamesAndSettings;
private TabPanel leaderboardsTabPanel;
private Label leaderboardsLabel;
private final String metaLeaderboardName;
private final boolean isEmbedded;
private final Set<LeaderboardUpdateListener> leaderboardUpdateListeners;
private final Set<SelectedLeaderboardChangeListener> selectedLeaderboardChangeListeners;
public MultiLeaderboardPanel(Component<?> parent, ComponentContext<?, ?> context,
SailingServiceAsync sailingService, String metaLeaderboardName,
AsyncActionsExecutor asyncActionsExecutor,
Timer timer, boolean isEmbedded, String preselectedLeaderboardName, RaceIdentifier preselectedRace,
ErrorReporter errorReporter, StringMessages stringMessages,
UserAgentDetails userAgent, boolean showRaceDetails, boolean autoExpandLastRaceColumn) {
super(parent, context);
this.stringMessages = stringMessages;
this.errorReporter = errorReporter;
this.sailingService = sailingService;
this.metaLeaderboardName = metaLeaderboardName;
this.asyncActionsExecutor = asyncActionsExecutor;
this.userAgent = userAgent;
this.showRaceDetails = showRaceDetails;
this.timer = timer;
this.isEmbedded = isEmbedded;
this.selectedLeaderboardName = preselectedLeaderboardName;
selectedLeaderboardFlowPanel = null;
selectedLeaderboardPanel = null;
leaderboardNamesAndDisplayNames = new ArrayList<Util.Pair<String, String>>();
leaderboardNamesAndSettings = new HashMap<String, LeaderboardSettings>();
leaderboardUpdateListeners = new HashSet<LeaderboardUpdateListener>();
selectedLeaderboardChangeListeners = new HashSet<SelectedLeaderboardChangeListener>();
}
private LeaderboardSettings getOrCreateLeaderboardSettings(String leaderboardName, LeaderboardSettings currentLeaderboardSettings) {
LeaderboardSettings newLeaderboardSettings = leaderboardNamesAndSettings.get(leaderboardName);
if(newLeaderboardSettings == null) {
newLeaderboardSettings = new LeaderboardSettings();
}
if(currentLeaderboardSettings != null) {
newLeaderboardSettings = LeaderboardSettingsFactory.getInstance().mergeLeaderboardSettings(newLeaderboardSettings, currentLeaderboardSettings);
}
leaderboardNamesAndSettings.put(leaderboardName, newLeaderboardSettings);
return newLeaderboardSettings;
}
@Override
public Widget createWidget() {
mainPanel = new VerticalPanel();
if(!isEmbedded) {
leaderboardsLabel = new Label(stringMessages.regattaLeaderboards());
leaderboardsLabel.setVisible(false);
leaderboardsLabel.getElement().getStyle().setFontWeight(FontWeight.BOLD);
leaderboardsLabel.getElement().getStyle().setMargin(5, Unit.PX);
mainPanel.add(leaderboardsLabel);
}
leaderboardsTabPanel = new TabPanel();
leaderboardsTabPanel.setVisible(false);
leaderboardsTabPanel.setAnimationEnabled(false);
leaderboardsTabPanel.setWidth("100%");
leaderboardsTabPanel.addSelectionHandler(new SelectionHandler<Integer>() {
@Override
public void onSelection(SelectionEvent<Integer> event) {
Integer tabIndex = event.getSelectedItem();
if(tabIndex >= 0) {
updateSelectedLeaderboard(leaderboardNamesAndDisplayNames.get(tabIndex).getA(), tabIndex);
}
}
});
mainPanel.add(leaderboardsTabPanel);
updateLeaderboardSelection();
return mainPanel;
}
@Override
public String getLocalizedShortName() {
return stringMessages.leaderboards();
}
@Override
public LeaderboardSettings getSettings() {
// TODO: Where do we get the LeaderboardSettings from?
return null;
}
@Override
public boolean hasSettings() {
return true;
}
@Override
public SettingsDialogComponent<LeaderboardSettings> getSettingsDialogComponent() {
return selectedLeaderboardPanel.getSettingsDialogComponent();
}
@Override
public void updateSettings(LeaderboardSettings newSettings) {
leaderboardNamesAndSettings.put(selectedLeaderboardName, newSettings);
selectedLeaderboardPanel.updateSettings(newSettings);
}
public void addLeaderboardUpdateListener(LeaderboardUpdateListener listener) {
this.leaderboardUpdateListeners.add(listener);
}
public void setLeaderboardNames(List<Util.Pair<String, String>> newLeaderboardNamesAndDisplayNames) {
leaderboardNamesAndDisplayNames.clear();
leaderboardNamesAndDisplayNames.addAll(newLeaderboardNamesAndDisplayNames);
updateLeaderboardSelection();
}
private void readAndUpdateLeaderboardsOfMetaleaderboard() {
sailingService.getLeaderboardsNamesOfMetaLeaderboard(metaLeaderboardName, new AsyncCallback<List<Util.Pair<String, String>>>() {
@Override
public void onSuccess(List<Util.Pair<String, String>> leaderboardNamesAndDisplayNames) {
setLeaderboardNames(leaderboardNamesAndDisplayNames);
}
@Override
public void onFailure(Throwable caught) {
GWT.log("Exception loading data", caught);
}
});
}
private void updateLeaderboardSelection() {
if (leaderboardsTabPanel != null) {
leaderboardsTabPanel.clear();
int index = 0;
int leaderboardCount = leaderboardNamesAndDisplayNames.size();
for (Util.Pair<String, String> leaderboardNameAndDisplayName : leaderboardNamesAndDisplayNames) {
FlowPanel tabFlowPanel = new FlowPanel();
leaderboardsTabPanel.add(tabFlowPanel, leaderboardNameAndDisplayName.getB(), false);
if (selectedLeaderboardName != null
&& selectedLeaderboardName.equals(leaderboardNameAndDisplayName.getA())) {
leaderboardsTabPanel.selectTab(index);
}
index++;
}
// show the last leaderboard when no leaderboard is selected yet
if (selectedLeaderboardName == null && leaderboardCount > 0) {
leaderboardsTabPanel.selectTab(leaderboardCount - 1);
}
leaderboardsTabPanel.setVisible(leaderboardCount > 0);
if (!isEmbedded) {
leaderboardsLabel.setVisible(leaderboardCount > 0);
}
}
}
private void updateSelectedLeaderboard(String newSelectedLeaderboardName, int newTabIndex) {
if (newSelectedLeaderboardName != null) {
if (selectedLeaderboardPanel != null && selectedLeaderboardFlowPanel != null) {
selectedLeaderboardPanel.removeAllListeners();
selectedLeaderboardFlowPanel.remove(selectedLeaderboardPanel);
selectedLeaderboardPanel = null;
selectedLeaderboardFlowPanel = null;
}
selectedLeaderboardFlowPanel = (FlowPanel) leaderboardsTabPanel.getWidget(newTabIndex);
LeaderboardSettings newLeaderboardSettings = getOrCreateLeaderboardSettings(newSelectedLeaderboardName, leaderboardNamesAndSettings.get(selectedLeaderboardName));
LeaderboardPanel newSelectedLeaderboardPanel = new LeaderboardPanel(this, getComponentContext(),
sailingService,
asyncActionsExecutor, newLeaderboardSettings, isEmbedded,
/* preselectedRace*/ null, new CompetitorSelectionModel(true), timer,
null, newSelectedLeaderboardName, errorReporter, stringMessages, userAgent,
showRaceDetails, /* competitorSearchTextBox */ null, /* showSelectionCheckbox */ true, /* raceTimesInfoProvider */null,
false, /* adjustTimerDelay */ true, /* autoApplyTopNFilter */ false,
/* showCompetitorFilterStatus */ false, /* enableSyncScroller */ false);
selectedLeaderboardFlowPanel.add(newSelectedLeaderboardPanel);
for (LeaderboardUpdateListener listener : leaderboardUpdateListeners) {
newSelectedLeaderboardPanel.addLeaderboardUpdateListener(listener);
}
setSelectedLeaderboard(newSelectedLeaderboardPanel);
} else {
if (selectedLeaderboardPanel != null && selectedLeaderboardFlowPanel != null) {
selectedLeaderboardPanel.removeAllListeners();
selectedLeaderboardFlowPanel.remove(selectedLeaderboardPanel);
selectedLeaderboardPanel = null;
selectedLeaderboardFlowPanel = null;
}
}
this.selectedLeaderboardName = newSelectedLeaderboardName;
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
readAndUpdateLeaderboardsOfMetaleaderboard();
} else {
updateSelectedLeaderboard(null, -1);
}
}
@Override
public void timeChanged(Date newTime, Date oldTime) {
if (selectedLeaderboardPanel != null) {
selectedLeaderboardPanel.timeChanged(newTime, oldTime);
}
}
@Override
public void addSelectedLeaderboardChangeListener(SelectedLeaderboardChangeListener listener) {
selectedLeaderboardChangeListeners.add(listener);
}
@Override
public void removeSelectedLeaderboardChangeListener(SelectedLeaderboardChangeListener listener) {
selectedLeaderboardChangeListeners.remove(listener);
}
@Override
public void setSelectedLeaderboard(LeaderboardPanel selectedLeaderboard) {
if (this.selectedLeaderboardPanel != selectedLeaderboard) {
this.selectedLeaderboardPanel = selectedLeaderboard;
for (SelectedLeaderboardChangeListener listener : selectedLeaderboardChangeListeners) {
listener.onSelectedLeaderboardChanged(selectedLeaderboardPanel);
}
}
}
public void removeLeaderboardUpdateListener(LeaderboardUpdateListener leaderboardUpdateListener) {
leaderboardUpdateListeners.remove(leaderboardUpdateListener);
}
@Override
public String getId() {
return "MultiLeaderboardPanel";
}
}
package com.sap.sailing.gwt.ui.leaderboard;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.perspective.ComponentContext;
import com.sap.sse.gwt.client.useragent.UserAgentDetails;
/**
* Represents a single Leaderboard in the Context of a MultiLeaderboard
*
*/
public class MultiLeaderboardPanel extends LeaderboardPanel {
public MultiLeaderboardPanel(Component<?> parent, ComponentContext<?, ?> context,
SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, LeaderboardSettings settings,
boolean isEmbedded, RegattaAndRaceIdentifier preSelectedRace,
CompetitorSelectionProvider competitorSelectionProvider, Timer timer, String leaderboardGroupName,
String leaderboardName, ErrorReporter errorReporter, StringMessages stringMessages,
UserAgentDetails userAgent, boolean showRaceDetails, CompetitorFilterPanel competitorSearchTextBox,
boolean showSelectionCheckbox, RaceTimesInfoProvider optionalRaceTimesInfoProvider,
boolean autoExpandLastRaceColumn, boolean adjustTimerDelay, boolean autoApplyTopNFilter,
boolean showCompetitorFilterStatus, boolean enableSyncScroller) {
super(parent, context, sailingService, asyncActionsExecutor, settings, isEmbedded, preSelectedRace,
competitorSelectionProvider, timer, leaderboardGroupName, leaderboardName, errorReporter,
stringMessages, userAgent, showRaceDetails, competitorSearchTextBox, showSelectionCheckbox,
optionalRaceTimesInfoProvider, autoExpandLastRaceColumn, adjustTimerDelay, autoApplyTopNFilter,
showCompetitorFilterStatus, enableSyncScroller);
}
}
@@ -0,0 +1,22 @@
package com.sap.sailing.gwt.ui.leaderboard;
import com.sap.sailing.domain.common.dto.AbstractLeaderboardDTO;
import com.sap.sailing.gwt.ui.client.StringMessages;
public class MultiLeaderboardPanelLifecycle extends LeaderboardPanelLifecycle {
public static final String MID = "MultiLeaderboardPanel";
public MultiLeaderboardPanelLifecycle(AbstractLeaderboardDTO leaderboard, StringMessages stringMessages) {
super(leaderboard, stringMessages);
}
@Override
public String getComponentId() {
return MID;
}
@Override
public LeaderboardSettings extractContextSettings(LeaderboardSettings leaderboardSettings) {
return createDefaultSettings();
}
}
@@ -0,0 +1,320 @@
package com.sap.sailing.gwt.ui.leaderboard;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.RaceIdentifier;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.LeaderboardUpdateListener;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.TimeListener;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.shared.components.AbstractLazyComponent;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
import com.sap.sse.gwt.client.shared.perspective.AbstractComponentContextWithSettingsStorage;
import com.sap.sse.gwt.client.shared.perspective.ComponentContext;
import com.sap.sse.gwt.client.shared.perspective.PerspectiveCompositeSettings;
import com.sap.sse.gwt.client.useragent.UserAgentDetails;
/**
* A panel managing multiple {@link LeaderboardPanel}s (e.g. from a meta leaderboard) so that the user can switch between them.
* @author Frank
*/
public class MultiLeaderboardProxyPanel extends AbstractLazyComponent<LeaderboardSettings> implements TimeListener, SelectedLeaderboardChangeProvider {
private LeaderboardPanel selectedLeaderboardPanel;
private FlowPanel selectedLeaderboardFlowPanel;
private final StringMessages stringMessages;
private final ErrorReporter errorReporter;
private final SailingServiceAsync sailingService;
private String selectedLeaderboardName;
private final AsyncActionsExecutor asyncActionsExecutor;
private final UserAgentDetails userAgent;
private final boolean showRaceDetails;
private final Timer timer;
private VerticalPanel mainPanel;
private final List<Util.Pair<String, String>> leaderboardNamesAndDisplayNames;
private TabPanel leaderboardsTabPanel;
private Label leaderboardsLabel;
private final String metaLeaderboardName;
private final boolean isEmbedded;
private final Set<LeaderboardUpdateListener> leaderboardUpdateListeners;
private final Set<SelectedLeaderboardChangeListener> selectedLeaderboardChangeListeners;
private HashMap<String, LeaderboardSettings> contextStore;
private LeaderboardSettings loadedSettings;
public MultiLeaderboardProxyPanel(Component<?> parent, ComponentContext<?, ?> context,
SailingServiceAsync sailingService, String metaLeaderboardName,
AsyncActionsExecutor asyncActionsExecutor,
Timer timer, boolean isEmbedded, String preselectedLeaderboardName, RaceIdentifier preselectedRace,
ErrorReporter errorReporter, StringMessages stringMessages,
UserAgentDetails userAgent, boolean showRaceDetails, boolean autoExpandLastRaceColumn,
PerspectiveCompositeSettings<LeaderboardPerspectiveOwnSettings> settings) {
super(parent, context);
loadedSettings = settings.findSettingsByComponentId(MultiLeaderboardPanelLifecycle.MID);
if (loadedSettings == null) {
loadedSettings = LeaderboardSettingsFactory.getInstance().createNewSettingsWithCustomDefaults(null);
}
this.stringMessages = stringMessages;
this.errorReporter = errorReporter;
this.sailingService = sailingService;
this.metaLeaderboardName = metaLeaderboardName;
this.asyncActionsExecutor = asyncActionsExecutor;
this.userAgent = userAgent;
this.showRaceDetails = showRaceDetails;
this.timer = timer;
this.isEmbedded = isEmbedded;
this.selectedLeaderboardName = preselectedLeaderboardName;
selectedLeaderboardFlowPanel = null;
selectedLeaderboardPanel = null;
leaderboardNamesAndDisplayNames = new ArrayList<Util.Pair<String, String>>();
/**
* This only stores the ContextSpecific settings, as they differ for all Leaderboards
*/
leaderboardUpdateListeners = new HashSet<LeaderboardUpdateListener>();
selectedLeaderboardChangeListeners = new HashSet<SelectedLeaderboardChangeListener>();
contextStore = new HashMap<>();
}
@Override
public Widget createWidget() {
mainPanel = new VerticalPanel();
if(!isEmbedded) {
leaderboardsLabel = new Label(stringMessages.regattaLeaderboards());
leaderboardsLabel.setVisible(false);
leaderboardsLabel.getElement().getStyle().setFontWeight(FontWeight.BOLD);
leaderboardsLabel.getElement().getStyle().setMargin(5, Unit.PX);
mainPanel.add(leaderboardsLabel);
}
leaderboardsTabPanel = new TabPanel();
leaderboardsTabPanel.setVisible(false);
leaderboardsTabPanel.setAnimationEnabled(false);
leaderboardsTabPanel.setWidth("100%");
leaderboardsTabPanel.addSelectionHandler(new SelectionHandler<Integer>() {
@Override
public void onSelection(SelectionEvent<Integer> event) {
Integer tabIndex = event.getSelectedItem();
if(tabIndex >= 0) {
updateSelectedLeaderboard(leaderboardNamesAndDisplayNames.get(tabIndex).getA(), tabIndex);
}
}
});
mainPanel.add(leaderboardsTabPanel);
updateLeaderboardSelection();
return mainPanel;
}
@Override
public String getLocalizedShortName() {
return stringMessages.leaderboards();
}
@Override
public boolean hasSettings() {
return true;
}
@Override
public LeaderboardSettings getSettings() {
return selectedLeaderboardPanel.getSettings();
}
@Override
public SettingsDialogComponent<LeaderboardSettings> getSettingsDialogComponent() {
return selectedLeaderboardPanel.getSettingsDialogComponent();
}
@SuppressWarnings("rawtypes")
@Override
public void updateSettings(LeaderboardSettings newSettings) {
ComponentContext<?, ?> ctx = getComponentContext();
// store contextspecific setting in this hashmap, so they are not lost on tab change
if (ctx instanceof AbstractComponentContextWithSettingsStorage) {
@SuppressWarnings("unchecked")
AbstractComponentContextWithSettingsStorage<?, LeaderboardSettings> cctx = (AbstractComponentContextWithSettingsStorage) ctx;
LeaderboardSettings contextSettings = cctx.extractContextSettings(this, newSettings);
contextStore.put(selectedLeaderboardPanel.getLeaderboardName(), contextSettings);
}
selectedLeaderboardPanel.updateSettings(newSettings);
}
public void addLeaderboardUpdateListener(LeaderboardUpdateListener listener) {
this.leaderboardUpdateListeners.add(listener);
}
public void setLeaderboardNames(List<Util.Pair<String, String>> newLeaderboardNamesAndDisplayNames) {
leaderboardNamesAndDisplayNames.clear();
leaderboardNamesAndDisplayNames.addAll(newLeaderboardNamesAndDisplayNames);
updateLeaderboardSelection();
}
private void readAndUpdateLeaderboardsOfMetaleaderboard() {
sailingService.getLeaderboardsNamesOfMetaLeaderboard(metaLeaderboardName, new AsyncCallback<List<Util.Pair<String, String>>>() {
@Override
public void onSuccess(List<Util.Pair<String, String>> leaderboardNamesAndDisplayNames) {
setLeaderboardNames(leaderboardNamesAndDisplayNames);
}
@Override
public void onFailure(Throwable caught) {
GWT.log("Exception loading data", caught);
}
});
}
private void updateLeaderboardSelection() {
if (leaderboardsTabPanel != null) {
leaderboardsTabPanel.clear();
int index = 0;
int leaderboardCount = leaderboardNamesAndDisplayNames.size();
for (Util.Pair<String, String> leaderboardNameAndDisplayName : leaderboardNamesAndDisplayNames) {
FlowPanel tabFlowPanel = new FlowPanel();
leaderboardsTabPanel.add(tabFlowPanel, leaderboardNameAndDisplayName.getB(), false);
if (selectedLeaderboardName != null
&& selectedLeaderboardName.equals(leaderboardNameAndDisplayName.getA())) {
leaderboardsTabPanel.selectTab(index);
}
index++;
}
// show the last leaderboard when no leaderboard is selected yet
if (selectedLeaderboardName == null && leaderboardCount > 0) {
leaderboardsTabPanel.selectTab(leaderboardCount - 1);
}
leaderboardsTabPanel.setVisible(leaderboardCount > 0);
if (!isEmbedded) {
leaderboardsLabel.setVisible(leaderboardCount > 0);
}
}
}
private void updateSelectedLeaderboard(String newSelectedLeaderboardName, int newTabIndex) {
if (newSelectedLeaderboardName != null) {
if (selectedLeaderboardPanel != null && selectedLeaderboardFlowPanel != null) {
selectedLeaderboardPanel.removeAllListeners();
selectedLeaderboardFlowPanel.remove(selectedLeaderboardPanel);
selectedLeaderboardPanel = null;
selectedLeaderboardFlowPanel = null;
}
selectedLeaderboardFlowPanel = (FlowPanel) leaderboardsTabPanel.getWidget(newTabIndex);
LeaderboardSettings toMerge = contextStore.get(newSelectedLeaderboardName);
if (toMerge != null) {
toMerge = mergeContext(loadedSettings, toMerge);
} else {
toMerge = loadedSettings;
}
MultiLeaderboardPanel newSelectedLeaderboardPanel = new MultiLeaderboardPanel(this, getComponentContext(),
sailingService,
asyncActionsExecutor, toMerge, isEmbedded,
/* preselectedRace*/ null, new CompetitorSelectionModel(true), timer,
null, newSelectedLeaderboardName, errorReporter, stringMessages, userAgent,
showRaceDetails, /* competitorSearchTextBox */ null, /* showSelectionCheckbox */ true, /* raceTimesInfoProvider */null,
false, /* adjustTimerDelay */ true, /* autoApplyTopNFilter */ false,
/* showCompetitorFilterStatus */ false, /* enableSyncScroller */ false);
selectedLeaderboardFlowPanel.add(newSelectedLeaderboardPanel);
for (LeaderboardUpdateListener listener : leaderboardUpdateListeners) {
newSelectedLeaderboardPanel.addLeaderboardUpdateListener(listener);
}
setSelectedLeaderboard(newSelectedLeaderboardPanel);
} else {
if (selectedLeaderboardPanel != null && selectedLeaderboardFlowPanel != null) {
selectedLeaderboardPanel.removeAllListeners();
selectedLeaderboardFlowPanel.remove(selectedLeaderboardPanel);
selectedLeaderboardPanel = null;
selectedLeaderboardFlowPanel = null;
}
}
this.selectedLeaderboardName = newSelectedLeaderboardName;
}
private LeaderboardSettings mergeContext(LeaderboardSettings settings, LeaderboardSettings toMerge) {
return LeaderboardSettingsFactory.getInstance().mergeLeaderboardSettings(toMerge, settings);
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
readAndUpdateLeaderboardsOfMetaleaderboard();
} else {
updateSelectedLeaderboard(null, -1);
}
}
@Override
public void timeChanged(Date newTime, Date oldTime) {
if (selectedLeaderboardPanel != null) {
selectedLeaderboardPanel.timeChanged(newTime, oldTime);
}
}
@Override
public void addSelectedLeaderboardChangeListener(SelectedLeaderboardChangeListener listener) {
selectedLeaderboardChangeListeners.add(listener);
}
@Override
public void removeSelectedLeaderboardChangeListener(SelectedLeaderboardChangeListener listener) {
selectedLeaderboardChangeListeners.remove(listener);
}
@Override
public void setSelectedLeaderboard(LeaderboardPanel selectedLeaderboard) {
if (this.selectedLeaderboardPanel != selectedLeaderboard) {
this.selectedLeaderboardPanel = selectedLeaderboard;
for (SelectedLeaderboardChangeListener listener : selectedLeaderboardChangeListeners) {
listener.onSelectedLeaderboardChanged(selectedLeaderboardPanel);
}
}
}
public void removeLeaderboardUpdateListener(LeaderboardUpdateListener leaderboardUpdateListener) {
leaderboardUpdateListeners.remove(leaderboardUpdateListener);
}
@Override
public String getId() {
return MultiLeaderboardPanelLifecycle.MID;
}
}
@@ -0,0 +1,37 @@
package com.sap.sailing.gwt.ui.leaderboard;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionProvider;
import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.Timer;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.perspective.ComponentContext;
import com.sap.sse.gwt.client.useragent.UserAgentDetails;
public class OverallLeaderboardPanel extends LeaderboardPanel {
public OverallLeaderboardPanel(Component<?> parent, ComponentContext<?, ?> context,
SailingServiceAsync sailingService, AsyncActionsExecutor asyncActionsExecutor, LeaderboardSettings settings,
boolean isEmbedded, RegattaAndRaceIdentifier preSelectedRace,
CompetitorSelectionProvider competitorSelectionProvider, Timer timer, String leaderboardGroupName,
String leaderboardName, ErrorReporter errorReporter, StringMessages stringMessages,
UserAgentDetails userAgent, boolean showRaceDetails, CompetitorFilterPanel competitorSearchTextBox,
boolean showSelectionCheckbox, RaceTimesInfoProvider optionalRaceTimesInfoProvider,
boolean autoExpandLastRaceColumn, boolean adjustTimerDelay, boolean autoApplyTopNFilter,
boolean showCompetitorFilterStatus, boolean enableSyncScroller) {
super(parent, context, sailingService, asyncActionsExecutor, settings, isEmbedded, preSelectedRace,
competitorSelectionProvider, timer, leaderboardGroupName, leaderboardName, errorReporter,
stringMessages, userAgent, showRaceDetails, competitorSearchTextBox, showSelectionCheckbox,
optionalRaceTimesInfoProvider, autoExpandLastRaceColumn, adjustTimerDelay, autoApplyTopNFilter,
showCompetitorFilterStatus, enableSyncScroller);
}
@Override
public String getId() {
return OverallLeaderboardPanelLifecycle.ID;
}
}
@@ -0,0 +1,18 @@
package com.sap.sailing.gwt.ui.leaderboard;
import com.sap.sailing.domain.common.dto.AbstractLeaderboardDTO;
import com.sap.sailing.gwt.ui.client.StringMessages;
public class OverallLeaderboardPanelLifecycle extends LeaderboardPanelLifecycle {
protected static final String ID = "OverallLeaderboardPanel";
public OverallLeaderboardPanelLifecycle(AbstractLeaderboardDTO leaderboard, StringMessages stringMessages) {
super(leaderboard, stringMessages);
}
public static String getId() {
return ID;
}
}
@@ -34,7 +34,7 @@ public abstract class AbstractLazyComponent<SettingsType extends Settings> exten
@Override
public ArrayList<String> getPath() {
return ComponentPathDeterminer.determinePath(parent);
return ComponentPathDeterminer.determinePath(this);
}
@Override
@@ -181,12 +181,32 @@ public abstract class AbstractComponentContextWithSettingsStorage<L extends Comp
return false;
}
@SuppressWarnings("unchecked")
public S extractGlobalSettings(Component<? extends Settings> component, Settings newDefaultSettings) {
L targetLifeCycle = determineLifeCycle(component.getPath(), rootLifecycle);
return extractGlobalSettings((S) newDefaultSettings, targetLifeCycle);
}
@SuppressWarnings("unchecked")
public S extractContextSettings(Component<? extends Settings> component, Settings newDefaultSettings) {
L targetLifeCycle = determineLifeCycle(component.getPath(), rootLifecycle);
return extractContextSettings((S) newDefaultSettings, targetLifeCycle);
}
private S extractGlobalSettings(S newDefaultSettings, L targetLifeCycle) {
return targetLifeCycle.extractGlobalSettings((S) newDefaultSettings);
}
private S extractContextSettings(S newDefaultSettings, L targetLifeCycle) {
return targetLifeCycle.extractContextSettings((S) newDefaultSettings);
}
@SuppressWarnings("unchecked")
@Override
public void makeSettingsDefault(Component<? extends Settings> component, Settings newDefaultSettings) {
L targetLifeCycle = determineLifeCycle(component.getPath(), rootLifecycle);
Settings globalSettings = targetLifeCycle.extractGlobalSettings((S) newDefaultSettings);
Settings contextSettings = targetLifeCycle.extractContextSettings((S) newDefaultSettings);
S globalSettings = extractGlobalSettings((S) newDefaultSettings, targetLifeCycle);
S contextSettings = extractContextSettings((S) newDefaultSettings, targetLifeCycle);
updateSettings(component.getPath(), globalSettings, contextSettings);
}