2025-08-12 22:18:58 +02:00
|
|
|
package vue;
|
|
|
|
|
|
|
|
|
|
import java.awt.*;
|
2025-09-07 14:44:32 +02:00
|
|
|
import java.awt.event.MouseEvent;
|
|
|
|
|
import java.awt.event.MouseListener;
|
2025-08-12 22:18:58 +02:00
|
|
|
import javax.swing.*;
|
|
|
|
|
|
|
|
|
|
|
2025-09-07 14:44:32 +02:00
|
|
|
import modele.Case;
|
|
|
|
|
import modele.piece.Piece;
|
|
|
|
|
import modele.Couleur;
|
|
|
|
|
|
|
|
|
|
public class CaseSwingUI extends JPanel implements MouseListener{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Color couleurCaseClaire;
|
|
|
|
|
private Color couleurCaseFoncee;
|
|
|
|
|
private Color couleurCaseSelection;
|
|
|
|
|
private Color couleurCasePrecedente;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final int ligne;
|
|
|
|
|
private final int colonne;
|
|
|
|
|
|
|
|
|
|
private boolean estDernierCoupOrigine = false;
|
|
|
|
|
private boolean estDernierCoupDestination = false;
|
|
|
|
|
|
2025-08-12 22:18:58 +02:00
|
|
|
private boolean selectionnee = false;
|
|
|
|
|
|
|
|
|
|
private final JLabel label = new JLabel("", SwingConstants.CENTER);
|
|
|
|
|
private final Case caseModele; // reference vers la case de le modele
|
|
|
|
|
|
2025-09-07 14:44:32 +02:00
|
|
|
public CaseSwingUI(String style, int ligne, int colonne, Case caseModele) {
|
|
|
|
|
switch (style) {
|
|
|
|
|
case "RETRO_BOIS" -> {
|
|
|
|
|
// Style Bois rétro :
|
|
|
|
|
couleurCaseClaire = new Color(222, 184, 135); // Burlywood (bois clair rétro)
|
|
|
|
|
couleurCaseFoncee = new Color(139, 69, 19); // SaddleBrown (bois foncé rétro)
|
|
|
|
|
couleurCaseSelection = new Color(205, 133, 63); // Peru (orange/brun vieilli)
|
|
|
|
|
}
|
|
|
|
|
case "METAL_FUTURISTE" -> {
|
|
|
|
|
// Style métallique Futuriste
|
|
|
|
|
couleurCaseClaire = new Color(192, 192, 192); // Silver
|
|
|
|
|
couleurCaseFoncee = new Color(105, 105, 105); // DimGray
|
|
|
|
|
couleurCaseSelection = new Color(0, 255, 255); // Cyan flashy (effet néon)
|
|
|
|
|
}
|
|
|
|
|
case "BOIS_CLAIR" -> {
|
|
|
|
|
// Style Bois clair
|
|
|
|
|
couleurCaseClaire = new Color(240, 218, 181); // Beige clair
|
|
|
|
|
couleurCaseFoncee = new Color(181, 136, 99); // Marron clair
|
|
|
|
|
couleurCaseSelection = new Color(209, 83, 71); // Rouge-orangé
|
|
|
|
|
couleurCasePrecedente = new Color(255, 112, 99); // Rouge clair
|
|
|
|
|
}
|
|
|
|
|
case "JAUNE_CHALEUREUX" -> {
|
|
|
|
|
// Style Jaune Chaleureux
|
|
|
|
|
couleurCaseClaire = new Color(253, 231, 76); // Jaune vif
|
|
|
|
|
couleurCaseFoncee = new Color(227, 101, 91); // Rouge doux
|
|
|
|
|
couleurCaseSelection = new Color(248, 161, 87); // Orange doux
|
|
|
|
|
}
|
|
|
|
|
case "VINTAGE_PASTEL" -> {
|
|
|
|
|
// Style vintage pastel
|
|
|
|
|
couleurCaseClaire = new Color(246, 229, 189); // Beige pastel
|
|
|
|
|
couleurCaseFoncee = new Color(249, 125, 125); // Rose brique clair
|
|
|
|
|
couleurCaseSelection = new Color(200, 90, 90); // Rouge passé
|
|
|
|
|
}
|
|
|
|
|
default -> {
|
|
|
|
|
couleurCaseClaire = new Color(255, 255, 255); // Blanc
|
|
|
|
|
couleurCaseFoncee = new Color(200, 200, 200); // Gris
|
|
|
|
|
couleurCaseSelection = new Color(100, 100, 100); // Gris foncé
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-12 22:18:58 +02:00
|
|
|
this.ligne = ligne;
|
|
|
|
|
this.colonne = colonne;
|
|
|
|
|
this.caseModele = caseModele;
|
|
|
|
|
|
2025-09-07 14:44:32 +02:00
|
|
|
// Gestion de la couleur
|
|
|
|
|
if ((ligne + colonne) % 2 == 0) {
|
|
|
|
|
setBackground(this.couleurCaseClaire); // couleur claire
|
|
|
|
|
} else {
|
|
|
|
|
setBackground(this.couleurCaseFoncee); // couleur foncée
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-12 22:18:58 +02:00
|
|
|
setOpaque(true);
|
|
|
|
|
setPreferredSize(new Dimension(64, 64));
|
|
|
|
|
setLayout(new BorderLayout());
|
|
|
|
|
|
|
|
|
|
// Ajout du label à la case
|
2025-09-07 14:44:32 +02:00
|
|
|
label.setFont(new Font("SansSerif", Font.BOLD, 60));
|
2025-08-12 22:18:58 +02:00
|
|
|
add(label, BorderLayout.CENTER);
|
|
|
|
|
|
2025-09-07 14:44:32 +02:00
|
|
|
this.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
|
|
|
|
|
this.updateFromModel(); // Mise à jour de l'affichage à partir du modèle
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Ajoutons l'ecouteur
|
|
|
|
|
addMouseListener(this);
|
2025-08-12 22:18:58 +02:00
|
|
|
}
|
|
|
|
|
|
2025-09-07 14:44:32 +02:00
|
|
|
@Override
|
|
|
|
|
public void mouseClicked(MouseEvent e) {
|
|
|
|
|
Container parent = this.getParent();
|
|
|
|
|
while(parent != null && !(parent instanceof PlateauSwingUI)) {
|
|
|
|
|
parent = parent.getParent();
|
|
|
|
|
}
|
|
|
|
|
if (parent instanceof PlateauSwingUI plateau) {
|
|
|
|
|
plateau.selectionnerCase(this);
|
|
|
|
|
}
|
|
|
|
|
//System.out.println("Case cliquée : " + ligne + ", " + colonne);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void mousePressed(MouseEvent e) {}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void mouseReleased(MouseEvent e) {}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void mouseEntered(MouseEvent e) {}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void mouseExited(MouseEvent e) {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-12 22:18:58 +02:00
|
|
|
@Override
|
|
|
|
|
protected void paintComponent(Graphics pinceaux) {
|
|
|
|
|
super.paintComponent(pinceaux); // Pour effacer l'ancien objet
|
|
|
|
|
|
2025-09-07 14:44:32 +02:00
|
|
|
Graphics2D g2d = (Graphics2D) pinceaux.create();
|
|
|
|
|
// Appliquer l'anti-aliasing pour des bords plus doux
|
|
|
|
|
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
|
|
|
|
|
|
|
|
|
int w = getWidth();
|
|
|
|
|
int h = getHeight();
|
|
|
|
|
|
2025-08-12 22:18:58 +02:00
|
|
|
// Couleur de fond (jaune)
|
2025-09-07 14:44:32 +02:00
|
|
|
//System.out.println("Selectionner debug: "+selectionnee );
|
2025-08-12 22:18:58 +02:00
|
|
|
if(selectionnee){
|
2025-09-07 14:44:32 +02:00
|
|
|
this.setBackground(couleurCaseSelection);
|
|
|
|
|
|
|
|
|
|
// Pour le truc de dégradé
|
|
|
|
|
// //Dégradé radial: claire au centre, foncé aux bords
|
|
|
|
|
// Color centre = new Color(255, 150, 130); // plus claire au centre
|
|
|
|
|
// Color bord = new Color(200, 50, 40); // plus foncé aux bords
|
|
|
|
|
// float[] dist = {0.0f, 1.0f};
|
|
|
|
|
// Color[] colors = {centre, bord};
|
|
|
|
|
// RadialGradientPaint gradient = new RadialGradientPaint(
|
|
|
|
|
// w / 2f, h / 2f, Math.max(w, h) / 2f, // centre X, centre Y, rayon
|
|
|
|
|
// dist, // fractions
|
|
|
|
|
// colors // couleurs
|
|
|
|
|
// );
|
|
|
|
|
|
|
|
|
|
// g2d.setPaint(gradient);
|
|
|
|
|
// g2d.fillRect(0, 0, w, h);
|
|
|
|
|
|
|
|
|
|
// //petit contour plus sombre
|
|
|
|
|
// g2d.setColor(new Color(150, 30, 30));
|
|
|
|
|
// g2d.drawRect(0, 0, w-1, h-1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-12 22:18:58 +02:00
|
|
|
}else{
|
2025-09-07 14:44:32 +02:00
|
|
|
// Couleur normale
|
|
|
|
|
//this.setBackground(this.couleurdeFond);
|
|
|
|
|
if ((ligne + colonne) % 2 == 0) {
|
|
|
|
|
g2d.setColor(couleurCaseClaire);
|
|
|
|
|
} else {
|
|
|
|
|
g2d.setColor(couleurCaseFoncee);
|
|
|
|
|
}
|
|
|
|
|
g2d.fillRect(0, 0, w, h);
|
|
|
|
|
|
2025-08-12 22:18:58 +02:00
|
|
|
}
|
2025-09-07 14:44:32 +02:00
|
|
|
|
|
|
|
|
// Surbrillance du dernier coup
|
|
|
|
|
if(estDernierCoupOrigine) {
|
|
|
|
|
g2d.setColor(couleurCasePrecedente);
|
|
|
|
|
g2d.fillRect(0, 0, w, h);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(estDernierCoupDestination) {
|
|
|
|
|
g2d.setColor(couleurCaseSelection);
|
|
|
|
|
g2d.fillRect(0, 0, w, h);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g2d.dispose(); // Libération des ressources graphiques
|
2025-08-12 22:18:58 +02:00
|
|
|
}
|
|
|
|
|
|
2025-09-07 14:44:32 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-12 22:18:58 +02:00
|
|
|
// Rafrachit le contenu visuel depuis le model
|
|
|
|
|
public void updateFromModel(){
|
|
|
|
|
Piece p = (caseModele != null) ? caseModele.getPiece(): null;
|
|
|
|
|
label.setText(toUnicode(p));
|
2025-09-07 14:44:32 +02:00
|
|
|
if(p != null) {
|
|
|
|
|
label.setForeground(new Color(0,0,0));
|
|
|
|
|
if (caseModele.getPiece().getCouleur() == Couleur.BLANC) {
|
|
|
|
|
label.setForeground(new Color(250,250,250));
|
|
|
|
|
}else{
|
|
|
|
|
label.setForeground(new Color(30,30,30));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
repaint(); // double appel car setForeground le fais deja
|
2025-08-12 22:18:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String toUnicode(Piece piece) {
|
|
|
|
|
// Conversion du symbole en caractère Unicode
|
|
|
|
|
if (piece == null) return "";
|
|
|
|
|
String symbole = piece.getSymbole();
|
|
|
|
|
return switch (symbole) {
|
2025-09-07 14:44:32 +02:00
|
|
|
case "BP" -> "♟";
|
|
|
|
|
case "BC" -> "♞";
|
|
|
|
|
case "BF" -> "♝";
|
|
|
|
|
case "BT" -> "♜";
|
|
|
|
|
case "BR" -> "♛";
|
|
|
|
|
case "BO" -> "♚";
|
2025-08-12 22:18:58 +02:00
|
|
|
case "NP" -> "♟";
|
|
|
|
|
case "NC" -> "♞";
|
|
|
|
|
case "NF" -> "♝";
|
|
|
|
|
case "NT" -> "♜";
|
2025-09-07 14:44:32 +02:00
|
|
|
case "NR" -> "♛";
|
|
|
|
|
case "NO" -> "♚";
|
2025-08-12 22:18:58 +02:00
|
|
|
default -> symbole;
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Getters/setters utiles pour l'IHM
|
2025-09-07 14:44:32 +02:00
|
|
|
public Piece getPiece() {
|
|
|
|
|
return (caseModele != null) ? caseModele.getPiece() : null;
|
|
|
|
|
}
|
|
|
|
|
public void setPiece(Piece piece) {
|
|
|
|
|
if(caseModele !=null ){
|
|
|
|
|
caseModele.setPiece(piece);
|
|
|
|
|
}
|
|
|
|
|
updateFromModel();
|
|
|
|
|
}
|
2025-08-12 22:18:58 +02:00
|
|
|
|
2025-09-07 14:44:32 +02:00
|
|
|
// Getters pour l'état de sélection
|
2025-08-12 22:18:58 +02:00
|
|
|
public boolean isSelectionnee() { return selectionnee; }
|
|
|
|
|
public void setSelectionnee(boolean selectionnee) {
|
|
|
|
|
this.selectionnee = selectionnee;
|
2025-09-07 14:44:32 +02:00
|
|
|
//this.setBorder(BorderFactory.createLineBorder(selectionnee ? new Color(248, 161, 87) : Color.DARK_GRAY,selectionnee ? 3 : 1));
|
2025-08-12 22:18:58 +02:00
|
|
|
// Repaint pour mettre à jour la couleur de fond
|
|
|
|
|
repaint();
|
|
|
|
|
}
|
2025-09-07 14:44:32 +02:00
|
|
|
|
|
|
|
|
// Gestion du dernier coup
|
|
|
|
|
public void setLastOrigin(boolean estDernierCoupOrigine) {
|
|
|
|
|
this.estDernierCoupOrigine = estDernierCoupOrigine;
|
|
|
|
|
repaint();
|
|
|
|
|
}
|
|
|
|
|
public void setLastDestination(boolean estDernierCoupDestination) {
|
|
|
|
|
this.estDernierCoupDestination = estDernierCoupDestination;
|
|
|
|
|
repaint();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Getters pour la position de la case
|
2025-08-12 22:18:58 +02:00
|
|
|
public int getLigne() { return ligne; }
|
|
|
|
|
public int getColonne() { return colonne; }
|
2025-09-07 14:44:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|