diff --git a/src/main/java/org/fenix/WorldRecord/RecordDialog.java b/src/main/java/org/fenix/WorldRecord/RecordDialog.java index 9fd64f9..b44984d 100644 --- a/src/main/java/org/fenix/WorldRecord/RecordDialog.java +++ b/src/main/java/org/fenix/WorldRecord/RecordDialog.java @@ -1,34 +1,42 @@ package org.fenix.WorldRecord; -import javax.swing.*; +import org.fenix.llanfair.dialog.*; + import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import javax.swing.*; +import java.awt.event.*; import java.io.IOException; import java.util.ArrayList; -public class RecordDialog extends JDialog +public class RecordDialog extends LlanfairDialog { private JLabel searchLabel = new JLabel("Search game:"); - private JTextField searchField = new JTextField(); private JButton searchButton = new JButton("Search"); + private JTextField searchField = new JTextField(); - private JLabel gamesLabel = new JLabel("Games:"); private DefaultComboBoxModel gameListModel = new DefaultComboBoxModel<>(); private JComboBox games = new JComboBox<>(gameListModel); + private JLabel gamesLabel = new JLabel("Games:"); - private JLabel categoriesLabel = new JLabel("Categories:"); private DefaultComboBoxModel categoryListModel = new DefaultComboBoxModel<>(); private JComboBox categories = new JComboBox<>(categoryListModel); + private JLabel categoriesLabel = new JLabel("Categories:"); - private JLabel worldRecord = new JLabel(); - private JButton ok = new JButton("Ok"); private JButton close = new JButton("Close"); + private JButton ok = new JButton("Ok"); + private JLabel worldRecord = new JLabel(); - private String category_id = ""; + private ActionListener categoryListener; + private ActionListener gameListener; - public RecordDialog() + private Category category; + private EditRun editRun; + + + public RecordDialog(EditRun editRun) { + this.editRun = editRun; + JPanel searchPanel = new JPanel(new FlowLayout()); { searchField.setPreferredSize(new Dimension(200,30)); @@ -50,13 +58,6 @@ public class RecordDialog extends JDialog gamesPanel.add(games); games.setEnabled(false); - - games.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - getCategories((Game) games.getSelectedItem()); - } - }); } JPanel categoriesPanel = new JPanel(new GridLayout(1,2)); { @@ -64,13 +65,6 @@ public class RecordDialog extends JDialog categoriesPanel.add(categories); categories.setEnabled(false); - - categories.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - getWorldRecord((Category) categories.getSelectedItem()); - } - }); } JPanel buttonPanel = new JPanel(new FlowLayout()); { @@ -106,20 +100,31 @@ public class RecordDialog extends JDialog pack(); } + /** + * Search the game title on speedrun.com + * @param name The name of the game + */ private void searchGame(String name) { + this.resetFields(); + ArrayList games = new ArrayList<>(); try { games = WorldRecordParser.searchGames(name); } catch (IOException e) { - System.out.println("fout"); + showError(); } this.setGames(games); + this.addGameListener(); } + /** + * Get the categories for a game on speedrun.com + * @param game A game object received from the game search + */ private void getCategories(Game game) { ArrayList categories = new ArrayList<>(); @@ -128,12 +133,17 @@ public class RecordDialog extends JDialog categories = WorldRecordParser.getCategories(game); } catch (IOException e) { - System.out.println("fout"); + showError(); } this.setCategories(categories); + this.addCategoryListener(); } + /** + * Get the world record time and owner from speedrun.com + * @param category A category object received from the category search + */ private void getWorldRecord(Category category) { String worldRecord = ""; @@ -142,16 +152,20 @@ public class RecordDialog extends JDialog worldRecord = WorldRecordParser.getRecord(category); } catch (IOException e) { - System.out.println("fout"); + showError(); } this.worldRecord.setText(worldRecord); - this.category_id = category.getId(); + this.category = category; } + /** + * Append the games in the array to the games combobox + * @param games A ArrayList of game objects + */ private void setGames(ArrayList games) { - gameListModel.removeAllElements(); + this.resetFields(); for(Game game: games) { @@ -161,6 +175,10 @@ public class RecordDialog extends JDialog this.games.setEnabled(true); } + /** + * Append the categories in the array to the categories checkbox + * @param categories A ArrayList of Category objects + */ private void setCategories(ArrayList categories) { categoryListModel.removeAllElements(); @@ -173,14 +191,95 @@ public class RecordDialog extends JDialog this.categories.setEnabled(true); } + /** + * Close the dialog without saving + */ private void close() { this.setVisible(false); } + /** + * Close the dialog and send a signal to the parent window + */ private void actionOk() { - this.category_id = ((Category) categories.getSelectedItem()).getId(); + this.category = ((Category) categories.getSelectedItem()); this.setVisible(false); + + this.editRun.recordSet(); + } + + /** + * Add the changeListener to the categories combobox + */ + private void addCategoryListener() + { + categoryListener = new ActionListener() { + public void actionPerformed(ActionEvent e) + { + getWorldRecord((Category) categories.getSelectedItem()); + } + }; + + categories.addActionListener(categoryListener); + } + + /** + * Add the changeListener to the games combobox + */ + private void addGameListener() + { + + gameListener = new ActionListener() { + public void actionPerformed(ActionEvent e) + { + getCategories((Game) games.getSelectedItem()); + } + }; + + games.addActionListener(gameListener); + } + + /** + * Reset the comboboxes + */ + private void resetFields() + { + try { + categories.removeActionListener(categoryListener); + games.removeActionListener(gameListener); + } catch (Exception e){} + + categories.setEnabled(false); + games.setEnabled(false); + + gameListModel.removeAllElements(); + categoryListModel.removeAllElements(); + } + + public static void showError() + { + JOptionPane.showMessageDialog(null, "Could not connect to speedrun.com", + "Error", JOptionPane.ERROR_MESSAGE); + } + + + /** + * Get the selected category object + * @return Category + */ + public Category getCategory() + { + return category; + } + + /** + * Get the selected record string + * @return String + */ + public String getRecordString() + { + return worldRecord.getText(); } } diff --git a/src/main/java/org/fenix/WorldRecord/WorldRecordParser.java b/src/main/java/org/fenix/WorldRecord/WorldRecordParser.java index 36e75a8..0f4d968 100644 --- a/src/main/java/org/fenix/WorldRecord/WorldRecordParser.java +++ b/src/main/java/org/fenix/WorldRecord/WorldRecordParser.java @@ -117,9 +117,9 @@ public class WorldRecordParser String time = ""; if(hours != 0) - time += hours + ":"; + time += String.format("%02d:", hours); - time += minutes + ":" + seconds; + time += String.format("%02d:%02d", minutes, seconds); if(time_seconds % 1 != 0) { diff --git a/src/main/java/org/fenix/llanfair/Run.java b/src/main/java/org/fenix/llanfair/Run.java index 13be004..ef58eeb 100644 --- a/src/main/java/org/fenix/llanfair/Run.java +++ b/src/main/java/org/fenix/llanfair/Run.java @@ -1,6 +1,8 @@ package org.fenix.llanfair; import com.thoughtworks.xstream.annotations.XStreamOmitField; +import org.fenix.WorldRecord.Category; +import org.fenix.WorldRecord.WorldRecordParser; import org.fenix.llanfair.config.Settings; import org.fenix.utils.TableModelSupport; import org.fenix.utils.config.Configuration; @@ -104,7 +106,7 @@ public class Run implements TableModel, Serializable { public static final String COMPLETED_ATTEMPT_COUNTER_PROPERTY = "run.completedAttemptCounter"; - + public static final String RECORD_CATEGORY_PROPERTY = "run.record.category"; public static final String DELAYED_START_PROPERTY = "run.delayedStart"; @@ -185,6 +187,8 @@ public class Run implements TableModel, Serializable { @XStreamOmitField private int sessionAttempts; + private Category recordCategory; + // ----------------------------------------------------------- CONSTRUCTORS /** @@ -598,6 +602,23 @@ public class Run implements TableModel, Serializable { public int getSessionAttempts() { return sessionAttempts; } + public String getRecordString() { + String recordString; + + try { + recordString = WorldRecordParser.getRecord(this.recordCategory); + } catch (Exception e) { + recordString = "Unknown World Record"; + } + + return recordString; + } + + public Category getRecordCategory() + { + return recordCategory; + } + // ---------------------------------------------------------------- SETTERS public T getSetting( String key ) { @@ -648,6 +669,15 @@ public class Run implements TableModel, Serializable { pcSupport.firePropertyChange(DELAYED_START_PROPERTY, old, delayedStart); } + public void setRecordCategory(Category category) + { + Category old = this.recordCategory; + + this.recordCategory = category; + + pcSupport.firePropertyChange(RECORD_CATEGORY_PROPERTY, old, name); + } + /** * Inserts the given segment at the end. If it's the first segment being * added, the run becomes {@link State#READY}, meaning it can be started. @@ -1155,6 +1185,9 @@ public class Run implements TableModel, Serializable { if ( configuration == null ) { configuration = new Configuration(); } + if(recordCategory == null) { + recordCategory = new Category("", ""); + } } /** diff --git a/src/main/java/org/fenix/llanfair/gui/Footer.java b/src/main/java/org/fenix/llanfair/gui/Footer.java index 3215eb3..74fce40 100644 --- a/src/main/java/org/fenix/llanfair/gui/Footer.java +++ b/src/main/java/org/fenix/llanfair/gui/Footer.java @@ -29,6 +29,7 @@ class Footer extends JPanel { private static final int TEXT = 0x04; private static final int BEST = 0x08; private static final int VERBOSE = 0x10; + private static final int WORLD_RECORD = 0x20; private static final int INSET = 3; @@ -90,7 +91,7 @@ class Footer extends JPanel { preferredSize = null; resize = false; - worldRecord = new JLabel("World record: 5 by xem92"); + worldRecord = new JLabel(); setRun(run); setOpaque(false); @@ -252,6 +253,8 @@ class Footer extends JPanel { updateValues(TIME | TEXT); updateSize(); forceResize(); + } else if (Run.RECORD_CATEGORY_PROPERTY.equals(property)) { + updateValues(WORLD_RECORD); } } @@ -585,6 +588,9 @@ class Footer extends JPanel { labelDeltaBest.setText("" + Language.LB_FT_DELTA_BEST); labelSumOfBest.setText("" + Language.LB_FT_SUM_OF_BEST); } + if((identifier & WORLD_RECORD) == WORLD_RECORD) { + worldRecord.setText(run.getRecordString()); + } } private void updateSize() {