/* ***********************IMPORTANT *********************************************
 *  Copyright (C) 2004-2007 Thierry Lagarde <tlagarde@users.sourceforge.net>
 *  This program 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 2 of the License.
 *
 *
 *                      ********************
 *
 *
 *  This program 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 Library General Public License for more details.
 *
 *
 *                      ********************
 *
 *
 * You are highly encouraged to send your changes to <tlagarde@users.sourceforge.net>
 * for possible incorporation into the main distribution.
 * By sending these changes to <tlagarde@users.sourceforge.net>,
 * it is assumed that you are offering <tlagarde@users.sourceforge.net>
 * the unlimited, non-exclusive right to reuse, modify, and relicense the code.
 *
 *
 *                      ********************
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **************************************************************************************/
#include <gtk/gtk.h>
#include "Objet.h"
#include "Objet_Liste.h"
#include "Animation.h"
#include "Image.h"
#include "Reseau.h"
#include "Declaration_Constante.h"
#include "Debug.h"

void refresh (void)
{
	while (gtk_events_pending ()) {
		gtk_main_iteration ();
	}
}


void Change_Couleur_Texte_Icon (struct Struct_Modele_Objet *Objet, guint16 red, guint16 green, guint16 blue, struct Struct_Liste_Reseau *Reseau)
{
	GtkTreeModel *model = NULL;
	GdkColor  color;

	ERROR_if (Objet == NULL);
	ERROR_if (Reseau == NULL);
	color.red = red;
	color.green = green;
	color.blue = blue;
	model = gtk_icon_view_get_model (GTK_ICON_VIEW (Widget_Liste (Objet, Reseau)));
	gtk_list_store_set (GTK_LIST_STORE (model), &Objet->ID_Arbre_Ligne, FOREGROUND_TEXT_LIST, &color, -1);
}


void Change_Couleur_Texte_Liste (struct Struct_Modele_Objet *Objet, guint16 red, guint16 green, guint16 blue, struct Struct_Liste_Reseau *Reseau)
{
	GtkTreeModel *model = NULL;
	GdkColor  color;

	ERROR_if (Objet == NULL);
	ERROR_if (Reseau == NULL);
	color.red = red;
	color.green = green;
	color.blue = blue;
	model = gtk_tree_view_get_model (GTK_TREE_VIEW (Widget_Liste (Objet, Reseau)));
	gtk_tree_store_set (GTK_TREE_STORE (model), &Objet->ID_Arbre_Ligne, FOREGROUND_TEXT_LIST, &color, -1);
}

void Change_Couleur_Ligne_Liste (struct Struct_Modele_Objet *Objet, guint16 red, guint16 green, guint16 blue, struct Struct_Liste_Reseau *Reseau)
{
	GtkTreeModel *model = NULL;
	GdkColor  color;

	ERROR_if (Objet == NULL);
	ERROR_if (Reseau == NULL);
	color.red = red;
	color.green = green;
	color.blue = blue;
	model = gtk_tree_view_get_model (GTK_TREE_VIEW (Widget_Liste (Objet, Reseau)));
	gtk_tree_store_set (GTK_TREE_STORE (model), &Objet->ID_Arbre_Ligne, BACKGROUND_TEXT_LIST, &color, -1);
}

void Change_Bold_Texte_Liste (struct Struct_Modele_Objet *Objet, gboolean Bold, struct Struct_Liste_Reseau *Reseau)
{
	GtkTreeModel *model = NULL;

	ERROR_if (Objet == NULL);
	ERROR_if (Reseau == NULL);
	model = gtk_tree_view_get_model (GTK_TREE_VIEW (Widget_Liste (Objet, Reseau)));
	if (Bold)
		gtk_tree_store_set (GTK_TREE_STORE (model), &Objet->ID_Arbre_Ligne, BOLD_TEXT_LIST, PANGO_WEIGHT_BOLD, -1);
	else
		gtk_tree_store_set (GTK_TREE_STORE (model), &Objet->ID_Arbre_Ligne, BOLD_TEXT_LIST, 400, -1);
}


void Change_Couleur_Rouge_Texte_liste (struct Struct_Modele_Objet *Objet, struct Struct_Liste_Reseau *Reseau)
{
	ERROR_if (Objet == NULL);
	ERROR_if (Reseau == NULL);
	Change_Couleur_Texte_Liste (Objet, 244 * 255, 14 * 255, 14 * 255, Reseau);
}


void Change_Couleur_Gris_Texte_liste (struct Struct_Modele_Objet *Objet, struct Struct_Liste_Reseau *Reseau)
{
	ERROR_if (Objet == NULL);
	ERROR_if (Reseau == NULL);
	if (Objet->Presentation == LISTE)
		Change_Couleur_Texte_Liste (Objet, 191 * 255, 191 * 255, 191 * 255, Reseau);
	else
		Change_Couleur_Texte_Icon (Objet, 191 * 255, 191 * 255, 191 * 255, Reseau);
}


void Change_Couleur_Blanc_Texte_liste (struct Struct_Modele_Objet *Objet, struct Struct_Liste_Reseau *Reseau)
{
	ERROR_if (Objet == NULL);
	ERROR_if (Reseau == NULL);
	Change_Couleur_Texte_Liste (Objet, 65535, 65535, 65535, Reseau);
}


void Change_Couleur_Noir_Texte_liste (struct Struct_Modele_Objet *Objet, struct Struct_Liste_Reseau *Reseau)
{
	ERROR_if (Objet == NULL);
	ERROR_if (Reseau == NULL);
	if (Objet->Presentation == LISTE)
		Change_Couleur_Texte_Liste (Objet, 0, 0, 0, Reseau);
	else
		Change_Couleur_Texte_Icon (Objet, 0, 0, 0, Reseau);
}


void Change_Texte_Alerte_Liste (struct Struct_Modele_Objet *Objet, struct Struct_Liste_Reseau *Reseau)
{
	ERROR_if (Objet == NULL);
	ERROR_if (Reseau == NULL);
	Change_Couleur_Rouge_Texte_liste (Objet, Reseau);
	Change_Bold_Texte_Liste (Objet, TRUE, Reseau);
}


void Change_Icone_Liste (struct Struct_Modele_Objet *Objet, GdkPixbuf * Liste_Image[], int Icone_Animation, struct Struct_Liste_Reseau *Reseau)
{
	GtkTreeModel *model = NULL;

	ERROR_if (Objet == NULL);
	ERROR_if (Reseau == NULL);
	model = gtk_tree_view_get_model (GTK_TREE_VIEW (Widget_Liste (Objet, Reseau)));
	gtk_tree_store_set (GTK_TREE_STORE (model), &Objet->ID_Arbre_Ligne, COL_ICON_LIST, Liste_Image[Icone_Animation], -1);
}


void Change_Icone_Rachaichissement_Liste (struct Struct_Modele_Objet *Objet, int Icone_rachaichissement, struct Struct_Liste_Reseau *Reseau)
{
	ERROR_if (Objet == NULL);
	ERROR_if (Reseau == NULL);
	Change_Icone_Liste (Objet, Image_Rachaichissement, Icone_rachaichissement, Reseau);
}


void Charge_Rachaichissement_Icone_Liste (void)
{
	Image_Rachaichissement[0] = Chargement_Image (PATH_ICONE "Animation/Chargement_0.png", COULEUR);
	Image_Rachaichissement[1] = Chargement_Image (PATH_ICONE "Animation/Chargement_1.png", COULEUR);
	Image_Rachaichissement[2] = Chargement_Image (PATH_ICONE "Animation/Chargement_2.png", COULEUR);
	Image_Rachaichissement[3] = Chargement_Image (PATH_ICONE "Animation/Chargement_3.png", COULEUR);
	Image_Rachaichissement[4] = Chargement_Image (PATH_ICONE "Animation/Chargement_4.png", COULEUR);
	Image_Rachaichissement[5] = Chargement_Image (PATH_ICONE "Animation/Chargement_5.png", COULEUR);
	Image_Rachaichissement[6] = Chargement_Image (PATH_ICONE "Animation/Chargement_6.png", COULEUR);
	Image_Rachaichissement[7] = Chargement_Image (PATH_ICONE "Animation/Chargement_7.png", COULEUR);
}


gboolean timer_Rachaichissement_Liste (void)
{
	struct Struct_Modele_Objet *Objet = NULL,*Objet_Liste_Selectionner = NULL;
	struct Struct_Liste_Reseau *Reseau = NULL;
	struct Struct_Equipement *Equipement = NULL;
	guint     Nb_Objet_Liste, i;

	if ((Reseau = Recupere_Pointeur_Structure_Reseau (ID_Reseau_En_Cours)) == NULL)
		return TRUE;
	Nb_Objet_Liste = g_list_length (Reseau->GList_Rafraichissement);

	if (Nb_Objet_Liste != 0) {
		for (i = 0; i < Nb_Objet_Liste; i++) {
			Objet = Recupere_Pointeur_Objet_Dans_Une_Liste (Reseau->GList_Rafraichissement, i);
			Equipement = (struct Struct_Equipement *) Objet->Pointeur_Attacher;
		
			if (Reseau->Mode_Liste_Detaille)
				Objet_Liste_Selectionner = Equipement->Objet_Liste_Par_Ip;
			else 
				Objet_Liste_Selectionner = Equipement->Objet_Liste_Par_Type;
			Change_Icone_Rachaichissement_Liste (Objet_Liste_Selectionner, Etat_Rafraichissement, Reseau);
		}
		Etat_Rafraichissement++;
		if (Etat_Rafraichissement == 8)
			Etat_Rafraichissement = 0;
	}
	return TRUE;
}


gboolean timer_Alerte_Liste (void)
{
	guint     Nb_Objet_Liste, i;
	struct Struct_Modele_Objet *Objet = NULL,*Objet_Liste_Selectionner = NULL;
	struct Struct_Liste_Reseau *Reseau = NULL;
	struct Struct_Equipement *Equipement = NULL;
	
	if ((Reseau = Recupere_Pointeur_Structure_Reseau (ID_Reseau_En_Cours)) == NULL)
		return TRUE;
	Nb_Objet_Liste = g_list_length (Reseau->GList_Alerte);

	if (Nb_Objet_Liste != 0) {
		for (i = 0; i < Nb_Objet_Liste; i++) {
			Objet = Recupere_Pointeur_Objet_Dans_Une_Liste (Reseau->GList_Alerte, i);
		
			Equipement = (struct Struct_Equipement *) Objet->Pointeur_Attacher;
		
			if (Reseau->Mode_Liste_Detaille)
				Objet_Liste_Selectionner = Equipement->Objet_Liste_Par_Ip;
			else 
				Objet_Liste_Selectionner = Equipement->Objet_Liste_Par_Type;
		
			if (Alerte_Affichage)
				Change_Texte_Alerte_Liste (Objet_Liste_Selectionner, Reseau);
			else
				Change_Couleur_Blanc_Texte_liste (Objet_Liste_Selectionner, Reseau);
		}
		Alerte_Affichage = !Alerte_Affichage;
	}
	return TRUE;
}


gboolean timer_Test_Etat_Liste (void)
{
	guint     Nb_Objet_Liste, i;
	struct Struct_Modele_Objet *Objet = NULL;
	struct Struct_Liste_Reseau *Reseau = NULL;
struct Struct_Equipement *Equipement = NULL;
	
	if ((Reseau = Recupere_Pointeur_Structure_Reseau (ID_Reseau_En_Cours)) == NULL)
		return TRUE;
	Nb_Objet_Liste = g_list_length (Reseau->GList_Test_Etat);

	if (Nb_Objet_Liste != 0) {
		for (i = 0; i < Nb_Objet_Liste; i++) {
			Objet = Recupere_Pointeur_Objet_Dans_Une_Liste (Reseau->GList_Test_Etat, i);
			
			if (Objet->ID_Modele_Objet!=PORTS) {
				Equipement = (struct Struct_Equipement *) Objet->Pointeur_Attacher;
			
				if (Reseau->Mode_Liste_Detaille)
					Objet = Equipement->Objet_Liste_Par_Ip;
				else
					Objet = Equipement->Objet_Liste_Par_Type;
			}
		
			if (Test_Etat_Affichage) {
				Affiche_Icone_Defaut_Objet_liste (Objet, Reseau);
				Change_Couleur_Noir_Texte_liste (Objet, Reseau);
			}
			else {
				Affiche_Icone_Defaut_Griser_Objet_liste (Objet, Reseau);
				Change_Couleur_Gris_Texte_liste (Objet, Reseau);
			}
		}
		Test_Etat_Affichage = !Test_Etat_Affichage;
	}
	return TRUE;
}
