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

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

import java.awt.BorderLayout;
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.AbstractButton;
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 String dossierSysteme = "";
	
	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, String dosSys) {
		super();
		this.setLayout(new BorderLayout());
		diplomate = i;
		dossierSysteme = dosSys;
		hN = new ArrayList();
		iCourant = 0;
	}
	
	public void activeReglet(boolean b) {
		if (carte != null) {
			carte.setRegletDispo(b);
		} else {
			if (image != null) {
				image.setRegletDispo(b);
			}
		}
	}
	
	/**
	 * charge une carte et l'ajoute a l'histo de nav
	 * @param path
	 * @param ech
	 * @param unité
	 * @param reg
	 * @param zoom
	 * @param edition
	 * @param listArrets
	 * @param latitudeO
	 * @param longitudeO
	 * @param echLati
	 * @param echLongi
	 * @param listeVues
	 * @param coulArrets
	 * @param titre
	 */
	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, String titre) {
		if (conteneur!= null) remove(conteneur);
		carte = new Carte(path, ech, unité, reg, zoom, edition, diplomate, listArrets, latitudeO, longitudeO, echLati, echLongi, coulArrets, titre);
		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+"\\");
		}
		diplomate.afficheArrets();
		this.validate();
//		enregistrement ds HN
		boolean doublon = false;
		if (hN != null && hN.size()>0) {
		    ArrayList temp = (ArrayList) hN.get(hN.size()-1);
		    if (temp.get(0).equals(path)) {	//verif que le dernier ajout a l'histo n'est pas le meme que l'avant dernier
		        doublon = true;
		    }
		}
		if (!doublon) {
		    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);
		    boite.add(titre);
		    hN.add(boite);
		    iCourant = hN.size()-1;
		    rafraichirBoutons();
		}
	}
	
	/**
	 * charge une image et l'ajoute a l'histo de nav
	 * @param path
	 * @param ech
	 * @param unité
	 * @param reg
	 * @param zoom
	 * @param edition
	 * @param titre
	 */
	public void chargerImage(String path, double ech, String unité, boolean reg, boolean zoom, boolean edition, String titre, String auteur, String commentaire) {
		if (conteneur!= null) remove(conteneur);
		if (vuesBarre != null) remove(vuesBarre);
		image = new Images(path, ech, unité, reg, zoom, edition, diplomate, titre);
		conteneur = new JScrollPane(image);
		conteneur.setBorder(null);
		conteneur.revalidate();
		this.add(conteneur);
		texte = null;
		carte = null;
		this.validate();
//		enregistrement ds HN
		boolean doublon = false;
		if (hN != null && hN.size()>0) {
		    ArrayList temp = (ArrayList) hN.get(hN.size()-1);
		    if (temp.get(0).equals(path)) {	//verif que le dernier ajout a l'histo n'est pas le meme que l'avant dernier
		        doublon = true;
		    }
		}
		if (!doublon) {
		    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(titre);
		    boite.add(auteur);
		    boite.add(commentaire);
		    hN.add(boite);
		    iCourant = hN.size()-1;
		}
	}
	
	/**
	 * charge un texte et l'ajoute a l'histo de nav
	 * @param path
	 * @param titre
	 */
	public void chargerTexte(String path, String titre, String auteur, String commentaire) {
		if (conteneur!= null) remove(conteneur);
		if (vuesBarre != null) remove(vuesBarre);
		texte = new Texte(titre);
		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
		boolean doublon = false;
		if (hN != null && hN.size()>0) {
		    ArrayList temp = (ArrayList) hN.get(hN.size()-1);
		    if (temp.get(0).equals(path)) {	//verif que le dernier ajout a l'histo n'est pas le meme que l'avant dernier
		        doublon = true;
		    }
		}
		if (!doublon) {
		    ArrayList boite = new ArrayList();
		    boite.add(path);
		    boite.add(titre);
		    boite.add(auteur);
		    boite.add(commentaire);
		    hN.add(boite);
		    iCourant = hN.size()-1;
		}
	}

	/**
	 * affiche une carte, depuis les boutons de navigation -> acces non enregistré ds l'histo de navigation
	 */
	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, String titre) {
		if (conteneur!= null) remove(conteneur);
		carte = new Carte(path, ech, unité, reg, zoom, edition, diplomate, listArrets, latitudeO, longitudeO, echLati, echLongi, couleur, titre);
		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+"\\");
		}
		diplomate.afficheArrets();
		diplomate.desactiveInfos();
		this.validate();
	}
	
	/**
	 * affiche une image, depuis les boutons de navigation -> acces non enregistré ds l'histo de navigation
	 */
	private void chargementImage(String path, double ech, String unité, boolean reg, boolean zoom, boolean edition, String titre, String auteur, String commentaire) {
		if (conteneur!= null) remove(conteneur);
		if (vuesBarre != null) remove(vuesBarre);
		image = new Images(path, ech, unité, reg, zoom, edition, diplomate, titre);
		conteneur = new JScrollPane(image);
		conteneur.setBorder(null);
		conteneur.revalidate();
		this.add(conteneur);
		texte = null;
		carte = null;
		diplomate.activeInfos(auteur, titre, commentaire);
		this.validate();
	}
	
	/**
	 * affiche un  texte depuis les boutons de navigation -> acces non enregistré ds l'histo de navigation
	 */
	private void chargementTexte(String path, String titre, String auteur, String commentaire) {
		if (conteneur!= null) remove(conteneur);
		if (vuesBarre != null) remove(vuesBarre);
		texte = new Texte(titre);
		texte.setEditable(false);
		texte.charger(path);
		conteneur = new JScrollPane(texte);
		conteneur.setBorder(null);
		conteneur.revalidate();
		this.add(conteneur);
		image = null;
		carte = null;
		diplomate.activeInfos(auteur, titre, commentaire);
		this.validate();
	}
	
	/**
	 * appel  la bonne methode de chargement suivant la donnee a charger
	 * @param i
	 */
	private void chargement(int i) {
		if (hN.size()>i) {
			ArrayList boite = (ArrayList) hN.get(i);
			if (boite.size() == 4) {	//texte
				chargementTexte((String) boite.get(0), (String) boite.get(1), (String) boite.get(2), (String) boite.get(3));
			} else {
				if (boite.size()==9) {	//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)),
							(String) boite.get(6),
							(String) boite.get(7),
							(String) boite.get(8)
					);
				} else {
					if (boite.size()==14) {	//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),
								(String) boite.get(13)
						);
					}
				}
			}
		}
	}
	
	/**
	 * affiche la donnee suivante
	 *
	 */
	public void suivant() {
		if (iCourant<hN.size()-1) {
			iCourant++;
			chargement(iCourant);
		}
	}
	
	/**
	 * affiche la donnee precedente
	 *
	 */
	public void precedent() {
		if (iCourant>0) {
			iCourant--;
			chargement(iCourant);
		}
	}
	
	/**
	 * permet a l'interface de savoir si la donnee affichée est la premiere de l'histo des acces
	 */
	public boolean premier() {
		return iCourant==0;
	}
	
	/**
	 * permet a l'interface de savoir si la donnee affichée est la derniere de l'histo des acces
	 */
	public boolean dernier() {
		return iCourant==hN.size()-1;
	}
	
	/**
	 * changement de l'image à afficher
	 * @param path
	 */
	public void chargerVue(String path) {
		carte.chargerVue(path);
	}
	
	/**
	 * rafraichit la couleur des arrets d'une carte
	 * @param c
	 */
	public void chargerCouleurArrets(String c) {
	    carte.chargerCouleurArrets(c);
	}
	
	/**
	 * rend la carte completement transparente
	 */
	public void masquerVuePrincipale() {
		carte.masquerCarte();
	}

	/**
	 * pour la copie vers le carnet
	 * @return
	 */
	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;
		}
	}
	
	/**
	 * pour la copie vers le carnet
	 * @return
	 */
	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) {
					    BarreEtat.resetGauche();
						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();
	}
	
	/**
	 * definit la couleur des boutons des vues suivant le premier et le second plan affichés ds navigation
	 */
	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) && carte.exporteCheminCarte().endsWith(nom)) {
				    //meme vue au 1er et au 2d plan
				    ((AbstractButton) l[i]).setIcon(new ImageIcon(dossierSysteme+"partout.gif"));
				} else {
				    if (carte.exporteCheminVue()!= null && carte.exporteCheminVue().endsWith(nom)) {
				        ((AbstractButton) l[i]).setIcon(new ImageIcon(dossierSysteme+"devant.gif"));
				    } else {
				        if (carte.exporteCheminCarte().endsWith(nom)) {
				            ((AbstractButton) l[i]).setIcon(new ImageIcon(dossierSysteme+"derriere.gif"));    
				        } else {
				            ((AbstractButton) l[i]).setIcon(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;
	}
	
	/**
	 * efface l'histo de navigation (pour un changement de session par ex.) 
	 */
	public void resetHisto() {
	    hN = null;
	    hN = new ArrayList();
	}
	
	public void setEchelle(double e) {
		if (carte != null) {
			carte.setEchelle(e);
		} else {
			if (image != null) {
				image.setEchelle(e);
			}
		}
	}

	/**
	 * active le mode de definition des coords d'une carte
	 */
	public void activerModeDefCoord() {
		carte.activerModeDefCoord();
	}
		
	/**
	 * desactive le mode de definition des coords d'une carte
	 */
	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
