package cryodex.modules.imperialassault;
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.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 IARoundPanel extends JPanel {
private static final long serialVersionUID = 1L;
private final List<IAMatch> matches;
private final List<GamePanel> gamePanels = new ArrayList<GamePanel>();
private JPanel quickEntryPanel;
private JPanel quickEntrySubPanel;
private JTextField roundNumber;
private JComboBox<IAPlayer> playerCombo;
private final JScrollPane scroll;
private final IATournament tournament;
public IARoundPanel(IATournament t, List<IAMatch> matches) {
super(new BorderLayout());
this.tournament = t;
this.matches = matches;
this.setBorder(BorderFactory.createLineBorder(Color.black));
int counter = 1;
for (IAMatch 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<IAPlayer> playerList = new ArrayList<IAPlayer>();
playerList.add(new IAPlayer(new Player()));
playerList.addAll(tournament.getIAPlayers());
Collections.sort(playerList);
playerCombo = new JComboBox<IAPlayer>(
playerList.toArray(new IAPlayer[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(this);
Integer i = null;
try {
i = Integer.parseInt(roundNumber.getText());
} catch (NumberFormatException e) {
}
IAPlayer player = playerCombo.getSelectedIndex() == 0 ? null
: (IAPlayer) 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;
}
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);
}
return panel;
}
public List<IAMatch> 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 IAMatch match;
private JLabel playersTitle;
private JComboBox<String> resultsCombo;
private boolean isLoading = false;
private int tableNumber = -1;
public GamePanel(int tableNumber, IAMatch match) {
this.tableNumber = tableNumber;
isLoading = true;
this.match = match;
reset(false);
init();
}
public IAMatch getMatch() {
return match;
}
private void init() {
if (match.isMatchComplete()) {
if (match.isBye()) {
getResultCombo().setSelectedIndex(1);
} else {
if (match.getWinner() == match.getPlayer1()) {
getResultCombo().setSelectedIndex(1);
} else if (match.getWinner() == match.getPlayer2()) {
getResultCombo().setSelectedIndex(2);
}
}
}
isLoading = false;
}
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 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() };
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);
break;
case 1:
if (match.getPlayer2() == null) {
match.setBye(true);
} else {
match.setWinner(match.getPlayer1());
}
break;
case 2:
match.setWinner(match.getPlayer2());
break;
default:
break;
}
tournament.getTournamentGUI().getRankingTable().resetPlayers();
}
public void reset(boolean isTextOnly) {
String titleText = null;
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;
}
}
getPlayerTitle().setText(titleText);
if (isTextOnly == false) {
getResultCombo().removeAllItems();
for (String s : getComboValues()) {
getResultCombo().addItem(s);
}
}
if (getComboValues().length == 2) {
getResultCombo().setSelectedIndex(1);
match.setBye(true);
}
}
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();
}
}
}