Subversion Repositories eFlore/Applications.del

Rev

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

package org.tela_botanica.del.client.composants.moteurrecherche;

import java.util.Map;

import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.formulaires.autocompletion.AutoCompletionComboBoxPresenteur;
import org.tela_botanica.del.client.composants.formulaires.autocompletion.AutoCompletionComboBoxVue;
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
import org.tela_botanica.del.client.composants.rss.RssPresenteur;
import org.tela_botanica.del.client.composants.rss.RssVue;
import org.tela_botanica.del.client.config.Config;
import org.tela_botanica.del.client.modeles.InformationsRecherche;
import org.tela_botanica.del.client.modeles.ModeRecherche;
import org.tela_botanica.del.client.services.ReferentielService;
import org.tela_botanica.del.client.utils.UtilitairesAutoCompletionService;

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.event.dom.client.HasKeyPressHandlers;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;

public abstract class MoteurRecherchePresenteur extends Presenteur {

        public abstract interface Vue extends IsWidget {
                public void ajouterVue(HasWidgets composite);

                public HasClickHandlers getLienRechercheAvancee();

                public void basculerAffichageZoneCache();

                public HasClickHandlers getBoutonRechercheSimple();

                public HasClickHandlers getBoutonFermer();

                public HasClickHandlers getBoutonVider();

                public HasClickHandlers getBoutonRechercheAvancee();

                public HasKeyPressHandlers getChampSaisie();

                public HasClickHandlers getChampSaisieCliquable();

                public String getValeurRechercheSimple();

                public String getLabelRecherche();

                public String getContientMots();

                public String getDepartement();

                public HasWidgets getCommune();

                public HasWidgets getTaxon();

                public String getFamille();

                public String getGenre();

                public String getMotCle();

                public String getAuteur();

                public String getDate();

                public void setValeurRechercheSimple(String valeurRecherche);

                public void setContientMots(String mots);

                public void setValeurDepartement(String dpt);

                public void chargerValeursRecherchePrecedente(InformationsRecherche informationsRecherche);

                public void focusSaisie();

                public void nettoyer();

                public HasKeyPressHandlers getChampsFamille();

                public HasKeyPressHandlers getChampsGenre();

                public HasKeyPressHandlers getChampsMotCle();
                
                public HasKeyPressHandlers getChampsMotCleDel();
                
                public HasKeyPressHandlers getChampsMotCleCel();

                public HasKeyPressHandlers getChampsAuteur();

                public HasKeyPressHandlers getChampsDate();
                
                public HasKeyPressHandlers getChampsDepartement();
                
                public HasKeyPressHandlers getChampsContientMots();
                
                public HasWidgets getZoneRss();

                public String getReferentiel();
                
                public void setReferentielLectureSeule(boolean lectureSeule);

                void remplirListeReferentiels(Map<String, String> listeReferentiels);

                public String getMotCleDel();

                public String getMotCleCel();
                
                public void cacherChampsTagsImage();
                public void cacherChampsTagsObs();

        }

        private Vue vue;
        private Config config;
        private ModeRecherche modeRecherche;
        private RssPresenteur presenteurRss;
        
        public enum TypeMoteur {
                SIMPLE, AVANCEE
        };

        private TypeMoteur typeMoteur = TypeMoteur.SIMPLE;

        private AutoCompletionComboBoxPresenteur completionTaxonsPresenteur = null;
        private AutoCompletionComboBoxPresenteur completionCommunesPresenteur = null;

        public MoteurRecherchePresenteur(Vue vue, ModeRecherche mode) {
                initialiser(vue, mode, new Config());
        }

        public MoteurRecherchePresenteur(AutoCompletionComboBoxPresenteur presenteurAutoCompletionTaxon, AutoCompletionComboBoxPresenteur presenteurAutoCompletionCommunes, Vue vue, ModeRecherche mode, Config configuration) {
                completionTaxonsPresenteur = presenteurAutoCompletionTaxon;
                completionCommunesPresenteur = presenteurAutoCompletionCommunes;
                initialiser(vue, mode, configuration);
        }

        private void initialiser(Vue vue, ModeRecherche mode, Config configuration) {
                
                //TODO : fixer le flux avant de le mettre en place
                //this.presenteurRss = new RssPresenteur(new RssVue(), CacheClient.getInstance().getInformationsRechercheObservation(), "S'abonner au flux rss des résultats de cette recherche");
                //presenteurRss.go(vue.getZoneRss());
                
                this.vue = vue;
                setMode(mode);
                this.config = configuration;
                if (completionTaxonsPresenteur == null)
                        this.creerCompletionTaxons();
                if (completionCommunesPresenteur == null)
                        this.creerCompletionCommunes();
                gererEvenements();
                
                vue.remplirListeReferentiels(ReferentielService.getReferentiels());
                if(CacheClient.getInstance().getReferentielNonModifiable()) {
                        vue.setReferentielLectureSeule(true);
                }
                
                if(estPourRechercheImages()) {
                        vue.cacherChampsTagsObs();
                } else {
                        vue.cacherChampsTagsImage();
                }
        }

        public ModeRecherche getMode() {
                return modeRecherche;
        }

        private void setMode(ModeRecherche mode) {
                modeRecherche = mode;
        }
        
        public TypeMoteur getTypeMoteur() {
                return this.typeMoteur;
        }
        
        public void setTypeMoteur(TypeMoteur typeMoteur) {
                this.typeMoteur = typeMoteur;
        }

        public boolean estPourRechercheImages() {
                return (modeRecherche == ModeRecherche.MODE_IMAGE);
        }

        public boolean estPourRechercheObservations() {
                return (modeRecherche == ModeRecherche.MODE_OBSERVATION);
        }

        private void creerCompletionTaxons() {
                String url = this.config.getServiceBaseUrl() + "nomstaxons";
                completionTaxonsPresenteur = new AutoCompletionComboBoxPresenteur(new AutoCompletionComboBoxVue(), url) {
                        protected String effectuerPreTraitementChaineRequete(String requete) {
                                // si aucun référentiel selectionné, pas de requete
                                if(vue.getReferentiel() != null && !vue.getReferentiel().equals("")) {
                                        requete = "?masque.nom=" + requete + "&masque.referentiel=" + vue.getReferentiel();
                                        return requete;
                                } else {
                                        return null;
                                }
                                // A décommenter lors de l'utilisation des web services eflore
                                // return
                                // RetourAutoCompletionService.effectuerPreTraitementChaineRequeteGenreEspeceEflore(requete);
                        }

                        @Override
                        protected String[] parserResultatRequete(Response response) {
                                return UtilitairesAutoCompletionService.parserResultatRetourSimple(response);
                                // A décommenter lors de l'utilisation des web services eflore
                                // return RetourAutoCompletionService.parserRetourOss(response);
                        }
                };
        }

        private void creerCompletionCommunes() {
                String url = this.config.getServiceBaseUrl() + "communes";
                completionCommunesPresenteur = new AutoCompletionComboBoxPresenteur(new AutoCompletionComboBoxVue(), url) {
                        protected String effectuerPreTraitementChaineRequete(String requete) {
                                requete = "?masque.nom=" + requete;
                                return requete;
                        }

                        @Override
                        protected void surSelectionSuggestion(String suggestion) {
                                setValeur(suggestion);
                                collecterInfosRecherche();
                                setValeur(getInformationsRechercheEnCache().getCommune());
                                vue.setValeurDepartement(getInformationsRechercheEnCache().getDepartement());
                        }

                        @Override
                        protected String[] parserResultatRequete(Response response) {
                                return UtilitairesAutoCompletionService.parserResultatRetourSimple(response);
                        }
                };
        }

        @Override
        public void go(HasWidgets composite) {
                afficherRequeteEtLancerRecherche();
                completionTaxonsPresenteur.go(vue.getTaxon());
                completionCommunesPresenteur.go(vue.getCommune());
                vue.ajouterVue(composite);
                vue.focusSaisie();
        }

        @Override
        protected void gererEvenements() {
                vue.getLienRechercheAvancee().addClickHandler(new ClickHandler() {
                        public void onClick(ClickEvent event) {
                                setTypeMoteur(TypeMoteur.AVANCEE);
                                vue.setContientMots(vue.getValeurRechercheSimple());
                                vue.basculerAffichageZoneCache();
                        }
                });

                vue.getBoutonRechercheSimple().addClickHandler(new ClickHandler() {
                        public void onClick(ClickEvent event) {
                                setTypeMoteur(TypeMoteur.SIMPLE);
                                collecterInfosRecherche();
                                afficherRequeteEtLancerRecherche();
                        }
                });

                vue.getBoutonFermer().addClickHandler(new ClickHandler() {
                        public void onClick(ClickEvent event) {
                                vue.setValeurRechercheSimple(vue.getContientMots());
                                vue.basculerAffichageZoneCache();
                        }
                });

                vue.getBoutonVider().addClickHandler(new ClickHandler() {
                        public void onClick(ClickEvent event) {
                                nettoyerChamps();
                                InformationsRecherche infosRecherche = new InformationsRecherche();
                                if (estPourRechercheImages()) {
                                        CacheClient.getInstance().setInformationsRechercheImage(infosRecherche);
                                } else if (estPourRechercheObservations()) {
                                        CacheClient.getInstance().setInformationsRechercheObservation(infosRecherche);
                                }
                        }
                });

                vue.getBoutonRechercheAvancee().addClickHandler(new ClickHandler() {
                        public void onClick(ClickEvent event) {
                                setTypeMoteur(TypeMoteur.AVANCEE);
                                collecterInfosRecherche();
                                vue.basculerAffichageZoneCache();
                                afficherRequeteEtLancerRecherche();
                        }
                });

                vue.getChampSaisie().addKeyPressHandler(new KeyPressHandler() {
                        public void onKeyPress(KeyPressEvent event) {
                                if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
                                        setTypeMoteur(TypeMoteur.SIMPLE);
                                        collecterInfosRecherche();
                                        afficherRequeteEtLancerRecherche();
                                }
                        }
                });

                vue.getChampSaisieCliquable().addClickHandler(new ClickHandler() {
                        public void onClick(ClickEvent event) {
                                if (vue.getValeurRechercheSimple().equals(vue.getLabelRecherche())) {
                                        vue.setValeurRechercheSimple("");
                                }
                        }
                });

                vue.getChampsAuteur().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
                vue.getChampsDate().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
                vue.getChampsFamille().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
                vue.getChampsGenre().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
                vue.getChampsMotCle().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
                vue.getChampsMotCleCel().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
                vue.getChampsMotCleDel().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
                vue.getChampsDepartement().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());
                vue.getChampsContientMots().addKeyPressHandler(creerGestionnaireEvenementToucheEntree());

        }

        public KeyPressHandler creerGestionnaireEvenementToucheEntree() {
                return new KeyPressHandler() {
                        public void onKeyPress(KeyPressEvent event) {
                                if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
                                        vue.basculerAffichageZoneCache();
                                        collecterInfosRecherche();
                                        afficherRequeteEtLancerRecherche();
                                }
                        }
                };
        }

        private void nettoyerChamps() {
                completionCommunesPresenteur.nettoyer();
                completionTaxonsPresenteur.nettoyer();
                vue.nettoyer();
        }

        public void collecterInfosRecherche() {
                InformationsRecherche informationRecherche = new InformationsRecherche();
                informationRecherche.setRechercheLibre(this.getRechercheLibre());
                if (this.typeMoteur == TypeMoteur.AVANCEE) {
                        informationRecherche.setTaxon(completionTaxonsPresenteur.getValeur());
                        informationRecherche.setDepartement(vue.getDepartement());
                        informationRecherche.setCommune(completionCommunesPresenteur.getValeur());
                        informationRecherche.setFamille(vue.getFamille());
                        informationRecherche.setGenre(vue.getGenre());
                        if(estPourRechercheObservations()) {
                                informationRecherche.setMotClef(vue.getMotCle());
                        } else {
                                informationRecherche.setMotClefDel(vue.getMotCleDel());
                                informationRecherche.setMotClefCel(vue.getMotCleCel());
                        }
                        informationRecherche.setTag(vue.getMotCle());
                        informationRecherche.setAuteur(vue.getAuteur());
                        informationRecherche.setDate(vue.getDate());
                        informationRecherche.setReferentiel(vue.getReferentiel());
                }
                
                if(CacheClient.getInstance().getReferentielNonModifiable()) {
                        informationRecherche.setReferentiel(CacheClient.getInstance().getReferentielCourant());
                }

                if (estPourRechercheImages()) {
                        CacheClient.getInstance().setPageCouranteRechercheImages(1);
                        CacheClient.getInstance().setInformationsRechercheImage(informationRecherche);
                } else if (estPourRechercheObservations()) {
                        CacheClient.getInstance().setPageCouranteRechercheObservations(1);
                        CacheClient.getInstance().setInformationsRechercheObservation(informationRecherche);
                }
        }

        private String getRechercheLibre() {
                String rechercheLibre = "";
                switch (this.typeMoteur) {
                case SIMPLE:
                        rechercheLibre = vue.getValeurRechercheSimple();
                        break;
                case AVANCEE:
                        rechercheLibre = vue.getContientMots();
                        break;
                default:
                        // TODO : voir comment gérer les exceptions proprement
                        // throw new
                        // Exception("Le type de moteur de recherche indiqué n'est pas disponible");
                }
                return rechercheLibre;
        }

        private InformationsRecherche getInformationsRechercheEnCache() {
                if (estPourRechercheImages()) {
                        return CacheClient.getInstance().getInformationsRechercheImage();
                } else if (estPourRechercheObservations()) {
                        return CacheClient.getInstance().getInformationsRechercheObservation();
                }
                return null;
        }

        public void afficherRequeteEtLancerRecherche() {
                InformationsRecherche informationsRecherche = getInformationsRechercheEnCache();
                if (informationsRecherche != null) {
                        completionTaxonsPresenteur.setValeur(informationsRecherche.getTaxon());
                        completionCommunesPresenteur.setValeur(informationsRecherche.getCommune());
                        vue.chargerValeursRecherchePrecedente(informationsRecherche);
                }
                lancerRecherche();
                //presenteurRss.genererLien(informationsRecherche);
        }

        public abstract void lancerRecherche();
}