package shapes;
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
import java.util.*;


/**
 *Classe qui définit un Rectangle qui hérite de Forme.
 * 
 * @author Eynard Julien et DELCLAUX Florian 
 * @version TP4 version 1 Applet
 */

public class Rectangle extends Forme
{
    /**champ correspondant à la longueur du rectangle*/
    public float longueur;

    /**champ correspondnat à la largeur du rectangle*/
    public float largeur;

   /**
     * Constructeur par défaut pour des objets de type Rectangle.
     * Longueur = 20
     * Largeur = 10
     * @param s : Rectangle remplie ou non
     */
    public Rectangle(boolean s)
        {
            super(s);
            longueur = 10;
            largeur = 20;
        }

    /**
     * Constructeur pour une position donnée pour des objets de type Rectangle.
     * Longueur = 20
     * Largeur = 10
     * @param x : Abscisse du rectangle
     * @param y : Ordonnée du rectangle
     * @param s : Rectangle remplie ou non
     */
     public Rectangle(float x, float y, boolean s)
        {
            super(x,y,s);
            longueur = 20;
            largeur = 10;
        }

     /**
     * Constructeur pour une position et des dimensions données  pour des objets de type Rectangle.
     * @param L : Longueur du rectangle
     * @param l : Largeur du rectangle
     * @param x : Abscisse du rectangle
     * @param y : Ordonnée du rectangle
     * @param s : Rectangle remplie ou non
     * 
     */
     public Rectangle(float L, float l, float x, float y,boolean s)
        {
            super(x, y,s);
            longueur = L;
            largeur =l;
        }

    /**
     * Redéfinition de la méthode toString pour un Rectangle
     * @return : Une chaîne de caractère décrivant un rectangle découlant de forme et non spécifique à un rectangle pour ses sous classes.
     */
    public String toString()
        {
            return "aire= "+aire()+"\n"+"perimetre= "+perimetre()+"\n"+super.toString();
        }

    /**
     * Redéfinition de la méthode print() qui affiche les caractéristiques spécifiques à un rectangle.
     */
    protected void print()
        {
            System.out.println("rectangle \n"+"largeur= "+largeur+"\n"+"longueur= "+longueur+"\n"+ toString());
        }

    /**
     * Redéfinition de la méthode afficher afin d'afficher un rectangle
     *Dessine un Rectangle2D plein ou vide et en couleur.
     *@param g : La fenêtre graphique spécifiée (ici l'applet)
     */
    public void afficher(Graphics g)
        {
            Rectangle2D.Float rect = new Rectangle2D.Float(x,y,longueur,largeur);//on crée un Rectangle2D
            Graphics2D g2 = (Graphics2D)g;//on cast g en 2D pour pouvoir faire des Rectangle2D

            g.setColor(couleur);//on donne la couleur à utiliser pour dessiner qui correspond à la couleur du Rectangle
            if(style == false)
                  g2.draw(rect);//on dessine un rectangle vide
            else
                  g2.fill(rect);//on dessine un rectangle plein
        }

     /**
     *Redéfinition de la méthode aire() permettant de calculer l'aire d'un objet de type rectangle et de ses sous types.
     *@return : Valeur du flottant correspondant à l'aire.
     */
    protected float aire()
    {
        return longueur*largeur;
    }

    /**
     *Redéfinition de la méthode perimetre() permettant de calculer le perimetre d'un objet de type Rectangle et de ses sous types.
     *@return : Valeur du flottant correspondant à l'aire.
     */
    protected float perimetre()
        {
            return 2*(longueur+largeur);
        }

    /**
     * Redéfinition de la méthode redimension afin de redéfinir la taille des cotés d'un rectangle
     *
     * @param a : Nouvelle valeur pour la longueur d'un rectangle.
     * @param b : Nouvelle valeur pour la largeur d'un rectangle.
     */
    public void redimension2(float a, float b) //throws Exception
        {
            longueur=a;
            largeur=b;
        }

     /**
     * Redéfinition de la méthode redimension afin de redéfinir la taille des cotés d'un rectangle de la même façon (création d'un carré)
     *
     * @param a : Nouvelle valeur pour la longueur et la largeur
     */
     public void redimension(float a)
        {
            longueur=a;
            largeur=a;
        }


     /**
     * Définition de la méthode qui modifie la taille du rectangle
     */
    public void modifier(int x1,int y1,int x2,int y2)
        {

             if (x2<x1)
                x=x2;

             if (y2<y1)
                y=y2;

             /*On redimensionne le Rectangle avec les longueurs de taille imposé par le déplacement de la souris*/
             redimension2(Math.abs(x2-x1),Math.abs(y2-y1));

        }

     /**
     * Définition de la méthode contient, pour savoir si un endroit est contenue dans un rectangle
     * @param a : abscisse du pointeur pressé
     * @param b : ordonnée du pointeur pressé 
     */
    public boolean contient (int a, int b)
        {
            if (((a>x)&&(a<(x+longueur)))&&((b>y)&&(b<(y+largeur))))
                return true;
            else
                return false;
        }


}