Subversion Repositories eFlore/Applications.cel

Rev

Rev 2624 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package org.tela_botanica.client.observation;


import org.tela_botanica.client.CarnetEnLigneMediateur;
import org.tela_botanica.client.i18n.Msg;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.dao.InformationLocaliteDAO;
import org.tela_botanica.client.modeles.objets.Configuration;
import org.tela_botanica.client.modeles.objets.EntiteGeographiqueObservation;
import org.tela_botanica.client.modeles.objets.InfosReferentielNom;
import org.tela_botanica.client.modeles.objets.ListeObservation;
import org.tela_botanica.client.modeles.objets.Observation;
import org.tela_botanica.client.modeles.objets.Utilisateur;
import org.tela_botanica.client.vues.observation.CartographieObservationVue;
import org.tela_botanica.client.vues.observation.FormulaireImportObservationVue;
import org.tela_botanica.client.vues.observation.FormulaireSaisieObservationVue;
import org.tela_botanica.client.vues.observation.ListeObservationVue;
import org.tela_botanica.client.vues.observation.MenuObservationVue;
import org.tela_botanica.client.vues.observation.PanneauFiltresObservationVues;
import org.tela_botanica.client.vues.observation.indicateurs.ImageGeneriqueVue;
import org.tela_botanica.client.vues.observation.indicateurs.InformationRepartitionVue;
import org.tela_botanica.client.vues.observation.indicateurs.LienExterneVue;
import org.tela_botanica.client.vues.observation.indicateurs.MiniZoomImageVue;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Ext;
import com.gwtext.client.core.ExtElement;
import com.gwtext.client.core.RegionPosition;
import com.gwtext.client.data.Record;
import com.gwtext.client.data.Tree;
import com.gwtext.client.dd.DragData;
import com.gwtext.client.widgets.BoxComponent;
import com.gwtext.client.widgets.Component;
import com.gwtext.client.widgets.Container;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
import com.gwtext.client.widgets.event.PanelListenerAdapter;
import com.gwtext.client.widgets.grid.GridDragData;
import com.gwtext.client.widgets.layout.BorderLayout;
import com.gwtext.client.widgets.layout.BorderLayoutData;
import com.gwtext.client.widgets.layout.FitLayout;
import com.gwtext.client.widgets.layout.RowLayout;
import com.gwtext.client.widgets.layout.RowLayoutData;
import com.gwtext.client.widgets.tree.TreeNode;


/**
 * Mediateur gérant les interactions entre vues et les echanges de données
 * C'est un singleton. 
 * @author aurelien
 *
 */
public class ObservationMediateur {
        
        /**
         * booleen qui verifie l'unicite de l'instance (donc static)
         */
        private static boolean estInstancie = false ;

        /**
         * pointeur sur le médiateur (pour le pattern singleton)
         */
        private static ObservationMediateur thisMediateur = null ;  
        
        /** Mediateur general de l'application carnet en ligne
         * 
         * 
         */
        private CarnetEnLigneMediateur carnetEnLigneMediateur = null ;
        
        
        /**
         * modele de données
         */
        private ObservationModele observationModele = null ;
        
        
        /**
         * panneau principal des Observation (onglet "observation")
         */
        private final Panel panneauPrincipalObservation = new Panel(Msg.get("observations"));
        
        
        /**
         * liste détaillée des Observations
         */
        public ListeObservationVue listeObservation = null ;
        
        /**
         * Saisie des Observations
         */
        private FormulaireSaisieObservationVue formulaireSaisieObservationVue=null;
        
        
        /**
         * 
         * Import des observations depuis un fichier
         * 
         */
        private FormulaireImportObservationVue formImportObs=null;
        
        
        /**
         * Cartographie
         */
        private CartographieObservationVue cartoObservationVue = null;
        
        

        /**
         * booleen explicitant s'il y a une selection en cours
         */
        private boolean selection = false ;             
        /**
         * panneau conteneur pour le panneau  des informations lies à l'observation
         */
        
        private Panel details = new Panel(Msg.get("details"));

        private LienExterneVue liExtVue = null;

        /**
         * panneau conteneur pour le panneau des filtres
         */
        
        private PanneauFiltresObservationVues filtres = null;

        
        
        /** 
         * panneau d'information de repartition sur le nom selectionné 
         * 
         */
        
        private InformationRepartitionVue informationRepartitionVue=null;
        
        
        /** 
         * panneau d'affichage d'une image generique associe au nom selectionne 
         * 
         */
        
        private ImageGeneriqueVue imageGeneriqueVue=null;
        
        private MiniZoomImageVue mvz = null ;
        
        private boolean importerObservations = false ;

        private com.gwtext.client.widgets.Window fenetreCarto;
        public boolean changementTabProg = false;
        
        private InfosReferentielNom refTaxSelectionne = null;

        private Panel centre;
        
        /**
         * constructeur privé (on accède a la classe par la méthode getInstance
         */
        
        
        private ObservationMediateur(CarnetEnLigneMediateur carnetEnLigneMediateur )
        {
                this.carnetEnLigneMediateur=carnetEnLigneMediateur;                                     
                // on crée un modèle
                observationModele = ObservationModele.Instance(this);
                
                // initialisation du référentiel par défaut
                setRefTaxSelectionne(Configuration.getReferentielsDispos().get(0));     
        
                listeObservation = new ListeObservationVue(this);
                listeObservation.setTitle(Msg.get("observations"));
                
                // quelques variables de position pour les borderlayouts
                final BorderLayoutData regionNord = new BorderLayoutData(
                                RegionPosition.NORTH);

                final BorderLayoutData regionCentre = new BorderLayoutData(
                                RegionPosition.CENTER);
                regionCentre.setSplit(true);

                  
                final BorderLayoutData regionEst = new BorderLayoutData(
                                RegionPosition.EAST);
                regionEst.setSplit(true);
        

                final BorderLayoutData regionOuest = new BorderLayoutData(
                                RegionPosition.WEST);
                regionOuest.setSplit(true);
                
                
                panneauPrincipalObservation.setLayout(new BorderLayout()) ;
                cartoObservationVue = new CartographieObservationVue(this);
                cartoObservationVue.setLayout(new FitLayout());
                
                // Le formulaire de saisie / modification d'observation
                formulaireSaisieObservationVue = new FormulaireSaisieObservationVue(this);
                formulaireSaisieObservationVue.setTitle(Msg.get("saisie"));
                formulaireSaisieObservationVue.setTitleCollapse(true);
                formulaireSaisieObservationVue.setCollapsible(true) ;
                formulaireSaisieObservationVue.setAutoScroll(true) ;
                
                fenetreCarto = new com.gwtext.client.widgets.Window();
                fenetreCarto.setConstrain(true);
                fenetreCarto.setModal(true);
                fenetreCarto.setCloseAction(com.gwtext.client.widgets.Window.HIDE);
                
                fenetreCarto.add(cartoObservationVue);
                
                formulaireSaisieObservationVue.addListener(
                new PanelListenerAdapter() {
                        @Override
                        public void onCollapse(Panel panel)  {
                                CarnetEnLigneMediateur.fireResize();
                        }
                    @Override
                        public void onExpand(Panel panel) {
                        CarnetEnLigneMediateur.fireResize();
                    }
                });
                
                centre = new Panel();
                centre.setLayout(new BorderLayout());
                centre.setAutoScroll(true);
                centre.setBorder(false);
                
                centre.addListener(
                        new PanelListenerAdapter() {
                                @Override
                                public void onCollapse(Panel panel)  {
                                        CarnetEnLigneMediateur.fireResize();
                                }
                            @Override
                                public void onExpand(Panel panel) {
                                CarnetEnLigneMediateur.fireResize();
                            }
                            
                                @Override
                                public void onResize(BoxComponent component, int adjWidth,
                                                int adjHeight, int rawWidth, int rawHeight) {
                                        formulaireSaisieObservationVue.redimensionnerFormulaire();
                                        listeObservation.doLayout();
                                }
                                
                                @Override
                                public void onAfterLayout(Container self) {
                                        
                                }
                });
                
                formulaireSaisieObservationVue.setBorder(false);
                
                BorderLayoutData listeLayoutData = new BorderLayoutData(RegionPosition.SOUTH);
                listeLayoutData.setSplit(true);
                
                BorderLayoutData formLayoutData = new BorderLayoutData(RegionPosition.CENTER);
                formLayoutData.setSplit(true);
                
                centre.add(listeObservation, listeLayoutData);
                centre.add(formulaireSaisieObservationVue, formLayoutData);

                // Redimensionnement global sur collapse/expand
                details.addListener(
                        new PanelListenerAdapter() {
                                @Override
                                public void onCollapse(Panel panel)  {
                                        CarnetEnLigneMediateur.fireResize();
                                }
                            @Override
                                public void onExpand(Panel panel) {
                                        
                                String[] selectionListe = listeObservation.getIdSelectionnees();
                                if(selectionListe.length > 0) {
                                        Observation obs = listeObservation.getCacheListeObservation().get(selectionListe[0]);
                                        obtenirImageInformationExternes(obs.getCodeCourtReferentielTaxo(), obs.getNumeroNomenclaturalSaisi());
                                }
                                CarnetEnLigneMediateur.fireResize();
                            }
                });
                                        
                // on initialise le volet qui contient les details
                details.setWidth("10%");
                details.setTitleCollapse(true);
                details.setCollapsible(true);
                
                details.setAutoScroll(true);
                details.setLayout(new RowLayout());
                
                // Lien vers eflore
                liExtVue = new LienExterneVue(this);
                liExtVue.setHeight("20px");
                details.add(liExtVue);
                
                // Information de repartition
                informationRepartitionVue=new InformationRepartitionVue(this);
                details.add(informationRepartitionVue, new RowLayoutData("30%"));
                
                // Image generique
                imageGeneriqueVue=new ImageGeneriqueVue(this);
                details.add(imageGeneriqueVue, new RowLayoutData("30%"));
                
                mvz = new MiniZoomImageVue(this) ; 
                
                details.add(mvz, new RowLayoutData("34%")) ;    
                
                // on crée le panneau des filtres
                filtres = new PanneauFiltresObservationVues(this);
                
                // on initialise le volet qui contient les filtres
                filtres.setWidth("10%");
                filtres.setTitleCollapse(true);
                filtres.setCollapsible(true);
                
                
                filtres.addListener(
                        new PanelListenerAdapter() {
                                @Override
                                public void onCollapse(Panel panel)  {
                                        CarnetEnLigneMediateur.fireResize();
                                }
                            @Override
                                public void onExpand(Panel panel) {
                                CarnetEnLigneMediateur.fireResize();
                            }
                });
                
                panneauPrincipalObservation.add(details,regionEst);
                
                panneauPrincipalObservation.add(filtres,regionOuest);
                panneauPrincipalObservation.add(centre,regionCentre);
        }
        
        /**
         * Retourne une instance de manière unique
         * @return l'instance unique du médiateur
         */
        public static ObservationMediateur Instance(CarnetEnLigneMediateur carnetEnLigneMediateur)
        {
                        if(!estInstancie || thisMediateur == null)
                        {
                                estInstancie = true ;
                                thisMediateur = new ObservationMediateur(carnetEnLigneMediateur) ;
                        }
                        
                        return thisMediateur ;  
        }
        
        
        public void connecterUtilisateur() {
                
                if(importerObservations) {
                        observationModele.importerObservations();
                }
                
                if(panneauPrincipalObservation == null || !panneauPrincipalObservation.isCreated()) 
                {
                        panneauPrincipalObservation.addListener(new ContainerListenerAdapter()
                        {
                                @Override
                                public void onRender(Component c)
                                {
                                        panneauPrincipalObservation.purgeListeners() ;
                                        initialiserArbres();
                                        filtres.getRechercheLibreVue().raz();
                                        obtenirNombreObservation();
                                        analyserHistorique();
                                }
                        }) ;
                }
                else
                {
                        initialiserArbres();
                        filtres.getRechercheLibreVue().raz();
                        obtenirNombreObservation();
                        analyserHistorique();
                }
        }
        
        private void initialiserArbres() {
                getPanneauFiltres().getArbreDateObservationFiltreVue().initialiser();
                getPanneauFiltres().getArbreEntiteGeographiqueObservationFiltreVue().initialiser();             
                getPanneauFiltres().getArbreMotsClesObservationVue().initialiser();     
        }

        
        
        // ACTIONS  a entreprendre lors d'un evenement particulier 
        /**
         * Lors du raffraichissement de la liste d'observation  
         */
        public void onRafraichissementListeObservations() {
                
                carnetEnLigneMediateur.donneesObsVersImages(listeObservation.getCacheListeObservation());
                observationModele.rafraichirCacheObservation(listeObservation.getCacheListeObservation());
                
                filtres.getArbreMotsClesObservationVue().cocherMotsCles(new String[0]);
        }
        
        /**
         * 
         * TODO : fonction plus generique, appelle sur un clic ou une selection de ligne, a appeller : SelectionnerObservation 
         * est appelé lors d'un clic de souris sur un enregistrement de la liste le
         * médiateur gère alors les conséquences
         * 
         * @param rowIndex
         *            le numéro de ligne selectionné
         */
        
        public void onClicListeObservation(int rowIndex, String ordreObservation) {
        
                Observation obs = obtenirCacheObservation().get(ordreObservation) ;
                
                if(GWT.isScript()) {
                        masquerChargementInfosObservations() ;
                }
                
                gererMiseAJourFormulaireObservation();
                gererMiseAJourPanneauDetails(obs);      
        }
        
        public void gererMiseAJourPanneauDetails(Observation obs) {
                // Affichage de l'image correspondante
                if(details.isVisible()) {
                        // Affichage de la carte de repartition correspondante
                        String numeroNomenclaturalSaisiObservation = obs.getNumeroNomenclaturalRetenu();
                        if(numeroNomenclaturalSaisiObservation != null && !numeroNomenclaturalSaisiObservation.isEmpty()) {
                                observationModele.obtenirImageInformationRepartition(informationRepartitionVue,obs.getCodeCourtReferentielTaxo(), numeroNomenclaturalSaisiObservation) ;
                                observationModele.obtenirImageGenerique(imageGeneriqueVue,obs.getCodeCourtReferentielTaxo(), numeroNomenclaturalSaisiObservation) ;
                        } else {
                                informationRepartitionVue.rafraichir("", false);
                                imageGeneriqueVue.rafraichir("", false);
                        }
                        observationModele.obtenirLiaisonImage(mvz, obs.getId()) ;
                        String[] infosRafraichissementLienExterne = {numeroNomenclaturalSaisiObservation, obs.getReferentielTaxo()};
                        liExtVue.rafraichir(infosRafraichissementLienExterne, false);
                }
                filtres.getArbreMotsClesObservationVue().rafraichir(obs.getMotsCles(), false);
        }
        
        public void gererMiseAJourFormulaireObservation() {
                String[] ids = listeObservation.getIdSelectionnees();
                if(ids.length == 1) {
                        Observation obs = listeObservation.getCacheListeObservation().get(ids[ids.length - 1]);
                        // affichage des détails dans le formulaire d'observation
                        formulaireSaisieObservationVue.rafraichir(obs, false) ;
                } else {
                        ListeObservation listeObs = new ListeObservation();
                        for(int i=0; i < ids.length;i++) {
                                Observation obsAjout = observationModele.getCacheObservation().get(ids[i]);
                                listeObs.ajouterObservation(obsAjout);
                        }
                        formulaireSaisieObservationVue.rafraichir(listeObs, false);
                }
        }
        
        public void obtenirImageInformationExternes(String referentielTaxo, String numeroNomenclaturalSaisiObservation) {       
                if(details.isVisible()) {
                        if(GWT.isScript()) {
                                masquerChargementInfosObservations() ;
                        }
                        String[] infosRefNom = {numeroNomenclaturalSaisiObservation, referentielTaxo};
                        liExtVue.rafraichir(infosRefNom, false);
                        observationModele.obtenirImageInformationRepartition(informationRepartitionVue, referentielTaxo, numeroNomenclaturalSaisiObservation) ;
                        observationModele.obtenirImageGenerique(imageGeneriqueVue, referentielTaxo, numeroNomenclaturalSaisiObservation) ;
                }
        }
        
        public int getTaillePage() {
                return listeObservation.getTaillePage();
        }
        
        public int getPageEnCours() {
                return listeObservation.getPageEncours();
        }
        
        
        // ACCES au Modèle 
        // C du CRUD 
        /**
         * TODO : afficher un message du type "observation ajouté".  
         * Lance la creation d'une observation
         * @param obs : l'observation saisie
         */     
        public void ajouterObservation(Observation obs) {
          // On rafraichit la liste d'observation 
          observationModele.ajouterObservation(listeObservation, obs) ;
          filtres.getArbreEntiteGeographiqueObservationFiltreVue().rafraichir(obs,true) ;
          filtres.getArbreDateObservationFiltreVue().rafraichir(obs,true) ;
                
        }
        
        // R du CRUD 
        /**
         * Demande au modele le nombre d'Observation à afficher
         * TODO : grouper cette demande avec la demande d'affichage de liste ? 
         */

        public void obtenirNombreObservation() {
                
                listeObservation.masquerChargement() ;
                mvz.raz() ;
                imageGeneriqueVue.raz() ;
                informationRepartitionVue.raz() ;
                
                observationModele.obtenirNombreObservation(listeObservation) ;
                
        }
        
        /**
         * Demande au modele le nombre d'Observation à afficher
         * TODO : grouper cette demande avec la demande d'affichage de liste ? 
         */

        public void obtenirDernierePageObservation() {
                
                listeObservation.rafraichir(new Observation(),false) ;
                
        }

        
        
        public void obtenirListeObservation() {
                obtenirListeObservation(listeObservation);
        }
        
        /**
         * Demande au modele le detail  des Observations à afficher
         * TODO : grouper cette demande avec la demande d'affichage de liste ? 
         */

        
        public void obtenirListeObservation(Rafraichissable r) {
                
                listeObservation.masquerChargement() ;
                observationModele.obtenirListeObservation(r,listeObservation.getTaillePage(),listeObservation.getPageEncours()) ;
        }
        
        public void obtenirCacheObservation(Rafraichissable r) {
                
                r.rafraichir(observationModele.getCacheObservation(), false) ;
        }
        

        /**
         * Envoie au modèle une demande pour obtenir l'arbre des localites
         * 
         * @param r
         *            le raffraichissable qui a demandé la mise à jour
         */
        public void obtenirListeEntiteGeographique() {
                
                observationModele.obtenirListeEntiteGeographique(filtres.getArbreEntiteGeographiqueObservationFiltreVue());
                
        }
        
        
        // U du CRUD
        public void modifierObservation(Observation obs) {
                
                // On prend soin de récupérer les mots clés de l'observation
                Observation obsMod = obtenirCacheObservation().get(obs.getNumeroOrdre());
                obs.setMotsCles(obsMod.getMotsCles());
                
                // On rafraichit la liste d'observation
                observationModele.modifierObservation(listeObservation, obs) ;
                filtres.getArbreEntiteGeographiqueObservationFiltreVue().rafraichir(obs,true) ;
                filtres.getArbreDateObservationFiltreVue().rafraichir(obs,true) ;
                
        }
        
        public void modifierObservationEnMasse(Observation obs) {
                // On rafraichit la liste d'observation
                listeObservation.masquerChargement();
                observationModele.modifierObservationEnMasse(listeObservation, obs) ;
        }
        
        // D du CRUD
        /**
         * TODO : afficher un message du type "observation modifie".  
         * Lance la modification d'une observation
         * @param obs : l'observation a modifier
         */
        
        
        
        public void supprimerObservation(Rafraichissable r, String numeroOrdre) {
                
                if(listeObservation.getSelectionModel().getCount() > 0)
                {
                        if(Window.confirm(Msg.get("question-supprimer-observation")+" ?")) {
                        observationModele.supprimerObservation(r,numeroOrdre) ;
                        }
                }
                
        }
        
        public boolean listeAvoirObservations() {
                return listeObservation.getStore().getCount() > 0;
        }
        
        // Etat du syteme
        /**
         * C'est dans cette fonction que doivent être renvoyé les valeurs des filtres
         * sous forme de tableau [nom, valeur]
         * @return Les noms et valeurs des filtres
         */
        public String[][] renvoyerFiltres()
        {               
                int longueur = 0;
                
                String[] filtresEntitesGeo = filtres.getArbreEntiteGeographiqueObservationFiltreVue().renvoyerValeursAFiltrer() ;
                String chaineNomsFiltresGeo = filtresEntitesGeo[0] ;
                String chaineValFiltresGeo = filtresEntitesGeo[1] ;
                
                String[] filtresDate = filtres.getArbreDateObservationFiltreVue().renvoyerValeursAFiltrer() ;
                String chaineNomsFiltresDate = filtresDate[0] ;
                String chaineValFiltresDate = filtresDate[1] ;
                
                String[] filtresTaxon = filtres.getRechercheLibreVue().renvoyerValeursAFiltrer();
                
                String[] filtresMotsCles = filtres.getArbreMotsClesObservationVue().renvoyerValeursAFiltrer();
                
                String chaineNomsFiltres = "" ;
                String chaineValFiltres = "" ;
                
                if(!chaineNomsFiltresGeo.trim().equals("") && !chaineValFiltresGeo.trim().equals("")) {
                        chaineNomsFiltres += chaineNomsFiltresGeo+",";
                        chaineValFiltres += chaineValFiltresGeo+",";
                }
                
                if(!chaineNomsFiltresDate.trim().equals("") && !chaineValFiltresDate.trim().equals("")) {
                        chaineNomsFiltres += chaineNomsFiltresDate+",";
                        chaineValFiltres += chaineValFiltresDate+",";
                }
                
                if(!filtresTaxon[0].trim().equals("") && !filtresTaxon[1].trim().equals("")) {
                        chaineNomsFiltres += filtresTaxon[0]+",";
                        chaineValFiltres += filtresTaxon[1]+",";
                }
                
                if(!filtresMotsCles[0].trim().equals("") && !filtresMotsCles[1].trim().equals("")) {
                        chaineNomsFiltres += filtresMotsCles[0];
                        chaineValFiltres += filtresMotsCles[1];
                }
                
                String[] nomsFiltres = chaineNomsFiltres.split(",") ;
                String[] valsFiltres = chaineValFiltres.split(",") ;
                
                longueur += nomsFiltres.length;
                
                String [][] valeursFiltres = new String[longueur][2] ;
                
                int i = 0;
                
                if(valsFiltres.length > 0)
                {
                        for(i = 0 ; i < nomsFiltres.length ; i++)
                        {
                                valeursFiltres[i][0] = nomsFiltres[i] ;
                                if(valsFiltres[i].equals(Msg.get("inconnue"))) 
                                {
                                        valeursFiltres[i][1] = "NULL" ;
                                }
                                else
                                {
                                        valeursFiltres[i][1] = valsFiltres[i] ;
                                }
                        }
                }
                
                listeObservation.afficherFiltres(valeursFiltres) ;
                
                return valeursFiltres ;
        }

        /**
         * 
         * @return
         * 
         */
        
        public Panel getPanneauPrincipalObservation() {
                return panneauPrincipalObservation;
        }


        public void montrerContextMenu(EventObject e) {
                
                MenuObservationVue mvo = new MenuObservationVue(this) ;
                mvo.showAt(e.getXY()) ;
                
        }

        public void doubleClicListeObservation(int rowIndex) {
                
                
        }
        
        // Getters 
        
        public PanneauFiltresObservationVues getPanneauFiltres() {
                
                return filtres;
                
        }
        
        public void masquerChargementInfosObservations()
        {
                ExtElement masked = Ext.get(details.getId());

                if (details.isVisible() && masked != null) {
                        informationRepartitionVue.raz() ;
                        imageGeneriqueVue.raz() ;
                        masked.mask(Msg.get("chargement"), true);
                }

                cartoObservationVue.masquerChargement(true);
        }
        
        public void deMasquerChargementInfosObservations()
        {
                ExtElement masked = Ext.get(details.getId());

                if (details.isVisible() && masked != null) {
                        masked.unmask() ;
                }       
        }


        public void obtenirDatesObservation() {
                
                observationModele.obtenirDatesObservation(filtres.getArbreDateObservationFiltreVue()) ;
        }


        public void exporterObservations(String format, String colonnes) {
                observationModele.exporterObservations(format, colonnes) ;
        }

        public void exporterObservationsPDF() {
                if(listeObservation.getIdSelectionnees().length > 300) {
                        Window.alert(Msg.get("erreur-nb-obs-étiquettes")+".");
                        return;
                }
                // TODO: nombre en fonction des filtres actifs, combien d'éléments seraient envoyés ?
                if(listeObservation.getIdSelectionnees().length == 0) {
                        //import com.google.gwt.core.client.GWT.log( XXX éléments);
                }
                observationModele.exporterObservationsPDF(listeObservation.getIdSelectionnees());
        }


        public void deconnecterUtilisateur() {
                
                if(panneauPrincipalObservation == null || panneauPrincipalObservation.isCreated() || !panneauPrincipalObservation.isVisible())
                {
                        panneauPrincipalObservation.addListener(new ContainerListenerAdapter()
                        {
                                @Override
                                public void onShow(Component component)
                                {
                                        deconnecterUtilisateur();
                                        panneauPrincipalObservation.purgeListeners();
                                }
                        });
                }
                else
                {
                        listeObservation.raz() ;
                        formulaireSaisieObservationVue.raz() ;
                        razFiltres();
                        informationRepartitionVue.raz() ;
                        imageGeneriqueVue.raz() ;
                        mvz.raz() ;
                }
        }


        public void supprimerLiaisonObsImage() {
                
                String ordreObs = listeObservation.getIdSelectionnees()[0];
                String idObs = observationModele.getIdPourOrdreObs(ordreObs);
                String idImg = mvz.getIdImage() ;
                String[] stParams = {idImg, idObs};
                if(Window.confirm(Msg.get("question-supprimer-lien-image-obs", stParams)+" ?"))
                {
                        mvz.supprimerLiaisonImage() ;
                        observationModele.supprimerLiaisonImages(idImg,idObs) ;
                }
                
        }

        public void supprimerObservations() {
                
                if(listeObservation.getIdSelectionnees().length > 0) {
                        if(Window.confirm(Msg.get("question-supprimer-observations-sel")+" ?")) { 
                                        String[] numObs = listeObservation.getIdSelectionnees();
                                        String numObsapl = "" ;
                                        for(int i = 0 ; i < numObs.length ; i++) {
                                                numObsapl += numObs[i]+"," ; 
                                        }
                                        
                                        observationModele.supprimerListeObservation(listeObservation,numObsapl) ;
                        }
                }
                else
                {
                        
                        Window.alert(Msg.get("aucune-observation-selectionnee"));
                }
        }


        public void transmettreObservations(boolean publier) {
                
                if(Utilisateur.getInstance().isIdentifie()) {
                        if(listeObservation.getIdSelectionnees().length > 0) {
                                
                                String action = "" ;
                                
                                if(publier) {
                                        action = Msg.get("rendre-publiques") ;
                                }
                                else {
                                        action = Msg.get("rendre-privees") ;
                                }
                                
                                String[] stParams = {action};
                                if(Window.confirm(Msg.get("question-rendre-publique-privee-observations-sel", stParams)+" ?")) { 
                                        String[] numObs = listeObservation.getIdSelectionnees();
                                        String numObsApl = "" ;
                                        for(int i = 0 ; i < numObs.length ; i++) {
                                                numObsApl += numObs[i] ;
                                                if(i != numObs.length - 1) {
                                                        numObsApl +="," ;
                                                }
                                        }
                                        
                                        observationModele.transmettreListeObservation(listeObservation,numObsApl, publier) ;
                                }
                        }
                        else
                        {
                                Window.alert(Msg.get("aucune-observation-selectionnee"));
                        }
                }
                else
                {
                        if(publier) {
                                if(Window.confirm(Msg.get("question-publication-observations-identifie"))) {
                                        importerObservations = true ;
                                        carnetEnLigneMediateur.afficherDialogueConnexion();
                                }
                        }
                }
                
        }
        
        public void analyserHistorique() {
                
                if (History.getToken().length()>0) {

                final String anum=History.getToken();
                observationModele.analyserHistorique(formulaireSaisieObservationVue,anum);
                }
        }

        /**
         * Appelle le modèle pour mettre à jour la paire mot-clé / identifiant du
         * mot clé
         * 
         * @param text
         *            le texte du mot clé
         * @param id
         *            l'identifiant du mot clé
         */
        public void mettreAjourMotsClesId(String text, String id) {

                observationModele.mettreAjourMotsClesId(text, id);

        }
        
        public boolean gererDDObsSurMotCle(TreeNode NoeudMotCle, DragData dragData) {
                
                if(dragData instanceof GridDragData) {

                        GridDragData gdd = ((GridDragData)dragData);
                        
                        String idMotCle = ((String[])NoeudMotCle.getUserObject())[1];
                        
                        Record[] obsALier = gdd.getSelections();
                        
                        String idObsALier[] = new String[obsALier.length];
                        String idObsALierString = "";
                        
                        for(int i = 0; i < obsALier.length; i++) {
                                if(i != 0) {
                                        idObsALierString += ", ";
                                }
                                idObsALierString += obsALier[i].getAsString("ordre_observation");
                                
                                if(!observationAvoirMotCle(idMotCle, obsALier[i].getAsString("ordre_observation"))) {
                                        idObsALier[i] = obsALier[i].getAsString("ordre_observation");
                                } else {
                                        idObsALier[i] = "";
                                }
                        }
                        
                        String message = "Lier les observations "; 
                        
                        if(idObsALier.length == 1) {
                                message = "Lier l'observation "; 
                        }
                        
                        if(Window.confirm(message+idObsALierString+" au projet "+NoeudMotCle.getText()+" ?")) {
                                mettreAjourMotsCles(idMotCle, idObsALier);
                                
                                return true;
                        } else {
                                return false;
                        }
                } else {
                        return false;
                }
        }
        
        public void gererDDMotCleSurObs(String idObs, String idMC) {
                
                Observation obs = obtenirCacheObservation().get(idObs);
                
                if(obs == null) {
                        return;
                }
                
                if(observationAvoirMotCle(idMC, idObs)) {
                        if(Window.confirm(Msg.get("question-suppression-liaison-obs-mot-cle")+" ?")) {
                                String nouveauMotsCles = obs.getMotsCles().replace(idMC, "");
                                nouveauMotsCles = nouveauMotsCles.replace(";;", ";");
                                
                                obs.setMotsCles(nouveauMotsCles);
                                
                                observationModele.supprimerLiaisonMotCleObservations(listeObservation, obs.getId(), idMC);
                        }
                }
        }

        public String gererOverDDMotCleSurObs(String idObs, String IdMC) {
                
                if(observationAvoirMotCle(IdMC, idObs)) {
                    return "x-dd-drop-unlink";
                } else {
                        return "x-dd-drop-nodrop";
                }
        }
        /**
         * Récupère les identifiants des obs selectionnézs et appelle le modèle
         * pour qu'il mette à jour les associations mots clés/obs
         * 
         * @param motsClesEnCours
         *            les mots clés à associer aux images selectionnés séparés par
         *            un ';'
         * @param arbreMC
         *            l'arbre des mots clés à mettre à jour
         */
        public void mettreAjourMotsCles(String motsClesEnCours, String[] idsObsALier) {
                
                String[] ids = listeObservation.getIdSelectionnees();
                observationModele.mettreAjourMotsCles(motsClesEnCours, idsObsALier);

        }

        /**
         * Appelle le médiateur pour qu'il ajoute un mot clé dans l'arbre des mots
         * clés
         * 
         * @param n
         *            le noeud à ajouter à l'arbre
         * @param arbreMC
         *            le nouvel arbre de mots clés à mettre à jour
         */
        public void ajouterMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
                observationModele.ajouterMotCleDansArbre(n, arbreMC, r);
        }

        /**
         * Appelle le médiateur pour qu'il supprime un mot clé et son sous arbre
         * dans l'arbre des mots clés
         * 
         * @param n
         *            le noeud à supprimer
         * @param arbreMC
         *            le nouvel arbre de mots clés à mettre à jour
         */
        public void supprimerMotCleDansArbre(TreeNode n, Tree arbreMC, Rafraichissable r) {
                observationModele.supprimerMotCleDansArbre(n, arbreMC, r);
        }

        /**
         * Appelle le médiateur pour qu'il modifie un mot clé dans l'arbre des mots
         * clés
         * 
         * @param n
         *            le noeud à modifier
         * @param arbreMC
         *            le nouvel arbre de mots clés à mettre à jour
         */
        public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC) {
                observationModele.modifierMotCleDansArbre(n, arbreMC, getPanneauFiltres().getArbreMotsClesObservationVue());
        }

        /**
         * Appelle le médiateur pour qu'il déplace un mot clé et son sous arbre dans
         * l'arbre des mots clés
         * 
         * @param n
         *            le noeud à déplacer
         * @param arbreMC
         *            le nouvel arbre de mots clés à mettre à jour
         */
        public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC) {

                observationModele.deplacerMotCleDansArbre(n, arbreMC, getPanneauFiltres().getArbreMotsClesObservationVue());
        }


        public void rafraichirArbreMotsCles(Tree arbreMotsCles) {
                
                getPanneauFiltres().getArbreMotsClesObservationVue().rafraichir(arbreMotsCles, false);
                
        }
        
        public boolean observationAvoirMotCle(String idMotCle, String idObs) {
                Observation obs = obtenirCacheObservation().get(idObs);
                if(obs == null) {
                        return false;
                }
                
                if(obs.getMotsCles().contains(idMotCle)) {
                        return true;
                }
                
                return false;
        }


        public void obtenirArbreMotsCles(Rafraichissable r) {
                
                observationModele.obtenirArbreMotsCles(r);
        }
        
        public String[] obtenirTexteMotsCles(String[] idsMotsCles) {
                
                String[] tableauMotsClesTexte = new String[idsMotsCles.length];
                
                for(int i=0; i< idsMotsCles.length; i++) {
                        tableauMotsClesTexte[i] = observationModele.obtenirTexteMotCle(idsMotsCles[i]);
                }
                
                return tableauMotsClesTexte;
        }
        
        public ListeObservation obtenirCacheObservation() {
                return observationModele.getCacheObservation();
        }

        public void donneesExterieures(Object nouvelleDonnees) {
                if(nouvelleDonnees instanceof Tree) {
                        
                        Tree arbreMotsCles = (Tree)nouvelleDonnees ;
                        observationModele.rafraichirArbreMotsCles(nouvelleDonnees);
                        rafraichirArbreMotsCles(arbreMotsCles);
                }
        }
        
        public void transmettreDonnees(Object o) {
                carnetEnLigneMediateur.donneesObsVersImages(o);
        }
        
        public void obtenirInformationCoord(Rafraichissable r, double lat, double lng) {
                observationModele.obtenirInformationCoord(r, lat, lng);
        }
        
        public void obtenirInformationLocalite(Rafraichissable r, String nomLocalite, String codeLoc) {
                observationModele.obtenirInformationLocalite(r, nomLocalite, codeLoc);
        }

        public void obtenirInformationCoord(double lat, double lng) {
                this.obtenirInformationCoord(lat, lng, false);
        }

        public void obtenirInformationCoord(double lat, double lng, boolean zoomer) {
                cartoObservationVue.setDoitZoomerSurRetour(true);
                // Les requêtes hors France sont longues, on veille donc à ne pas les empiler 
                // inutilement pour ne pas les traiter au retour 
                InformationLocaliteDAO.annulerRequeteEnCours();
                // Pour faire patienter l'utilisateur le temps de trouver la zone
                //Util.curseurAttente();
                afficherFenetreCarto();
                cartoObservationVue.afficherCarteEnAttenteAvecMarker(lat, lng);
                observationModele.obtenirInformationCoord(cartoObservationVue, lat, lng);
        }

        public void obtenirInformationLocalite(String nomLocalite, String codeLoc) {
                observationModele.obtenirInformationLocalite(cartoObservationVue, nomLocalite, codeLoc);
        }

        /**
         * Ouvre la fenêtre carto, place un marqueur sur le point demandé et centre l'affichage,
         * mais ne recherche pas d'infos sur le point
         * @param infos doit contenir des coordonnées (lon, lat)
         */
        public void rafraichirFenetreCartoSurPoint(EntiteGeographiqueObservation infos) {
                cartoObservationVue.rafraichir(infos, false);
        }

        public void rafraichirSaisieLocaliteObservation(EntiteGeographiqueObservation infosLocalite) {
                InformationLocaliteDAO.annulerRequeteEnCours();
                formulaireSaisieObservationVue.rafraichir(infosLocalite, false);
                cacherFenetreCarto();
        }

        private void razFiltres() {
                filtres.getArbreDateObservationFiltreVue().raz() ;
                filtres.getArbreEntiteGeographiqueObservationFiltreVue().raz() ;
                filtres.getArbreMotsClesObservationVue().raz();
                filtres.getRechercheLibreVue().raz();
        }
        

        public void viderFiltre(String nom) {
                filtres.viderFiltres(nom);
                obtenirNombreObservation();
        }

        public Component getListeObservation() {
                return listeObservation;
        }

        public void redimensionnerPanneaux(int adjHeight, int adjWidth) {       
                formulaireSaisieObservationVue.setHeight(300);
                listeObservation.setHeight(adjHeight/2);
                centre.doLayout();
        }

        public void afficherFormulaireImportObservation() {
                if (formImportObs==null) { // lazy inst. 
                        formImportObs = new FormulaireImportObservationVue(this);
                }
                formImportObs.afficher();       
        }

        public void setImporterObservationsAnonymes(boolean importerObservations) {
                this.importerObservations = importerObservations;
        }

        public void afficherFenetreCarto() {
                int hauteur = (int)Math.round(Window.getClientHeight()*0.75);
                int largeur = (int)Math.round(Window.getClientWidth()*0.75);
                fenetreCarto.setSize(largeur, hauteur);
                if(!fenetreCarto.isVisible()) {
                        fenetreCarto.show();
                }
                cartoObservationVue.setTailleCarte(hauteur - 20, largeur - 20);
        }

        private void cacherFenetreCarto() {
                if(fenetreCarto.isVisible()) {
                        fenetreCarto.hide();
                }
        }

        public InfosReferentielNom getRefTaxSelectionne() {
                return refTaxSelectionne;
        }

        public void setRefTaxSelectionne(int index) {
                refTaxSelectionne = Configuration.getReferentielsDispos().get(index);
        }

        public void setRefTaxSelectionne(InfosReferentielNom refTax) {
                refTaxSelectionne = refTax;
        }

        public String renvoyerTri() {
                return listeObservation.renvoyerTri();
        }

        public String renvoyerDirectionTri() {
                return listeObservation.renvoyerDirectionTri();
        }
}