package server;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import org.json.JSONArray;
import org.json.JSONObject;
import card.Card;
import player.BasePlayer;
public class SwingClientGame extends ClientGame {
//UI STUFF
JFrame mainFrame;
JPanel gamePanel;
JPanel hintPanel;
JPanel flashPanel;
JPanel deckPanel;
JLabel[][] deckUI;
JLabel[] hintUI;
JLabel[] flashUI;
GridBagConstraints layoutConstr;
// Hints
JFrame hintFrame;
JLabel[] hintTypes;
Font font;
public static void main(String[] args){
new SwingClientGame();
}
private void createHintUi(){
hintFrame = new JFrame("Hint UI");
hintFrame.setSize(450, 150);
hintFrame.setLayout(new GridLayout(0, 5));
hintFrame.getContentPane().setBackground(Color.black);
hintTypes = new JLabel[10];
hintTypes[0] = new JLabel("1", SwingConstants.CENTER);
hintTypes[0].setForeground(Color.white);
hintTypes[0].addMouseListener(new HintMouseListener(new Card(-1, 0, -1)));
hintTypes[1] = new JLabel("2", SwingConstants.CENTER);
hintTypes[1].setForeground(Color.white);
hintTypes[1].addMouseListener(new HintMouseListener(new Card(-1, 1, -1)));
hintTypes[2] = new JLabel("3", SwingConstants.CENTER);
hintTypes[2].setForeground(Color.white);
hintTypes[2].addMouseListener(new HintMouseListener(new Card(-1, 2, -1)));
hintTypes[3] = new JLabel("4", SwingConstants.CENTER);
hintTypes[3].setForeground(Color.white);
hintTypes[3].addMouseListener(new HintMouseListener(new Card(-1, 3, -1)));
hintTypes[4] = new JLabel("5", SwingConstants.CENTER);
hintTypes[4].setForeground(Color.white);
hintTypes[4].addMouseListener(new HintMouseListener(new Card(-1, 4, -1)));
hintTypes[5] = new JLabel("G", SwingConstants.CENTER);
hintTypes[5].setForeground(Color.green);
hintTypes[5].addMouseListener(new HintMouseListener(new Card(GREEN, -1, -1)));
hintTypes[6] = new JLabel("R", SwingConstants.CENTER);
hintTypes[6].setForeground(Color.red);
hintTypes[6].addMouseListener(new HintMouseListener(new Card(RED, -1, -1)));
hintTypes[7] = new JLabel("Y", SwingConstants.CENTER);
hintTypes[7].setForeground(Color.yellow);
hintTypes[7].addMouseListener(new HintMouseListener(new Card(YELLOW, -1, -1)));
hintTypes[8] = new JLabel("W", SwingConstants.CENTER);
hintTypes[8].setForeground(Color.white);
hintTypes[8].addMouseListener(new HintMouseListener(new Card(WHITE, -1, -1)));
hintTypes[9] = new JLabel("B", SwingConstants.CENTER);
hintTypes[9].setForeground(Color.blue);
hintTypes[9].addMouseListener(new HintMouseListener(new Card(BLUE, -1, -1)));
for(int i=0; i<hintTypes.length; ++i){
hintTypes[i].setBackground(Color.black);
hintTypes[i].setFont(font);
hintFrame.add(hintTypes[i]);
}
hintFrame.validate();
hintFrame.setVisible(false);
}
private void toggleHintUi(int x, int y){
hintFrame.setLocation(x, y);
hintFrame.setVisible(!hintFrame.isVisible());
}
@Override
protected void createUI() {
layoutConstr = new GridBagConstraints();
mainFrame = new JFrame("Hanabi - Player " + (ownId+1) + " (" + players[ownId].getName() + ")");
mainFrame.setSize(1000, 650);
mainFrame.setLocation(0, 0);
mainFrame.setLayout(new GridBagLayout());
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.getContentPane().setBackground(Color.black);
mainFrame.setVisible(true);
gamePanel = new JPanel();
gamePanel.setLayout(new BoxLayout(gamePanel, BoxLayout.Y_AXIS));
GridLayout deckLayout = new GridLayout(COLORS, 5);
deckPanel = new JPanel(deckLayout);
deckPanel.setBackground(Color.black);
deckUI = new JLabel[COLORS][5];
for(int i=0; i<COLORS; ++i){
for(int j=0; j<5; ++j){
JLabel tmp = new JLabel("X");
tmp.setBackground(Color.black);
tmp.setForeground(Color.white);
tmp.setFont(font);
tmp.setHorizontalAlignment(JLabel.CENTER);
deckUI[i][j] = tmp;
deckPanel.add(deckUI[i][j]);
}
}
hintPanel = new JPanel();
hintPanel.setBackground(Color.black);
flashPanel = new JPanel();
flashPanel.setBackground(Color.black);
//first empty cell
layoutConstr.gridx = 0;
layoutConstr.gridy = 0;
layoutConstr.weightx = 0.2;
layoutConstr.weighty = 0.1;
layoutConstr.gridwidth = 1;
mainFrame.add(new JPanel(), layoutConstr);
System.out.println("Number of Players: " + nrOfPlayers);
layoutConstr.gridx = 1;
if(nrOfPlayers < 5){
layoutConstr.weightx = 0.6;
layoutConstr.gridwidth = 1;
int index = (nrOfPlayers == 2) ? 1 : 2;
//mainFrame.add(((SwingPlayer) players[index]).getContainer(), layoutConstr);
JPanel playerPanel = ((SwingPlayer) players[index]).getPlayerUi();
mainFrame.add(playerPanel);
playerPanel.setLayout(new BoxLayout(playerPanel, BoxLayout.X_AXIS));
} else {
layoutConstr.weightx = 0.3;
layoutConstr.gridwidth = 1;
//mainFrame.add(((SwingPlayer) players[3]).getContainer(), layoutConstr);
JPanel playerPanel = ((SwingPlayer) players[3]).getPlayerUi();
mainFrame.add(playerPanel);
playerPanel.setLayout(new BoxLayout(playerPanel, BoxLayout.X_AXIS));
layoutConstr.gridx = 2;
//mainFrame.add(((SwingPlayer) players[2]).getContainer(), layoutConstr);
playerPanel = ((SwingPlayer) players[2]).getPlayerUi();
mainFrame.add(playerPanel);
playerPanel.setLayout(new BoxLayout(playerPanel, BoxLayout.X_AXIS));
}
//second empty cell
layoutConstr.gridx = (nrOfPlayers < 5) ? 2 : 3;
layoutConstr.weightx = 0.2;
layoutConstr.gridwidth = 1;
mainFrame.add(new JPanel(), layoutConstr);
//4th or 5th player
layoutConstr.gridx = 0;
layoutConstr.gridy = 1;
layoutConstr.weightx = 0.2;
layoutConstr.weighty = 0.8;
layoutConstr.gridwidth = 1;
if(nrOfPlayers == 2 || nrOfPlayers == 3){
mainFrame.add(new JPanel(), layoutConstr);
} else {
int index = (nrOfPlayers == 4) ? 3 : 4;
//mainFrame.add(((SwingPlayer) players[index]).getContainer(), layoutConstr);
JPanel playerPanel = ((SwingPlayer) players[index]).getPlayerUi();
mainFrame.add(playerPanel);
playerPanel.setLayout(new BoxLayout(playerPanel, BoxLayout.Y_AXIS));
}
layoutConstr.gridx = 1;
layoutConstr.weightx = 0.6;
layoutConstr.gridwidth = (nrOfPlayers < 5) ? 1 : 2;
mainFrame.add(gamePanel, layoutConstr);
//2nd player
layoutConstr.gridx = (nrOfPlayers < 5) ? 2 : 3;
layoutConstr.weightx = 0.2;
layoutConstr.gridwidth = 1;
if(nrOfPlayers == 2){
mainFrame.add(new JPanel(), layoutConstr);
} else {
//mainFrame.add(((SwingPlayer) players[1]).getContainer(), layoutConstr);
JPanel playerPanel = ((SwingPlayer) players[1]).getPlayerUi();
mainFrame.add(playerPanel);
playerPanel.setLayout(new BoxLayout(playerPanel, BoxLayout.Y_AXIS));
}
//third empty cell
layoutConstr.gridx = 0;
layoutConstr.gridy = 2;
layoutConstr.weightx = 0.2;
layoutConstr.weighty = 0.1;
layoutConstr.gridwidth = 1;
mainFrame.add(new JPanel(), layoutConstr);
layoutConstr.gridx = 1;
layoutConstr.weightx = 0.8;
layoutConstr.gridwidth = (nrOfPlayers < 5) ? 1 : 2;
//mainFrame.add(((SwingPlayer) players[0]).getContainer(), layoutConstr);
JPanel playerPanel = ((SwingPlayer) players[0]).getPlayerUi();
mainFrame.add(playerPanel);
playerPanel.setLayout(new BoxLayout(playerPanel, BoxLayout.X_AXIS));
//fourth empty cell
layoutConstr.gridx = (nrOfPlayers < 5) ? 2 : 3;
layoutConstr.gridy = 2;
layoutConstr.weightx = 0.2;
layoutConstr.gridwidth = 1;
mainFrame.add(new JPanel(), layoutConstr);
gamePanel.add(hintPanel);
gamePanel.add(flashPanel);
gamePanel.add(deckPanel);
hintUI = new JLabel[MAX_HINTS];
for(int i=0; i<MAX_HINTS; ++i){
JLabel tmp = new JLabel();
tmp.setText("1");
tmp.setForeground(Color.white);
tmp.setName("Hint_" + i);
tmp.setFont(font);
hintPanel.add(tmp);
hintUI[i] = tmp;
}
flashUI = new JLabel[MAX_FLASHS];
for(int i=0;i<MAX_FLASHS; ++i){
JLabel tmp = new JLabel();
tmp.setText("0");
tmp.setForeground(Color.white);
tmp.setName("Flash_" + i);
tmp.setFont(font);
flashPanel.add(tmp);
flashUI[i] = tmp;
}
mainFrame.validate();
createHintUi();
}
@Override
public void loadFont() {
font = new Font("Shanghai", Font.PLAIN, fontSize);
}
@Override
protected void updateGame(JSONObject jo){
super.updateGame(jo);
System.out.println("SwingClientGame updateGame called");
}
@Override
protected BasePlayer createPlayer(int id, int nrOfCards, String name){
return new SwingPlayer(id, nrOfCards, name);
}
@Override
protected BasePlayer createPlayer(JSONObject jo){
System.out.println("create SwingPlayer");
return new SwingPlayer(jo);
}
@Override
protected void updateUI() {
// for(int i=0; i<playerUi.length; ++i){
// createCardsForPlayer(i);
// }
// mainFrame.removeAll();
// mainFrame.dispose();
// createUI();
// TODO
}
private static Color getColor(int id){
Color color = null;
switch(id){
case 0:
color = Color.green;
break;
case 1:
color = Color.red;
break;
case 2:
color = Color.yellow;
break;
case 3:
color = Color.white;
break;
case 4:
color = Color.blue;
break;
}
return color;
}
private class SwingPlayer extends BasePlayer {
JPanel playerUi;
JButton playerName;
JLabel[] cardUi;
public SwingPlayer(int id, int nrOfCards, String name){
super(id, nrOfCards, name);
playerUi = new JPanel();
playerName = new JButton(name);
cardUi = new JLabel[nrOfCards];
}
public SwingPlayer(JSONObject jo) {
super(jo);
playerUi = new JPanel();
playerUi.setBackground(Color.black);
playerName = new JButton(name);
playerName.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
if(SwingUtilities.isLeftMouseButton(e)){
System.out.println("Hint!");
toggleHintUi(e.getXOnScreen(), e.getYOnScreen());
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}
});
playerUi.add(playerName);
cardUi = new JLabel[cards.length];
for(int i=0; i<cardUi.length; ++i){
final Card c = cards[i];
JLabel uiCard = new JLabel(String.valueOf(cards[i].getValue()));
uiCard.setForeground(getColor(cards[i].getColorInt()));
uiCard.setBackground(Color.black);
uiCard.setFont(font);
uiCard.addMouseListener(new PlaceListener(c));
cardUi[i] = uiCard;
playerUi.add(cardUi[i]);
playerUi.validate();
}
}
@Override
public void setCards(JSONArray ja){
super.setCards(ja);
for(int i=0; i<cardUi.length; ++i){
JLabel uiCard = new JLabel();
uiCard.setText(String.valueOf(cards[i].getValue()));
uiCard.setForeground(getColor(cards[i].getColorInt()));
uiCard.addMouseListener(new PlaceListener(cards[i]));
cardUi[i] = uiCard;
}
playerUi.validate();
}
public JPanel getPlayerUi(){
return playerUi;
}
}
private class HintMouseListener implements MouseListener {
private Card c;
public HintMouseListener(Card c) {
this.c = c;
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
if(SwingUtilities.isLeftMouseButton(e)){
moveHint(c);
toggleHintUi(e.getXOnScreen(), e.getYOnScreen());
}
}
}
private class PlaceListener implements MouseListener {
private Card c;
public PlaceListener(Card c){
this.c = c;
}
@Override
public void mouseReleased(MouseEvent e) {
if(SwingUtilities.isLeftMouseButton(e)){
movePlaceCard(c);
} else if(SwingUtilities.isRightMouseButton(e)){
moveTrashCard(c);
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}
}
}