#define LARGEUR_FENETRE 400
#define HAUTEUR_FENETRE 300
#include <graphlib.h>

#include "boutons.h"
#include "defil.h"
#include "menu.h"

char *gblTitre=NULL;
CPopupMenu cpm;
void OptionChoisie(int opt);

//Initialise une liste d'entrées pour pouvoir les utiliser.
void CreeListe(CBouton *boutons, EVENEMENT *noms, int nombre)			{
	int i;
	offset=0;
	if (nombre>MAX_BOUTONS)
		nBoutons=MAX_BOUTONS;
	else
		nBoutons=nombre;
	for (i=0;i<nBoutons;i++)		{
		boutons[i].Init(0,i*30);
		boutons[i].SetEvent(&noms[i]);
	}
}

//Boucle principale d'affichage du menu
int BoucleParDefaut(CBouton *boutons);
//Bouton parent (retour en arrière) actif ou non.
int parentActive=0;
OBJET *objFond, *objGBA;
double gblAngle=-10;
int gblAffGba=1;

void DessFond()			{
	int i,j;
	static ECRAN *ecrTemp, ecrCour;
	static int lastAff=1;

	//Pour faire tourner (rotation) la GBA
	gblAngle+=0.2;
	if (skip)
		return;
	
	if ((gblAffGba==2 || gblAffGba==0) && ecrTemp && lastAff==gblAffGba)			{
		CopieEcran(&ecrCour,ecrTemp);
		return;
	}

	//Dessine le fond d'écran (granuleux, bleu)
	for (j=0;j<HAUTEUR_FENETRE;j+=15)
		for (i=0;i<LARGEUR_FENETRE;i+=45)
			Objet(objFond,i,j);

	if (gblAffGba==1)
		RotationObjet(objGBA,LARG/2,HAUT/2,2,gblAngle,FX_TRANS,32);
	else if (!ecrTemp || lastAff!=gblAffGba)			{
		EcranCourant(&ecrCour);
		if (gblAffGba==2)
			RedimensionneObjet(objGBA,0,0,LARG,HAUT,FX_TRANS,32);
		if (!ecrTemp)
			ecrTemp=CreeEcran(LARG,HAUT);
		CopieEcran(ecrTemp,&ecrCour);
	}
	lastAff=gblAffGba;
}

//Gère le bouton "parent". Renvoie 1 si le bouton est cliqué, zéro sinon.
int GereBoutonParent(int x, int y, int clic)			{
	static int clique=0, pointe=0;
	static OBJET *objParent=NULL;

	if (!objParent)
		objParent=ChargeObjet("parent.bmp");

	if (x>=-3 && y>=-1 && x<=19 && y<=23 && parentActive)			{
		FxRect(0,2,23,25,ROUGE);
		if (clique)			{
			FxCadre(1,3,21,23,BLANC,FX_TRANS,64);
		}
		else		{
			gblMessage="Retour au menu précédent";
		}
		FxObjet(objParent,3,3);
		if (clic)
			clique=1;
		pointe=1;
	}
	else		{
		pointe=0;
		if (parentActive)
			FxObjet(objParent,3,3,FX_TRANS,192);
		else
			FxObjet(objParent,3,3,FX_TRANS,96);
	}

	if (!testTouche(T_SOURIS_GAUCHE))		{
		if (clique==1 && pointe==1)			{
			pointe=clique=0;
			return 1;
		}
		pointe=clique=0;
	}

	return 0;
}

void GereMessage()			{
	static int position=0;
	static char *msg=NULL;
	int i;

	if (gblMessage)		{
		position++;
		if (position>=16)
			position=48;
		msg=gblMessage;
	}
	else
		position--;

	if (position<0)			position=0;
	if (position>48)		position=48;

	if (!skip)		{
		i=position>16?16:position;
		FxCadre(0,HAUT-i,LARG,i,NOIR,FX_TRANS,i*16);
		if (msg)
			DessTexte(5,HAUT-i,msg);
	}
}

void DessineTitre()				{
	RECT rt;
	if (skip)
		return;
	rt.left=0;
	rt.top=25;
	rt.right=LARG;
	rt.bottom=60;
	ChangeFonte("Arial",30);
	CouleurTexte(JAUNE);
	AttributsTexte(GRAS);
	DrawText(hdcImage,gblTitre,strlen(gblTitre),&rt,DT_CENTER);
	AttributsTexte(NORMAL);
}

int BoucleParDefaut(CBouton *boutons)			{
	int x,y, clic;
	int i;
	int boutonPresse=-1;

	gblDessus=0;

	//Il faudra voir s'il y a un message à afficher
	gblMessage=NULL;

	//On prend les coordonnées de la souris
	PositionSouris(&x,&y);
	//Et le clic
	clic=toucheAppuyee(T_SOURIS_GAUCHE);
	if (toucheAppuyee(T_F9))			{
		gblAffGba++;
		gblAffGba=gblAffGba%3;
	}

	i=cpm.Gere(x,y,clic);

	if (gblDessus && !cpm.actif)
		gblDessus=0;

	if (i!=-1)		{
		OptionChoisie(i);
		cpm.Desactive();
	}

	//Les coordonnées seront calculées de manière à être relatives à ce point
	ZoneEcran(70-3,80-3,90,240);							//-3 nécessaire pour l'espacement
	if (GereBoutonParent(x-70,y-80,clic) || toucheAppuyee(T_ESCAPE))
		boutonPresse=-2;							//-2 = retour

	//Zone d'écran pour les boutons
	ZoneEcran(100,80,100+180,240);

	for (i=0;i<nBoutons;i++)		{
		if (!gblDessus)			{
			if (boutons[i].Gere(x-100,y-80+offset,clic))
				boutonPresse=i;							//Le bouton est pressé
		}
		else
			boutons[i].Gere(-100,-100,0);

		if (!skip)
			boutons[i].Dessine();
	}

	//Dessine la barre de défilement
	DessineBarreDefil(x-310,y-80,clic);

	//Roulette de la souris
	i=RouletteSouris();
	//Fait défiler
	if (i>0)
		offset+=15;
	else if (i<0)
		offset-=15;

	//Si trop bas ou trop haut -> retour aux valeurs min/max.
	if (offset+HAUT_LISTE>=nBoutons*ESPACEMENT)
		offset=nBoutons*ESPACEMENT-HAUT_LISTE;
	if (offset<0)
		offset=0;

	//Restauration de la zone écran
	ZoneEcran(0,0,LARG,HAUT);

	GereMessage();
	DessineTitre();

	if (!skip)
		cpm.Affiche();

	//Restauration de la zone écran
	ZoneEcran(0,0,LARG,HAUT);

//	while(GetForegroundWindow()!=hConsole);

	//Retour du bouton pressé.
	return boutonPresse;
}

#include "code.h"

