package bingo.player; import java.awt.*; import javax.swing.*; import bingo.shared.Utilities; public class ControlPane extends JPanel { protected long seed = System.currentTimeMillis(); protected static boolean DEBUG = false; protected JLabel nameLabel; protected JTextField nameField; protected String name = ""; protected JLabel seedLabel; protected JTextField seedField; protected JLabel hostLabel; protected String hostString = "BINGO server's hostname:"; protected JTextField hostField; protected JLabel cardsLabel; protected String cardsString = "Number of cards:"; protected static int MAX_NUM_CARDS = 3; //XXX protected JRadioButton cardRB[]; protected JButton registerButton; protected JButton clearButton; protected String parametersTitle = "Game Parameters"; private Player player; protected int numCardWindows = 0; protected CardWindow[] cardWindows = new CardWindow[3]; //XXX public ControlPane(Player player) { //super(false); this.player = player; // The player can type their name. nameLabel = new JLabel("Your name:", JLabel.RIGHT); nameField = new JTextField(20); nameField.setText(player.params.getName()); // The player can enter a seed value for their card. seedLabel = new JLabel("A random number seed:", JLabel.RIGHT); seedField = new JTextField(new Long(seed).toString(), 20); // The player can choose the number of cards to play (1-MAX_NUM_CARDS). cardsLabel = new JLabel(cardsString, JLabel.RIGHT); String rbString; char rbChar; int num; ButtonGroup group = new ButtonGroup(); cardRB = new JRadioButton[MAX_NUM_CARDS]; //XXX for (int i = 0; i < MAX_NUM_CARDS; i++) { num = i + 1; rbString = new Integer(num).toString(); rbChar = rbString.charAt(0); cardRB[i] = new JRadioButton(rbString); cardRB[i].setActionCommand(rbString); cardRB[i].setMnemonic(rbChar); cardRB[i].addActionListener(player); group.add(cardRB[i]); } int numCards = player.params.getNumCards(); if (numCards < MAX_NUM_CARDS) { cardRB[numCards - 1].setSelected(true); } else { cardRB[MAX_NUM_CARDS - 1].setSelected(true); } //XXXNeed to delete Player.one, etc. // Choose the host that the GameKeeper is running on. hostLabel = new JLabel(hostString, JLabel.RIGHT); hostField = new JTextField(20); hostField.setText(player.params.getHostname()); /* * The player clicks this button when * ready to register. */ registerButton = new JButton(Player.register); registerButton.setMnemonic(Player.registerKey); registerButton.setActionCommand(Player.register); registerButton.addActionListener(player); /* * The player clicks this button after a game * is finished to clear the game. */ clearButton = new JButton(Player.clear); clearButton.setMnemonic(Player.clearKey); clearButton.setActionCommand(Player.clear); clearButton.addActionListener(player); clearButton.setEnabled(false); // Do the layout. JPanel parameters = new JPanel(false); GridBagLayout gridbag = new GridBagLayout(); parameters.setLayout(gridbag); parameters.setBorder(BorderFactory.createTitledBorder( parametersTitle)); // three rows Utilities.addParameterRow(parameters, nameLabel, nameField); Utilities.addParameterRow(parameters, seedLabel, seedField); Utilities.addParameterRow(parameters, hostLabel, hostField); // radio button row Box cardNumBox = Utilities.makeEvenlySpacedBox(cardRB); Utilities.addParameterRow(parameters, cardsLabel, cardNumBox); // register and clear buttons JComponent compList[] = new JComponent[2]; compList[0] = registerButton; compList[1] = clearButton; Box buttonBox = Utilities.makeEvenlySpacedBox(compList); setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); add(parameters); add(Box.createRigidArea(new Dimension(Player.BIGPAD, Player.BIGPAD))); add(buttonBox); add(Box.createRigidArea(new Dimension(Player.BIGPAD, Player.BIGPAD))); } /** Maximum size == preferred height, unlimited width. */ public Dimension getMaximumSize() { Dimension d = getPreferredSize(); d.width = Short.MAX_VALUE; return d; } /** Need not be called from AWT thread. */ public void reset() { SwingUtilities.invokeLater(new Runnable() { public void run() { enableAll(true); clearButton.setEnabled(false); } }); } /** Need not be called from AWT thread. */ public void gameOver() { SwingUtilities.invokeLater(new Runnable() { public void run() { clearButton.setEnabled(true); } }); } /** Call this only from the AWT thread. */ public void didRegister() { enableAll(false); } /** Call this only from AWT thread. */ /* * This couldn't be private in 1.1 because it's called from * an inner class, which causes the 1.1.4 and earlier compilers * to hang. */ void enableAll(boolean enable) { nameLabel.setEnabled(enable); seedLabel.setEnabled(enable); hostLabel.setEnabled(enable); cardsLabel.setEnabled(enable); //XXX JTextFields never become disabled (in Swing 0.5.1). nameField.setEnabled(enable); seedField.setEnabled(enable); hostField.setEnabled(enable); for (int i = 0; i < MAX_NUM_CARDS; i++) { cardRB[i].setEnabled(enable); } registerButton.setEnabled(enable); repaint(); //XXX this shouldn't be necessary, but it is } }