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);
}
}
}