///
/// \file Controle.cpp
/// 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
///

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

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

#include "FenetreControles.h"
#include "Controle.h"
#include "Couleur.h"

///
/// Anti-warning.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
#define UNREFERENCED_PARAMETER(P) (P)

///
/// Constructeur basique.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
Controle::Controle(void) {
  px = 0;
  py = 0;
  coul = new Couleur();
  actif = 0;
  finActivation = NULL;
  enabled = 1;
  fenetre = NULL;
  strcpy(name,"");
}

///
/// 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::Controle(int px,int py,Couleur *coul) {
  this->px = px;
  this->py = py;
  this->coul = new Couleur(coul);
  actif = 0;
  finActivation = NULL;
  enabled = 1;
  fenetre = NULL;
  strcpy(name,"");
}

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

void Controle::dessiner(void) {
}

void Controle::sauve(void) {
}

void Controle::annule(void) {
}

void Controle::setPosition(int spx,int spy) {
  this->px = spx;
  this->py = spy;
}

void Controle::getPosition(int *spx,int *spy) {
  *spx = this->px;
  *spy = this->py;
}

///
/// Deselection du controle.
///
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 25/02/10
///
void Controle::deselection(void) {
  actif = 0;
}

///
/// 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 Controle::setEnabled(int senabled) {
  this->enabled = senabled;
}

void Controle::setFenetre(FenetreControles *f) {
  fenetre = f;
}

void Controle::initialise(void) {
}

int Controle::selection(int,int) {
  return(0);
}

int Controle::gereModification(int,int,int,int) {
  return(0);
}

int Controle::gereKeyboard(unsigned char,int,int) {
  return(0);
}

int Controle::gereSpecial(int,int,int) {
  return(0);
}

///
/// 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 Controle::setGLColor(float r,float v,float b,float a) {
  if ( enabled )
    glColor4f(r,v,b,a);
    else {
    float facteur = 4.0F;
    Couleur *clf = fenetre->getBackgroundColor();
    if ( clf == NULL ) {
      glutSetWindow(fenetre->num);
      float cl[4];
      glGetFloatv(GL_COLOR_CLEAR_VALUE,cl);
      glColor4f((facteur*cl[0]+r)/(facteur+1.0F),
                (facteur*cl[1]+v)/(facteur+1.0F),
                (facteur*cl[2]+b)/(facteur+1.0F),1.0F); }
      else {
      glColor4f((facteur*clf->r+r)/(facteur+1.0F),
                (facteur*clf->v+v)/(facteur+1.0F),
                (facteur*clf->b+b)/(facteur+1.0F),1.0F); } }
} 

///
/// 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 Controle::setGLColor(float *c) {
  if ( enabled )
    glColor4fv((float *) c);
    else {
    float facteur = 4.0F;
    Couleur *clf = fenetre->getBackgroundColor();
    if ( clf == NULL ) {
      glutSetWindow(fenetre->num);
      float cl[4];
      glGetFloatv(GL_COLOR_CLEAR_VALUE,cl);
      glColor4f((facteur*cl[0]+c[0])/(facteur+1.0F),
                (facteur*cl[1]+c[1])/(facteur+1.0F),
                (facteur*cl[2]+c[2])/(facteur+1.0F),1.0F); }
      else {
      glColor4f((facteur*clf->r+c[0])/(facteur+1.0F),
                (facteur*clf->v+c[1])/(facteur+1.0F),
                (facteur*clf->b+c[2])/(facteur+1.0F),1.0F); } }
} 

///
/// 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 Controle::setGLMaterial(GLenum face,GLenum caracteristique,float *c) {
  if ( enabled )
    glMaterialfv(face,caracteristique,(float *) c);
    else {
    float facteur = 8.0F;
    Couleur *clf = fenetre->getBackgroundColor();
    if ( clf == NULL ) {
      glutSetWindow(fenetre->num);
      float cl[4];
      glGetFloatv(GL_COLOR_CLEAR_VALUE,cl);
      cl[0] = (facteur*cl[0]+c[0])/(facteur+1.0F);
      cl[1] = (facteur*cl[1]+c[1])/(facteur+1.0F);
      cl[2] = (facteur*cl[2]+c[2])/(facteur+1.0F);
      glMaterialfv(face,caracteristique,cl); }
      else {
      float cl[4];
      cl[0] = (facteur*clf->r+c[0])/(facteur+1.0F);
      cl[1] = (facteur*clf->v+c[1])/(facteur+1.0F);
      cl[2] = (facteur*clf->b+c[2])/(facteur+1.0F);
      glMaterialfv(face,caracteristique,cl); } } 
} 

void Controle::sauve(FILE *f) {
  UNREFERENCED_PARAMETER(f);
}

void Controle::setName(const char *nm) {
  strcpy(name,nm);
}

char *Controle::getName(void) {
  return(name);
}
