/*   EXTRAITS DE LA LICENCE
	Copyright CEA, contributeurs : Luc BILLARD et Damien
	CALISTE, laboratoire L_Sim, (2001-2006)
  
	Adresse mèl :
	BILLARD, non joignable par mèl ;
	CALISTE, damien P caliste AT cea P fr.

	Ce logiciel est un programme informatique servant à visualiser des
	structures atomiques dans un rendu pseudo-3D. 

	Ce logiciel est régi par la licence CeCILL soumise au droit français et
	respectant les principes de diffusion des logiciels libres. Vous pouvez
	utiliser, modifier et/ou redistribuer ce programme sous les conditions
	de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA 
	sur le site "http://www.cecill.info".

	Le fait que vous puissiez accéder à cet en-tête signifie que vous avez 
	pris connaissance de la licence CeCILL, et que vous en avez accepté les
	termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel).
*/

/*   LICENCE SUM UP
	Copyright CEA, contributors : Luc BILLARD et Damien
	CALISTE, laboratoire L_Sim, (2001-2006)

	E-mail address:
	BILLARD, not reachable any more ;
	CALISTE, damien P caliste AT cea P fr.

	This software is a computer program whose purpose is to visualize atomic
	configurations in 3D.

	This software is governed by the CeCILL  license under French law and
	abiding by the rules of distribution of free software.  You can  use, 
	modify and/ or redistribute the software under the terms of the CeCILL
	license as circulated by CEA, CNRS and INRIA at the following URL
	"http://www.cecill.info". 

	The fact that you are presently reading this means that you have had
	knowledge of the CeCILL license and that you accept its terms. You can
	find a copy of this licence shipped with this software at Documentation/licence.en.txt.
*/
#ifndef VISUELEMENTS_H
#define VISUELEMENTS_H

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

#include <gtk_main.h>
#include <visu_data.h>
#include <visu_rendering.h>

/* This subpanel allow users to change the caracteristics
   for all the elements, such as color or specular... It
   allows also to choose a prefered directory to store and
   read resource files. */

subPanel *visuSetElementsParameters;

/* parameters */

/* sensitive widgets */
GtkWidget *vBoxElements;
GtkWidget *rgbElement[4];
GtkWidget *lightingElement[5];
GtkWidget *renderingMethodElements;


/* Private variables */
VisuElement *currentSelectedElement;

/* to store the rendering method interface. */
/* This method is called by this module when an element
   is changed, in order to ask the user define interface
   to update is drawing. The parameter element is the name
   of the new element. */
typedef void (*elementChangedFunc)(VisuElement *ele);
struct GtkRenderingInterface_struct
{
/*   setSensitiveFunc sensitiveInterface; */
  elementChangedFunc newElementInterface;
  createGtkWidgetFunc createInterface;
};
typedef struct GtkRenderingInterface_struct GtkRenderingInterface;

GHashTable *listOfRenderingInterfaces;
/* This method allows to initiate the method
   to deal with the interface. */
void setInterfaceMethods(RenderingMethod *method,
			 elementChangedFunc change,
			 createGtkWidgetFunc create);
/* It reads the value of the interface methods. */
void getRenderingInterface(RenderingMethod *method,
			   elementChangedFunc *change,
			   createGtkWidgetFunc *create);
elementChangedFunc updateRenderingMethodResources;


/* Public methods. */
/* It adds the interface widget in the subPanel. The variable
   renderingMethodElements pints then to this widget. If
   renderingMethodElements has already a target, this target is
   freed via gtk_widget_destroy. */
void changeRenderingMethodInterface(GtkWidget* interface);
/* It allows the client to set the method use to update
   user defined values. */
void setElementChangedFunc(elementChangedFunc func);

/* Private functions. */
GtkWidget *createInteriorElements();
void createCallBacksElements();
void setInitialValuesElements();
char *getDefaultLabelOfElement(VisuElement *element);

/* callbacks */
void renderingMethodChanged(GObject *obj, gpointer userData);
void changedRGBElements(GtkRange *rg, gpointer data);
void changedMaterialElements(GtkRange *rg, gpointer data);

#endif

