From 3d2b04ed4e77cc1ab2bbcf39d71210bac05682a7 Mon Sep 17 00:00:00 2001 From: fmittag Date: Sat, 18 Feb 2012 17:12:44 +0100 Subject: [PATCH] further TimePanel und RaceTimePanel adjustments, new setting for automated calculation of delay for live mode simulation --- .../sailing/gwt/ui/client/RaceTimePanel.java | 36 ++++++++--- .../gwt/ui/client/RaceTimePanelSettings.java | 20 +++++++ .../RaceTimePanelSettingsDialogComponent.java | 38 ++++++++++++ .../sap/sailing/gwt/ui/client/TimePanel.java | 59 +++++++++++-------- .../TimePanelSettingsDialogComponent.java | 48 ++++++++------- .../gwt/ui/raceboard/RaceBoardPanel.java | 6 +- .../gwt/ui/server/SailingServiceImpl.java | 2 +- .../gwt/ui/shared/RaceTimesInfoDTO.java | 6 +- 8 files changed, 156 insertions(+), 59 deletions(-) create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanelSettings.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanelSettingsDialogComponent.java diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanel.java index 8752fe02be8..fcb8e36992b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanel.java @@ -11,8 +11,9 @@ import com.sap.sailing.gwt.ui.client.Timer.PlayModes; import com.sap.sailing.gwt.ui.client.Timer.PlayStates; import com.sap.sailing.gwt.ui.shared.LegTimesInfoDTO; import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO; +import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; -public class RaceTimePanel extends TimePanel implements RaceSelectionChangeListener { +public class RaceTimePanel extends TimePanel implements RaceSelectionChangeListener { private final SailingServiceAsync sailingService; private final ErrorReporter errorReporter; @@ -24,6 +25,8 @@ public class RaceTimePanel extends TimePanel implements RaceSelectionChangeListe private boolean isTimerInitialized = false; + private RaceTimesInfoDTO lastRaceTimesInfo; + public RaceTimePanel(final SailingServiceAsync sailingService, Timer timer, ErrorReporter errorReporter, StringMessages stringMessages) { super(timer, stringMessages); @@ -65,7 +68,7 @@ public class RaceTimePanel extends TimePanel implements RaceSelectionChangeListe } @Override - public void updateSettings(TimePanelSettings newSettings) { + public void updateSettings(RaceTimePanelSettings newSettings) { super.updateSettings(newSettings); isTimerInitialized = false; @@ -74,23 +77,38 @@ public class RaceTimePanel extends TimePanel implements RaceSelectionChangeListe readRaceTimesInfo(); } + @Override + public RaceTimePanelSettings getSettings() { + RaceTimePanelSettings result = new RaceTimePanelSettings(); + result.setDelayToLivePlayInSeconds(timer.getLivePlayDelayInMillis()/1000); + result.setRefreshInterval(timer.getRefreshInterval()); + result.setRaceTimesInfo(lastRaceTimesInfo); + return result; + } + + @Override + public SettingsDialogComponent getSettingsDialogComponent() { + return new RaceTimePanelSettingsDialogComponent(getSettings(), stringMessages); + } + private void updateTimeInfos(RaceTimesInfoDTO raceTimesInfo) { - if(raceTimesInfo == null || raceTimesInfo.timePointOfNewestEvent == null) { + lastRaceTimesInfo = raceTimesInfo; + + if(raceTimesInfo == null || raceTimesInfo.timePointOfNewestEvent == null || raceTimesInfo.startOfTracking == null) { reset(); } else { // we set here the min and max of the time slider, the start and end of the race as well as the knows leg markers if(!isTimerInitialized) { - // manipulation of delay to make the event 'live' -// long lastEventTimeDelay = System.currentTimeMillis() - raceTimesInfo.timePointOfNewestEvent.getTime() + 1000; -// timer.setDelay(lastEventTimeDelay); - long livePlayDelayInMillis = timer.getLivePlayDelayInMillis(); + long liveTimePointInMillis = System.currentTimeMillis() - livePlayDelayInMillis; - if(raceTimesInfo.timePointOfNewestEvent.getTime() > System.currentTimeMillis() - livePlayDelayInMillis) + if(liveTimePointInMillis < raceTimesInfo.timePointOfNewestEvent.getTime() && + liveTimePointInMillis > raceTimesInfo.startOfTracking.getTime()) { timer.setPlayMode(PlayModes.Live); - else + } else { timer.setPlayMode(PlayModes.Replay); + } initMinMax(raceTimesInfo); initTimerPosition(raceTimesInfo); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanelSettings.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanelSettings.java new file mode 100644 index 00000000000..bc3c6b7c74b --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanelSettings.java @@ -0,0 +1,20 @@ +package com.sap.sailing.gwt.ui.client; + +import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO; + +public class RaceTimePanelSettings extends TimePanelSettings { + private RaceTimesInfoDTO raceTimesInfo; + + public RaceTimePanelSettings() { + super(); + } + + public RaceTimesInfoDTO getRaceTimesInfo() { + return raceTimesInfo; + } + + public void setRaceTimesInfo(RaceTimesInfoDTO raceTimesInfo) { + this.raceTimesInfo = raceTimesInfo; + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanelSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanelSettingsDialogComponent.java new file mode 100644 index 00000000000..9f780d6617c --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanelSettingsDialogComponent.java @@ -0,0 +1,38 @@ +package com.sap.sailing.gwt.ui.client; + +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO; + +public class RaceTimePanelSettingsDialogComponent extends TimePanelSettingsDialogComponent { + + public RaceTimePanelSettingsDialogComponent(RaceTimePanelSettings settings, StringMessages stringMessages) { + super(settings, stringMessages); + } + + @Override + public Widget getAdditionalWidget(DataEntryDialog dialog) { + Widget widget = super.getAdditionalWidget(dialog); + + HorizontalPanel labelAndTDelayForLiveBoxPanel = new HorizontalPanel(); + labelAndTDelayForLiveBoxPanel.setSpacing(5); + labelAndTDelayForLiveBoxPanel.add(new Label("Delay for live mode:")); + RaceTimesInfoDTO raceTimesInfo = initialSettings.getRaceTimesInfo(); + if(raceTimesInfo != null && raceTimesInfo.startOfTracking != null) { + long delayforLiveModeInMs = System.currentTimeMillis() - raceTimesInfo.getStartOfTracking().getTime(); + labelAndTDelayForLiveBoxPanel.add(new Label(delayforLiveModeInMs / 1000 + " s")); + } + mainContentPanel.add(labelAndTDelayForLiveBoxPanel); + + return widget; + } + + @Override + public RaceTimePanelSettings getResult() { + RaceTimePanelSettings result = new RaceTimePanelSettings(); + result.setDelayToLivePlayInSeconds(timeDelayBox.getValue() == null ? -1 : timeDelayBox.getValue()); + result.setRefreshInterval(refreshIntervalBox.getValue() == null ? -1 : (long) (refreshIntervalBox.getValue() * 1000)); + return result; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java index 150dcb8fe3d..1c4c04ea505 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanel.java @@ -30,7 +30,7 @@ import com.sap.sailing.gwt.ui.shared.components.SettingsDialog; import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; import com.sap.sailing.gwt.ui.shared.controls.slider.SliderBar; -public class TimePanel extends FormPanel implements Component, TimeListener, PlayStateListener, RequiresResize { +public class TimePanel extends FormPanel implements Component, TimeListener, PlayStateListener, RequiresResize { protected final Timer timer; private final IntegerBox playSpeedBox; private final Label timeDelayLabel; @@ -39,9 +39,9 @@ public class TimePanel extends FormPanel implements Component private final Label playModeLabel; protected final SliderBar sliderBar; private final Button backToLivePlayButton; - private final StringMessages stringMessages; - private final DateTimeFormat dateFormatter = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.DATE_FULL); - private final DateTimeFormat timeFormatter = DateTimeFormat.getFormat("HH:mm:ss"); + protected final StringMessages stringMessages; + protected final DateTimeFormat dateFormatter = DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.DATE_FULL); + protected final DateTimeFormat timeFormatter = DateTimeFormat.getFormat("HH:mm:ss"); private final ImageResource playButtonImg; private final ImageResource pauseButtonImg; private final ImageResource playSpeedImg; @@ -50,7 +50,9 @@ public class TimePanel extends FormPanel implements Component private final ImageResource playModeInactiveImg; private final Image playPauseImage; private final Image playModeImage; - private Date lastReceivedDataTimepoint; + protected Date lastReceivedDataTimepoint; + private final Button slowDownButton; + private final Button speedUpButton; private static ClientResources resources = GWT.create(ClientResources.class); @@ -63,7 +65,7 @@ public class TimePanel extends FormPanel implements Component @Override public void onClick(ClickEvent event) { - new SettingsDialog(TimePanel.this, stringConstants).show(); + new SettingsDialog(TimePanel.this, stringConstants).show(); } } @@ -136,8 +138,21 @@ public class TimePanel extends FormPanel implements Component } } }); + playPauseImage.getElement().getStyle().setFloat(Style.Float.LEFT); + playPauseImage.getElement().getStyle().setPadding(3, Style.Unit.PX); playControlPanel.add(playPauseImage); - + + backToLivePlayButton = new Button("Live"); + backToLivePlayButton.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + TimePanel.this.timer.resume(); + } + }); + backToLivePlayButton.getElement().getStyle().setFloat(Style.Float.LEFT); + backToLivePlayButton.getElement().getStyle().setPadding(3, Style.Unit.PX); + playControlPanel.add(backToLivePlayButton); + // current date and time control FlowPanel timeControlPanel = new FlowPanel(); timeControlPanel.setStyleName("timePanel-controls-time"); @@ -166,15 +181,6 @@ public class TimePanel extends FormPanel implements Component playModeLabel.getElement().getStyle().setFloat(Style.Float.LEFT); playModeLabel.getElement().getStyle().setPadding(5, Style.Unit.PX); - backToLivePlayButton = new Button("> Live"); - backToLivePlayButton.addClickHandler(new ClickHandler() { - @Override - public void onClick(ClickEvent event) { - TimePanel.this.timer.play(); - } - }); - controlsPanel.add(backToLivePlayButton); - // play speed controls FlowPanel playSpeedControlPanel = new FlowPanel(); playSpeedControlPanel.setStyleName("timePanel-controls-playSpeed"); @@ -189,7 +195,7 @@ public class TimePanel extends FormPanel implements Component playSpeedControlPanel.add(playSpeedImage); playSpeedControlPanel.add(playSpeedBox); - Button slowDownButton = new Button("-1"); + slowDownButton = new Button("-1"); slowDownButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { @@ -199,7 +205,7 @@ public class TimePanel extends FormPanel implements Component }); playSpeedControlPanel.add(slowDownButton); - Button speedUpButton = new Button("+1"); + speedUpButton = new Button("+1"); speedUpButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { @@ -333,6 +339,9 @@ public class TimePanel extends FormPanel implements Component timeDelayLabel.setVisible(true); sliderBar.setEnabled(true); backToLivePlayButton.setVisible(true); + playSpeedBox.setEnabled(false); + slowDownButton.setEnabled(false); + speedUpButton.setEnabled(false); break; case Replay: timeDelayLabel.setVisible(false); @@ -340,15 +349,19 @@ public class TimePanel extends FormPanel implements Component playModeLabel.setText(stringMessages.playModeReplay()); sliderBar.setEnabled(true); backToLivePlayButton.setVisible(false); + playSpeedBox.setEnabled(true); + slowDownButton.setEnabled(true); + speedUpButton.setEnabled(true); break; } } - public TimePanelSettings getSettings() { + @SuppressWarnings("unchecked") + public T getSettings() { TimePanelSettings result = new TimePanelSettings(); result.setDelayToLivePlayInSeconds(timer.getLivePlayDelayInMillis()/1000); result.setRefreshInterval(timer.getRefreshInterval()); - return result; + return (T) result; } @Override @@ -362,12 +375,12 @@ public class TimePanel extends FormPanel implements Component } @Override - public SettingsDialogComponent getSettingsDialogComponent() { - return new TimePanelSettingsDialogComponent(getSettings(), stringMessages); + public SettingsDialogComponent getSettingsDialogComponent() { + return new TimePanelSettingsDialogComponent(getSettings(), stringMessages); } @Override - public void updateSettings(TimePanelSettings newSettings) { + public void updateSettings(T newSettings) { boolean delayChanged = newSettings.getDelayToLivePlayInSeconds() != getSettings().getDelayToLivePlayInSeconds(); if (delayChanged) { timer.setDelay(1000l * newSettings.getDelayToLivePlayInSeconds()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanelSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanelSettingsDialogComponent.java index e231c9176eb..c2fd84f00b5 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanelSettingsDialogComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/TimePanelSettingsDialogComponent.java @@ -10,47 +10,51 @@ import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.ui.client.DataEntryDialog.Validator; import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; -public class TimePanelSettingsDialogComponent implements SettingsDialogComponent { - private LongBox timeDelayBox; - private DoubleBox refreshIntervalBox; - private final StringMessages stringMessages; - private final TimePanelSettings initialSettings; +public class TimePanelSettingsDialogComponent implements SettingsDialogComponent { + protected LongBox timeDelayBox; + protected DoubleBox refreshIntervalBox; + protected final StringMessages stringMessages; + protected final T initialSettings; + protected VerticalPanel mainContentPanel; - public TimePanelSettingsDialogComponent(TimePanelSettings settings, StringMessages stringMessages) { + public TimePanelSettingsDialogComponent(T settings, StringMessages stringMessages) { this.stringMessages = stringMessages; initialSettings = settings; } @Override - public Widget getAdditionalWidget(DataEntryDialog dialog) { - VerticalPanel vp = new VerticalPanel(); - - HorizontalPanel labelAndTimeDelayBoxPanel = new HorizontalPanel(); - labelAndTimeDelayBoxPanel.add(new Label(stringMessages.timeDelay())); - timeDelayBox = dialog.createLongBox(initialSettings.getDelayToLivePlayInSeconds(), 4); - labelAndTimeDelayBoxPanel.add(timeDelayBox); - vp.add(labelAndTimeDelayBoxPanel); - + public Widget getAdditionalWidget(DataEntryDialog dialog) { + mainContentPanel = new VerticalPanel(); + HorizontalPanel labelAndRefreshIntervalBoxPanel = new HorizontalPanel(); - labelAndRefreshIntervalBoxPanel.add(new Label(stringMessages.refreshInterval())); + labelAndRefreshIntervalBoxPanel.setSpacing(5); + labelAndRefreshIntervalBoxPanel.add(new Label(stringMessages.refreshInterval() + ":")); refreshIntervalBox = dialog.createDoubleBox(((double) initialSettings.getRefreshInterval()) / 1000, 4); labelAndRefreshIntervalBoxPanel.add(refreshIntervalBox); - vp.add(labelAndRefreshIntervalBoxPanel); + mainContentPanel.add(labelAndRefreshIntervalBoxPanel); - return vp; + HorizontalPanel labelAndTimeDelayBoxPanel = new HorizontalPanel(); + labelAndTimeDelayBoxPanel.setSpacing(5); + labelAndTimeDelayBoxPanel.add(new Label(stringMessages.timeDelay() + ":")); + timeDelayBox = dialog.createLongBox(initialSettings.getDelayToLivePlayInSeconds(), 10); + labelAndTimeDelayBoxPanel.add(timeDelayBox); + mainContentPanel.add(labelAndTimeDelayBoxPanel); + + return mainContentPanel; } + @SuppressWarnings("unchecked") @Override - public TimePanelSettings getResult() { - TimePanelSettings result = new TimePanelSettings(); + public T getResult() { + T result = (T) new TimePanelSettings(); result.setDelayToLivePlayInSeconds(timeDelayBox.getValue() == null ? -1 : timeDelayBox.getValue()); result.setRefreshInterval(refreshIntervalBox.getValue() == null ? -1 : (long) (refreshIntervalBox.getValue() * 1000)); return result; } @Override - public Validator getValidator() { - return new Validator() { + public Validator getValidator() { + return new Validator() { @Override public String getErrorMessage(TimePanelSettings valueToValidate) { String errorMessage = null; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java index c188d356fc2..4a013430cd9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java @@ -112,9 +112,9 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel componentsNavigationPanel.addStyleName("raceBoardNavigation"); boolean showLeaderboard = true; - boolean showMap = true; - boolean showWindCharts = true; - boolean showCompetitorCharts = true; + boolean showMap = false; + boolean showWindCharts = false; + boolean showCompetitorCharts = false; if (user == null) { // anonymous user diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index dcb4db83c96..d16c6305f68 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -754,7 +754,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier); if (trackedRace != null) { - raceTimesInfo = new RaceTimesInfoDTO(); + raceTimesInfo = new RaceTimesInfoDTO(raceIdentifier); raceTimesInfo.startOfRace = trackedRace.getStart() == null ? null : trackedRace.getStart().asDate(); raceTimesInfo.startOfTracking = trackedRace.getStartOfTracking() == null ? null : trackedRace.getStartOfTracking().asDate(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceTimesInfoDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceTimesInfoDTO.java index b440c85ef45..0b8bee47188 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceTimesInfoDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RaceTimesInfoDTO.java @@ -10,7 +10,7 @@ import com.sap.sailing.domain.common.RaceIdentifier; public class RaceTimesInfoDTO implements IsSerializable { private RaceIdentifier raceIdentifier; - private List legTimes; + public List legTimes; public Date startOfRace; public Date startOfTracking; @@ -20,6 +20,10 @@ public class RaceTimesInfoDTO implements IsSerializable { public Date timePointOfLastEvent; public Date timePointOfNewestEvent; + public RaceTimesInfoDTO(RaceIdentifier raceIdentifier) { + this.raceIdentifier = raceIdentifier; + } + public RaceTimesInfoDTO() {} public RaceIdentifier getRaceIdentifier() {