Newer
Older
hanabi / src / player / SwingPlayer.java
package player;
import game.Game;
import game.Card;
import static game.Card.intColorToText;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class SwingPlayer extends AbstractPlayer {
	private final static String HTML_BEGIN = "<html>";
	private final static String HTML_END = "</html>";
	private final static String HTML_NEWLINE = "<br/>";
	private JLabel[] uiCards;
	private JPanel container;
	public SwingPlayer(int cards, Game g) {
		super(cards, g);
		container = new JPanel();
		uiCards = new JLabel[cards];
		for(int i=0; i<cards; ++i){
			uiCards[i] = new JLabel();
			uiCards[i].setHorizontalAlignment(SwingConstants.CENTER);
			Font f = uiCards[i].getFont();
			uiCards[i].setFont(new Font(f.getFontName(), f.getStyle(), f.getSize()*2));
			addMouseListener(i);
			container.add(uiCards[i]);
		}
	}
	
	public JPanel getContainer(){
		return container;
	}
	
	public JLabel getUiCard(int pos){
		return uiCards[pos];
	}
	
	@Override
	public void setCard(int pos, Card card) {
		super.setCard(pos, card);
		uiCards[pos].setText(card.getValue() + "");
		uiCards[pos].setForeground(card.getColor());
		uiCards[pos].setBackground(Color.black);
		uiCards[pos].setOpaque(true);
		uiCards[pos].setFont(new Font("Shanghai", Font.PLAIN, 40));
	}
	@Override
	public Card getCard(int pos) {
		return super.getCard(pos);
	}
	@Override
	public void setCardInfo(int pos, String info) {
		super.setCardInfo(pos, info);
		info = info.replaceAll("\\n", HTML_NEWLINE);
		System.out.println(info);
		info = HTML_BEGIN + info + HTML_END;
		uiCards[pos].setToolTipText(info);
	}
	@Override
	public String getCardInfo(int pos) {
		return super.getCardInfo(pos);
	}
	
	@Override
	public void print(){
		System.out.println("swing");
	}

	@Override
	public void setName(int index, String name) {
		uiCards[index].setName(name);
	}

	@Override
	public String getName(int index) {
		return uiCards[index].getName();
	}

	@Override
	public void setSize(int index, int width, int height) {
		uiCards[index].setSize(width, height);
	}

	@Override
	public void setColor(int index, int r, int g, int b) {
		uiCards[index].setForeground(new Color(r, g, b));
	}

	@Override
	public int[] getColor(int index) {
		int[] color = new int[3];
		Color c = uiCards[index].getForeground();
		color[0] = c.getRed();
		color[1] = c.getGreen();
		color[2] = c.getBlue();
		return color;
	}

	@Override
	public void setBackground(int index, int r, int g, int b) {
		uiCards[index].setBackground(new Color(r, g, b));
	}

	@Override
	public int[] getBackground(int index) {
		int[] color = new int[3];
		Color c = uiCards[index].getBackground();
		color[0] = c.getRed();
		color[1] = c.getGreen();
		color[2] = c.getBlue();
		return color;
	}

	@Override
	public void setText(int index, String text) {
		uiCards[index].setText(text);
	}

	@Override
	public String getText(int index) {
		return uiCards[index].getText();
	}
	
	private void addMouseListener(int i){
		uiCards[i].addMouseListener(new MouseListener() {
			@Override
			public void mouseReleased(MouseEvent e) {
				JLabel label = (JLabel) e.getComponent();
				String name = label.getName();
				int clickedPlayer = Integer.parseInt(name.substring(0, 1));
				int clickedCard = Integer.parseInt(name.substring(name.length()-1));
				Card card = g.getPlayer(clickedPlayer).getCard(clickedCard);
				int clickedValue = card.getValue();
				int clickedColor = card.getColorInt();
				if(label.getBackground() == Color.pink){
					g.removeSelectedCards();
					label.setBackground(Color.black);
					System.out.println("Removed card #" + clickedCard + "(" + card.getColorInt() + ", " + card.getValue() + ")");
					if(g.getSelectedCards() == 0){
						g.resetMoveValues();
					}
				}
				if(!g.isUseColor() && !g.isUseValue() && !g.isTrashCard() && !g.isPlaceCard()){
					System.out.println("Please choose move type first");
					return;
				}
				if(clickedPlayer == g.getCurrentPlayerIndex()){
					if(g.isUseColor() || g.isUseValue()){
						System.out.println("Please don't select your own cards!");
						return;
					} else if((g.isTrashCard() || g.isPlaceCard()) && g.getSelectedCards() == 1){
						System.out.println("You already selected a card!");
						return;
					}
				} else if(clickedPlayer != g.getCurrentPlayerIndex() && (g.isTrashCard() || g.isPlaceCard())){
					System.out.println("Please select your own cards");
					return;
				}
				if(g.getSelectedPlayer() == -1){
					g.setSelectedPlayer(clickedPlayer);
					g.setChosenColor(clickedColor);
					g.setChosenValue(clickedValue);
					g.addSelectedCards();
					System.out.println("Selected player #" + g.getSelectedPlayer());
					label.setBackground(Color.pink);
					System.out.println("Added card #" + clickedCard + "(" + intColorToText(card.getColorInt()) + ", " + card.getValue() + ")");
					return;
				}
				if(g.getSelectedPlayer() != clickedPlayer){
					System.out.println("Please choose a card of the selected player or unselect all cards and choose another player.");
					return;
				}
				if(g.getChosenColor() == -1){
					g.setChosenColor(clickedColor);
				}
				if(g.getChosenValue() == -1){
					g.setChosenValue(clickedValue);
				}
				if(label.getBackground() == Color.black){
					if(g.isUseColor()){
						if(g.getChosenColor() == clickedColor){
							if(label.getBackground() != Color.pink){
								g.addSelectedCards();
								label.setBackground(Color.pink);
								System.out.println("Added card #" + clickedCard + "(" + intColorToText(card.getColorInt()) + ", " + card.getValue() + ")");
							}
						}
					} else if(g.isUseValue()){
						if(g.getChosenValue() == clickedValue){
							if(label.getBackground() != Color.pink){
								g.addSelectedCards();
								label.setBackground(Color.pink);
								System.out.println("Added card #" + clickedCard + "(" + intColorToText(card.getColorInt()) + ", " + card.getValue() + ")");
							}
						}
					}
				}
			}
			
			@Override
			public void mousePressed(MouseEvent e) {
			}
			
			@Override
			public void mouseExited(MouseEvent e) {
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {
			}
			
			@Override
			public void mouseClicked(MouseEvent e) {
			}
		});
	}

	@Override
	public void unsetListeners(int index) {
		MouseListener[] listeners = uiCards[index].getMouseListeners();
		for(int i=0; i<listeners.length; ++i){
			uiCards[index].removeMouseListener(listeners[i]);
		}
	}

	@Override
	public void deactiveCards(){
		for(int i=0; i<uiCards.length; ++i){
			uiCards[i].setText("?");
			uiCards[i].setEnabled(false);
		}
	}

	@Override
	public void activeCards(){
		for(int i=0; i<uiCards.length; ++i){
			uiCards[i].setText(getCard(i).getValue() + "");
			uiCards[i].setEnabled(true);
		}
	}
}