Subversion Repositories eFlore/Applications.cel

Rev

Rev 140 | Blame | Last modification | View Log | RSS feed

package org.tela_botanica.client;

import org.tela_botanica.client.image.ImageMediateur;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.modeles.Configuration;
import org.tela_botanica.client.modeles.Utilisateur;

import org.tela_botanica.client.observation.ObservationMediateur;
import org.tela_botanica.client.vues.EtatConnexionVue;
import org.tela_botanica.client.vues.FormulaireDeConnexionVue;
import org.tela_botanica.client.vues.ListeUtilisateurAdminVue;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Image;
import com.gwtext.client.core.EventCallback;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Ext;
import com.gwtext.client.core.ExtElement;
import com.gwtext.client.core.Function;
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.TabPanel;
import com.gwtext.client.widgets.Tool;
import com.gwtext.client.widgets.ToolTip;
import com.gwtext.client.widgets.event.ContainerListener;
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
import com.gwtext.client.widgets.event.PanelListener;
import com.gwtext.client.widgets.event.PanelListenerAdapter;
import com.gwtext.client.widgets.layout.FitLayout;
import com.gwtext.client.widgets.layout.RowLayout;
import com.gwtext.client.widgets.layout.RowLayoutData;

/**
 * Mediateur gérant les interactions entre vues et les echanges de données
 * C'est un singleton. 
 * @author david delon 
 *
 */

public class CarnetEnLigneMediateur implements Rafraichissable {
        
        
        /**
         * booleen qui verifie l'unicite de l'instance
         */
        private static boolean estInstancie = false ;

        /**
         * pointeur vers le médiateur lui même (pour le pattern singleton)
         */
        private static CarnetEnLigneMediateur thisMediateur = null ;  
                
        /**
         * modele de données
         */
        
        private  CarnetEnLigneModele carnetEnLigneModele=null;

        
        /**
         * panneau principal de l'application "Carnet en ligne"
         */

        private Panel panneauPrincipalCarnetEnLigne= null ;
        
        
        
        /**
         * panneau a onglet pour les observation et les images
         */ 
        
        
        private com.gwtext.client.widgets.TabPanel ongletsObservationsImages=null;
        
        
        /**
         * Indicateur d'etat de la connexion utilisateur
         */
        
        private EtatConnexionVue etatConnexionVue=null;
        
        
        /**
         * Texte d'invite connexion  
         */
        private final String texteDeconnexion="Utilisez ce carnet en ligne pour saisir vos observations, <u>identifiez-vous</u> pour les transmettre à Tela Botanica"; 

        /**
         * Boolean indiquant un essai de connexion
         */
        
        private boolean tentativeConnection=false;
        

        /**
         *  Formulaire de connexion (lazy instantiation)
         *  
         */
        
        private FormulaireDeConnexionVue formulaireDeConnexionVue=null;
        
        /**
         * 
         */
        private Panel bandeau = null ;
        
        private Panel panneauAdmin = null ;
        
        Tool cacherPanneau = null ;
        
        /**
         * Mediateur Gestion des images
         */
        
        private ImageMediateur imageMediateur=null;
        
        /**
         * Mediateur Gestion des observations
         */
        
        private ObservationMediateur observationMediateur=null;
        
        /**
         * Un tooltip pour l'aide
         */
        private ToolTip tp = new ToolTip() ;


        /**
         * Utilisateur en cours
         */

                
        private Utilisateur utilisateur=null; 
        

        
        public static CarnetEnLigneMediateur Instance()
        {
                        if(!estInstancie || thisMediateur==null)
                        {
                                estInstancie = true ;
                                thisMediateur = new CarnetEnLigneMediateur() ;
                        }
                        
                        return thisMediateur ;
                        
        }
        
        
        /**
         * constructeur privé (on accède a la classe par la méthode getInstance
         */
        
        private CarnetEnLigneMediateur() {
        
                
                panneauPrincipalCarnetEnLigne = new Panel("Carnet en ligne");
                
//              Disposition 
                
                panneauPrincipalCarnetEnLigne.setLayout(new RowLayout());

                
//              On crée un modèle d'acces aux donnnes 
                
                carnetEnLigneModele=CarnetEnLigneModele.Instance();
                
                
                //Image bandeau = new Image("Bandeau-haut.gif") ;
                bandeau = new Panel();
                Image logoND = new Image("logo_n_d.gif") ;
                logoND.setStylePrimaryName("x-img-logo_nd") ;
                final Image img = new Image("bandeau-haut.gif") {
                        public void onBrowserEvent(Event e) {
                                
                                if(DOM.eventGetType(e) == Event.ONCLICK)
                                {
                                        bandeau.toggleCollapse(true);
                                }
                                if(DOM.eventGetType(e) == Event.ONMOUSEOVER) {
                                        tp.setHtml("<div class=\"x-tooltip-help\"> Cliquez sur l'image ou sur la flèche en haut à droite pour replier le panneau </div>");
                                        tp.showAt(0,0);
                                }
                                
                                
                                if(DOM.eventGetType(e) == Event.ONMOUSEOUT) {
                                        if(tp.isVisible()) {
                                                tp.hide();
                                        }
                                }
                        }
                };
                bandeau.add(img) ;
                img.setSize("50%", "100%");
                bandeau.add(logoND) ;
                logoND.setSize("10%", "100%");
                bandeau.setId("x-up-bandeau") ;
                bandeau.setBorder(false) ;
                // La vue affichant le statut de la connexion 
                bandeau.setSize("60%","80%") ;
                etatConnexionVue=new EtatConnexionVue(this);
                etatConnexionVue.setLayout(new FitLayout()) ;
                
                // Le panneau à onglet qui contient les 2 applications Observation et Images 
                
                ongletsObservationsImages = new TabPanel();
                
                panneauPrincipalCarnetEnLigne.add(etatConnexionVue,new RowLayoutData(20));
                panneauPrincipalCarnetEnLigne.add(bandeau, new RowLayoutData("10%")) ;
                
                img.sinkEvents(Event.ONCLICK);
                img.sinkEvents(Event.ONMOUSEOVER);
                img.sinkEvents(Event.ONMOUSEOUT);
                
                //      on ajoute le panneau a onglet au panneau principal
                cacherPanneau = new Tool(Tool.TOGGLE, new Function() {

                        public void execute() {
                                
                                if(!bandeau.isCollapsed()) {
                                        bandeau.toggleCollapse(true) ;
                                }
                                else {
                                        bandeau.toggleCollapse(true) ;
                                }
                                
                        }
                        
                }) ;
                
                panneauAdmin = new Panel();
                panneauPrincipalCarnetEnLigne.add(panneauAdmin, new RowLayoutData(20));
                panneauAdmin.setBorder(false);
                panneauAdmin.hide();
                
                panneauPrincipalCarnetEnLigne.add(ongletsObservationsImages);
                panneauPrincipalCarnetEnLigne.addTool(cacherPanneau) ;
                
                panneauPrincipalCarnetEnLigne.setAutoScroll(true);
                
                // On ajoute les applications           
                observationMediateur = ObservationMediateur.Instance(this);
                imageMediateur= ImageMediateur.Instance(this);
                
                //temp dd viewport desactive ajout de cette  ligne
                getPanneauPrincipalCarnetEnLigne().setHeight(Window.getClientHeight()) ;
                
                //      on ajoute les panneaux  principaux des applications au panneau à onglets
                ongletsObservationsImages.add(observationMediateur.getPanneauPrincipalObservation());
                ongletsObservationsImages.add(imageMediateur.getPanneauPrincipalImage());
        }
        
        
        public void getEtatUtilisateur() { 
                
                        
                carnetEnLigneModele.getEtatUtilisateur(this); 
                                
                
        }


        // Methode publiques
        
        
        
        /**
         * Recherche Identifiant utilisateur en cours et etat de connection
         * @return Utilisateur
         */
        
        
        public Utilisateur getUtilisateur() {
                return utilisateur;
        }

        /**
         * Deconnecte l'utilisateur passe en parametre
         */
    public void deconnecterUtilisateur() {

        // TODO: vider proprement toutes les vues (méthode à voir)
                carnetEnLigneModele.deconnecterUtilisateur(this, utilisateur.getIdentifiant());
                
                observationMediateur.deconnecterUtilisateur() ;
                imageMediateur.deconnecterUtilisateur();
        }

        public void connecterUtilisateur(String login, String password) {
        
                tentativeConnection=true;
                carnetEnLigneModele.connecterUtilisateur(this, login, password); 
                
        }


        
        /**
         *  Affichage etat de la connexion
         */
        
        
        private void afficheEtatConnexion() {
                 
                
                if (!utilisateur.isIdentifie()) {
                           etatConnexionVue.setEtat("",false);
                }
                else {
                        if(utilisateur.isAdmin()) {
                          afficherLienAdmin();
                    }
                        
                        panneauAdmin.setVisible(utilisateur.isAdmin());
                    etatConnexionVue.setEtat(utilisateur.getIdentifiant(),true);
                      
                }
                
        }

        
        /**
         * 
         * Affichage boite de connexion
         *
         */
        
        
        public void afficherDialogueConnexion() {
                
                  if (formulaireDeConnexionVue==null) { 
                          formulaireDeConnexionVue= new FormulaireDeConnexionVue(this);
                  }
                  
                  // On le positionne à peu près au milieu de l'écran
                  int left = (Window.getClientWidth() - 512) / 2;
                  int top = (Window.getClientHeight() - 256) / 2;
                  
                  formulaireDeConnexionVue.setPopupPosition(left, top);
                  formulaireDeConnexionVue.show();
                
        }


        

        public Panel getPanneauPrincipalCarnetEnLigne() {
                return panneauPrincipalCarnetEnLigne;
        }

        
//       TODO : repandre rafraichissement

        public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {

                        if (nouvelleDonnees instanceof Utilisateur) {
                                                              
                                utilisateur = (Utilisateur) nouvelleDonnees;
                                                                
                                afficheEtatConnexion();
                                
                                if ((tentativeConnection) && !utilisateur.isIdentifie()) {
                                        
                                        panneauAdmin.setVisible(false);
                                        //formulaireDeConnexionVue.afficherMessageAlerte();
                                }
                                else {
                                        if ((tentativeConnection) && utilisateur.isIdentifie()) {                                               
                                                formulaireDeConnexionVue.hide();
                                        }
                                }

                        // On lance l'affichage des observations
                                observationMediateur.connecterUtilisateur();
                                imageMediateur.connecterUtilisateur();

                        }

        }


        public void obtenirListeObservations(Rafraichissable r) {
                
                observationMediateur.obtenirCacheObservation(r) ;
                
        }


        public void donneesRafraichies(Object nouvelleDonnees) {
                
                imageMediateur.donneesExterieures(nouvelleDonnees) ;
                
        }


        public void afficherListeUtilisateurs() {
                
                ListeUtilisateurAdminVue listeUtilisateur = new ListeUtilisateurAdminVue(this) ;
                listeUtilisateur.show(Ext.get("LienChangerUtilisateur").getDOM());
                
        }
        
        public void afficherLienAdmin() {

                String labelAdmin = "<div id=\"lienAdmin\">Vous consultez les données de "+utilisateur.getIdentite()+"  <a id=\"LienChangerUtilisateur\" href=\"#\">Changer d'utilisateur</a></div>" ;
                panneauAdmin.setHtml(labelAdmin);
                
                ExtElement lienChangerUt = Ext.get("LienChangerUtilisateur");
                if(lienChangerUt != null) 
                {       
                        lienChangerUt.removeAllListeners();
                        lienChangerUt.addListener("click", new EventCallback() {

                                public void execute(EventObject e) {
                                        afficherListeUtilisateurs();
                                }
                                
                        });
                }
                else
                {
                        panneauAdmin.addListener(new ContainerListenerAdapter() 
                        {
                                public void onAfterLayout(Container c) 
                                {
                                        ExtElement lienChangerUt = Ext.get("LienChangerUtilisateur");
                                        lienChangerUt.removeAllListeners();
                                        lienChangerUt.addListener("click", new EventCallback() {

                                                public void execute(EventObject e) {
                                                        afficherListeUtilisateurs();
                                                }
                                                
                                        });
                                }
                        });
                }
        }
        
        public void changerIdentite(String nouvelleIdentite) {
                utilisateur.setIdentite(nouvelleIdentite);
                afficherLienAdmin();
                observationMediateur.connecterUtilisateur();
                imageMediateur.connecterUtilisateur();
        }


        public void obtenirListeUtilisateurs(String rech, Rafraichissable r) {
                carnetEnLigneModele.obtenirListeUtilisateur(r,rech,utilisateur.getIdentifiant());
        }

}