package com.lunivore.noughtsandcrosses.view;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import com.lunivore.noughtsandcrosses.game.Game;
import com.lunivore.noughtsandcrosses.game.GameObserver;
@SuppressWarnings("serial")
public class GridPanel extends JPanel implements GameObserver {
public static class OXButton extends JButton {
private final int row;
private final int column;
public OXButton(String string, int row, int column) {
this.row = row;
this.column = column;
setPreferredSize(new Dimension(50, 50));
setName(string);
}
}
private static final String NL = System.getProperty("line.separator");
private OXButton[][] gridButtons = new OXButton[][] {
new OXButton[] {new OXButton("a1", 0, 0), new OXButton("a2", 0, 1), new OXButton("a3", 0, 2)},
new OXButton[] {new OXButton("b1", 1, 0), new OXButton("b2", 1, 1), new OXButton("b3", 1, 2)},
new OXButton[] {new OXButton("c1", 2, 0), new OXButton("c2", 2, 1), new OXButton("c3", 2, 2)}
};
public GridPanel(final Game game) {
setName(ComponentNames.GRID);
setLayout(new GridLayout(3, 3));
for (OXButton[] row : gridButtons) {
for (final OXButton button : row) {
add(button);
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
game.playerActsAt(button.column, button.row);
}
});
}
}
game.addObserver(this);
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
for (int row = 0; row < gridButtons.length; row++) {
for (OXButton button : gridButtons[row]) {
builder.append(text(button));
}
if (row < gridButtons.length - 1) { builder.append(NL); }
}
return builder.toString();
}
private String text(JButton button) {
return button.getText() == "" ? "." : button.getText();
}
public void gameChanged(Game game) {
for (OXButton[] row : gridButtons) {
for (OXButton button : row) {
button.setText(game.playerAt(button.column, button.row).asString());
}
}
}
public void gameWon(Game game) {
gameChanged(game);
}
}