chunks)
port.setEnabled(true);
connectButton.setEnabled(true);
}
+
+ if ("connect error".equals(message)) {
+ connectButton.setText("Connect");
+ ip.setEnabled(true);
+ port.setEnabled(true);
+ connectButton.setEnabled(true);
+ }
if (message.substring(0, 1).equals("$")) {
race.update(Factory.getMessage(message));
diff --git a/src/com/zacharyfox/rmonitor/leaderboard/frames/AboutFrame.java b/src/com/zacharyfox/rmonitor/leaderboard/frames/AboutFrame.java
index f0d20e6..1036079 100644
--- a/src/com/zacharyfox/rmonitor/leaderboard/frames/AboutFrame.java
+++ b/src/com/zacharyfox/rmonitor/leaderboard/frames/AboutFrame.java
@@ -27,7 +27,7 @@ public AboutFrame()
aboutText.setBackground(null);
aboutText.setContentType("text/html");
aboutText
- .setText("RMonitorLeaderboard\n\ncopyright © 2013 Zachary Fox
\n\nProject Located at: https://github.com/zacharyfox/RMonitorLeaderboard
");
+ .setText("KHRMonitorLeaderboard\n\ncopyright © 2017 Kai Höfler
\n\nBased on RMonitorLeaderboard
\n\ncopyright © 2013 Zachary Fox, 2017 Kai Höfler
\n\nProject Located at: https://github.com/zacharyfox/RMonitorLeaderboard
");
getContentPane().add(aboutText, "cell 0 0 2 1,grow");
okButton = new JButton("OK");
diff --git a/src/com/zacharyfox/rmonitor/leaderboard/frames/ConnectFrame.java b/src/com/zacharyfox/rmonitor/leaderboard/frames/ConnectFrame.java
index 8480df7..ec8dba0 100644
--- a/src/com/zacharyfox/rmonitor/leaderboard/frames/ConnectFrame.java
+++ b/src/com/zacharyfox/rmonitor/leaderboard/frames/ConnectFrame.java
@@ -1,11 +1,17 @@
package com.zacharyfox.rmonitor.leaderboard.frames;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.prefs.Preferences;
+
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
+import org.ini4j.IniPreferences;
+
import net.miginfocom.swing.MigLayout;
public class ConnectFrame extends JFrame
@@ -17,9 +23,11 @@ public class ConnectFrame extends JFrame
private final JLabel portLabel;
private static ConnectFrame instance;
private static final long serialVersionUID = 3848021032174790659L;
+ private Preferences connectPrefs;
private ConnectFrame(MainFrame mainFrame)
{
+ connectPrefs = new IniPreferences(mainFrame.getIni()).node("Connect");
getContentPane().setLayout(new MigLayout("", "[][grow]", "[][][]"));
ipLabel = new JLabel("Scoreboard IP:");
@@ -28,7 +36,7 @@ private ConnectFrame(MainFrame mainFrame)
setBounds(100, 100, 400, 150);
ip = new JTextField();
- ip.setText("127.0.0.1");
+ ip.setText(connectPrefs.get("IP", "127.0.0.1"));
getContentPane().add(ip, "cell 1 0,growx");
ip.setColumns(10);
@@ -37,7 +45,7 @@ private ConnectFrame(MainFrame mainFrame)
getContentPane().add(portLabel, "cell 0 1,alignx trailing");
port = new JTextField();
- port.setText("50000");
+ port.setText(connectPrefs.get("Port", "50000"));
getContentPane().add(port, "cell 1 1,growx");
port.setColumns(10);
@@ -49,11 +57,13 @@ private ConnectFrame(MainFrame mainFrame)
public String getIP()
{
+ connectPrefs.put("IP",ip.getText());
return ip.getText();
}
public Integer getPort()
{
+ connectPrefs.put("Port",port.getText());
return Integer.parseInt(port.getText());
}
diff --git a/src/com/zacharyfox/rmonitor/leaderboard/frames/FinishLineLogConfigFrame.java b/src/com/zacharyfox/rmonitor/leaderboard/frames/FinishLineLogConfigFrame.java
new file mode 100644
index 0000000..28b817b
--- /dev/null
+++ b/src/com/zacharyfox/rmonitor/leaderboard/frames/FinishLineLogConfigFrame.java
@@ -0,0 +1,83 @@
+package com.zacharyfox.rmonitor.leaderboard.frames;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.prefs.Preferences;
+
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JTextField;
+import javax.swing.SwingConstants;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.ini4j.IniPreferences;
+
+public class FinishLineLogConfigFrame extends JFrame implements ActionListener
+{
+ public JButton startButton;
+ public JTextField rowHeight;
+ private final JLabel rowHeightLabel;
+ private static FinishLineLogConfigFrame instance;
+ private static final long serialVersionUID = 3848021032174790659L;
+ private Preferences finishLineLogPrefs;
+ private MainFrame mainFrame;
+
+
+
+ private FinishLineLogConfigFrame(MainFrame mainFrame)
+ {
+ finishLineLogPrefs = new IniPreferences(mainFrame.getIni()).node("FinishLineLog");
+ getContentPane().setLayout(new MigLayout("", "[][grow]", "[][]"));
+ setBounds(100, 100, 400, 150);
+
+ rowHeightLabel = new JLabel("Row Height:");
+ rowHeightLabel.setHorizontalAlignment(SwingConstants.RIGHT);
+ getContentPane().add(rowHeightLabel, "cell 0 0,alignx trailing");
+
+ rowHeight = new JTextField();
+ rowHeight.setText(finishLineLogPrefs.get("RowHeight", "24"));
+ getContentPane().add(rowHeight, "cell 1 0,growx");
+ rowHeight.setColumns(5);
+
+ startButton = new JButton("Start");
+ startButton.setHorizontalAlignment(SwingConstants.RIGHT);
+ startButton.addActionListener(this);
+ getContentPane().add(startButton, "cell 1 1,alignx right");
+ mainFrame.storeIniFile();
+
+ this.mainFrame = mainFrame;
+ }
+
+
+ public Integer getRowHeight()
+ {
+ finishLineLogPrefs.put("RowHeight",rowHeight.getText());
+ return Integer.parseInt(rowHeight.getText());
+ }
+
+ public static FinishLineLogConfigFrame getInstance(MainFrame mainFrame)
+ {
+ if (instance == null) {
+ instance = new FinishLineLogConfigFrame(mainFrame);
+ }
+
+ return instance;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent evt)
+ {
+ if (evt.getActionCommand().equals("Start")) {
+ FinishLineLogFrame newFrame = new FinishLineLogFrame(mainFrame, getRowHeight());
+ newFrame.setVisible(true);
+ //startButton.setText("Stop");
+ mainFrame.storeIniFile();
+ this.setVisible(false);
+ } else if (evt.getActionCommand().equals("Stop")) {
+ startButton.setText("Start");
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/com/zacharyfox/rmonitor/leaderboard/frames/FinishLineLogFrame.java b/src/com/zacharyfox/rmonitor/leaderboard/frames/FinishLineLogFrame.java
new file mode 100644
index 0000000..c0cb227
--- /dev/null
+++ b/src/com/zacharyfox/rmonitor/leaderboard/frames/FinishLineLogFrame.java
@@ -0,0 +1,259 @@
+package com.zacharyfox.rmonitor.leaderboard.frames;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.GridLayout;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.image.BufferedImage;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import javax.swing.AbstractAction;
+import javax.swing.ActionMap;
+import javax.swing.InputMap;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSeparator;
+import javax.swing.JTable;
+import javax.swing.KeyStroke;
+import javax.swing.SwingConstants;
+import javax.swing.UIManager;
+
+import net.miginfocom.swing.MigLayout;
+
+import com.zacharyfox.rmonitor.leaderboard.FinishLineLogTable;
+import com.zacharyfox.rmonitor.leaderboard.FinishlineLogTableModel;
+import com.zacharyfox.rmonitor.utils.Duration;
+
+public class FinishLineLogFrame extends JFrame implements ActionListener
+{
+ private final JLabel elapsedTime;
+ private final JLabel lblNewLabel_1;
+ private final JLabel lblNewLabel_2;
+ private final FinishLineLogTable finishLineLogTable;
+ private final JPanel resultsTablePanel;
+ private final JLabel runName;
+ private final JSeparator separator;
+ private final JPanel timeBar;
+ private final JLabel timeToGo;
+ private final JPanel titleBar;
+ private final JLabel trackName;
+ private MainFrame mainFrame;
+
+ private final PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt)
+ {
+ updateDisplay(evt);
+ }
+ };
+
+ private static final long serialVersionUID = -743830529485841322L;
+
+ public FinishLineLogFrame(MainFrame mainFrame, int rowHeight)
+ {
+ this.mainFrame = mainFrame;
+
+ this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+
+ Font systemLabelFont = UIManager.getFont("Label.font");
+ this.setBounds(100, 100, 870, 430);
+ this.getContentPane().setLayout(new MigLayout("", "[grow][grow]", "[][10:10:10][][][grow]"));
+
+ titleBar = new JPanel();
+ this.getContentPane().add(titleBar, "cell 0 0 2 1,grow");
+ titleBar.setLayout(new GridLayout(1, 0, 0, 0));
+
+ runName = new JLabel("-");
+ runName.setFont(new Font(systemLabelFont.getName(), Font.BOLD, systemLabelFont.getSize() + 3));
+ titleBar.add(runName);
+
+ trackName = new JLabel("-");
+ trackName.setFont(new Font(systemLabelFont.getName(), Font.BOLD, systemLabelFont.getSize() + 3));
+ trackName.setHorizontalAlignment(SwingConstants.RIGHT);
+ titleBar.add(trackName);
+
+ separator = new JSeparator();
+ separator.setForeground(Color.BLACK);
+ separator.setBorder(null);
+ getContentPane().add(separator, "cell 0 1 2 1,growx,aligny top");
+
+ timeBar = new JPanel();
+ getContentPane().add(timeBar, "cell 0 3 2 1,growx");
+ timeBar.setLayout(new MigLayout("", "[][grow]50[][grow]", "[]"));
+
+ lblNewLabel_1 = new JLabel("Elapsed:");
+ lblNewLabel_1.setHorizontalTextPosition(JLabel.RIGHT);
+ lblNewLabel_1.setHorizontalAlignment(JLabel.RIGHT);
+ timeBar.add(lblNewLabel_1, "cell 1 0");
+
+ lblNewLabel_2 = new JLabel("To Go:");
+ lblNewLabel_2.setHorizontalAlignment(JLabel.RIGHT);
+ timeBar.add(lblNewLabel_2, "cell 3 0");
+
+ elapsedTime = new JLabel(new Duration().toString());
+ elapsedTime.setHorizontalTextPosition(JLabel.LEFT);
+ elapsedTime.setHorizontalAlignment(JLabel.LEFT);
+ elapsedTime.setFont(new Font(systemLabelFont.getName(), Font.BOLD, systemLabelFont.getSize() + 3));
+ timeBar.add(elapsedTime, "cell 2 0");
+
+ timeToGo = new JLabel(new Duration().toString());
+ timeToGo.setHorizontalTextPosition(JLabel.LEFT);
+ timeToGo.setHorizontalAlignment(JLabel.LEFT);
+ timeToGo.setFont(new Font(systemLabelFont.getName(), Font.BOLD, systemLabelFont.getSize() + 3));
+ timeBar.add(timeToGo, "cell 4 0");
+
+ resultsTablePanel = new JPanel();
+ getContentPane().add(resultsTablePanel, "cell 0 4 2 1,grow");
+// resultsTablePanel.setLayout(new GridLayout(1, 0, 0, 0));
+ resultsTablePanel.setLayout(new BorderLayout());
+ finishLineLogTable = new FinishLineLogTable(rowHeight);
+ finishLineLogTable.setIntercellSpacing(new Dimension(10, 1));
+ finishLineLogTable.setFillsViewportHeight(true);
+ finishLineLogTable.setShowVerticalLines(false);
+ finishLineLogTable.setShowHorizontalLines(false);
+ finishLineLogTable.setShowGrid(false);
+ finishLineLogTable.setRowMargin(2);
+ finishLineLogTable.setRowHeight(rowHeight);
+ finishLineLogTable.setFont(new Font("Lucida Console", Font.BOLD, rowHeight));
+ finishLineLogTable.setBackground(Color.BLACK);
+ finishLineLogTable.setForeground(Color.YELLOW);
+ finishLineLogTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
+ finishLineLogTable.setRowSelectionAllowed(false);
+ finishLineLogTable.getTableHeader().setFont(new Font("Lucida Console", Font.BOLD, rowHeight));
+ finishLineLogTable.getTableHeader().setOpaque(false);
+ finishLineLogTable.getTableHeader().setBackground(Color.BLACK);
+ finishLineLogTable.getTableHeader().setForeground(Color.YELLOW);
+ resultsTablePanel.add(finishLineLogTable.getTableHeader(),BorderLayout.NORTH);
+ resultsTablePanel.add(finishLineLogTable,BorderLayout.CENTER);
+
+ mainFrame.getRace().addPropertyChangeListener(propertyChangeListener);
+
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ if (e.getActionCommand().equals("Connect")) {
+/* race = new Race();
+ race.addPropertyChangeListener(new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt)
+ {
+ updateDisplay(evt);
+ }
+ });
+ ConnectFrame.getInstance(this).getIP();
+ ConnectFrame.getInstance(this).getPort();
+ storeIniFile();
+
+ worker = new Worker(ConnectFrame.getInstance(this), race);
+
+ if (recorder != null) {
+ worker.setRecorder(recorder);
+ }
+ worker.execute();*/
+ } else if (e.getActionCommand().equals("Disconnect")) {
+ //worker.cancel(true);
+ }
+
+ return;
+ }
+
+ public void goFullScreen()
+ {
+ final Cursor oldCursor = getContentPane().getCursor();
+ final Rectangle oldBounds = getBounds();
+ final GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
+
+ if (gd.isFullScreenSupported()) {
+ try {
+ setCursor(getToolkit().createCustomCursor(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB),
+ new Point(0, 0), "null"));
+ dispose();
+ setUndecorated(true);
+ pack();
+ setVisible(true);
+ gd.setFullScreenWindow(this);
+
+ InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
+ final ActionMap actionMap = getRootPane().getActionMap();
+
+ inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, true), "escAction");
+ actionMap.put("escAction", new AbstractAction() {
+ private static final long serialVersionUID = -2399289576909037389L;
+
+ @Override
+ public void actionPerformed(ActionEvent evt)
+ {
+ actionMap.remove(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, true));
+ FinishLineLogFrame.this.setCursor(oldCursor);
+ gd.setFullScreenWindow(null);
+ FinishLineLogFrame.this.dispose();
+ FinishLineLogFrame.this.setUndecorated(false);
+ FinishLineLogFrame.this.pack();
+ FinishLineLogFrame.this.setBounds(oldBounds);
+ FinishLineLogFrame.this.setVisible(true);
+ }
+ });
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+ /*
+ * finally { gd.setFullScreenWindow(null); }
+ */
+ } else {
+ setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);
+ }
+ }
+
+
+
+ private void updateDisplay(PropertyChangeEvent evt)
+ {
+ if (evt.getPropertyName().equals("raceName")) {
+ runName.setText((String) evt.getNewValue());
+ }
+
+ if (evt.getPropertyName().equals("elapsedTime")) {
+ elapsedTime.setText(((Duration) evt.getNewValue()).toString());
+ }
+
+ if (evt.getPropertyName().equals("timeToGo")) {
+ timeToGo.setText(((Duration) evt.getNewValue()).toString());
+ }
+
+ if (evt.getPropertyName().equals("lapsToGo")) {
+ timeToGo.setText(String.valueOf(((int) evt.getNewValue())));
+ }
+
+
+ if (evt.getPropertyName().equals("competitorsVersion")) {
+ ((FinishlineLogTableModel) finishLineLogTable.getModel()).updateData();
+ }
+
+
+ if (evt.getPropertyName().equals("trackName")) {
+ trackName.setText(evt.getNewValue().toString());
+ }
+
+ if (evt.getPropertyName().equals("trackLength")) {
+ // TODO: Handle Track Length
+ // trackLength.setText(evt.getNewValue().toString());
+ }
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/src/com/zacharyfox/rmonitor/leaderboard/frames/LapCounterFrame.java b/src/com/zacharyfox/rmonitor/leaderboard/frames/LapCounterFrame.java
new file mode 100644
index 0000000..09f5c62
--- /dev/null
+++ b/src/com/zacharyfox/rmonitor/leaderboard/frames/LapCounterFrame.java
@@ -0,0 +1,329 @@
+package com.zacharyfox.rmonitor.leaderboard.frames;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+import java.util.prefs.Preferences;
+
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.SwingConstants;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+
+import org.ini4j.IniPreferences;
+
+import com.zacharyfox.rmonitor.entities.Race;
+import com.zacharyfox.rmonitor.entities.Race.FlagState;
+import com.zacharyfox.rmonitor.utils.Duration;
+
+import javax.swing.JLabel;
+import javax.swing.JCheckBox;
+
+public class LapCounterFrame extends JFrame {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 7957459184007408065L;
+
+ private static LapCounterFrame instance;
+ private final MainFrame mainFrame;
+
+ static GraphicsDevice device = GraphicsEnvironment
+ .getLocalGraphicsEnvironment().getScreenDevices()[0];
+
+ private final JPanel contentPanel = new JPanel();
+ private JTextField tfLaps;
+
+ private JButton cancelButton;
+ private int lastLapCount;
+ private int lastLapsComplete;
+ private Duration lastLapCountChangeTime;
+ private int lapSwitchDelay;
+ private boolean countLapsUp;
+ private Preferences lapCounterPrefs;
+
+ private static final String TIME_FORMAT = "HH:mm:ss";
+ public static final SimpleDateFormat timeFormat = new SimpleDateFormat(TIME_FORMAT, Locale.getDefault());
+
+ private final PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt)
+ {
+ updateDisplay(evt);
+ }
+ };
+ private JTextField tfElapsedTime;
+ private JTextField tfFlag;
+ private JPanel infoPanel;
+ private JLabel lblElapsedTime;
+ private JLabel lblDelay;
+ private JTextField tfDelay;
+ private JCheckBox chckbxCountUpwards;
+
+
+ /**
+ * Create the dialog.
+ */
+ public LapCounterFrame(final MainFrame mainFrame) {
+ this.mainFrame = mainFrame;
+ lapCounterPrefs = new IniPreferences(mainFrame.getIni()).node("LapCounter");
+ lapSwitchDelay = Integer.parseInt(lapCounterPrefs.get("LapSwitchDelay", "5"));
+ countLapsUp = false;
+ lastLapsComplete = -1;
+
+ mainFrame.storeIniFile();
+
+ setBounds(100, 100, 1446, 840);
+ setExtendedState(JFrame.MAXIMIZED_BOTH);
+
+ getContentPane().setLayout(new BorderLayout());
+ contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
+ getContentPane().add(contentPanel, BorderLayout.CENTER);
+ contentPanel.setLayout(new BorderLayout(0, 0));
+ {
+ tfLaps = new JTextField();
+ Font theFont = new Font("Tahoma", Font.PLAIN, (int) (getHeight()*.85));//400
+ //System.out.println("Font Height of " + Integer.toString((int) (getHeight()*.8)) + " = " + Integer.toString( tfLaps.getFontMetrics(theFont).getHeight()));
+ //System.out.println("Frame Height = " + Integer.toString( getHeight()));
+
+ tfLaps.setFont(theFont);
+ tfLaps.setEditable(false);
+ tfLaps.setHorizontalAlignment(SwingConstants.CENTER);
+ tfLaps.setForeground(Color.WHITE);
+ tfLaps.setText("999");
+ tfLaps.setBackground(Color.BLACK);
+ contentPanel.add(tfLaps, BorderLayout.CENTER);
+ tfLaps.setColumns(3);
+
+ }
+
+ contentPanel.addComponentListener(new resizeListener());
+
+ {
+ JPanel buttonPane = new JPanel();
+ buttonPane.setBackground(Color.BLACK);
+ getContentPane().add(buttonPane, BorderLayout.SOUTH);
+ buttonPane.setLayout(new BorderLayout(0, 0));
+ {
+ cancelButton = new JButton("X");
+ cancelButton.setFont(new Font("Tahoma", Font.BOLD, 11));
+ cancelButton.setMnemonic('x');
+ cancelButton.setBackground(Color.BLACK);
+ cancelButton.setForeground(Color.RED);
+ cancelButton.setActionCommand("Cancel");
+ cancelButton.addActionListener(new ActionListener (){
+ @Override
+ public void actionPerformed(ActionEvent evt) {
+ instance.setVisible(false);
+ mainFrame.getRace().removePropertyChangeListener(propertyChangeListener);
+ instance.dispose();
+ instance = null;
+ }
+ });
+
+ buttonPane.add(cancelButton, BorderLayout.EAST);
+ }
+ {
+ tfFlag = new JTextField();
+ tfFlag.setBackground(Color.BLACK);
+ buttonPane.add(tfFlag, BorderLayout.CENTER);
+ tfFlag.setColumns(30);
+ }
+ {
+ infoPanel = new JPanel();
+ infoPanel.setBackground(Color.BLACK);
+ FlowLayout flowLayout = (FlowLayout) infoPanel.getLayout();
+ flowLayout.setAlignment(FlowLayout.LEFT);
+ buttonPane.add(infoPanel, BorderLayout.WEST);
+ {
+ lblElapsedTime = new JLabel("Elapsed Time:");
+ lblElapsedTime.setForeground(Color.WHITE);
+ infoPanel.add(lblElapsedTime);
+ }
+ {
+ tfElapsedTime = new JTextField();
+ infoPanel.add(tfElapsedTime);
+ tfElapsedTime.setEditable(false);
+ tfElapsedTime.setEnabled(false);
+ tfElapsedTime.setColumns(8);
+ }
+ {
+ lblDelay = new JLabel("Delay:");
+ lblDelay.setForeground(Color.WHITE);
+ infoPanel.add(lblDelay);
+ }
+ {
+ tfDelay = new JTextField();
+ infoPanel.add(tfDelay);
+ tfDelay.setColumns(4);
+ tfDelay.setText(Integer.toString(lapSwitchDelay));
+ {
+ chckbxCountUpwards = new JCheckBox("Count Laps upwards");
+ chckbxCountUpwards.setBackground(Color.BLACK);
+ chckbxCountUpwards.setForeground(Color.WHITE);
+ chckbxCountUpwards.setSelected(countLapsUp);
+ infoPanel.add(chckbxCountUpwards);
+ }
+
+ tfDelay.getDocument().addDocumentListener(new DocumentListener() {
+ @Override
+ public void insertUpdate(DocumentEvent e) {
+ if (tfDelay.getText().matches("\\d+")){
+ if (!Integer.toString(lapSwitchDelay).equals(tfDelay.getText())){
+
+ lapSwitchDelay = Integer.parseInt(tfDelay.getText());
+ lapCounterPrefs.put("LapSwitchDelay", tfDelay.getText());
+ mainFrame.storeIniFile();
+ }
+ }
+ }
+ @Override public void removeUpdate(DocumentEvent e) { } // do nothing
+ @Override public void changedUpdate(DocumentEvent e) { } // do nothing
+ });
+ }
+ }
+
+ }
+
+
+ lastLapCountChangeTime = new Duration();
+ lastLapCount = 0;
+
+ mainFrame.getRace().addPropertyChangeListener(propertyChangeListener);
+
+ }
+
+
+ class resizeListener extends ComponentAdapter {
+ public void componentResized(ComponentEvent e) {
+ //Recalculate the variable you mentioned
+ Font theFont = new Font("Tahoma", Font.PLAIN, (int) (e.getComponent().getHeight()*.85));//400
+ //System.out.println("Font Height of " + Integer.toString((int) (getHeight()*.8)) + " = " + Integer.toString( tfLaps.getFontMetrics(theFont).getHeight()));
+ //System.out.println("Size changed to " + Integer.toString( e.getComponent().getHeight()));
+
+ tfLaps.setFont(theFont);
+ //tfLaps.setText(Integer.toString((int) (e.getComponent().getHeight()*.85)));
+ }
+ }
+
+ public void addCancelButtonListener(ActionListener listener) {
+ cancelButton.addActionListener(listener);
+ }
+
+
+ public void updateDisplay(PropertyChangeEvent evt){
+
+ if (evt.getPropertyName().equals("lapsToGo") ) {
+ lastLapCount = ((int) evt.getNewValue());
+ lastLapCountChangeTime = mainFrame.getRace().getElapsedTime();
+ }
+
+ if (evt.getPropertyName().equals("lapsComplete") ) {
+ lastLapsComplete = ((int) evt.getNewValue());
+ lastLapCountChangeTime = mainFrame.getRace().getElapsedTime();
+ }
+
+ if (evt.getPropertyName().equals("lapsToGo") || evt.getPropertyName().equals("elapsedTime") || evt.getPropertyName().equals("lapsComplete") ) {
+ tfElapsedTime.setText(mainFrame.getRace().getElapsedTime().toString());
+ int secondsSinceLastLapCountUpdate = mainFrame.getRace().getElapsedTime().toInt()-lastLapCountChangeTime.toInt();
+
+ Race.FlagState currentFlagState = mainFrame.getRace().getCurrentFlagState();
+
+ // Display lastLapsComplete or lastLapCount dependent on checkbox
+ if (chckbxCountUpwards.isSelected()){
+ if (lastLapsComplete >= 0){
+ tfLaps.setText(Integer.toString(lastLapsComplete));
+ } else {
+ tfLaps.setText("-");
+ }
+ }else{
+
+ // For Purple the LapToGo are shown instantly
+ if ( currentFlagState == Race.FlagState.PURPLE || currentFlagState == Race.FlagState.NONE){
+ if (lastLapCount > 0){
+ tfLaps.setText(Integer.toString(lastLapCount));
+ } else {
+ tfLaps.setText("-");
+ }
+ // for other flags we show the Laps to GO only after the lapSwitchDelay
+ } else if (secondsSinceLastLapCountUpdate > lapSwitchDelay ){
+
+
+ if (lastLapCount > 0){
+ tfLaps.setText(Integer.toString(lastLapCount-1));
+ } else {
+ if (currentFlagState == Race.FlagState.NONE) {
+ tfLaps.setText("-");
+ } else {
+ tfLaps.setText("0");
+ }
+ }
+ }
+ }
+ }
+
+ if (evt.getPropertyName().equals("currentFlagState")){
+ setFlagColor((FlagState) evt.getNewValue());
+ tfElapsedTime.setText(mainFrame.getRace().getElapsedTime().toString());
+
+ //After switch to green we have to trigger the decrease the lap counter
+ if ((FlagState) evt.getNewValue() == Race.FlagState.GREEN){
+ lastLapCountChangeTime = mainFrame.getRace().getElapsedTime();
+ }
+ }
+
+
+
+
+ }
+
+ private void setFlagColor(Race.FlagState flagState){
+ switch (flagState){
+ case RED:
+ tfFlag.setBackground(Color.red);
+ break;
+ case YELLOW:
+ tfFlag.setBackground(Color.YELLOW);
+ break;
+ case GREEN:
+ tfFlag.setBackground(Color.GREEN);
+ break;
+ case FINISH:
+ tfFlag.setBackground(Color.LIGHT_GRAY);
+ break;
+ case PURPLE:
+ tfFlag.setBackground(new Color(98,0,255));
+ break;
+ default:
+ tfFlag.setBackground(Color.BLACK);
+ }
+
+ }
+
+
+ public static LapCounterFrame getInstance(MainFrame mainFrame)
+ {
+ if (instance == null) {
+ instance = new LapCounterFrame(mainFrame);
+ }
+
+ return instance;
+ }
+
+
+}
diff --git a/src/com/zacharyfox/rmonitor/leaderboard/frames/MainFrame.java b/src/com/zacharyfox/rmonitor/leaderboard/frames/MainFrame.java
index caf19df..625e246 100644
--- a/src/com/zacharyfox/rmonitor/leaderboard/frames/MainFrame.java
+++ b/src/com/zacharyfox/rmonitor/leaderboard/frames/MainFrame.java
@@ -16,6 +16,9 @@
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
@@ -33,16 +36,19 @@
import net.miginfocom.swing.MigLayout;
+import org.ini4j.Ini;
+
import com.zacharyfox.rmonitor.entities.Race;
import com.zacharyfox.rmonitor.leaderboard.LeaderBoardMenuBar;
import com.zacharyfox.rmonitor.leaderboard.LeaderBoardTable;
import com.zacharyfox.rmonitor.leaderboard.LeaderBoardTableModel;
+import com.zacharyfox.rmonitor.leaderboard.RaceProvider;
import com.zacharyfox.rmonitor.leaderboard.Worker;
import com.zacharyfox.rmonitor.utils.Duration;
import com.zacharyfox.rmonitor.utils.Estimator;
import com.zacharyfox.rmonitor.utils.Recorder;
-public class MainFrame extends JFrame implements ActionListener
+public class MainFrame extends JFrame implements ActionListener, RaceProvider
{
private final JLabel elapsedTime;
private Estimator estimator;
@@ -66,11 +72,28 @@ public class MainFrame extends JFrame implements ActionListener
private final JPanel titleBar;
private final JLabel trackName;
private Worker worker;
+ private Ini ini;
+ private String iniFilename;
private static final long serialVersionUID = -743830529485841322L;
- public MainFrame()
+ public MainFrame(String iniFilename)
{
+ this.iniFilename = iniFilename;
+ ini = new Ini();
+ try {
+ File inifile = new File(iniFilename);
+ if(!inifile.exists()) {
+ inifile.createNewFile();
+ }
+ ini.load(new FileReader(inifile));
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+
+
Font systemLabelFont = UIManager.getFont("Label.font");
this.setBounds(100, 100, 870, 430);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
@@ -163,6 +186,8 @@ public MainFrame()
resultsScrollPane.setViewportView(leaderBoardTable);
menuBar = new LeaderBoardMenuBar(this);
+ menuBar.disableStartSignalMenu();
+ menuBar.disableLapCounterMenu();
this.setJMenuBar(menuBar);
}
@@ -178,17 +203,38 @@ public void propertyChange(PropertyChangeEvent evt)
updateDisplay(evt);
}
});
+ ConnectFrame.getInstance(this).getIP();
+ ConnectFrame.getInstance(this).getPort();
+ storeIniFile();
+
worker = new Worker(ConnectFrame.getInstance(this), race);
+
if (recorder != null) {
worker.setRecorder(recorder);
}
+ menuBar.enableStartSignalMenu();
+ menuBar.enableLapCounterMenu();
+ menuBar.enableFinishLineLogMenu();
worker.execute();
} else if (e.getActionCommand().equals("Disconnect")) {
+ menuBar.disableStartSignalMenu();
+ menuBar.disableLapCounterMenu();
+ menuBar.disableFinishLineLogMenu();
worker.cancel(true);
}
return;
}
+
+ public void storeIniFile(){
+ try {
+ File file = new File(iniFilename);
+ ini.store(file);
+ } catch (Exception e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
+ }
public void goFullScreen()
{
@@ -290,12 +336,21 @@ private void setFlagColor(String status)
flagColor_2.setBackground(new Color(255, 255, 255));
flagColor_3.setBackground(new Color(255, 255, 255));
flagColor_4.setBackground(new Color(0, 0, 0));
+ } else if (status.equals("Finish")) {
+ flagColor_1.setBackground(new Color(0, 0, 0));
+ flagColor_2.setBackground(new Color(255, 255, 255));
+ flagColor_3.setBackground(new Color(255, 255, 255));
+ flagColor_4.setBackground(new Color(0, 0, 0));
}
}
+ public Race getRace(){
+ return race;
+ }
+
private void updateDisplay(PropertyChangeEvent evt)
{
- if (evt.getPropertyName().equals("name")) {
+ if (evt.getPropertyName().equals("raceName")) {
runName.setText((String) evt.getNewValue());
}
@@ -307,6 +362,11 @@ private void updateDisplay(PropertyChangeEvent evt)
timeToGo.setText(((Duration) evt.getNewValue()).toString());
}
+ if (evt.getPropertyName().equals("lapsToGo")) {
+ timeToGo.setText(String.valueOf(((int) evt.getNewValue())));
+ }
+
+
if (evt.getPropertyName().equals("competitorsVersion")) {
((LeaderBoardTableModel) leaderBoardTable.getModel()).updateData();
}
@@ -324,4 +384,10 @@ private void updateDisplay(PropertyChangeEvent evt)
// trackLength.setText(evt.getNewValue().toString());
}
}
+
+ public Ini getIni(){
+ return ini;
+ }
+
+
}
\ No newline at end of file
diff --git a/src/com/zacharyfox/rmonitor/leaderboard/frames/PlayerFrame.java b/src/com/zacharyfox/rmonitor/leaderboard/frames/PlayerFrame.java
index f1249c6..1c7c840 100644
--- a/src/com/zacharyfox/rmonitor/leaderboard/frames/PlayerFrame.java
+++ b/src/com/zacharyfox/rmonitor/leaderboard/frames/PlayerFrame.java
@@ -3,12 +3,15 @@
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
+import java.util.prefs.Preferences;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextField;
+import org.ini4j.IniPreferences;
+
import net.miginfocom.swing.MigLayout;
import com.zacharyfox.rmonitor.utils.Player;
@@ -18,31 +21,54 @@ public class PlayerFrame extends JFrame implements ActionListener
private JFileChooser chooser;
private final MainFrame mainFrame;
private final JTextField playerFile;
+ private final JTextField playerSpeedup;
+
private final JButton selectFileButton;
private final JButton startStop;
+ private final JButton pause;
private static PlayerFrame instance;
private static Player player;
private static final long serialVersionUID = -9179041103033981780L;
+ private Preferences playerPrefs;
private PlayerFrame(MainFrame mainFrame)
{
this.mainFrame = mainFrame;
-
- getContentPane().setLayout(new MigLayout("", "[grow][][]", "[][]"));
- setBounds(100, 100, 400, 150);
+
+ playerPrefs = new IniPreferences(mainFrame.getIni()).node("Player");
+
+ getContentPane().setLayout(new MigLayout("", "[grow][][][][]", "[][]"));
+ setBounds(100, 100, 600, 150);
playerFile = new JTextField();
getContentPane().add(playerFile, "cell 0 0,growx");
+ playerFile.setText(playerPrefs.get("LastFile", ""));
playerFile.setColumns(10);
selectFileButton = new JButton("Open");
selectFileButton.addActionListener(this);
getContentPane().add(selectFileButton, "cell 1 0");
+ playerSpeedup = new JTextField();
+ getContentPane().add(playerSpeedup, "cell 2 0");
+ playerSpeedup.setText(playerPrefs.get("Speedup", "2"));
+ playerSpeedup.setColumns(3);
+
startStop = new JButton("Start");
startStop.setEnabled(false);
startStop.addActionListener(this);
- getContentPane().add(startStop, "cell 2 0");
+ getContentPane().add(startStop, "cell 3 0");
+
+ pause = new JButton("Pause");
+ pause.setEnabled(false);
+ pause.addActionListener(this);
+ getContentPane().add(pause, "cell 4 0");
+
+ if (playerFile.getText() != null && !"".equals(playerFile.getText())){
+ File file = new File(playerFile.getText());
+ if (file.canWrite()) startStop.setEnabled(true);
+
+ }
}
@Override
@@ -50,25 +76,40 @@ public void actionPerformed(ActionEvent evt)
{
if (evt.getActionCommand().equals("Open")) {
chooser = new JFileChooser();
- chooser.setSelectedFile(new File("leaderboard-recording.txt"));
+ chooser.setSelectedFile(new File(playerPrefs.get("LastFile", "leaderboard-recording.txt")));
if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
playerFile.setText(chooser.getSelectedFile().toString());
+ playerPrefs.put("LastFile", chooser.getSelectedFile().toString());
startStop.setEnabled(true);
}
} else if (evt.getActionCommand().equals("Start")) {
startStop.setText("Stop");
+ pause.setEnabled(true);
playerFile.setEnabled(false);
selectFileButton.setEnabled(false);
player = new Player(playerFile.getText());
+ player.setPlayerSpeedup(Integer.parseInt(playerSpeedup.getText()));
+ playerPrefs.put("Speedup", playerSpeedup.getText());
player.execute();
} else if (evt.getActionCommand().equals("Stop")) {
player.close();
startStop.setText("Start");
+ pause.setEnabled(false);
playerFile.setEnabled(true);
selectFileButton.setEnabled(true);
+
+ } else if (evt.getActionCommand().equals("Pause")) {
+ pause.setText("Resume");
+ player.pause();
+
+ } else if (evt.getActionCommand().equals("Resume")) {
+ pause.setText("Pause");
+ player.resume();
+
}
+
}
public static PlayerFrame getInstance(MainFrame mainFrame)
diff --git a/src/com/zacharyfox/rmonitor/leaderboard/frames/ServerFrame.java b/src/com/zacharyfox/rmonitor/leaderboard/frames/ServerFrame.java
new file mode 100644
index 0000000..0b48b07
--- /dev/null
+++ b/src/com/zacharyfox/rmonitor/leaderboard/frames/ServerFrame.java
@@ -0,0 +1,83 @@
+package com.zacharyfox.rmonitor.leaderboard.frames;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.prefs.Preferences;
+
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JTextField;
+import javax.swing.SwingConstants;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.ini4j.IniPreferences;
+
+import com.zacharyfox.rmonitor.utils.JsonServer;
+
+public class ServerFrame extends JFrame implements ActionListener
+{
+ public JButton startStop;
+ public JTextField port;
+ private final JLabel portLabel;
+ private static ServerFrame instance;
+ private static final long serialVersionUID = 3848021032174790659L;
+ private Preferences connectPrefs;
+ private static JsonServer jsonServer;
+ private MainFrame mainFrame;
+
+ private ServerFrame(MainFrame mainFrame)
+ {
+ connectPrefs = new IniPreferences(mainFrame.getIni()).node("JsonServer");
+ getContentPane().setLayout(new MigLayout("", "[][grow]", "[][]"));
+ setBounds(100, 100, 400, 150);
+
+ portLabel = new JLabel("JsonServer Port:");
+ portLabel.setHorizontalAlignment(SwingConstants.RIGHT);
+ getContentPane().add(portLabel, "cell 0 0,alignx trailing");
+
+ port = new JTextField();
+ port.setText(connectPrefs.get("Port", "8080"));
+ getContentPane().add(port, "cell 1 0,growx");
+ port.setColumns(10);
+
+ startStop = new JButton("Start");
+ startStop.setHorizontalAlignment(SwingConstants.RIGHT);
+ startStop.addActionListener(this);
+ getContentPane().add(startStop, "cell 1 1,alignx right");
+ this.mainFrame = mainFrame;
+ }
+
+
+ public Integer getPort()
+ {
+ connectPrefs.put("Port",port.getText());
+ return Integer.parseInt(port.getText());
+ }
+
+ public static ServerFrame getInstance(MainFrame mainFrame)
+ {
+ if (instance == null) {
+ instance = new ServerFrame(mainFrame);
+ }
+
+ return instance;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent evt)
+ {
+ if (evt.getActionCommand().equals("Start")) {
+ startStop.setText("Stop");
+ jsonServer = new JsonServer(getPort(), mainFrame);
+ jsonServer.execute();
+
+ } else if (evt.getActionCommand().equals("Stop")) {
+ jsonServer.stopServer();
+ jsonServer = null;
+ startStop.setText("Start");
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/com/zacharyfox/rmonitor/leaderboard/frames/StartSignalFrame.java b/src/com/zacharyfox/rmonitor/leaderboard/frames/StartSignalFrame.java
new file mode 100644
index 0000000..ccc0ffd
--- /dev/null
+++ b/src/com/zacharyfox/rmonitor/leaderboard/frames/StartSignalFrame.java
@@ -0,0 +1,218 @@
+package com.zacharyfox.rmonitor.leaderboard.frames;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.Collection;
+
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.SwingConstants;
+import javax.swing.border.EmptyBorder;
+
+import com.zacharyfox.rmonitor.entities.Competitor;
+import com.zacharyfox.rmonitor.entities.Race;
+import com.zacharyfox.rmonitor.entities.Race.FlagState;
+import com.zacharyfox.rmonitor.utils.Duration;
+
+
+
+public class StartSignalFrame extends JFrame {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 7957459184007408065L;
+
+ private static StartSignalFrame instance;
+ private final MainFrame mainFrame;
+
+ static GraphicsDevice device = GraphicsEnvironment
+ .getLocalGraphicsEnvironment().getScreenDevices()[0];
+
+ private final JPanel contentPanel = new JPanel();
+ private JTextField tfRaceName;
+ private JTextArea tfFlag;
+ private JTextField tfRaceTime;
+
+ private JButton cancelButton;
+ private final PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt)
+ {
+ updateDisplay(evt);
+ }
+ };
+
+ /**
+ * Create the dialog.
+ */
+ public StartSignalFrame(final MainFrame mainFrame) {
+ this.mainFrame = mainFrame;
+ setBounds(100, 100, 698, 590);
+ setExtendedState(JFrame.MAXIMIZED_BOTH);
+ getContentPane().setLayout(new BorderLayout());
+ contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
+ getContentPane().add(contentPanel, BorderLayout.CENTER);
+ contentPanel.setLayout(new BorderLayout(0, 0));
+ {
+ tfRaceName = new JTextField();
+ tfRaceName.setHorizontalAlignment(SwingConstants.CENTER);
+ tfRaceName.setForeground(Color.WHITE);
+ tfRaceName.setBackground(Color.BLACK);
+
+ tfRaceName.setFont(new Font("Tahoma", Font.PLAIN, 80));
+ contentPanel.add(tfRaceName, BorderLayout.NORTH);
+ if (mainFrame.getRace() != null){
+ tfRaceName.setText(mainFrame.getRace().getRaceName());
+ } else {
+ tfRaceName.setText("");
+ }
+
+ tfRaceName.setColumns(50);
+ }
+ {
+ tfFlag = new JTextArea();
+ tfFlag.setEditable(false);
+ tfFlag.setWrapStyleWord(true);
+ tfFlag.setLineWrap(true);
+ tfFlag.setForeground(Color.WHITE);
+ tfFlag.setFont(new Font("Tahoma", Font.PLAIN, 80));
+ tfFlag.setRows(5);
+ tfFlag.setBackground(Color.BLACK);
+ contentPanel.add(tfFlag, BorderLayout.CENTER);
+
+ tfFlag.setColumns(20);
+
+ if (mainFrame.getRace() != null){
+ setFlagColor(mainFrame.getRace().getCurrentFlagState());
+ }
+ }
+ {
+ tfRaceTime = new JTextField();
+ tfRaceTime.setText("00:00:00");
+ tfRaceTime.setHorizontalAlignment(SwingConstants.CENTER);
+ tfRaceTime.setBackground(Color.BLACK);
+ tfRaceTime.setForeground(Color.WHITE);
+ tfRaceTime.setFont(new Font("Tahoma", Font.PLAIN, 100));
+ contentPanel.add(tfRaceTime, BorderLayout.SOUTH);
+ tfRaceTime.setColumns(10);
+ }
+ {
+ JPanel buttonPane = new JPanel();
+ buttonPane.setBackground(Color.BLACK);
+ buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
+ getContentPane().add(buttonPane, BorderLayout.SOUTH);
+ {
+ cancelButton = new JButton("X");
+ cancelButton.setFont(new Font("Tahoma", Font.BOLD, 11));
+ cancelButton.setMnemonic('x');
+ cancelButton.setBackground(Color.BLACK);
+ cancelButton.setForeground(Color.RED);
+ cancelButton.setActionCommand("Cancel");
+ cancelButton.addActionListener(new ActionListener (){
+
+ @Override
+ public void actionPerformed(ActionEvent evt) {
+ instance.setVisible(false);
+ mainFrame.getRace().removePropertyChangeListener(propertyChangeListener);
+ instance.dispose();
+ instance = null;
+
+ }
+
+ });
+
+ buttonPane.add(cancelButton);
+ }
+ }
+
+ mainFrame.getRace().addPropertyChangeListener(propertyChangeListener);
+
+ }
+
+
+ public void addCancelButtonListener(ActionListener listener) {
+ cancelButton.addActionListener(listener);
+ }
+
+
+
+ private void updateDisplay(PropertyChangeEvent evt)
+ {
+ if (evt.getPropertyName().equals("raceName")) {
+ tfRaceName.setText((String) evt.getNewValue());
+ }
+
+ if (evt.getPropertyName().equals("elapsedTime")) {
+ tfRaceTime.setText(((Duration) evt.getNewValue()).toString());
+ }
+
+ if (evt.getPropertyName().equals("currentFlagState")) {
+ setFlagColor((FlagState) evt.getNewValue());
+ tfFlag.setText("");
+ }
+
+ if (evt.getPropertyName().equals("competitorsVersion")) {
+ if (mainFrame.getRace().getCurrentFlagState() == Race.FlagState.PURPLE) {
+ tfFlag.setText(getCompetitorsString(Competitor.getInstances().values()) );
+ }
+ }
+
+
+ }
+
+
+ private String getCompetitorsString(Collection competitors){
+ String result = "";
+ for (Competitor competitor : competitors) {
+ result = result + competitor.getRegNumber() + ", ";
+ }
+ if (!"".equals(result)){
+ result = result.substring(0, result.length()-2);
+ }
+ return result;
+ }
+
+ private void setFlagColor(Race.FlagState flagState){
+ switch (flagState){
+ case RED:
+ tfFlag.setBackground(Color.red);
+ break;
+ case YELLOW:
+ tfFlag.setBackground(Color.YELLOW);
+ break;
+ case GREEN:
+ tfFlag.setBackground(Color.GREEN);
+ break;
+ case FINISH:
+ tfFlag.setBackground(Color.LIGHT_GRAY);
+ break;
+ case PURPLE:
+ tfFlag.setBackground(new Color(98,0,255));
+ break;
+ default:
+ tfFlag.setBackground(Color.BLACK);
+ }
+
+ }
+
+ public static StartSignalFrame getInstance(MainFrame mainFrame)
+ {
+ if (instance == null) {
+ instance = new StartSignalFrame(mainFrame);
+ }
+
+ return instance;
+ }
+
+}
diff --git a/src/com/zacharyfox/rmonitor/message/CompInfo.java b/src/com/zacharyfox/rmonitor/message/CompInfo.java
index a5f2403..d557bad 100644
--- a/src/com/zacharyfox/rmonitor/message/CompInfo.java
+++ b/src/com/zacharyfox/rmonitor/message/CompInfo.java
@@ -9,14 +9,14 @@ public class CompInfo extends RMonitorMessage
private String nationality;
private String number;
private String regNumber;
- private int transNumber;
+ private String transNumber;
public CompInfo(String[] tokens)
{
if (tokens[0].equals("$A")) {
regNumber = tokens[1];
number = tokens[2];
- transNumber = Integer.parseInt(tokens[3]);
+ transNumber = tokens[3];
firstName = tokens[4];
lastName = tokens[5];
nationality = tokens[6];
@@ -68,7 +68,7 @@ public String getRegNumber()
return regNumber;
}
- public int getTransNumber()
+ public String getTransNumber()
{
return transNumber;
}
diff --git a/src/com/zacharyfox/rmonitor/utils/Connection.java b/src/com/zacharyfox/rmonitor/utils/Connection.java
index e925cd0..62d7a39 100644
--- a/src/com/zacharyfox/rmonitor/utils/Connection.java
+++ b/src/com/zacharyfox/rmonitor/utils/Connection.java
@@ -22,7 +22,7 @@ public Connection(String ip, int port) throws Exception
@Override
public void close() throws IOException
{
- clientReader.close();
+ if (clientReader != null) clientReader.close();
super.close();
}
diff --git a/src/com/zacharyfox/rmonitor/utils/JsonServer.java b/src/com/zacharyfox/rmonitor/utils/JsonServer.java
new file mode 100644
index 0000000..3d91cd2
--- /dev/null
+++ b/src/com/zacharyfox/rmonitor/utils/JsonServer.java
@@ -0,0 +1,157 @@
+package com.zacharyfox.rmonitor.utils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.swing.SwingWorker;
+
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+
+import com.google.gson.Gson;
+import com.zacharyfox.rmonitor.entities.Race;
+import com.zacharyfox.rmonitor.entities.RaceTO;
+import com.zacharyfox.rmonitor.leaderboard.RaceProvider;
+
+public class JsonServer extends SwingWorker
+{
+ private class JsonHandler extends AbstractHandler
+ {
+ private RaceProvider raceProvider;
+ private Gson gson;
+ private RaceTO lastRaceTO;
+
+ public JsonHandler(RaceProvider raceProvider){
+ this.raceProvider = raceProvider;
+ gson = new Gson();
+ }
+
+ @Override
+ public void handle( String target,
+ Request baseRequest,
+ HttpServletRequest request,
+ HttpServletResponse response ) throws IOException,
+ ServletException
+ {
+ // Declare response encoding and types
+ response.setContentType("application/json");
+
+
+ // set CORS Headers
+ response.addHeader("Access-Control-Allow-Headers",
+ "Access-Control-Allow-Origin, Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
+ if (response.getHeader("Access-Control-Allow-Origin") == null)
+ response.addHeader("Access-Control-Allow-Origin", "*");
+
+ // Declare response status code
+ response.setStatus(HttpServletResponse.SC_OK);
+
+ Object resultTO;
+
+ System.out.println("Path Info:" + request.getPathInfo());
+ // We split the path of the request
+ String [] pathInfoParts = request.getPathInfo().split("/");
+ if (pathInfoParts.length > 1 && pathInfoParts[1].equals("race")) {
+ // object selected is race
+ //System.out.println("Path is race:" + pathInfoParts[1]);
+ // check for an ID as second part
+ if (pathInfoParts.length > 2 && pathInfoParts[2].matches("\\d+")) {
+ int raceID = Integer.parseInt(pathInfoParts[2]);
+ //System.out.println("Returning race with ID:" + raceID);
+ resultTO = getRaceToReturn(raceID);
+ }else{
+ //System.out.println("Returning current race");
+ resultTO = getRaceToReturn();
+ }
+ } else if (pathInfoParts.length > 1 && pathInfoParts[1].equals("races")){
+ //default we return the race
+ resultTO = getRacesToReturn();
+ } else {
+ resultTO = getRaceToReturn();
+ }
+
+
+
+
+ // Write back response
+ response.getWriter().println(gson.toJson(resultTO));
+
+
+ // Inform jetty that this request has now been handled
+ baseRequest.setHandled(true);
+ }
+
+ private RaceTO getRaceToReturn(){
+ RaceTO currentRaceTO = raceProvider.getRace().getRaceTO();
+ // if the currentRaceTO has ID = 0 we try to get the lastRaceTO from the history
+ if (lastRaceTO != null && currentRaceTO.raceID == 0){
+ this.raceProvider.getRace();
+ currentRaceTO = Race.getToByID(lastRaceTO.raceID);
+ } else {
+ lastRaceTO = currentRaceTO;
+ }
+ return currentRaceTO;
+ }
+
+ private RaceTO getRaceToReturn(int id){
+
+ raceProvider.getRace();
+ return Race.getToByID(id);
+ }
+
+ private RaceTO[] getRacesToReturn(){
+
+ return Race.getAllRaceTOs();
+
+ }
+ }
+
+ Server jettyServer;
+
+ private int port;
+
+
+
+ public JsonServer(int port, RaceProvider raceProvider)
+ {
+ this.port = port;
+ jettyServer = new Server(this.port);
+ jettyServer.setHandler(new JsonHandler(raceProvider));
+
+
+
+
+ }
+
+
+ public void stopServer()
+ {
+ try {
+ jettyServer.stop();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+
+ @Override
+ protected Integer doInBackground() throws Exception
+ {
+ try {
+ jettyServer.start();
+ jettyServer.join();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+}
diff --git a/src/com/zacharyfox/rmonitor/utils/Player.java b/src/com/zacharyfox/rmonitor/utils/Player.java
index 5c8df41..ffab537 100644
--- a/src/com/zacharyfox/rmonitor/utils/Player.java
+++ b/src/com/zacharyfox/rmonitor/utils/Player.java
@@ -14,6 +14,8 @@ public class Player extends SwingWorker
private Socket clientSocket;
private FileReader fileReader;
private ServerSocket serverSocket;
+ private int speedup = 2;
+ private boolean pause = false;
public Player(String fileName)
{
@@ -28,12 +30,14 @@ public Player(String fileName)
}
+
public void close()
{
try {
- clientSocket.close();
- bufferedReader.close();
- fileReader.close();
+ if (clientSocket != null) clientSocket.close();
+ if (serverSocket != null) serverSocket.close();
+ if (bufferedReader != null) bufferedReader.close();
+ if (fileReader != null) fileReader.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -51,13 +55,19 @@ protected Integer doInBackground() throws Exception
clientSocket = serverSocket.accept();
System.out.println("Player client connected");
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
- while ((line = bufferedReader.readLine()) != null) {
- String[] tokens = line.split(" ", 2);
- long tS = Integer.parseInt(tokens[0]);
- System.out.println(tokens[1]);
- out.println(tokens[1]);
- Thread.sleep((int) ((tS - lastTs) / 10));
- lastTs = tS;
+ line = bufferedReader.readLine();
+ while ( line != null) {
+ if (pause){
+ Thread.sleep(1000);
+ } else {
+ String[] tokens = line.split(" ", 2);
+ long tS = Integer.parseInt(tokens[0]);
+ //System.out.println(tokens[1]);
+ out.println(tokens[1]);
+ Thread.sleep((int) ((tS - lastTs) / speedup));
+ lastTs = tS;
+ line = bufferedReader.readLine();
+ }
}
} catch (Exception e) {
// TODO Auto-generated catch block
@@ -65,4 +75,17 @@ protected Integer doInBackground() throws Exception
}
return null;
}
+
+ public void pause(){
+ pause = true;
+ }
+
+ public void resume(){
+ pause = false;
+ }
+
+
+ public void setPlayerSpeedup(int newSpeedup){
+ speedup = newSpeedup;
+ }
}