Newer
Older
hanabi-networking / src / server / SwingClientGame.java
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) {
		}
	}
}