package cryodex.modules.armada; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Graphics; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import cryodex.CryodexController; import cryodex.Player; import cryodex.widget.ComponentUtils; public class ArmadaRoundPanel extends JPanel { private static final long serialVersionUID = 1L; private final List<ArmadaMatch> matches; private final List<GamePanel> gamePanels = new ArrayList<GamePanel>(); private JPanel quickEntryPanel; private JPanel quickEntrySubPanel; private JTextField roundNumber; private JComboBox<ArmadaPlayer> playerCombo; private final JScrollPane scroll; private final ArmadaTournament tournament; public ArmadaRoundPanel(ArmadaTournament t, List<ArmadaMatch> matches) { super(new BorderLayout()); this.tournament = t; this.matches = matches; this.setBorder(BorderFactory.createLineBorder(Color.black)); int counter = 1; for (ArmadaMatch match : matches) { GamePanel gpanel = new GamePanel(counter, match); gamePanels.add(gpanel); counter++; } scroll = new JScrollPane(ComponentUtils.addToFlowLayout(buildPanel(), FlowLayout.CENTER)); scroll.setBorder(BorderFactory.createEmptyBorder()); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { scroll.getVerticalScrollBar().setValue(0); scroll.getVerticalScrollBar().setUnitIncrement(15); } }); this.add(getQuickEntryPanel(), BorderLayout.NORTH); this.add(scroll, BorderLayout.CENTER); } public JPanel getQuickEntryPanel() { if (quickEntryPanel == null) { quickEntryPanel = new JPanel(new BorderLayout()); quickEntryPanel.setVisible(CryodexController.getOptions() .isShowQuickFind()); ComponentUtils.forceSize(quickEntryPanel, 405, 135); quickEntrySubPanel = new JPanel(new BorderLayout()); ComponentUtils.forceSize(quickEntrySubPanel, 400, 130); roundNumber = new JTextField(5); roundNumber.getDocument().addDocumentListener( new DocumentListener() { @Override public void changedUpdate(DocumentEvent e) { update(); } @Override public void removeUpdate(DocumentEvent e) { update(); } @Override public void insertUpdate(DocumentEvent e) { update(); } }); List<ArmadaPlayer> playerList = new ArrayList<ArmadaPlayer>(); playerList.add(new ArmadaPlayer(new Player())); playerList.addAll(tournament.getArmadaPlayers()); Collections.sort(playerList); playerCombo = new JComboBox<ArmadaPlayer>( playerList.toArray(new ArmadaPlayer[playerList.size()])); playerCombo.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { update(); } }); quickEntryPanel.add(ComponentUtils.addToFlowLayout(ComponentUtils .addToHorizontalBorderLayout(new JLabel( "Enter table number"), roundNumber, ComponentUtils .addToHorizontalBorderLayout(new JLabel( "or choose a player"), playerCombo, null)), FlowLayout.CENTER), BorderLayout.NORTH); quickEntryPanel.add(quickEntrySubPanel); } return quickEntryPanel; } public void update() { scroll.getViewport().removeAll(); scroll.getViewport() .add(ComponentUtils.addToFlowLayout(buildPanel(), FlowLayout.CENTER)); ComponentUtils.repaint(ArmadaRoundPanel.this); Integer i = null; try { i = Integer.parseInt(roundNumber.getText()); } catch (NumberFormatException e) { } ArmadaPlayer player = playerCombo.getSelectedIndex() == 0 ? null : (ArmadaPlayer) playerCombo.getSelectedItem(); if (player != null) { roundNumber.setEnabled(false); } else if (i != null) { playerCombo.setEnabled(false); } else { roundNumber.setEnabled(true); playerCombo.setEnabled(true); } GamePanel gamePanel = null; if (i != null) { if (i > gamePanels.size()) { return; } gamePanel = gamePanels.get(i - 1); } else if (player != null) { for (GamePanel g : gamePanels) { if (g.getMatch().getPlayer1() == player) { gamePanel = g; break; } else if (g.getMatch().getPlayer2() != null && g.getMatch().getPlayer2() == player) { gamePanel = g; break; } } } if (gamePanel == null) { return; } quickEntrySubPanel.add(gamePanel.getPlayerTitle(), BorderLayout.CENTER); quickEntrySubPanel.removeAll(); JPanel panel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 2; gbc.anchor = GridBagConstraints.EAST; panel.add(gamePanel.getPlayerTitle(), gbc); gbc.gridx = 2; gbc.fill = GridBagConstraints.BOTH; panel.add(gamePanel.getResultCombo(), gbc); if (gamePanel.getMatch().getPlayer2() != null) { gbc.gridy++; gbc.gridwidth = 1; gbc.fill = GridBagConstraints.NONE; gbc.gridx = 1; panel.add(gamePanel.getPlayer1ScoreLabel(), gbc); gbc.gridx = 2; panel.add(gamePanel.getPlayer1ScoreField(), gbc); gbc.gridy++; gbc.gridwidth = 1; gbc.gridx = 1; panel.add(gamePanel.getPlayer2ScoreLabel(), gbc); gbc.gridx = 2; panel.add(gamePanel.getPlayer2ScoreField(), gbc); } quickEntrySubPanel.add(panel, BorderLayout.CENTER); ComponentUtils.repaint(quickEntrySubPanel); ComponentUtils.repaint(quickEntryPanel); } public JPanel buildPanel() { JPanel panel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = -1; for (GamePanel gp : gamePanels) { gbc.gridy++; gbc.gridx = 0; gbc.gridwidth = 2; gbc.anchor = GridBagConstraints.EAST; panel.add(gp.getPlayerTitle(), gbc); gbc.gridx = 2; gbc.fill = GridBagConstraints.BOTH; panel.add(gp.getResultCombo(), gbc); if (gp.getMatch().getPlayer2() != null) { gbc.gridy++; gbc.gridwidth = 1; gbc.fill = GridBagConstraints.NONE; gbc.gridx = 1; panel.add(gp.getPlayer1ScoreLabel(), gbc); gbc.gridx = 2; panel.add(gp.getPlayer1ScoreField(), gbc); gbc.gridy++; gbc.gridwidth = 1; gbc.gridx = 1; panel.add(gp.getPlayer2ScoreLabel(), gbc); gbc.gridx = 2; panel.add(gp.getPlayer2ScoreField(), gbc); } } return panel; } public List<ArmadaMatch> getMatches() { return matches; } public void resetGamePanels(boolean isTextOnly) { for (GamePanel gp : gamePanels) { gp.reset(isTextOnly); } getQuickEntryPanel().setVisible( CryodexController.getOptions().isShowQuickFind()); ComponentUtils.repaint(this); } private class GamePanel { private final ArmadaMatch match; private JLabel playersTitle; private JComboBox<String> resultsCombo; private JTextField player1Score; private JTextField player2Score; private JLabel player1ScoreLabel; private JLabel player2ScoreLabel; private boolean isLoading = false; private int tableNumber = -1; public GamePanel(int tableNumber, ArmadaMatch match) { this.tableNumber = tableNumber; isLoading = true; this.match = match; reset(false); init(); } private void init() { if (match.isMatchComplete()) { if (match.isBye()) { getResultCombo().setSelectedIndex(1); } else { if (match.getWinner() == match.getPlayer1()) { if(match.isConcede()){ getResultCombo().setSelectedIndex(4); } else { getResultCombo().setSelectedIndex(1); } } else if (match.getWinner() == match.getPlayer2()) { if(match.isConcede()){ getResultCombo().setSelectedIndex(3); } else { getResultCombo().setSelectedIndex(2); } } } } if (match.getPlayer2() != null) { if (match.getPlayer1Score() != null) { getPlayer1ScoreField().setText( String.valueOf(match.getPlayer1Score())); } if (match.getPlayer2Score() != null) { getPlayer2ScoreField().setText( String.valueOf(match.getPlayer2Score())); } } isLoading = false; } private ArmadaMatch getMatch() { return match; } private JLabel getPlayerTitle() { if (playersTitle == null) { playersTitle = new JLabel(""); playersTitle.setFont(new Font(playersTitle.getFont().getName(), playersTitle.getFont().getStyle(), 20)); playersTitle.setHorizontalAlignment(SwingConstants.RIGHT); } return playersTitle; } private JLabel getPlayer1ScoreLabel() { if (player1ScoreLabel == null) { player1ScoreLabel = new JLabel(); } return player1ScoreLabel; } private JLabel getPlayer2ScoreLabel() { if (player2ScoreLabel == null) { player2ScoreLabel = new JLabel(); } return player2ScoreLabel; } private String[] getComboValues() { if (match.getPlayer2() == null) { String[] values = { "Select a result", "BYE" }; return values; } else { String generic = "Select a result"; String[] values = { generic, "WIN - " + match.getPlayer1().getName(), "WIN - " + match.getPlayer2().getName(), match.getPlayer1().getName() + " Conceded", match.getPlayer2().getName() + " Conceded"}; return values; } } private JComboBox<String> getResultCombo() { if (resultsCombo == null) { resultsCombo = new JComboBox<String>(getComboValues()); resultsCombo.setRenderer(new DefaultListCellRenderer() { private static final long serialVersionUID = 1L; @Override public void paint(Graphics g) { setForeground(Color.BLACK); super.paint(g); } }); resultsCombo.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { comboChange(); } }); } return resultsCombo; } private void comboChange() { if (isLoading) { return; } switch (resultsCombo.getSelectedIndex()) { case 0: match.setWinner(null); match.setBye(false); match.setConcede(false); break; case 1: if (match.getPlayer2() == null) { match.setBye(true); } else { match.setWinner(match.getPlayer1()); } match.setConcede(false); break; case 2: match.setWinner(match.getPlayer2()); match.setConcede(false); break; case 3: match.setWinner(match.getPlayer2()); match.setConcede(true); break; case 4: match.setWinner(match.getPlayer1()); match.setConcede(true); break; default: break; } tournament.getTournamentGUI().getRankingTable().resetPlayers(); } public JTextField getPlayer1ScoreField() { if (player1Score == null) { player1Score = new JTextField(); player1Score.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent arg0) { Integer points = null; try { points = Integer.valueOf(player1Score.getText()); } catch (Exception e) { } match.setPlayer1Score(points); tournament.getTournamentGUI().getRankingTable() .resetPlayers(); } @Override public void focusGained(FocusEvent arg0) { } }); ComponentUtils.forceSize(player1Score, 50, 25); } return player1Score; } public JTextField getPlayer2ScoreField() { if (player2Score == null) { player2Score = new JTextField(); player2Score.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent arg0) { Integer points = null; try { points = Integer.valueOf(player2Score.getText()); } catch (Exception e) { } match.setPlayer2Score(points); tournament.getTournamentGUI().getRankingTable() .resetPlayers(); } @Override public void focusGained(FocusEvent arg0) { } }); ComponentUtils.forceSize(player2Score, 50, 25); } return player2Score; } public void reset(boolean isTextOnly) { String titleText = null; boolean showScore = ArmadaModule.getInstance().getOptions() .isShowScore(); getPlayer1ScoreLabel().setVisible(showScore); getPlayer1ScoreField().setVisible(showScore); getPlayer2ScoreLabel().setVisible(showScore); getPlayer2ScoreField().setVisible(showScore); if (match.getPlayer2() == null) { titleText = match.getPlayer1().getName() + " has a BYE"; } else { titleText = match.getPlayer1().getName() + " VS " + match.getPlayer2().getName(); if (match.isDuplicate()) { titleText = "(Duplicate)" + titleText; } if (CryodexController.getOptions().isShowTableNumbers()) { titleText = tableNumber + ": " + titleText; } getPlayer1ScoreLabel().setText( match.getPlayer1().getName() + " score"); getPlayer2ScoreLabel().setText( match.getPlayer2().getName() + " score"); } getPlayerTitle().setText(titleText); if (isTextOnly == false) { getResultCombo().removeAllItems(); for (String s : getComboValues()) { getResultCombo().addItem(s); } } } public void markInvalid() { if (match.isValidResult() == false) { getPlayerTitle().setForeground(Color.red); } else { getPlayerTitle().setForeground(Color.black); } } } public void markInvalid() { for (GamePanel gamePanel : gamePanels) { gamePanel.markInvalid(); } } }