/*
 * Created on 13 avr. 2005
 */
package geonoteZones;

import geonoteInterface.Interface;
import geonoteTypesDonnees.Carte;
import geonoteTypesDonnees.Images;
import geonoteTypesDonnees.Texte;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


/**
 * gere la zone d'affichage principale
 */
public class Navigation extends JPanel {
	public Carte carte = null;
	private JScrollPane conteneur = null;
	private Interface diplomate = null; //pour communiquer avec l'interface

	private Images image = null;
	private Texte texte = null;
	private JMenuBar vuesBarre = null;
	
	private ArrayList hN = null; //historique de la navigation parmi les donnees georefs; enregistre ts les params necessaire au chargement de la donnee
	private int iCourant;

	/**
	 * Constructeur
	 * @param i
	 */
	public Navigation(Interface i) {
		super();
		this.setLayout(new BorderLayout());
		diplomate = i;
		hN = new ArrayList();
		iCourant = 0;
	}
	
	public void activeReglet(boolean b) {
		if (carte != null) {
			carte.setRegletDispo(b);
		} else {
			if (image != null) {
				image.setRegletDispo(b);
			}
		}
	}
	
	public void chargerCarte(final String path, final double ech, final String unité, final boolean reg, final boolean zoom, final boolean edition, final ArrayList listArrets, final int latitudeO, final int longitudeO, final double echLati, final double echLongi, ArrayList listeVues, String coulArrets) {
		if (conteneur!= null) remove(conteneur);
		carte = new Carte(path, ech, unité, reg, zoom, edition, diplomate, listArrets, latitudeO, longitudeO, echLati, echLongi, coulArrets);
		conteneur = new JScrollPane(carte);
		conteneur.setBorder(null);
		conteneur.revalidate();
		this.add(conteneur, BorderLayout.CENTER);
		texte = null;
		image = null;
		if (listeVues != null) {
			//recup du dossier des cartes a partir du path de la carte
			String esp = path.substring(0, path.lastIndexOf("\\"));
			rechargeTypBarre(listeVues,esp+"\\");
		}
		this.validate();
//		enregistrement ds HN
		ArrayList boite = new ArrayList();
		boite.add(path);
		boite.add(Double.toString(ech));
		boite.add(unité);
		boite.add(Boolean.toString(reg));
		boite.add(Boolean.toString(zoom));
		boite.add(Boolean.toString(edition));
		boite.add(listArrets);
		boite.add(Integer.toString(latitudeO));
		boite.add(Integer.toString(longitudeO));
		boite.add(Double.toString(echLati));
		boite.add(Double.toString(echLongi));
		boite.add(listeVues);
		boite.add(coulArrets);
		hN.add(boite);
		iCourant = hN.size()-1;
		rafraichirBoutons();
	}
	
	public void chargerImage(String path, double ech, String unité, boolean reg, boolean zoom, boolean edition) {
		if (conteneur!= null) remove(conteneur);
		if (vuesBarre != null) remove(vuesBarre);
		image = new Images(path, ech, unité, reg, zoom, edition, diplomate);
		conteneur = new JScrollPane(image);
		conteneur.setBorder(null);
		conteneur.revalidate();
		this.add(conteneur);
		texte = null;
		carte = null;
		this.validate();
//		enregistrement ds HN
		ArrayList boite = new ArrayList();
		boite.add(path);
		boite.add(Double.toString(ech));
		boite.add(unité);
		boite.add(Boolean.toString(reg));
		boite.add(Boolean.toString(zoom));
		boite.add(Boolean.toString(edition));
		hN.add(boite);
		iCourant = hN.size()-1;
	}
	
	public void chargerTexte(String path) {
		if (conteneur!= null) remove(conteneur);
		if (vuesBarre != null) remove(vuesBarre);
		texte = new Texte();
		texte.setEditable(false);
		texte.charger(path);
		conteneur = new JScrollPane(texte);
		conteneur.setBorder(null);
		conteneur.revalidate();
		this.add(conteneur);
		image = null;
		carte = null;
		this.validate();
		//enregistrement ds HN
		ArrayList boite = new ArrayList();
		boite.add(path);
		hN.add(boite);
		iCourant = hN.size()-1;
	}
	
	private void chargementCarte(final String path, final double ech, final String unité, final boolean reg, final boolean zoom, final boolean edition, final ArrayList listArrets, final int latitudeO, final int longitudeO, final double echLati, final double echLongi, ArrayList listeVues, String couleur) {
		if (conteneur!= null) remove(conteneur);
		carte = new Carte(path, ech, unité, reg, zoom, edition, diplomate, listArrets, latitudeO, longitudeO, echLati, echLongi, couleur);
		conteneur = new JScrollPane(carte);
		conteneur.setBorder(null);
		conteneur.revalidate();
		this.add(conteneur, BorderLayout.CENTER);
		texte = null;
		image = null;
		if (listeVues != null) {
			//recup du dossier des cartes a partir du path de la carte
			String esp = path.substring(0, path.lastIndexOf("\\"));
			rechargeTypBarre(listeVues,esp+"\\");
		}
		this.validate();
	}
	
	private void chargementImage(String path, double ech, String unité, boolean reg, boolean zoom, boolean edition) {
		if (conteneur!= null) remove(conteneur);
		if (vuesBarre != null) remove(vuesBarre);
		image = new Images(path, ech, unité, reg, zoom, edition, diplomate);
		conteneur = new JScrollPane(image);
		conteneur.setBorder(null);
		conteneur.revalidate();
		this.add(conteneur);
		texte = null;
		carte = null;
		this.validate();
	}
	
	private void chargementTexte(String path) {
		if (conteneur!= null) remove(conteneur);
		if (vuesBarre != null) remove(vuesBarre);
		texte = new Texte();
		texte.setEditable(false);
		texte.charger(path);
		conteneur = new JScrollPane(texte);
		conteneur.setBorder(null);
		conteneur.revalidate();
		this.add(conteneur);
		image = null;
		carte = null;
		this.validate();
	}
	
	private void chargement(int i) {
		if (hN.size()>i) {
			ArrayList boite = (ArrayList) hN.get(i);
			if (boite.size() == 1) {	//texte
				chargementTexte((String) boite.get(0));
			} else {
				if (boite.size()==6) {	//image
					chargementImage(
							(String) boite.get(0),
							Double.parseDouble((String) boite.get(1)),
							(String) boite.get(2),
							Boolean.parseBoolean((String) boite.get(3)),
							Boolean.parseBoolean((String) boite.get(4)),
							Boolean.parseBoolean((String) boite.get(5))
					);
				} else {
					if (boite.size()==13) {	//carte
						chargementCarte(
								(String) boite.get(0),
								Double.parseDouble((String) boite.get(1)),
								(String) boite.get(2),
								Boolean.parseBoolean((String) boite.get(3)),
								Boolean.parseBoolean((String) boite.get(4)),
								Boolean.parseBoolean((String) boite.get(5)),
								(ArrayList) boite.get(6),
								Integer.parseInt((String) boite.get(7)),
								Integer.parseInt((String) boite.get(8)),
								Double.parseDouble((String) boite.get(9)),
								Double.parseDouble((String) boite.get(10)),
								(ArrayList) boite.get(11),
								(String) boite.get(12)
						);
					}
				}
			}
		}
	}
	
	public void suivant() {
		if (iCourant<hN.size()-1) {
			iCourant++;
			chargement(iCourant);
		}
	}
	
	public void precedent() {
		if (iCourant>0) {
			iCourant--;
			chargement(iCourant);
		}
	}
	
	public boolean premier() {
		return iCourant==0;
	}
	
	public boolean dernier() {
		return iCourant==hN.size()-1;
	}
	
	/**
	 * changement de l'image ŕ afficher
	 * @param path
	 */
	public void chargerVue(String path) {
		carte.chargerVue(path);
	}
	
	public void chargerCouleurArrets(String c) {
	    carte.chargerCouleurArrets(c);
	}
	
	public void masquerVuePrincipale() {
		carte.masquerCarte();
	}
	
	public ImageIcon exporteCarte() {
		if (carte != null) {
			return carte.getImage();
		} else {
			return null;
		}
	}
	
	/**
	 * pour la copie vers le carnet
	 * @return
	 */
	public ImageIcon exporteImage() {
		if (image != null) {
			return image.getImage();
		} else {
			return null;
		}
	}
	
	public Texte exporteTexte() {
		if (texte != null) {
			return texte;
		} else {
			return null;
		}
	}
	
	public String exporteTypeActif() {
		if (image != null) {
			return "image";
		} else {
			if (carte != null) {
				return "carte";
			} else {
				return "texte";
			}
		}
	}
	
	public String exporteUnite() {
		String result = "";
		if (carte != null) {
			result = carte.getUnité();
		} else {
			if (image != null) {
				result = image.getUnité();
			}
		}
		return result;
	}
	
	/**
	 * rafraichit la barre des vues
	 * @param l
	 * @param dossier
	 */
	public void rechargeTypBarre(ArrayList l, final String dossier) {
		Iterator i = l.iterator();
		if (vuesBarre != null) remove(vuesBarre); //reconstruction de la barre des vues
		if (!l.isEmpty()) {
			vuesBarre = new JMenuBar();
			while (i.hasNext()) {
				final ArrayList courant = (ArrayList) i.next();
				final JButton bouton = new JButton((String) courant.get(0));
				bouton.setName((String) courant.get(1));
				bouton.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent arg0) {
						if (diplomate.isModeSuppVue()) {
//							carte.charger( dossier+(String) courant.get(1));
							diplomate.suppVueEffectue((String) courant.get(0), (String) courant.get(1));
						} else {
							carte.VueVersCarte();
							carte.chargerVue(dossier+(String) courant.get(1));
							rafraichirBoutons();
							carte.masquerCarte();
							diplomate.ajouteVue((String) courant.get(1));
							diplomate.rapportTrace("carte", "changement vue", (String) courant.get(1));
						}
					}
				});
				bouton.setFocusable(false);
				vuesBarre.add(bouton);
			}
			this.add(vuesBarre, BorderLayout.NORTH);
		}
		this.validate();
	}
	
	private void rafraichirBoutons() {
		if (vuesBarre != null) {
			Component[] l = vuesBarre.getComponents();
			int i = 0;
			while (i<l.length) {
				JButton b = (JButton) l[i];
				String nom = b.getName();
				if (carte.exporteCheminVue()!= null && carte.exporteCheminVue().endsWith(nom)) {
					l[i].setForeground(new Color(0,0,0));
					l[i].setBackground(Color.WHITE);
				} else {
					if (carte.exporteCheminCarte().endsWith(nom)) {
						l[i].setForeground(Color.WHITE);
						l[i].setBackground(new Color(100,100,100));
					} else {
						l[i].setForeground(Color.black);
						l[i].setBackground(null);
					}
				}
				i++;
			}
		}
	}
	
	/**
	 * efface ttes les donnees
	 */
	public void reset() {
		if (conteneur!= null) remove(conteneur);
		if (vuesBarre != null) remove(vuesBarre);
		texte = null;
		image = null;
		carte = null;
	}
	
	public void setEchelle(double e) {
		if (carte != null) {
			carte.setEchelle(e);
		} else {
			if (image != null) {
				image.setEchelle(e);
			}
		}
	}

	public void activerModeDefCoord() {
		carte.activerModeDefCoord();
	}
		
	public void desactiverModeDefCoord() {
		carte.desactiverModeDefCoord();
	}
	
	public void setUnite(String u) {
		if (carte != null) {
			carte.setUnité(u);
		} else {
			if (image != null) {
				image.setUnité(u);
			}
		}
	}
	
} // fin de classe
