mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-25 05:23:51 +00:00
Leaderboard settings
This commit is contained in:
1 parent
b44f5cc0d1
commit
40b76ed703
22 files changed
+638
-446
No files matched your search
+4
-4
@@ -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
-2
@@ -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));
|
||||
|
||||
+6
-6
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -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,
|
||||
|
||||
+3
-8
@@ -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;
|
||||
|
||||
-5
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package com.sap.sailing.gwt.ui.leaderboard;
|
||||
|
||||
public class LeaderBoardPerspectiveSettings {
|
||||
|
||||
}
|
||||
+2
-1
@@ -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) {
|
||||
|
||||
+96
-71
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+38
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
+2
-1
@@ -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);
|
||||
}
|
||||
|
||||
-12
@@ -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);
|
||||
}
|
||||
}
|
||||
-21
@@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
+20
-8
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+37
-301
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+22
@@ -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();
|
||||
}
|
||||
}
|
||||
+320
@@ -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;
|
||||
}
|
||||
}
|
||||
+37
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+18
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -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
|
||||
|
||||
+22
-2
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user