Subversion Repositories eFlore/Applications.del

Rev

Rev 2054 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package org.tela_botanica.del.client.vues.identiplante.resultats;

import java.util.List;

import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.pagination.PaginationPresenteur;
import org.tela_botanica.del.client.composants.pagination.PaginationVue;
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import org.tela_botanica.del.client.gestionhistorique.ConstantesNavigation;
import org.tela_botanica.del.client.modeles.ActiviteUtilisateur;
import org.tela_botanica.del.client.modeles.Image;
import org.tela_botanica.del.client.modeles.InformationsRecherche;
import org.tela_botanica.del.client.modeles.ModeTri;
import org.tela_botanica.del.client.modeles.Observation;
import org.tela_botanica.del.client.modeles.ObservationServiceResultat;
import org.tela_botanica.del.client.modeles.Utilisateur;
import org.tela_botanica.del.client.services.rest.ObservationService;
import org.tela_botanica.del.client.services.rest.UtilisateurServiceConcret;
import org.tela_botanica.del.client.services.rest.async.ActiviteUtilisateurCallback;
import org.tela_botanica.del.client.services.rest.async.ObservationsCallback;
import org.tela_botanica.del.client.utils.StringUtils;
import org.tela_botanica.del.client.vues.identiplante.resultats.observations.ObservationPresenteur;
import org.tela_botanica.del.client.vues.identiplante.resultats.observations.ObservationVue;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Label;

public class ResultatsIdentiplantePresenteur extends Presenteur {

        /**
         * Interface vue : création des composants graphiques
         * */
        public abstract interface Vue extends IsWidget {
                public HasWidgets getZoneObservations();

                public HasWidgets getZonePaginationHaut();

                public HasWidgets getZonePaginationBas();

                public void startChargement();

                public void stopChargement();

                public void nettoyer();

                public HasClickHandlers getTriParDateObservationAscendant();

                public HasClickHandlers getTriParDateObservationDescendant();
                
                public HasClickHandlers getTriParDatePublicationAscendant();

                public HasClickHandlers getTriParDatePublicationDescendant();
                
                public HasClickHandlers getTriParNbCommentairesAscendant();

                public HasClickHandlers getTriParNbCommentairesDescendant();

                public void afficherElementsAucunResultatTrouve();

                public void afficherElementsResultatsTrouves();

                public HasClickHandlers getLabelDateObservation();
                
                public HasClickHandlers getLabelDatePublication();
                
                public HasClickHandlers getLabelNbCommentaires();

                void setModeTriPublication(ModeTri mode);

                void setModeTriObservation(ModeTri mode);

                void setModeTriNbCommentaires(ModeTri mode);
                
                void afficherCacherZoneTri(boolean afficher);
        }

        private Vue vue;
        private ObservationService serviceObs;
        private ModeTri triCourantDatePublication = ModeTri.TRI_DESCENDANT;
        private ModeTri triCourantDateObservation = ModeTri.PAS_DE_TRI;
        private ModeTri triCourantNbCommentaires = ModeTri.PAS_DE_TRI;
        private CacheClient cache = CacheClient.getInstance();
        private String statut;

        /**
         * Constructeur de la classe
         * 
         * @param ObservationService
         *            serviceObs le service pour récupérer les observations
         * @Vue Vue l'objet implémentant l'interface
         * */
        public ResultatsIdentiplantePresenteur(ObservationService serviceObs, Vue vue) {
                String statut = CacheClient.getInstance().getFiltreStatut();
                this.vue = vue;
                InformationsRecherche infos = CacheClient.getInstance().getInformationsRechercheObservation();
                
                if (infos.getTriParDatePublication() != ModeTri.PAS_DE_TRI) {
                        triCourantDatePublication = infos.getTriParDatePublication();
                        vue.setModeTriPublication(triCourantDatePublication);
                }
                
                if (infos.getTriParDateObservation() != ModeTri.PAS_DE_TRI) {
                        triCourantDateObservation = infos.getTriParDateObservation();
                        vue.setModeTriObservation(triCourantDatePublication);
                }
                        
                if (infos.getTriParNbCommentaires() != ModeTri.PAS_DE_TRI) {
                        triCourantNbCommentaires = infos.getTriParNbCommentaires();
                        vue.setModeTriNbCommentaires(triCourantNbCommentaires);
                }
                
                this.serviceObs = serviceObs;
                this.statut = statut;
        }

        /**
         * Lancer l'affichage de la recherche dans le composant passé en paramètre
         * 
         * @param HasWidgets composite le conteneur de widgets dans lequel ajouter la vue
         * */
        public void go(HasWidgets composite) {
                composite.add(vue.asWidget());
                lancerRechercheEtCreerWidgetPagination();
                gererEvenements();
        }

        /**
         * Initier un callback pour créer le widget de pagination et afficher les
         * observations recues et lancer la recherche avec le service
         * */
        public void lancerRechercheEtCreerWidgetPagination() {
                
                int debut = (cache.getPageCouranteRechercheObservations() - 1) * cache.getPasPagination();
                int fin = cache.getPageCouranteRechercheObservations() * cache.getPasPagination();

                ObservationsCallback callback = new ObservationsCallback() {

                        @Override
                        public void surRetour(ObservationServiceResultat observationsRecues) {
                                creerWidgetPagination(observationsRecues.getNbTotalObservationsPourLaRecherche());
                                afficherObservations(observationsRecues);

                        }

                        @Override
                        public void surErreur(String messageErreur) {
                                Window.alert(messageErreur);

                        }
                };

                serviceObs.getObservations(cache.getInformationsRechercheObservation(), debut, fin, statut, callback);
        }

        /**
         * Créer les widgets de pagination en fonction du nombre d'observation
         * 
         * @param int nbObservations le nombre d'observations à afficher
         * */
        private void creerWidgetPagination(int nbObservations) {
                vue.getZonePaginationHaut().clear();
                PaginationPresenteur paginationPresenteurHaut = creerPresenteurPagination(nbObservations);
                paginationPresenteurHaut.setGroupePagination("pagination_observations");
                paginationPresenteurHaut.go(vue.getZonePaginationHaut());

                vue.getZonePaginationBas().clear();
                PaginationPresenteur paginationPresenteurBas = creerPresenteurPagination(nbObservations);
                paginationPresenteurBas.setGroupePagination("pagination_observations");
                paginationPresenteurBas.go(vue.getZonePaginationBas());
        }

        /**
         * Créer un présenteur du widget pagination
         * 
         * @param int nbObservations le nombre total d'observation à afficher
         * */
        private PaginationPresenteur creerPresenteurPagination(int nbObservations) {
                PaginationPresenteur presenteur = new PaginationPresenteur(new PaginationVue(), nbObservations, cache.getPasPagination(), cache.getPageCouranteRechercheObservations()) {

                        @Override
                        public void chargerElements(int debut, int fin) {
                                chargerEtAfficherObservations(debut, fin);
                                cache.setPageCouranteRechercheObservations(getPageCourante());
                        }

                        @Override
                        public void actualiserPasCache(int pas) {
                                cache.setPasPagination(pas);
                        }

                };
                return presenteur;
        }

        /**
         * Gestion des évènements de la vue recherche Observation
         * */
        protected void gererEvenements() {

                ClickHandler surClicDateObservation = new ClickHandler() {
                        /**
                         * Gestion du clic sur l'option de tri par date d'observation Masque
                         * les éléments de tri qui sont en cours et affiche les autres
                         * */
                        public void onClick(ClickEvent event) {
                                toggleModeTriObservation();

                                InformationsRecherche informationsRechercheObservations = cache.getInformationsRechercheObservation();
                                informationsRechercheObservations.setTriParDatePublication(ModeTri.PAS_DE_TRI);
                                informationsRechercheObservations.setTriParNbCommentaires(ModeTri.PAS_DE_TRI);
                                informationsRechercheObservations.setTriParDateObservation(triCourantDateObservation);
                                chercherEtAfficherObservationsPageEnCours();
                        }
                };
                
                ClickHandler surClicDatePublication = new ClickHandler() {
                        /**
                         * Gestion du clic sur l'option de tri par date d'observation Masque
                         * les éléments de tri qui sont en cours et affiche les autres
                         * */
                        public void onClick(ClickEvent event) {
                                toggleModeTriPublication();

                                InformationsRecherche informationsRechercheObservations = cache.getInformationsRechercheObservation();
                                informationsRechercheObservations.setTriParDateObservation(ModeTri.PAS_DE_TRI);
                                informationsRechercheObservations.setTriParNbCommentaires(ModeTri.PAS_DE_TRI);
                                informationsRechercheObservations.setTriParDatePublication(triCourantDatePublication);

                                chercherEtAfficherObservationsPageEnCours();
                        }
                };
                
                ClickHandler surClicNbCommentaires = new ClickHandler() {
                        /**
                         * Même comportement qu'au dessus mais pour le tri par nb de commentaires
                         */
                        public void onClick(ClickEvent event) {
                                toggleModeTriNbCommentaires();

                                InformationsRecherche informationsRechercheObservations = cache.getInformationsRechercheObservation();
                                informationsRechercheObservations.setTriParDateObservation(ModeTri.PAS_DE_TRI);
                                informationsRechercheObservations.setTriParDatePublication(ModeTri.PAS_DE_TRI);
                                informationsRechercheObservations.setTriParNbCommentaires(triCourantNbCommentaires);
                                chercherEtAfficherObservationsPageEnCours();
                        }
                };

                vue.getLabelDateObservation().addClickHandler(surClicDateObservation);
                vue.getTriParDateObservationAscendant().addClickHandler(surClicDateObservation);
                vue.getTriParDateObservationDescendant().addClickHandler(surClicDateObservation);
                
                vue.getLabelDatePublication().addClickHandler(surClicDatePublication);
                vue.getTriParDatePublicationAscendant().addClickHandler(surClicDatePublication);
                vue.getTriParDatePublicationDescendant().addClickHandler(surClicDatePublication);
                
                vue.getLabelNbCommentaires().addClickHandler(surClicNbCommentaires);
                vue.getTriParNbCommentairesAscendant().addClickHandler(surClicNbCommentaires);
                vue.getTriParNbCommentairesDescendant().addClickHandler(surClicNbCommentaires);
        }

        /**
         * Inverser le mode de tri en fonction du précédent
         * */
        public void toggleModeTriPublication() {
                if (triCourantDatePublication == ModeTri.TRI_ASCENDANT) {
                        triCourantDatePublication = ModeTri.TRI_DESCENDANT;
                } else if(triCourantDatePublication == ModeTri.TRI_DESCENDANT) {
                        triCourantDatePublication = ModeTri.TRI_ASCENDANT;
                } else {
                        triCourantDatePublication = ModeTri.TRI_DESCENDANT;
                }
                
                triCourantDateObservation = ModeTri.PAS_DE_TRI;
                triCourantNbCommentaires = ModeTri.PAS_DE_TRI;

                vue.setModeTriPublication(triCourantDatePublication);
        }
        
        /**
         * Inverser le mode de tri en fonction du précédent
         * */
        public void toggleModeTriObservation() {
                if (triCourantDateObservation == ModeTri.TRI_ASCENDANT) {
                        triCourantDateObservation = ModeTri.TRI_DESCENDANT;
                } else if(triCourantDateObservation == ModeTri.TRI_DESCENDANT) {
                        triCourantDateObservation = ModeTri.TRI_ASCENDANT;
                } else {
                        triCourantDateObservation = ModeTri.TRI_DESCENDANT;
                }
                
                triCourantDatePublication = ModeTri.PAS_DE_TRI;
                triCourantNbCommentaires = ModeTri.PAS_DE_TRI;

                vue.setModeTriObservation(triCourantDateObservation);
        }
        
        /**
         * Inverser le mode de tri en fonction du précédent
         * */
        public void toggleModeTriNbCommentaires() {
                if (triCourantNbCommentaires == ModeTri.TRI_ASCENDANT) {
                        triCourantNbCommentaires = ModeTri.TRI_DESCENDANT;
                } else if(triCourantNbCommentaires == ModeTri.TRI_DESCENDANT) {
                        triCourantNbCommentaires = ModeTri.TRI_ASCENDANT;
                } else {
                        triCourantNbCommentaires = ModeTri.TRI_DESCENDANT;
                }
                
                triCourantDateObservation = ModeTri.PAS_DE_TRI;
                triCourantDatePublication = ModeTri.PAS_DE_TRI;

                vue.setModeTriNbCommentaires(triCourantNbCommentaires);
        }

        /**
         * Initialiser les variable de début et fin et lancer le chargement des
         * observations
         * */
        public void chercherEtAfficherObservationsPageEnCours() {
                int debut = (cache.getPageCouranteRechercheObservations() - 1) * cache.getPasPagination();
                int fin = (cache.getPageCouranteRechercheObservations()) * cache.getPasPagination();
                chargerEtAfficherObservations(debut, fin);
        }

        /**
         * Lancer le service pour charger les observations entre debut et fin et les
         * afficher
         * 
         * @param int debut l'entier de départ de la requete
         * @param int fin l'entier de limite de la requete
         * */
        public void chargerEtAfficherObservations(int debut, int fin) {
                vue.startChargement();
                vue.nettoyer();

                ObservationsCallback surReceptionObservation = new ObservationsCallback() {

                        @Override
                        public void surRetour(ObservationServiceResultat observationsRecues) {
                                afficherObservations(observationsRecues);

                        }

                        @Override
                        public void surErreur(String messageErreur) {
                                Window.alert(messageErreur);

                        }
                };
                serviceObs.getObservations(cache.getInformationsRechercheObservation(), debut, fin, statut, surReceptionObservation);
        }

        /**
         * Parcrourir les résultats de la recherche pour initier l'affichage de
         * chaque observation
         * 
         * @param ObservationServiceResultat
         *            resultats les résultats issus de la requête
         * */
        private void afficherObservations(ObservationServiceResultat resultats) {
                vue.nettoyer();

                if (resultats.getObservations() == null || resultats.getObservations().size() == 0) {
                        vue.afficherElementsAucunResultatTrouve();
                } else {
                        vue.afficherElementsResultatsTrouves();
                        
                        // Si on consulte l'onglet mon activité, on cache le tri qui n'a pas de sens ici car c'est une timeline
                        vue.afficherCacherZoneTri(!cache.getFiltreStatut().equals(ConstantesNavigation.PARAM_TYPE_MONACTIVITE));
                        // S'il y a de nouveau évènements sur l'obs, elle doit être mise en valeur
                        // les x premieres obs sont affichées un peu différemment (où x est le nombre de nouveaux évènements)
                        int i = 0;
                        int nbEvents = CacheClient.getInstance().getUtilisateur().getActivite().getNbEvenementsInt();
                        
                        for (Observation observation : resultats.getObservations()) {
                                List<Image> listeImagesObs = observation.getImages();
                                Image imagePrincipale = null;
                                if(listeImagesObs != null && listeImagesObs.size() > 0) {
                                        imagePrincipale = listeImagesObs.get(0);
                                }
                                ObservationPresenteur presenteur = new ObservationPresenteur(new ObservationVue(), observation, imagePrincipale);
                                presenteur.go(vue.getZoneObservations());
                                
                                // La taille de la page s'étant adaptée au nombre de nouveaux évènements, on applique
                                // uniquement la mise en valeur sur la premiere
                                if(nbEvents != 0 && i < nbEvents && cache.getPageCouranteRechercheObservations() == 1) {
                                        presenteur.mettreEnValeurEvenementsObs();
                                }
                                i++;
                        }
                }
                CacheClient.getInstance().mettreAjourUrlCourante();
                vue.stopChargement();
        }
}