///
/// \file Controle.h
/// Classe mere de gestion des elements d'interface utilisateur graphique.
/// 
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///

#ifndef ____CONTROLE____
#define ____CONTROLE____

#include <stdio.h>

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

class Couleur;
class FenetreControles;

///
/// \class Controle
/// Classe mere de gestion des elements d'interface utilisateur graphique.
/// 
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///

class Controle {
  public :
    int actif;                      ///< Booleen indiquant la selection du controle.
    void (*finActivation)(void);    ///< Fonction a lancer en cas de fin de selection du controle.

  protected :
    int px;                         ///< Position en x.
    int py;                         ///< Position en y.
    Couleur *coul;                  ///< Couleur.
    int enabled;                    ///< Booleen indiquant l'activation du controle.
    FenetreControles *fenetre;      ///< La fenetre d'inclusion du controle.
    char name[512];                 ///< Le nom du controle.

  public :

///
/// Constructeur basique.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    Controle(void);

///
/// Constructeur avec parametres.
///
/// @param px La position en x du controle.
/// @param py La position en y du controle.
/// @param coul La couleur de base du controle.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    Controle(int px,int py,Couleur *coul);

///
/// Destructeur.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    virtual ~Controle(void);

///
/// Deselection du controle.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void deselection(void);

///
/// Activation/desactivation d'un controle.
///
/// @param enabled Le booleen d'activation/desactivation.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void setEnabled(int enabled);

///
/// Affectation de la fenetre d'appartenance du controle.
///
/// @param f La fenetre.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void setFenetre(FenetreControles *f);

///
/// Affectation de la position du controle.
///
/// @param px La position en x du controle.
/// @param py La position en y du controle.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    virtual void setPosition(int px,int py);

///
/// Lecture de la position du controle.
///
/// @param px La position en x du controle.
/// @param py La position en y du controle.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    virtual void getPosition(int *px,int *py);

///
/// Initialisation du controle.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    virtual void initialise(void);

///
/// Dessin du controle.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    virtual void dessiner(void);

///
/// Sauvegarde des valeurs actuelles liees au controle.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    virtual void sauve(void);

///
/// Restoration des valeurs sauvegardees liees au controle.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    virtual void annule(void);

///
/// Selection du controle lie a la position (x,y).
///
/// @param x La coordonnee x.
/// @param y La coordonnee y.
/// @return Le booleen indiquant que la selection a bien ete geree.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    virtual int selection(int x,int y);

///
/// Modification du controle lie a la position (x,y) et a un vecteur (dx,dy).
///
/// @param x La coordonnee x.
/// @param y La coordonnee y.
/// @param dx La valeur dx.
/// @param dy La valeur dy.
/// @return Le booleen indiquant que la selection a bien ete geree.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    virtual int gereModification(int x,int y,int dx,int dy);

///
/// Gestion clavier du controle lie a la position (x,y).
///
/// @param c Le caractere frappe au clavier.
/// @param x La coordonnee x.
/// @param y La coordonnee y.
/// @return Le booleen indiquant que la clavier a bien ete gere.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    virtual int gereKeyboard(unsigned char c,int x,int y);

///
/// Gestion du clavier special du controle lie a la position (x,y).
///
/// @param c Le code du caractere frappe au clavier.
/// @param x La coordonnee x.
/// @param y La coordonnee y.
/// @return Le booleen indiquant que la clavier a bien ete gere.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    virtual int gereSpecial(int c,int x,int y);

///
/// Sauvegarde du controle dans un fichier.
///
/// @param f Le fichier de sauvegarde.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    virtual void sauve(FILE *f);

///
/// Configure le nom du controle.
///
/// @param nm Le nom donne au controle.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void setName(const char *nm);

///
/// Retourne le nom du controle.
///
/// @return Le nom.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    char *getName(void);

  protected :

///
/// Configuration de la couleur OpenGL du controle.
///
/// @param c Le tableau de float decrivant la couleur.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void setGLColor(float *c);

///
/// Configuration de la couleur OpenGL du controle.
///
/// @param r La composante de rouge de la couleur.
/// @param v La composante de vert de la couleur.
/// @param b La composante de bleu de la couleur.
/// @param a La composante alpha de la couleur.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void setGLColor(float r,float v,float b,float a);

///
/// Configuration du materiel OpenGL du controle.
///
/// @param face La face concernee.
/// @param caracteristique La caracteristique concernee.
/// @param c Le tableau de float decrivant les valeurs de configuration.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void setGLMaterial(GLenum face,GLenum caracteristique,float *c); 
};

#endif
