package fr.julien.solitaire;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseListener;
import java.awt.geom.Ellipse2D;
import java.util.List;
import javax.swing.JLabel;
import fr.julien.solitaire.listeners.ListenerBoule;
import fr.julien.solitaire.listeners.ListenerPremiereBoule;
/**
* Boule est la classe qui représente une boule sur le plateau du solitaire
*
* Cette classe est caractérisée par les informations suivantes ;
*
* - Un attribut vide ou plein (si la boule est présente ou non)
* - Un attribut accessible qui indique si la case est accessible ou non
* - Un attribut selected qui indique si la case est active
* - Un attribut focus qui permet de colorier le rebord de la boule si le curseur la survole
* - Une couleur
* - Deux listeners
*
*
*
* Cette classe est une classe fille de JLabel pour laquelle la méthode paintComponent est
* surchargée de manière à dessiner une boule.
*
*
* De plus, cette classe possède des méthodes permettant de supprimer la boule de la case,
* activer la case, etc.
*
*
* Remarque : La classe Boule peut également être vue comme une classe Case car, le JLabel
* est déssiné vide lorsque le paramètre plein est à false.
*
*
* @author Julien
* @version 1.0
*
*/
public class Boule extends JLabel {
/**
* Identifiant pour la sérialisation
*/
private static final long serialVersionUID = -3228466367846096427L;
/**
* booléen qui permet de définir si la boule est sur la case ou non
*/
private boolean plein=true;
/**
* booléen qui permet de définir le la case est accessible pour une boule
*/
private boolean accessible=false;
/**
* booléen qui permet d'identifier la boule séléctionnée
*/
private boolean selected=false;
/**
* booléen qui permet de dessiner un rebord lors du passage du curseur
*/
private boolean focus;
/**
* La couleur de la boule
*/
private final Color couleur = Color.green;
/**
* Le listener qui permet d'enlever la première boule
*/
private MouseListener listenerDebut;
/**
* Le listener qui permet de jouer les autres coups.
*/
private MouseListener listener;
/**
* Constructeur de Boule
* @param boules
* Les autres boules du plateau (utilisé par les listenrers)
*/
public Boule(List> boules){
listenerDebut = new ListenerPremiereBoule(this, boules);
listener = new ListenerBoule(this, boules);
plein=true;
addMouseListener(listenerDebut);
}
/**
* La méthode contains est redéfinie pour que les mouseListeners ne soient
* activés que lorsque le pointeur de la souris est dans le rond correspondant
* à la boule et non dans le rectangle du JLabel
*/
@Override
public boolean contains(int x, int y){
Ellipse2D el = new Ellipse2D.Double(0, 0, getWidth(), getHeight());
return el.contains(x, y);
}
/**
* La méthode paintComponent est surchargée pour dessiner la boule
*/
@Override
public void paintComponent(Graphics g){
int largeur=getWidth()-8;
int hauteur=getHeight()-8;
if(plein){
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(couleur);
g2d.setStroke(new BasicStroke(3));
GradientPaint gradient = new GradientPaint(largeur / 2, 4, couleur, (largeur) / 2, 4 + hauteur, new Color(167,167,167,200));
g2d.setPaint(gradient);
g2d.fillOval(4, 4, largeur, hauteur);
gradient = new GradientPaint(largeur / 2, 4, Color.LIGHT_GRAY, largeur / 2, 4 + hauteur / 2, new Color(couleur.getRed(), couleur.getGreen(), couleur.getBlue(), 0));
g2d.setPaint(gradient);
g2d.fillOval(4+largeur/5, 4, 5*largeur/8, hauteur/3);
if(selected){
g2d.setColor(Color.cyan);
g2d.drawOval(4, 4, largeur, hauteur);
}
else if(focus){
g2d.setColor(Color.white);
g2d.drawOval(4, 4, largeur, hauteur);
}
}
else {
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.DARK_GRAY);
g.fillOval(4, 4, largeur, hauteur);
g2d.setColor(Color.LIGHT_GRAY);
if(accessible){
g.setColor(Color.cyan);
}
g2d.setStroke(new BasicStroke(2));
g.drawOval(4, 4, largeur, hauteur);
}
}
/**
* Cette méthode permet de permuter les listeners
* une fois le premier tour effectué
*/
public void effectuerPremierTour(){
removeMouseListener(listenerDebut);
addMouseListener(listener);
}
/**
* Méthode qui permet de modifier l'état d'une case
* @param plein
* booléen vrai si la case contient une boule
*/
public void setPlein(boolean plein) {
this.plein = plein;
repaint();
}
/**
* Méthode d'accès à l'état de la case
* @return true si la case contient une boule
*/
public boolean isPlein() {
return plein;
}
/**
* Méthode qui permet de savoir si la case est accessible
* @return true si la case est accessible
*/
public boolean isAccessible() {
return accessible;
}
/**
* Méthode qui permet de rendre une case accessible ou non
* @param accessible
* l'accessiblilité de la case
*/
public void setAccessible(boolean accessible) {
this.accessible = accessible;
repaint();
}
/**
* Méthode qui permet de séléctionner une case
* @param selected
* le booléen qui permet de définir si la case est séléctionnée
*/
public void setSelected(boolean selected) {
this.selected = selected;
repaint();
}
/**
* Méthode qui permet de modifier le focus sur une case
* @param focus
* Le focus à modifier
*/
public void setFocus(boolean focus) {
this.focus = focus;
repaint();
}
}