/*
 *   This file is part of the MLV Library.
 *
 *   Copyright (C) 2010,2011,2012 Adrien Boussicault, Marc Zipstein
 *
 *
 *    This Library is free software: you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation, either version 3 of the License, or
 *    (at your option) any later version.
 *
 *    This Library is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this Library.  If not, see <http://www.gnu.org/licenses/>.
 */

/** \~french 
 * \file MLV_input_box.h
 *
 * \author Adrien Boussicault
 * \author Marc Zipstein
 *
 * \brief Ce fichier définit les prototypes des fonctions permettant de 
 *        demander à l'utilisateur du texte par l'intermédiaire de boîtes 
 *        de saisie.
 *
 */

#ifndef __MLV__MLV_INPUT_BOX_H__
#define __MLV__MLV_INPUT_BOX_H__

#include "MLV_color.h"
#include "MLV_text.h"

#ifdef __cplusplus
extern "C" {
#endif

/** \~french 
 * \brief Définition du type des boîtes de saisies
 *
 */
typedef struct _MLV_Input_box MLV_Input_box;

/** \~french 
 *
 * \brief Cette fonction suspend l'exécution du programme, affiche une boîte 
 *        de saisie et attends que l'utilisateur rentre une phrase dans le 
 *        champs de la boîte.
 *
 * La boîte de saisie contient deux zones de textes. 
 * La première zone ne peut pas être éditée par l'utilisateur et sert à 
 * afficher un message d'information. 
 * La deuxième est vide et peut être éditée par l'utilisateur.
 * Lorsque l'utilisateur appuie sur la touche entrée, le texte qui 
 * se trouve dans la zone de texte est renvoyé par la fonction
 * grâce au paramètre text.
 * Le texte, la taille et les couleurs de la boîte de saisie sont
 * paramétrables.
 * 
 * MLV_wait_input_box() alloue lui même la mémoire associée au paramètre "text".
 * Par contre, après utilisation, vous devez libérer l'espace mémoire qui a été 
 * alloué.
 *
 * \param sommetHautGaucheX     La coordonnée en X du coin Nord-Ouest de la 
 *                              boîte de saisie.
 * \param sommetHautGaucheY     La coordonnée en Y du coin Nord-Ouest de la 
 *                              boîte de saisie.
 * \param sommetBasDroitX       La coordonnée en X du coin Sud-Est de la 
 *                              boîte de saisie.
 * \param sommetBasDroitY       La coordonnée en Y du coin Sud-Est de la 
 *                              boîte de saisie.
 * \param borderColor           La couleur de la bordure de la boîte de saisie.
 * \param textColor             La couleur du texte de la boîte de saisie.
 * \param backgroundColor       La couleur de fond de la boîte de saisie.
 * \param informativeMessage    Le message à afficher devant la boîte de saisie.
 * \param text                  L'addresse où sera placé la réponse donnée par 
 *                              l'utilisateur.
 */
void MLV_wait_input_box(
	int sommetHautGaucheX, int sommetHautGaucheY,
	int sommetBasDroitX, int sommetBasDroitY,
	MLV_Color borderColor, MLV_Color textColor,
	MLV_Color backgroundColor,
	const char* informativeMessage,
	char** text
);

/** \~french 
 *
 * \brief Même chose que MLV_wait_input_box(), mais il est possible de 
 *        changer la fonte du du texte.
 * 
 * MLV_wait_input_box_with_font() alloue lui même la mémoire associée au 
 * paramètre "text".
 * Par contre, après utilisation, vous devez libérer l'espace mémoire qui a 
 * été alloué.
 *
 * \param sommetHautGaucheX   La coordonnée en X du coin Nord-Ouest de la 
 *                            boîte de saisie.
 * \param sommetHautGaucheY   La coordonnée en Y du coin Nord-Ouest de la 
 *                            boîte de saisie.
 * \param sommetBasDroitX     La coordonnée en X du coin Sud-Est de la boîte 
 *                            de saisie.
 * \param sommetBasDroitY     La coordonnée en Y du coin Sud-Est de la boîte 
 *                            de saisie.
 * \param borderColor         La couleur de la bordure de la boîte de saisie.
 * \param textColor           La couleur du texte de la boîte de saisie.
 * \param backgroundColor     La couleur de fond de la boîte de saisie.
 * \param informativeMessage  Le message à afficher devant la boîte de saisie.
 * \param text                L'addresse où sera placé la réponse donnée par 
 *                            l'utilisateur.
 * \param font                La font du texte à utiliser.
 */
void MLV_wait_input_box_with_font(
	int sommetHautGaucheX, int sommetHautGaucheY,
	int sommetBasDroitX, int sommetBasDroitY,
	MLV_Color borderColor, MLV_Color textColor,
	MLV_Color backgroundColor,
	const char* informativeMessage,
	char** text,
	const MLV_Font* font
);


/** \~french 
 * \brief Cette fonction suspend l'exécution du programme jusqu'à ce que 
 *        l'utilisateur écrive une phrase dans le champs de la boîte de 
 *        saisie passée en paramètre de la fonction.
 *
 * \param input_box La boîte de saisie qui doit être observée.
 * \param text Le texte récupéré par la boîte de saisie.
 */
void MLV_wait_particular_input_box( MLV_Input_box* input_box, char** text);


/** \~french 
 * \brief Cette fonction créé une boîte de saisie.
 *
 * Une fois la boîte de saisie créé, si l'utilisateur clique sur la boîte 
 * de saisie, la boîte de saisie devient active.
 * Cela veux dire que tout les évènements clavier sont récupérés par la 
 * boîte de saisie qui s'en sert pour enregistrer le texte tapé par 
 * l'utilisateur.
 * De même, tout clique de souris réalisé sur la boîte de saisie est 
 * acaparé par la boîte de saisie.
 *
 * Pour dessiner une ou toutes les boîtes de saisies, dans la zone où vous 
 * les avez créées, vous devez utiliser les fonctions : 
 * - MLV_draw_input_box()
 * - MLV_draw_all_input_boxes()
 *
 * \param sommetHautGaucheX La coordonnée en X du sommet Nord-Ouest de la boîte 
 *                          de saisie.
 * \param sommetHautGaucheY La coordonnée en Y du sommet Nord-Ouest de la boîte 
 *                          de saisie.
 * \param width La largeur de la boîte de saisie.
 * \param height La hauteur de la boîte de saisie.
 * \param borderColor La couleur de la bordure de la boîte de saisie.
 * \param textColor La couleur du texte.
 * \param backgroundColor La couleur du fond.
 * \param informativeMessage La message d'entête de la boîte de saisie.
 */
MLV_Input_box* MLV_create_input_box(
	int sommetHautGaucheX, int sommetHautGaucheY,
	int width, int height,
	MLV_Color borderColor, MLV_Color textColor,
	MLV_Color backgroundColor,
	const char* informativeMessage
);

/** \~french 
 * \brief Cette fonction créé une boîte de saisie avec une font spécifique.
 *
 * \param sommetHautGaucheX La coordonnée en X du sommet Nord-Ouest de la boîte de saisie.
 * \param sommetHautGaucheY La coordonnée en Y du sommet Nord-Ouest de la boîte de saisie.
 * \param width La largeur de la boîte de saisie.
 * \param height La hauteur de la boîte de saisie.
 * \param borderColor La couleur de la bordure de la boîte de saisie.
 * \param textColor La couleur du texte.
 * \param backgroundColor La couleur du fond.
 * \param informativeMessage Le message d'entête de la boîte de saisie.
 * \param font La font à utiliser pour le texte.
 */
MLV_Input_box* MLV_create_input_box_with_font(
	int sommetHautGaucheX, int sommetHautGaucheY,
	int width, int height,
	MLV_Color borderColor, MLV_Color textColor,
	MLV_Color backgroundColor,
	const char* informativeMessage,
	const MLV_Font* font
);


/** \~french 
 * \brief Cette fonction ferme une boîte de saisie précédement créée.
 *
 * L'espace mémoire allouée à la boîte de saisie est libéré.
 *
 * \param input_box La boîte de saisie à fermer.
 */
void MLV_free_input_box( MLV_Input_box* input_box );

/** \~french 
 * \brief Cette fonction change le message d'entête d'une boîte de saisie.
 *
 * \param input_box La boîte de saisie à modifier.
 * \param message Le message d'entête.
 */
void MLV_change_informative_message_of_input_box(
	MLV_Input_box* input_box, const char* message
);

/** \~french 
 * \brief Cette fonction dessine une boîte de saisie particulière.
 *
 * \param input_box La boîte de saisie à dessiner.
 */
void MLV_draw_input_box( MLV_Input_box* input_box );

/** \~french 
 * \brief Cette fonction dessine tous les boîtes de saisies.
 *

 */
void MLV_draw_all_input_boxes();

/** \~french 
 * \brief Cette fonction supprime l'historique d'une boîte de saisie.
 *
 * \param input_box La boîte de saisie dont l'histoirque doit être supprimé
 */
void MLV_suppress_history( MLV_Input_box* input_box );

/** \~french 
 * \brief Cette fonction change la taille et la position d'une boîte de saisie donnée en paramètre.
 *
 * \param input_box La boîte de saisie à modifier.
 * \param sommetHautGaucheX La nouvelle coordonnée en X de la position du sommet
 *                          Nord-Ouest de la boîte de saisie.
 * \param sommetHautGaucheY La nouvelle coordonnée en Y de la position du sommet
 *                          Nord-Ouest de la boîte de saisie.
 * \param width La nouvelle largeur de la boîte de saisie.
 * \param height La nouvelle hauteur de la boîte de saisie.
 */
void MLV_change_input_box_geometry(
	MLV_Input_box* input_box,  int sommetHautGaucheX, int sommetHautGaucheY,
	int width, int height
);

/** \~french 
 * \brief Cette fonction change la taille d'une boîte de saisie.
 *
 * \param input_box La boîte de saisie à modifier.
 * \param width La nouvelle largeur de la boîte de saisie.
 * \param height La nouvelle hauteur de la boîte de saisie.
 */
void MLV_change_input_box_size(MLV_Input_box* input_box, int width, int height);

/** \~french 
 * \brief Cette fonction change la position d'une boîte de saisie donnée en paramètre.
 *
 * \param input_box La boîte de saisie à modifier.
 * \param sommetHautGaucheX La nouvelle coordonnée en X de la position du sommet
 *                          Nord-Ouest de la boîte de saisie.
 * \param sommetHautGaucheY La nouvelle coordonnée en Y de la position du sommet
 *                          Nord-Ouest de la boîte de saisie.
 */
void MLV_change_input_box_position(
	MLV_Input_box* input_box, int sommetHautGaucheX, int sommetHautGaucheY
);

/** \~french 
 * \brief Cette fonction change les différentes couleurs d'une boîte de saisie donnée
 *
 * \param input_box La boîte de saisie à modifier.
 * \param borderColor La nouvelle couleur du bord de la boîte de saisie.
 * \param textColor La nouvelle couleur du texte de la boîte de saisie.
 * \param backgroundColor La nouvelle couleur de fond de la boîte de saisie.
 */
void MLV_change_input_box_colors( 
	MLV_Input_box* input_box,  MLV_Color borderColor, MLV_Color textColor,
	MLV_Color backgroundColor
);

/** \~french 
 * \brief Cette fonction active une boîte de saisie. 
 *
 * Cette opération agit comme si l'utilisateur avait cliqué sur la boîte de 
 * saisie en question (action qui rend active une boîte de saisie).
 *
 * Lorsque une boîte de saisie est active, les évènements du clavier sont 
 * récupérés par la boîte de saisie et sont utilisés pour enregistrer le 
 * texte tapé par l'utilisateur.
 * Les cliques de souris sur la boîte de saisie sont aussi récupérés par 
 * la boîte de saisie.
 *
 * \param input_box La boîte de saisie à activer.
 */
void MLV_activate_input_box( MLV_Input_box* input_box );

/** \~french 
 * \brief Cette fonction désactive la boîte de saisie qui est active.
 * 
 * Si il n'y a pas de boîte de saisie active, cette fonction ne fait rien.
 */
void MLV_desactivate_input_box( );

#ifdef __cplusplus
}
#endif

#endif
