#ifndef __Objet_Graphique_HXX__
#define __Objet_Graphique_HXX__

#include "Point.hxx"

class ostream;

class ObjetGraphique
{
  // Donnees protected : accessibles aux sous classes !
  protected :
    Point pointDeBase_;
    int   couleur_;
    int   epaisseur_;
    
    
    static int NbObjetsGraphiques_;

  public:
  
  // Une chtite constante :)
  
    enum { COULEURFOND=0 };

  public :
    ObjetGraphique(int x, int y, int couleur=0, int epaisseur=0) :
      pointDeBase_(x,y), 
      couleur_(couleur), 
      epaisseur_(epaisseur)
    {
      NbObjetsGraphiques_++;
    }

    const Point &pointDeBase(void) const
    {
      return pointDeBase_;
    }

    int couleur(void) const
    {
      return couleur_;
    }

    int epaisseur(void) const
    {
      return epaisseur_;
    }

    virtual void afficher(void) const=0 ; // Code specifique 
                                          // a chaque categorie d'objet

    virtual void effacer(void)     // Comportement par defaut de l'effacage
    {
      int sauveCouleur=couleur_;
      couleur_=COULEURFOND;
      afficher();
      couleur_=sauveCouleur;
    }
    
    static int NbObjetsGraphiques(void)
    {
      return NbObjetsGraphiques_;
    }
    


    void deplacerVers(int versX, int versY)
    {
      effacer();
      pointDeBase_.deplacerVers(versX, versY);
      afficher();
    }

    void deplacerDe(int surX, int surY)
    {
      deplacerVers(pointDeBase_.x()+surX, pointDeBase_.y()+surY);
      // Reutilisation du code de la fonction precedente pour fiabilisation
    }
   
    friend ostream& operator<<(ostream &, const ObjetGraphique&);

    virtual void afficher(ostream &) const;

    virtual ~ObjetGraphique();
};

#endif
