Subversion Repositories eFlore/Applications.del

Rev

Rev 392 | Go to most recent revision | Blame | Last modification | View Log | RSS feed

package org.tela_botanica.del.client.vues.rechercheobservations;

import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.moteurrecherche.MoteurRecherchePresenteur;
import org.tela_botanica.del.client.composants.moteurrecherche.MoteurRechercheVue;
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.i18n.I18n;
import org.tela_botanica.del.client.modeles.Observation;
import org.tela_botanica.del.client.modeles.ObservationServiceResultat;
import org.tela_botanica.del.client.services.rest.ObservationService;
import org.tela_botanica.del.client.services.rest.async.ObservationsCallback;

import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.RootPanel;

public class RechercheObservationsPresenteur extends Presenteur {
        
        private ObservationService serviceObs;

        public abstract interface Vue extends IsWidget {
                public HasWidgets getZoneRecherche();
                public HasWidgets getZoneObservations();
                public HasWidgets getZonePaginationHaut();
                public HasWidgets getZonePaginationBas();
                public void startChargement();
                public void stopChargement();
                public void nettoyer();
        }

        private Vue vue;
        private PaginationPresenteur paginationHautPresenteur, paginationBasPresenteur;
        
        /**
         * Ceci sert à éviter que les deux présenteurs paginations fassent deux requêtes par changement de page
         * En attendant d'en discuter avec les autres
         */
        private boolean requeteEnCours = false;
        
        public RechercheObservationsPresenteur(ObservationService serviceObs, Vue vue) {
                this.vue = vue;
                this.serviceObs = serviceObs;
        }

        public void go(HasWidgets composite) {
                if (composite == null) {
                        composite = RootPanel.get();
                }
                composite.add(vue.asWidget());
                ajouterMoteurRechercheAvancee();

                ObservationsCallback callback = new ObservationsCallback() {
                        @Override
                        public void surObservationsRecues(
                                        ObservationServiceResultat observationsRecues) {                
                                        creerWidgetPagination(observationsRecues.getNbTotalObservationsPourLaRecherche());
                                        afficherObservations(observationsRecues);
                        }
                };
                
                serviceObs.getObservations(CacheClient.getInstance().getInformationsRechercheObservation(), 0, CacheClient.getInstance().getPasPagination(),callback);
        }

        protected void ajouterMoteurRechercheAvancee() {
                MoteurRecherchePresenteur presenteur = new MoteurRecherchePresenteur(new MoteurRechercheVue("") {
                }, false, true) {

                        @Override
                        public void lancerRecherche() {
                                chargerEtAfficherObservations(0, CacheClient.getInstance().getPasPagination());
                        }
                };
                presenteur.go(vue.getZoneRecherche());
        }

        protected void gererEvenements() {
        }

        public void chargerEtAfficherObservations(int debut, int fin) {
                vue.startChargement();
                vue.nettoyer();
                ObservationsCallback callback = new ObservationsCallback() {
                        
                        @Override
                        public void surObservationsRecues(ObservationServiceResultat observationsRecues) {              
                                        afficherObservations(observationsRecues);
                                        requeteEnCours = false;
                        }
                };
                requeteEnCours = true;
                serviceObs.getObservations(CacheClient.getInstance().getInformationsRechercheObservation(), debut, fin, callback);
        }

        private void afficherObservations(ObservationServiceResultat observationServiceResultat) {
                vue.nettoyer();
                for (Observation observation : observationServiceResultat.getObservations()) {
                        ObservationPresenteur presenteur = new ObservationPresenteur(new ObservationVue(), observation);
                        presenteur.go(vue.getZoneObservations());
                }
                vue.stopChargement();
        }

        private void creerWidgetPagination(int nbObservations) {
                this.paginationHautPresenteur = new PaginationPresenteur(new PaginationVue(), nbObservations, CacheClient.getInstance().getPasPagination()) {

                        @Override
                        public void changerPage(int debut, int fin) {
                                chargerEtAfficherObservations(debut, fin);
                                CacheClient.getInstance().setPageCouranteRechercheObservations(getPageCourante());
                        }

                        @Override
                        public void actualiserPasCache(int pas) {
                                CacheClient.getInstance().setPasPagination(pas);
                        }
                        
                        @Override
                        public void synchroniser() {
                                paginationBasPresenteur.setPas(getPas());
                                paginationBasPresenteur.setPageCourante(getPageCourante());
                                paginationBasPresenteur.setNbPages(getNbPages());
                                paginationBasPresenteur.actualiserLiens();
                        }
                };
                paginationHautPresenteur.go(vue.getZonePaginationHaut());
                
                this.paginationBasPresenteur = new PaginationPresenteur(new PaginationVue(), nbObservations, CacheClient.getInstance().getPasPagination()) {

                        @Override
                        public void changerPage(int debut, int fin) {
                                if(!requeteEnCours) {
                                        chargerEtAfficherObservations(debut, fin);
                                        CacheClient.getInstance().setPageCouranteRechercheObservations(getPageCourante());
                                }
                        }

                        @Override
                        public void actualiserPasCache(int pas) {
                                CacheClient.getInstance().setPasPagination(pas);
                        }
                        
                        @Override
                        public void synchroniser() {
                                paginationHautPresenteur.setPas(getPas());
                                paginationHautPresenteur.setPageCourante(getPageCourante());
                                paginationHautPresenteur.setNbPages(getNbPages());
                                paginationHautPresenteur.actualiserLiens();
                        }
                };
                paginationBasPresenteur.go(vue.getZonePaginationBas());
        }

}