import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.geom.Rectangle2D;

// Bouton, herite de Clip
public class Button extends Clip {

	// Texte du bouton
	private boolean updateTextPosition = true; // A-t-on besoin de recalculer la hauteur/largeur du texte (pour le centrer)
	private String text = "";
	public String getText(){ return text; }
	public void setText(String value){ text = value; updateTextPosition = true; Invalidate(); }  
	
	// Offset du texte
	int os_x, os_y;
	
	// Police de caractere du texte
	Font font;
	
	// Zone de clique (ici, tout le bouton)
	public Rectangle zone;
	
	public Button(HWCanvas canvas, String text, int x, int y, int w, int h) {
		super(canvas, false);
		// Zone de clique = taille du bouton
		zone = new Rectangle(0, 0, w, h);
		// Position du bouton
		this.x = x;
		this.y = y;
		// Dimension du bouton
		this.width = w;
		this.height = h;
		// Initialisation de la police et du texte
		font = new Font("ARIAL", Font.BOLD, 14);
		this.text = text;
	}
	
	// Repaint du clip
	void repaint(Graphics2D g){ repaint(g, 0, 0); } // Par defaut a un offset (0,0)
	void repaint(Graphics2D g, int ox, int oy) {
		if(isDisposed) return; // Si le bouton a ete detruit, on quitte la fonction
		try{
			if(updateTextPosition){ // Si besoin, on recalcule la position du texte pour le centrer
				updateTextPosition = false;
				FontMetrics fm   = g.getFontMetrics(font);
				Rectangle2D rect = fm.getStringBounds(text, g);
				os_x = (width  - (int)rect.getWidth())  / 2;
				os_y = (height - (int)rect.getHeight()) / 2 + fm.getAscent();
			}
			
			// On applicaque la police de caractere
			g.setFont(font);
			
			// Suivant si le bouton est selectionne, on change la couleur
			if(selected){
				g.setColor(new Color(255, 128, 64, 100));
				g.fillRect(ox+x, oy+y, width, height);
				g.setColor(new Color(50, 50, 50));
				g.drawString(text, ox+x+os_x, oy+y+os_y);
			}else{
				g.setColor(new Color(200, 200, 200, 100));
				g.fillRect(ox+x, oy+y, width, height);
				g.setColor(new Color(50, 50, 50));
				g.drawString(text, ox+x+os_x, oy+y+os_y);
			}
			
			// Si l'utilisateur survol le bouton, il s'eclairci
			if(isHover()){
				g.setColor(new Color(255, 255, 255, 100));
				g.fillRect(ox+x, oy+y, width, height);
			}
		}catch(Exception ex){}
	}
	
	// Est-ce que l'utilisateur survol le bouton
	public boolean isHover(){
		if(isDisposed) return false;
		return (((CircuitCanvas) canvas).getHoverClip() == this); // Si le CircuitCanvas considere que l'utilisateur le survol, alors renvoyer true
	}
	
	// Recuperation de l'element qui se trouve sous la souris (ici il y a seulement le bouton)
	public Object getItem(MouseEvent me){
		if(isDisposed) return null;
		int x = me.getPoint().x - this.x;
		int y = me.getPoint().y - this.y;
		if(isDisposed) return false;
		if(x >= zone.x && x<=zone.x+zone.width &&
				y >= zone.y && y<=zone.y+zone.height) return this;
		return null;
	}

	// Memorisation de l'etat, selectionne ou non
	boolean selected=false;
	public void select(boolean yes){
		if(yes == selected) return; // Si deja dans l'etat voulu, ne rien faire
		selected = yes; // Autrement changer l'etat
		Invalidate(); // Invalider le clip (ce qui entraine son repaint)
	}
}
