///
/// \file FenetreControles.h
/// Classe de gestion d'une fenetre de composants d'interface utilisateur.
/// 
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///

#ifndef FENETRECONTROLES
#define FENETRECONTROLES

class Controle;
class Couleur;
class Vector;

///
/// \class FenetreControles
/// Classe de gestion d'une fenetre de composants d'interface utilisateur.
/// 
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///

class FenetreControles {
  
  public :
    int mpx;                             ///< Derniere position souris en x active detectee dans la fenetre.
    int mpy;                             ///< Derniere position souris en y active detectee dans la fenetre.
    int button;                          ///< Bouton de souris utilise.
    int mouvement;                       ///< Booleen mouvement souris en cours.
    int ctrlActif;                       ///< Numero du controle en activite.
    int ctrlEnCours;                     ///< Numero du controle selectionne.
    void (*fonction)(Controle *ctrl);    ///< Fonction executee en reaction a l'activation d'un controle de la fenetre.
    void (*display)(void);               ///< Fonction (GLUT) optionnelle de raffraichissement de la fenetre.
    int num;                             ///< Numero (GLUT) de la fenetre.
    int *enCours;                        ///< Booleen de controle si la fenetre de controle est active ou non.
    Couleur *backgroundColor;            ///< Couleur de fond.
    int sp;                              ///< Nombre de controles ajoutes a la fenetre.

  protected :
    int px;                              ///< Position en x de la fenetre (coin superieur gauche).
    int py;                              ///< Position en y de la fenetre (coin superieur gauche).
    int tx;                              ///< Taille en x (largeur) de la fenetre.
    int ty;                              ///< Taille en y (hauteur) de la fenetre.
    char titre[200];                     ///< Titre de la fenetre.

  private :
    Controle **ctrl;                     ///< Le tableau des controles implante dans la fenetre.

  public :

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

///
/// Constructeur avec parametres.
///
/// @param px Position en x de la fenetre (coin superieur gauche).
/// @param py Position en y de la fenetre (coin superieur gauche).
/// @param tx Taille en x (largeur) de la fenetre.
/// @param ty Taille en y (hauteur) de la fenetre.
/// @param titre Titre de la fenetre.
/// @param fonction Fonction executee en reponse a l'activation d'un controle de la fenetre.
/// @param display Fonction optionnelle d'affichage executee en reponse a l'activation d'un controle de la fenetre.
/// @param menus Fonction optionnelle de creation des menus de la fenetre.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    FenetreControles(int px,int py,int tx,int ty,const char *titre,void (*fonction)(Controle *),void (*display)(void),void (*menus)(void));

///
/// Constructeur avec parametres.
///
/// @param px Position en x de la fenetre (coin superieur gauche).
/// @param py Position en y de la fenetre (coin superieur gauche).
/// @param tx Taille en x (largeur) de la fenetre.
/// @param ty Taille en y (hauteur) de la fenetre.
/// @param titre Titre de la fenetre.
/// @param fonction Fonction executee en reponse a l'activation d'un controle de la fenetre.
/// @param display Fonction optionnelle d'affichage executee en reponse a l'activation d'un controle de la fenetre.
/// @param menus Fonction optionnelle de creation des menus de la fenetre.
/// @param enCours Booleen de detection de l'utilisation de la fenetre.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    FenetreControles(int px,int py,int tx,int ty,const char *titre,void (*fonction)(Controle *),void (*display)(void),void (*menus)(void),int *enCours);

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

///
/// Ajout d'un Controle a la fenetre.
///
/// @param ctrl Le controle a ajouter.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void add(Controle *ctrl);

///
/// Initialisation de la fenetre.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void init(void);

///
/// Finalisation de la fenetre.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void finalise(void);

///
/// Annulation de la fenetre (restoration des parametres geres par les controles a leurs valeurs initiales).
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void annule(void);

///
/// Sauvegarde pour annulation de la fenetre (restoration des parametres geres par les controles a leurs valeurs initiales).
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void sauve(void);

///
/// Reinitialisation de la fenetre.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void reinit(void);

///
/// Affectation de la fonction optionnelle d'affichage.
///
/// @param display La fonction optionnelle d'affichage.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void setAffichage(void (*display)(void));

///
/// Affectation de la fonction de reponse a l'utilisation des controles de la fenetre.
///
/// @param fonction La fonction de reponse.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void setFonction(void (*fonction)(Controle *ctrl));

///
/// Changement de la taille de la fenetre.
///
/// @param tx La nouvelle taille en x (largeur).
/// @param ty La nouvelle taille en y (hauteur).
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void resizeWindow(int tx,int ty);

///
/// Changement des caracteristiques de la fenetre.
///
/// @param px La nouvelle position en x (coin superieur gauche).
/// @param py La nouvelle position en y (coin superieur gauche).
/// @param tx La nouvelle taille en x (largeur).
/// @param ty La nouvelle taille en y (hauteur).
/// @param s Le nouveau titre.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void reshapeWindow(int px,int py,int tx,int ty,const char *s);

///
/// Changement des caracteristiques de la fenetre.
///
/// @param tx La nouvelle taille en x (largeur).
/// @param ty La nouvelle taille en y (hauteur).
/// @param s Le nouveau titre.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void reshapeWindow(int tx,int ty,const char *s);

///
/// Changement des caracteristiques de la fenetre.
///
/// @param tx La nouvelle taille en x (largeur).
/// @param ty La nouvelle taille en y (hauteur).
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void reshapeWindow(int tx,int ty);

///
/// Lecture du nombre de controles de la fenetre.
///
/// @return Le nombre de controles de la fenetre.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    int getNombreControles(void);

///
/// Affectation du nombre de controles de la fenetre.
///
/// @param nb Le nombre de controles de la fenetre.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void setNombreControles(int nb);

///
/// Affectation de la couleur de fond de la fenetre.
///
/// @param c La couleur de fond.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    void setBackgroundColor(Couleur *c);

///
/// Lecture de la couleur de fond de la fenetre.
///
/// @return La couleur de fond.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    Couleur *getBackgroundColor(void);

///
/// Sauvegarde d'un fichier de configuration texte XML des parametres geres par les controles de la fenetre.
///
/// @param filename Le nom du fichier de sauvegarde.
/// @param tagName Le nom du tag principal du fichier.
/// @return Un booleen indiquant si la sauvegarde a abouti.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    int sauveFichierConfiguration(const char *filename,const char *tagName);

///
/// Sauvegarde d'un fichier de configuration texte XML des parametres geres par les controles de la fenetre.
///
/// @param filename Le nom du fichier de sauvegarde.
/// @param tagName Le nom du tag principal du fichier.
/// @param v Le Vector contenant les controles a sauvegarder.
/// @return Un booleen indiquant si la sauvegarde a abouti.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    int sauveFichierConfiguration(const char *filename,const char *tagName,Vector *v);

  private :

///
/// Creation d'une fenetre.
///
/// @param px La position en x (coin superieur gauche).
/// @param py La position en y (coin superieur gauche).
/// @param tx La taille en x (largeur).
/// @param ty La taille en y (hauteur).
/// @param titre Le titre.
/// @return Le handle GLUT de la fenetre creee.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
    int creationFenetre(int px,int py,int tx,int ty,char *titre);
};

#endif
