added timeslider playstate icons

This commit is contained in:
fmittag
2012-02-10 14:06:50 +01:00
parent 09d63eb39e
commit 11f9a65295
12 changed files with 176 additions and 67 deletions
@@ -22,4 +22,16 @@ public interface ClientResources extends ClientBundle {
@Source("com/sap/sailing/gwt/ui/client/images/timeslider-speed.png")
ImageResource timesliderPlaySpeedIcon();
@Source("com/sap/sailing/gwt/ui/client/images/timeslider-playstate-live-active.png")
ImageResource timesliderPlayStateLiveActiveIcon();
@Source("com/sap/sailing/gwt/ui/client/images/timeslider-playstate-live-inactive.png")
ImageResource timesliderPlayStateLiveInactiveIcon();
@Source("com/sap/sailing/gwt/ui/client/images/timeslider-playstate-replay-active.png")
ImageResource timesliderPlayStateReplayActiveIcon();
@Source("com/sap/sailing/gwt/ui/client/images/timeslider-playstate-replay-inactive.png")
ImageResource timesliderPlayStateReplayInactiveIcon();
}
@@ -2,8 +2,6 @@ package com.sap.sailing.gwt.ui.client;
import java.util.HashMap;
import com.sap.sailing.gwt.ui.leaderboard.MultiChartPanel;
/**
* Manages color assignments to objects.
@@ -22,7 +20,7 @@ public class ColorMap<T> {
}
/**
* Returns a color that is computed once by using {@link MultiChartPanel#createHexColor(int)} and then cached.
* Returns a color that is computed once.
*
* @param object
* An ID unique for a competitor.
@@ -38,8 +36,7 @@ public class ColorMap<T> {
}
/**
* Only use this if you don't want the color to be cached. You can use {@link MultiChartPanel#getColorByID(int)}
* instead.
* Only use this if you don't want the color to be cached.
*
* @param index
* The index of e.g. a competitor. Make sure, that each competitor has a unique index.
@@ -47,7 +47,12 @@ public class TimePanel extends FormPanel implements Component<TimePanelSettings>
private final ImageResource playButtonImg;
private final ImageResource pauseButtonImg;
private final ImageResource playSpeedImg;
private final ImageResource playModeLiveActiveImg;
private final ImageResource playModeReplayActiveImg;
private final ImageResource playModeInactiveImg;
private final Image playPauseImage;
private final Image playModeImage;
private Date lastReceivedDataTimepoint;
private static ClientResources resources = GWT.create(ClientResources.class);
@@ -78,6 +83,11 @@ public class TimePanel extends FormPanel implements Component<TimePanelSettings>
playSpeedImg = resources.timesliderPlaySpeedIcon();
playPauseImage = new Image(playButtonImg);
playModeLiveActiveImg = resources.timesliderPlayStateLiveActiveIcon();
playModeReplayActiveImg = resources.timesliderPlayStateReplayActiveIcon();
playModeInactiveImg = resources.timesliderPlayStateLiveInactiveIcon();
playModeImage = new Image(playModeInactiveImg);
sliderBar = new SliderBar();
sliderBar.setEnabled(true);
sliderBar.setLabelFormatter(new SliderBar.LabelFormatter() {
@@ -150,6 +160,9 @@ public class TimePanel extends FormPanel implements Component<TimePanelSettings>
FlowPanel playModeControlPanel = new FlowPanel();
playModeControlPanel.setStyleName("timePanel-controls-playmode");
playModeControlPanel.add(playModeImage);
playModeImage.getElement().getStyle().setFloat(Style.Float.LEFT);
playModeLabel = new Label();
playModeControlPanel .add(playModeLabel);
controlsPanel.add(playModeControlPanel );
@@ -201,29 +214,24 @@ public class TimePanel extends FormPanel implements Component<TimePanelSettings>
slowDownButton.getElement().getStyle().setPadding(3, Style.Unit.PX);
// time delay
if(timer.getPlayMode() == PlayModes.Live) {
FlowPanel timeDelayPanel = new FlowPanel();
timeDelayPanel.setStyleName("timePanel-controls-timeDelay");
FlowPanel timeDelayPanel = new FlowPanel();
timeDelayPanel.setStyleName("timePanel-controls-timeDelay");
final Label delayTextLabel = new Label(stringMessages.timeDelay() + ":");
timeDelayPanel.add(delayTextLabel);
timeDelayLabel = new Label();
timeDelayPanel.add(timeDelayLabel);
controlsPanel.add(timeDelayPanel);
delayTextLabel.getElement().getStyle().setFloat(Style.Float.LEFT);
delayTextLabel.getElement().getStyle().setPadding(3, Style.Unit.PX);
timeDelayLabel.getElement().getStyle().setFloat(Style.Float.LEFT);
timeDelayLabel.getElement().getStyle().setPadding(3, Style.Unit.PX);
} else {
timeDelayLabel = null;
}
timeDelayLabel = new Label();
timeDelayPanel.add(timeDelayLabel);
controlsPanel.add(timeDelayPanel);
timeDelayLabel.getElement().getStyle().setFloat(Style.Float.LEFT);
timeDelayLabel.getElement().getStyle().setPadding(3, Style.Unit.PX);
// settings
ImageResource settingsIcon = resources.settingsIcon();
Anchor settingsAnchor = new Anchor(AbstractImagePrototype.create(settingsIcon).getSafeHtml());
settingsAnchor.setTitle(stringMessages.settings());
settingsAnchor.addClickHandler(new SettingsClickHandler(stringMessages));
controlsPanel.add(settingsAnchor);
setWidget(vp);
playStateChanged(timer.getPlayState(), timer.getPlayMode());
}
@Override
@@ -235,8 +243,11 @@ public class TimePanel extends FormPanel implements Component<TimePanelSettings>
}
sliderBar.setCurrentValue(new Double(t), false);
timeLabel.setText(timeFormatter.format(time));
dateLabel.setText(dateFormatter.format(time));
if(lastReceivedDataTimepoint == null)
timeLabel.setText(timeFormatter.format(time));
else
timeLabel.setText(timeFormatter.format(time) + " (" + timeFormatter.format(lastReceivedDataTimepoint) + ")");
}
public void setMinMax(Date min, Date max) {
@@ -293,20 +304,28 @@ public class TimePanel extends FormPanel implements Component<TimePanelSettings>
switch(playState) {
case Playing:
playPauseImage.setResource(pauseButtonImg);
if(playMode == PlayModes.Live)
playModeImage.setResource(playModeLiveActiveImg);
else
playModeImage.setResource(playModeReplayActiveImg);
break;
case Paused:
case Stopped:
playPauseImage.setResource(playButtonImg);
playModeImage.setResource(playModeInactiveImg);
break;
}
switch(timer.getPlayMode()) {
switch(playMode) {
case Live:
playModeLabel.setText(stringMessages.playModeLive());
timeDelayLabel.setText(((int) timer.getCurrentDelay() / 1000) + " s");
playModeLabel.setText(stringMessages.playModeLive());
timeDelayLabel.setText(stringMessages.timeDelay() + ": " + ((int) timer.getCurrentDelay() / 1000) + " s");
timeDelayLabel.setVisible(true);
sliderBar.setEnabled(false);
break;
case Replay:
timeDelayLabel.setVisible(false);
timeDelayLabel.setText("");
playModeLabel.setText(stringMessages.playModeReplay());
sliderBar.setEnabled(true);
break;
@@ -357,4 +376,12 @@ public class TimePanel extends FormPanel implements Component<TimePanelSettings>
sliderBar.onResize();
}
public Date getLastReceivedDataTimepoint() {
return lastReceivedDataTimepoint;
}
public void setLastReceivedDataTimepoint(Date lastReceivedDataTimepoint) {
this.lastReceivedDataTimepoint = lastReceivedDataTimepoint;
}
}
@@ -42,8 +42,6 @@ public class Timer {
*/
private PlayStates playState;
// private boolean playing;
/**
* The current play mode of the timer
*/
@@ -70,7 +68,7 @@ public class Timer {
public enum PlayStates { Stopped, Playing, Paused };
/**
* The timer is created in resumed mode, using "now" as its current time, 1.0 as its {@link #playSpeedFactor play speed factor} and
* The timer is created in stopped state, using "now" as its current time, 1.0 as its {@link #playSpeedFactor play speed factor} and
* 1 second (1000ms) as the {@link #delayBetweenAutoAdvancesInMilliseconds delay between automatic updates} should the timer be
* {@link #resume() started}.
*/
@@ -79,7 +77,7 @@ public class Timer {
}
/**
* The timer is created in resumed mode, using "now" as its current time, 1.0 as its {@link #playSpeedFactor
* The timer is created in stopped state, using "now" as its current time, 1.0 as its {@link #playSpeedFactor
* acceleration factor} and <code>delayBetweenAutoAdvancesInMilliseconds</code> as the
* {@link #delayBetweenAutoAdvancesInMilliseconds delay between automatic updates} should the timer be
* {@link #resume() started}.
@@ -142,6 +140,14 @@ public class Timer {
return time;
}
public void setPlayMode(PlayModes playMode) {
this.playMode = playMode;
for (PlayStateListener playStateListener : playStateListeners) {
playStateListener.playStateChanged(playState, playMode);
}
}
/**
* Pauses this timer after the next time advance. {@link #playing} is set to <code>false</code> if not already
* paused, and registered {@link PlayStateListener}s will be notified.
@@ -241,8 +247,4 @@ public class Timer {
public PlayModes getPlayMode() {
return playMode;
}
public void setPlayMode(PlayModes playMode) {
this.playMode = playMode;
}
}
@@ -140,7 +140,7 @@ public class RaceBoardEntryPoint extends AbstractEntryPoint {
RaceSelectionModel raceSelectionModel = new RaceSelectionModel();
List<RaceIdentifier> singletonList = Collections.singletonList(selectedRace.getRaceIdentifier());
raceSelectionModel.setSelection(singletonList);
raceBoardPanel = new RaceBoardPanel(sailingService, raceSelectionModel, leaderboardName, leaderboardGroupName,
raceBoardPanel = new RaceBoardPanel(sailingService, userDTO, raceSelectionModel, leaderboardName, leaderboardGroupName,
RaceBoardEntryPoint.this, stringMessages, userAgentType);
raceBoardPanel.fillEvents(events);
@@ -37,10 +37,13 @@ import com.sap.sailing.gwt.ui.client.UserAgentChecker.UserAgentTypes;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettingsFactory;
import com.sap.sailing.gwt.ui.leaderboard.MultiChartPanel;
import com.sap.sailing.gwt.ui.leaderboard.MultiChartSettings;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.UserDTO;
import com.sap.sailing.gwt.ui.shared.components.ComponentViewer;
import com.sap.sailing.gwt.ui.shared.panels.BreadcrumbPanel;
@@ -69,11 +72,13 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
private final TimePanel timePanel;
private final Timer timer;
private final RaceSelectionProvider raceSelectionProvider;
private final UserDTO user;
public RaceBoardPanel(SailingServiceAsync sailingService, RaceSelectionProvider raceSelectionProvider, String leaderboardName,
public RaceBoardPanel(SailingServiceAsync sailingService, UserDTO theUser, RaceSelectionProvider raceSelectionProvider, String leaderboardName,
String leaderboardGroupName, ErrorReporter errorReporter, final StringMessages stringMessages, UserAgentTypes userAgentType) {
this.sailingService = sailingService;
this.raceSelectionProvider = raceSelectionProvider;
this.user = theUser;
raceSelectionProvider.addRaceSelectionChangeListener(this);
racesByIdentifier = new HashMap<RaceIdentifier, RaceDTO>();
RaceIdentifier selectedRaceIdentifier = raceSelectionProvider.getSelectedRaces().iterator().next();
@@ -103,26 +108,43 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
componentsNavigationPanel = new FlowPanel();
componentsNavigationPanel.addStyleName("raceBoardNavigation");
// create the default leaderboard and select the right race
LeaderboardSettings leaderBoardSettings = LeaderboardSettingsFactory.getSettingsForPlayMode(timer.getPlayMode());
LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, leaderBoardSettings, selectedRaceIdentifier, competitorSelectionModel,
timer, leaderboardName, leaderboardGroupName, errorReporter, stringMessages, userAgentType);
boolean showLeaderboard = true;
boolean showMap = true;
boolean showWindCharts = false;
// boolean showCompetitorChart = true;
boolean showCompetitorMultiChart = true;
if (user == null) {
// anonymous user
showWindCharts = false;
}
CollapsableComponentViewer<LeaderboardSettings> leaderboardViewer = new CollapsableComponentViewer<LeaderboardSettings>(
leaderboardPanel, "100%", "100%", stringMessages);
collapsableViewers.add(leaderboardViewer);
showMap = false;
showWindCharts = false;
// create the default leaderboard and select the right race
if(showLeaderboard) {
LeaderboardSettings leaderBoardSettings = LeaderboardSettingsFactory.getSettingsForPlayMode(timer.getPlayMode());
LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, leaderBoardSettings, selectedRaceIdentifier, competitorSelectionModel,
timer, leaderboardName, leaderboardGroupName, errorReporter, stringMessages, userAgentType);
CollapsableComponentViewer<LeaderboardSettings> leaderboardViewer = new CollapsableComponentViewer<LeaderboardSettings>(
leaderboardPanel, "100%", "100%", stringMessages);
collapsableViewers.add(leaderboardViewer);
}
// create the race map
RaceMap raceMap = new RaceMap(sailingService, errorReporter, timer, competitorSelectionModel, stringMessages);
CollapsableComponentViewer<RaceMapSettings> raceMapViewer = new CollapsableComponentViewer<RaceMapSettings>(
raceMap, "auto", "500px", stringMessages);
if(showMap) {
RaceMap raceMap = new RaceMap(sailingService, errorReporter, timer, competitorSelectionModel, stringMessages);
CollapsableComponentViewer<RaceMapSettings> raceMapViewer = new CollapsableComponentViewer<RaceMapSettings>(
raceMap, "auto", "500px", stringMessages);
raceMap.loadMapsAPI((Panel) raceMapViewer.getViewerWidget().getContent());
raceMap.onRaceSelectionChange(Collections.singletonList(selectedRaceIdentifier));
collapsableViewers.add(raceMapViewer);
raceMap.loadMapsAPI((Panel) raceMapViewer.getViewerWidget().getContent());
raceMap.onRaceSelectionChange(Collections.singletonList(selectedRaceIdentifier));
collapsableViewers.add(raceMapViewer);
}
boolean showWindChart = true;
if(showWindChart) {
if(showWindCharts) {
WindChartSettings windChartSettings = new WindChartSettings(WindSource.values());
WindChart windChart = new WindChart(sailingService, raceSelectionProvider, timer, windChartSettings, stringMessages, errorReporter);
CollapsableComponentViewer<WindChartSettings> windChartViewer = new CollapsableComponentViewer<WindChartSettings>(
@@ -131,6 +153,16 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
collapsableViewers.add(windChartViewer);
}
if(showCompetitorMultiChart) {
MultiChartPanel multiChart = new MultiChartPanel(sailingService, competitorSelectionModel, raceSelectionProvider,
timer, stringMessages, (int) (Window.getClientWidth() - 350),
(int) (Window.getClientHeight() - 170), errorReporter, /* showRaceSelector */ false);
CollapsableComponentViewer<MultiChartSettings> multiChartViewer = new CollapsableComponentViewer<MultiChartSettings>(
multiChart, "600px", "500px", stringMessages);
multiChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
collapsableViewers.add(multiChartViewer);
}
for (CollapsableComponentViewer<?> componentViewer : collapsableViewers) {
mainPanel.add(componentViewer.getViewerWidget());
addComponentViewerMenuEntry(componentViewer);
@@ -208,10 +240,16 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
if (selectedRace.startOfTracking != null) {
min = selectedRace.startOfTracking;
}
if (selectedRace.endOfRace != null) {
max = selectedRace.endOfRace;
} else if (selectedRace.timePointOfNewestEvent != null) {
// if (selectedRace.endOfRace != null) {
// max = selectedRace.endOfRace;
// } else if (selectedRace.timePointOfNewestEvent != null) {
// max = selectedRace.timePointOfNewestEvent;
// timer.setPlayMode(PlayModes.Live);
// }
//
if (selectedRace.timePointOfNewestEvent != null) {
max = selectedRace.timePointOfNewestEvent;
timePanel.setLastReceivedDataTimepoint(selectedRace.timePointOfNewestEvent);
timer.setPlayMode(PlayModes.Live);
}
@@ -227,7 +265,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
}
break;
}
//timer.setPlayMode(PlayModes.Live);
sailingService.getRaceTimesInfo(selectedRace.getRaceIdentifier(),
new AsyncCallback<RaceTimesInfoDTO>() {
@Override
@@ -238,19 +276,19 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
@Override
public void onSuccess(RaceTimesInfoDTO raceTimesInfo) {
// raceTimesInfo can be null if the race is not tracked anymore
if (raceTimesInfo != null) {
timePanel.setLegMarkers(raceTimesInfo.getLegTimes());
if (raceTimesInfo.getStartOfRace() != null) {
// set the new start time
Date startOfRace = raceTimesInfo.getStartOfRace();
Date startOfTimeslider = new Date(startOfRace.getTime() - 5 * 60 * 1000);
timePanel.changeMin(startOfTimeslider);
timer.setTime(raceTimesInfo.getStartOfRace().getTime());
}
} else {
timePanel.reset();
}
// if (raceTimesInfo != null) {
// timePanel.setLegMarkers(raceTimesInfo.getLegTimes());
// if (raceTimesInfo.getStartOfRace() != null) {
// // set the new start time
// Date startOfRace = raceTimesInfo.getStartOfRace();
// Date startOfTimeslider = new Date(startOfRace.getTime() - 5 * 60 * 1000);
//
// timePanel.changeMin(startOfTimeslider);
// timer.setTime(raceTimesInfo.getStartOfRace().getTime());
// }
// } else {
// timePanel.reset();
// }
}
});
}
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde version="3.6"?>
<target name="Race Analysis Target (IDE external) for Frank" sequenceNumber="50">
<locations>
<location includeAllPlatforms="false" includeMode="slicer" includeSource="true" type="InstallableUnit">
<unit id="org.eclipse.jetty.bundles.f.feature.group" version="7.5.4"/>
<repository location="http://download.eclipse.org/jetty/updates/jetty-bundles-7.x/7.5.4.v20111024/"/>
</location>
<location path="C:\Projects\sailing\dev\p2-repositories\eclipse\equinox-SDK-3.7" type="Directory"/>
<location path="${project_loc:com.sap.sailing.targetplatform.base}/gen/p2" type="Directory"/>
</locations>
</target>
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde version="3.6"?>
<target name="Race Analysis Target (Maven - local build for externals)" sequenceNumber="34">
<locations>
<location includeAllPlatforms="false" includeMode="slicer" includeSource="true" type="InstallableUnit">
<unit id="org.eclipse.equinox.core.sdk.feature.group" version="3.7.0.v20110506-0800-7uF9LFp7FWmE7gTBiKg15LDD"/>
<repository location="http://download.eclipse.org/equinox/drops/R-3.7-201106131736/"/>
</location>
<location includeAllPlatforms="false" includeMode="slicer" includeSource="true" type="InstallableUnit">
<unit id="org.eclipse.jetty.bundles.f.feature.group" version="7.5.4"/>
<repository location="http://download.eclipse.org/jetty/updates/jetty-bundles-7.x/7.5.4.v20111024/"/>
</location>
<location includeAllPlatforms="false" includeMode="slicer" includeSource="true" type="InstallableUnit">
<unit id="com.sap.sailing.target.base.feature.group" version="1.0.0"/>
<unit id="com.sap.sailing.target.test.feature.group" version="1.0.0"/>
<repository location="http://sapcoe-app01.pironet-ndh.com/p2/sailing/"/>
</location>
</locations>
</target>