Subversion Repositories eFlore/Applications.del

Rev

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

package org.tela_botanica.del.client.vues.pictoflora.moteur;

import java.util.List;

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.modeles.ModeRecherche;
import org.tela_botanica.del.client.modeles.Protocole;
import org.tela_botanica.del.client.modeles.ProtocoleServiceResultat;
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
import org.tela_botanica.del.client.navigation.evenement.changementprotocole.EvenementChangementProtocole;
import org.tela_botanica.del.client.services.rest.ImageServiceConcret;
import org.tela_botanica.del.client.services.rest.ProtocoleService;
import org.tela_botanica.del.client.services.rest.ProtocoleServiceConcret;
import org.tela_botanica.del.client.services.rest.async.ProtocolesCallback;
import org.tela_botanica.del.client.vues.pictoflora.resultats.ResultatPictofloraPresenteur;
import org.tela_botanica.del.client.vues.pictoflora.resultats.ResultatPictofloraVue;

import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.HasChangeHandlers;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.ListBox;

public class MoteurPictofloraPresenteur {

        public interface Vue extends IsWidget {
                public HasWidgets getZoneResultats();

                public HasWidgets getZoneRecherche();

                public void ajouterVue(HasWidgets composite);

                public void setListeProtocoles(ListBox listeProtocoles);
                
                public HasChangeHandlers getListeProtocoles();
                
                public void ajouterProtocole(String NomProtocole, String idProtocole);

                public void selectionnerProtocole(int index);
                
                public void selectionnerProtocoleParProtocole(Protocole protocole);
                
                public String getNomProtocoleSelectionne();

                public int getIdProtocoleSelectionne();

                public void ajouterProtocoles(List<Protocole> protocoles);

                public void mettreAJourDescriptionProtocoleCourant(Protocole protocoleCourant);
                
        }

        private Vue vue;
        private ProtocoleService protocoleService;
        private List<Protocole> protocoles;

        /**
         * Constructeur
         * */
        public MoteurPictofloraPresenteur(Vue vue, ProtocoleService protocoleService) {
                
                this.vue = vue;
                this.protocoleService = protocoleService;
                chargerProtocoles();
                
                // TODO: le code ci dessous sert à ne pas recharger les protocoles
                // à chaque fois, voir si on peut le factoriser quelque part
                if (CacheClient.getInstance().getProtocoleCourant() == null) {
                        if (CacheClient.getInstance().getListeProtocoles() == null) {
                                protocoleService.getProtocoles(new ProtocolesCallback() {

                                        @Override
                                        public void surRetour(ProtocoleServiceResultat protocolesRecus) {
                                                CacheClient.getInstance().setListeProtocoles(protocolesRecus.getProtocoles());
                                                if (protocolesRecus.getProtocoles().size() > 0) {
                                                        if(protocoles == null) {
                                                                protocoles = protocolesRecus.getProtocoles();
                                                        }
                                                        //Vérifier qu'on n'a pas demandé un protocole particulier en paramètre
                                                        String parametre = CacheClient.getInstance().getIdProtocoleEnAttente();
                                                        if (parametre != null) {
                                                                for (Protocole protocoleCourant : protocoles) {
                                                                                if (parametre.equals(String.valueOf(protocoleCourant.getId()))) {
                                                                                        CacheClient.getInstance().setProtocoleCourant(protocoleCourant);
                                                                                }
                                                                }
                                                                CacheClient.getInstance().setIdProtocoleEnAttente(null);
                                                        } else {
                                                                CacheClient.getInstance().setProtocoleCourant(protocolesRecus.getProtocoles().get(0));
                                                        }
                                                } else {
                                                        // TODO afficher message indiquant que la liste des
                                                        // protocoles de votes n'est pas fourni
                                                }
                                        }
                                });
                        } else {
                                CacheClient.getInstance().setProtocoleCourant(CacheClient.getInstance().getListeProtocoles().get(0));
                        }
                }
                gererEvenements();
        }
        
        private void gererEvenements() {
                
                vue.getListeProtocoles().addChangeHandler(new ChangeHandler() {
                        @Override
                        public void onChange(ChangeEvent event) {
                                surChangementProtocole();
                        }
                });
                
        }
        
        private void chargerProtocoles() {
                // test pour ne pas charger les protocoles déjà chargés
                // TODO: faire un systeme de cache gérés par les web service eux même
                if (CacheClient.getInstance().getListeProtocoles() == null) {
                        protocoleService.getProtocoles(new ProtocolesCallback() {

                                @Override
                                public void surRetour(ProtocoleServiceResultat protocolesRecus) {
                                        protocoles = protocolesRecus.getProtocoles();
                                        remplirListeProtocole(protocoles);
                                        surChangementProtocole();
                                }
                        });
                } else {
                        protocoles = CacheClient.getInstance().getListeProtocoles();
                        remplirListeProtocole(CacheClient.getInstance().getListeProtocoles());
                }
        }
        
        public void surChangementProtocole() {
                Protocole protocoleCourant = null;
                for (Protocole protocole : protocoles) {
                        if (protocole.getId() == vue.getIdProtocoleSelectionne()) {
                                protocoleCourant = protocole;
                        }
                }
                vue.mettreAJourDescriptionProtocoleCourant(protocoleCourant);
                CacheClient.getInstance().setProtocoleCourant(protocoleCourant);
                EvenementChangementProtocole evenement = new EvenementChangementProtocole(protocoleCourant);
                BusEvenementiel.getInstance().fireEvent(evenement);
                CacheClient.getInstance().mettreAjourUrlCourante();
        }
        
        private void remplirListeProtocole(List<Protocole> protocoles) {
                //si un paramètre est passé dans l'url, on sélectionne un protocole
                String parametre = CacheClient.getInstance().getIdProtocoleEnAttente();
                if (parametre != null) {
                        for (Protocole protocoleCourant : protocoles) {
                                if (parametre.equals(String.valueOf(protocoleCourant.getId()))) {
                                        CacheClient.getInstance().setProtocoleCourant(protocoleCourant);
                                }
                        }
                }
        
                vue.ajouterProtocoles(protocoles);
                if (CacheClient.getInstance().getProtocoleCourant() == null) {
                        vue.selectionnerProtocole(0);
                        vue.mettreAJourDescriptionProtocoleCourant(protocoles.get(0));
                } else {
                        vue.selectionnerProtocoleParProtocole(CacheClient.getInstance().getProtocoleCourant());
                        vue.mettreAJourDescriptionProtocoleCourant(CacheClient.getInstance().getProtocoleCourant());
                }
                CacheClient.getInstance().mettreAjourUrlCourante();
        }

        public void go(HasWidgets composite) {
                vue.ajouterVue(composite);
                chargerMoteurRechercheAvancee();
        }

        public void chargerMoteurRechercheAvancee() {
                MoteurRecherchePresenteur presenteurRecherche = new MoteurRecherchePresenteur(new MoteurRechercheVue(""), ModeRecherche.MODE_IMAGE) {
                        public void lancerRecherche() {
                                chercherImages();
                        }
                };
                presenteurRecherche.go(vue.getZoneRecherche());
        }

        public void chercherImages() {
                vue.getZoneResultats().clear();
                CacheClient.getInstance().mettreAjourUrlCourante();
                new ResultatPictofloraPresenteur(new ImageServiceConcret(), new ProtocoleServiceConcret(), new ResultatPictofloraVue()).go(vue.getZoneResultats());
        }

        public HasWidgets getZoneResultats() {
                return vue.getZoneResultats();
        }
}