/* ---------------------------------------------------------------------------
                                   - Jade SDK -
                             (c) 2003 Alexis PAUTROT
                            Site Web  -  jadesdk.free.fr
                            Contact   -  jadesdk@free.fr
   --------------------------------------------------------------------------- */
package tutorial_03;

// importe package moteur
import jade.engine.*;

// importe package de chargement
import jade.loader.JadeLoader;
import jade.loader.JadeContainer;

import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.Color;
import java.awt.Graphics;


// classe de chargement et scène de jeu
public class MainScene implements JadeLoader, JadeScene, KeyListener
{
	// container d'affichage
	JadeContainer container;

	// moteur et surface d'affichage
	JadeDisplay display;

	// menu courant
	JadeMenu menu;

	// menus (principal et sous menu)
	JadeMenu mainMenu, subMenu;

	// position du menu
	int menuX=200, menuY=50;

	// styles du menu
	boolean menuAlignment = JadeMenu.VERTICAL;
	int itemAlignment = JadeMenu.CENTERED;
	boolean stringAlignment = JadeFont.HORIZONTAL;
	int itemShiftX=0, itemShiftY=0, letterShiftX=0, letterShiftY=0;

	// fond d'écran blanc uni
	JadeBackground background;

	// touche escape stoppe l'application
	public final void keyReleased(KeyEvent ke)
	{
		// code touche
		int key=ke.getKeyCode();

		// sort si appui de la touche échappe
		if (key==KeyEvent.VK_ESCAPE) container.exit();

		// déplace selection dans menu
		if ( (key==KeyEvent.VK_UP) || (key==KeyEvent.VK_LEFT) ) menu.selectionUp();
		if ( (key==KeyEvent.VK_DOWN) || (key==KeyEvent.VK_RIGHT) ) menu.selectionDown();

		// selectionne entrée du menu
		if (key==KeyEvent.VK_ENTER)
		{
			if (menu==mainMenu)
			{
				if (menu.getSelectedItemIndex()==3)
					// change menu pour sous-menu
					menu=subMenu;
			}
			else
			if (menu==subMenu)
			{
				if (menu.getSelectedItemIndex()==3)
					// retour menu principal
					menu=mainMenu;
			}
		}

		if (key==KeyEvent.VK_X)
		{
			menuX = 200; menuY = 50;
			menuAlignment = JadeMenu.VERTICAL;
			itemAlignment = JadeMenu.CENTERED;
			stringAlignment = JadeFont.HORIZONTAL;
			itemShiftX=0; itemShiftY=0; letterShiftX=0; letterShiftY=0;
		}

		if (key==KeyEvent.VK_O) menuY -= 10;
		if (key==KeyEvent.VK_L) menuY += 10;
		if (key==KeyEvent.VK_K) menuX -= 10;
		if (key==KeyEvent.VK_M) menuX += 10;

		if (key==KeyEvent.VK_A) menuAlignment = ! menuAlignment;

		if (key==KeyEvent.VK_Z)
			if ( itemAlignment==JadeMenu.LEFT ) itemAlignment=JadeMenu.CENTERED;
			else if ( itemAlignment==JadeMenu.CENTERED ) itemAlignment=JadeMenu.RIGHT;
			else itemAlignment=JadeMenu.LEFT;

		if (key==KeyEvent.VK_E) itemShiftX += 1;
		if (key==KeyEvent.VK_D) itemShiftX -= 1;

		if (key==KeyEvent.VK_R) itemShiftY += 1;
		if (key==KeyEvent.VK_F) itemShiftY -= 1;

		if (key==KeyEvent.VK_T) stringAlignment = ! stringAlignment;

		if (key==KeyEvent.VK_Y) letterShiftX += 1;
		if (key==KeyEvent.VK_H) letterShiftX -= 1;

		if (key==KeyEvent.VK_U) letterShiftY += 1;
		if (key==KeyEvent.VK_J) letterShiftY -= 1;
	}
	public final void keyPressed(KeyEvent ke){}
	public final void keyTyped(KeyEvent ke){}

	// méthode de chargement et de lancement de jeu
	public final void loadAndRun(JadeContainer container)
	{
		this.container=container;

		// créer moteur d'affichage
		display=new JadeDisplay(container);

		// créer interface de chargement
		JadeLoadingInterface jli=new JadeLoadingInterface(display);

		// charge polices
		jli.setMessage("Loading fonts..");
		jli.initializeProgress(150);
			JadeMediaLoader.setPath("tutorial_03/");

			JadeFont unSelectedFont=new JadeFont(JadeMediaLoader.parseImage(JadeMediaLoader.loadImage("bankgothic.gif"),10,9),"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789<>=+-*/,.;:!?\\&$%#@\"()[]{}_ ",8,10);
			jli.setProgress(50);

			JadeFont selectedFont=new JadeFont(JadeMediaLoader.parseImage(JadeMediaLoader.loadImage("bankgothic_selected.gif"),10,9),"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789<>=+-*/,.;:!?\\&$%#@\"()[]{}_ ",8,10);
			jli.setProgress(50);

			// créer fond blanc uni
			background=new JadeImageMosaicBackground(JadeMediaLoader.loadImage("checker.gif"));
			jli.setProgress(50);

		// créer menus
		mainMenu=new JadeMenu(new String[]{"item a","item b","item c","sub menu"},unSelectedFont,selectedFont,null);
		subMenu=new JadeMenu(new String[]{"item 1","item 2","item 3","return to main"},unSelectedFont,selectedFont,null);

		// accroche clavier
		display.setKeyListener(this);

		// lance la scène
		display.start(this);
	}

	// démarrage de la scène
	public final void begin()
	{
		// initialise moteur
		display.setAnimationRate(30);

		// initialise menu par défaut
		menu=mainMenu;
	}

	// fin de la scène
	public final void end()
	{
	}

	// boucle d'animation
	public final void mainLoop()
	{
		draw();
	}

	// affichage
	public final void draw()
	{
		// efface surface d'affichage
		display.clearWithBackground(background);

		// affiche menu
		menu.draw(menuX,menuY,display.getDoubleBufferedGraphics(),menuAlignment,itemAlignment,itemShiftX,itemShiftY,stringAlignment,letterShiftX,letterShiftY);

		// affiche texte
		Graphics gc = display.getDoubleBufferedGraphics();
		gc.setColor(Color.black);
		gc.drawString("'x' : reset to default",10,155);
		gc.drawString("'o,k,l,m' : move the menu",10,175);
		gc.drawString("'a' : menu alignment",10,195);
		gc.drawString("'z' : item alignment",10,210);
		gc.drawString("'e,d' : item horizontal shift",10,225);
		gc.drawString("'r,f' : item vertical shift",10,240);
		gc.drawString("'t' : string alignment",10,260);
		gc.drawString("'y,h' : letter horizontal shift",10,275);
		gc.drawString("'u,j' : letter vertical shift",10,290);

		// affiche style choisi
		gc.setColor(Color.darkGray);
		gc.drawString(""+menuX+","+menuY,300,175);

		if ( menuAlignment == JadeMenu.HORIZONTAL )
				gc.drawString("horizontal",300,195);
		else 	gc.drawString("vertical",300,195);

		if ( itemAlignment == JadeMenu.LEFT )
			gc.drawString("left/top",300,210);
		else
			if ( itemAlignment == JadeMenu.CENTERED )
				gc.drawString("centered",300,210);
			else
				gc.drawString("right/bottom",300,210);

		gc.drawString(""+itemShiftX,300,225);
		gc.drawString(""+itemShiftY,300,240);

		if ( stringAlignment == JadeFont.HORIZONTAL )
				gc.drawString("horizontal",300,260);
		else 	gc.drawString("vertical",300,260);

		gc.drawString(""+letterShiftX,300,275);
		gc.drawString(""+letterShiftY,300,290);

		// affiche bandeau de texte
		gc.setColor(Color.black);
		gc.fillRect(0,0,400,15);
		gc.setColor(Color.white);
		gc.drawString("press escape to quit", 5,12 );
	}
}
