Subversion Repositories eFlore/Applications.del

Rev

Rev 1577 | Rev 1886 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package org.tela_botanica.del.client.composants.formulaires.formulaireproposition;

import java.util.Date;
import java.util.HashMap;
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.validation.ValidateurChampTexteNonNul;
import org.tela_botanica.del.client.config.Config;
import org.tela_botanica.del.client.modeles.Contributeur;
import org.tela_botanica.del.client.modeles.InterventionForum;
import org.tela_botanica.del.client.modeles.PropositionDetermination;
import org.tela_botanica.del.client.modeles.Utilisateur;
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.EvenementAjoutDetermination;
import org.tela_botanica.del.client.services.ReferentielService;
import org.tela_botanica.del.client.services.rest.PropositionDeterminationService;
import org.tela_botanica.del.client.services.rest.async.PropositionDeterminationCallBack;
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.http.client.Response;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;

public class FormulairePropositionPresenteur extends Presenteur {

        public interface Vue extends IsWidget {
                public HasText getObjetNom();

                public HasText getObjetPrenom();

                public HasWidgets getPropositionTaxon();

                public HasText getCommentaires();

                public HasClickHandlers getBoutonValidationProposition();

                public void afficherNomPrenomEtDesactiver(String nom, String prenom);

                public String getCourriel();

                public void afficherEmailEtDesactiver(String courriel);

                public String getNom();

                public String getPrenom();

                public void afficherStyleErreurNom(String styleErreur);

                public void supprimerStyleErreurNom(String styleErreur);

                public void afficherStyleErreurPrenom(String styleErreur);

                public void supprimerStyleErreurPrenom(String styleErreur);
                
                public void afficherPropositionDejaEffectuée(String taxon);

                public HasText getObjetCourriel();
                
                public void setReferentiel(String referentiel);
                
                public String getReferentiel();

                public void afficherStyleErreurCourriel(String styleErreur);

                void supprimerStyleErreurCourriel(String styleErreur);

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

        private Vue vue;
        private Config config;
        private AutoCompletionComboBoxPresenteur autoCompletionNomTaxonsPresenteur;
        private PropositionDeterminationService propositionDeterminationService;
        
        private Map<String, String> cacheTaxons = new HashMap<String, String>();

        public FormulairePropositionPresenteur(Vue vue, PropositionDeterminationService propositionDeterminationService) {
                this.vue = vue;
                this.propositionDeterminationService=propositionDeterminationService;
                config = new Config();
                creerCompletionTaxons();
                remplirAvecInfosUtilisateur();
        }

        private void remplirAvecInfosUtilisateur() {
                Utilisateur utilisateur = CacheClient.getInstance().getUtilisateur();
                if (utilisateur.estIdentifie()) {
                        vue.afficherNomPrenomEtDesactiver(utilisateur.getNom(), utilisateur.getPrenom());
                        vue.afficherEmailEtDesactiver(utilisateur.getCourriel());
                }
        }

        private void creerCompletionTaxons() {
                String url = this.config.getServiceBaseUrl() + "nomstaxons";
                vue.remplirListeReferentiels(ReferentielService.getReferentiels());
                final String referentiel = CacheClient.getInstance().getObservationCourante().getReferentiel();
                String referentielPredefini = referentiel.substring(0, 5);
                if (referentielPredefini.equals("autre") || referentielPredefini.equals("")) {
                        referentielPredefini = "bdtfx"; // évite de saisir des noms latins en dur et de perdre le nn
                }
                vue.setReferentiel(referentielPredefini);
                autoCompletionNomTaxonsPresenteur = 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("") && !vue.getReferentiel().equals("tous")) {
                                        requete = "?masque.nom=" + requete + "&masque.referentiel=" + vue.getReferentiel().substring(0, 5);
                                        return requete;
                                } else {
                                        return null;
                                }
                        }

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

        public void go(HasWidgets composite) {
                autoCompletionNomTaxonsPresenteur.go(vue.getPropositionTaxon());
                composite.add(vue.asWidget());
                gererEvenements();
        }

        protected void gererEvenements() {
                vue.getBoutonValidationProposition().addClickHandler(new ClickHandler() {
                        @Override
                        public void onClick(ClickEvent event) {

                                if (!validerSaisieProposition()) {
                                        return;
                                } else {
                                        final PropositionDetermination propositionAjoutee = collecterValeursSaisieProposition();
                                        if(verifierPropositionDejaAjoutee(propositionAjoutee)){
                                                BusEvenementiel.getInstance().fireEvent(new EvenementAjoutDetermination(propositionAjoutee));
                                                vue.afficherPropositionDejaEffectuée(propositionAjoutee.getEspece());
                                                return;
                                        }

                                        propositionDeterminationService.ajouterProposition(propositionAjoutee, new PropositionDeterminationCallBack() {

                                                @Override
                                                public void surRetour(String idNouvelleProposition) {
                                                        propositionAjoutee.setId(idNouvelleProposition);
                                                        CacheClient.getInstance().getObservationCourante().ajouterPropositionDetermination(propositionAjoutee);
                                                        EvenementAjoutDetermination evenementAjoutDetermination = new EvenementAjoutDetermination(propositionAjoutee);
                                                        BusEvenementiel.getInstance().fireEvent(evenementAjoutDetermination);
                                                }

                                        });
                                }
                        }
                });
        }

        private boolean verifierPropositionDejaAjoutee(PropositionDetermination propositionDetermination){
                for(InterventionForum interventionForum: CacheClient.getInstance().getObservationCourante().getInterventionsForum()){
                        if(interventionForum instanceof PropositionDetermination){
                                if(((PropositionDetermination)interventionForum).getEspece().equals(propositionDetermination.getEspece())){
                                        return true;
                                }
                        }
                }
                return false;
        }
        
        private boolean validerSaisieProposition() {

                ValidateurChampTexteNonNul validateurNom = new ValidateurChampTexteNonNul(vue.getObjetNom()) {
                        @Override
                        public void afficherStyleErreur(String styleErreur) {
                                vue.afficherStyleErreurNom(styleErreur);
                        }

                        @Override
                        public void supprimerStyleErreur(String styleErreur) {
                                vue.supprimerStyleErreurNom(styleErreur);
                        }
                };

                ValidateurChampTexteNonNul validateurPrenom = new ValidateurChampTexteNonNul(vue.getObjetPrenom()) {
                        @Override
                        public void afficherStyleErreur(String styleErreur) {
                                vue.afficherStyleErreurPrenom(styleErreur);
                        }

                        @Override
                        public void supprimerStyleErreur(String styleErreur) {
                                vue.supprimerStyleErreurPrenom(styleErreur);
                        }
                };
                
                ValidateurChampTexteNonNul validateurCourriel = new ValidateurChampTexteNonNul(vue.getObjetCourriel()) {
                        @Override
                        public void afficherStyleErreur(String styleErreur) {
                                vue.afficherStyleErreurCourriel(styleErreur);
                        }

                        @Override
                        public void supprimerStyleErreur(String styleErreur) {
                                vue.supprimerStyleErreurCourriel(styleErreur);
                        }
                };

                ValidateurChampTexteNonNul validateurTaxon = new ValidateurChampTexteNonNul(autoCompletionNomTaxonsPresenteur.getAutoCompletionComboBoxVue().getSuggestBox()) {
                        @Override
                        public void afficherStyleErreur(String styleErreur) {
                                autoCompletionNomTaxonsPresenteur.afficherStyleErreur(styleErreur);
                        }

                        @Override
                        public void supprimerStyleErreur(String styleErreur) {
                                autoCompletionNomTaxonsPresenteur.supprimerStyleErreur(styleErreur);
                        }
                };

                boolean nomSaisi = validateurNom.valider();
                boolean prenomSaisi = validateurPrenom.valider();
                boolean courrielSaisi = validateurCourriel.valider();
                boolean taxonSaisi = validateurTaxon.valider();

                return nomSaisi && prenomSaisi && courrielSaisi && taxonSaisi;
        }

        private PropositionDetermination collecterValeursSaisieProposition() {
                PropositionDetermination propositionAjoutee = new PropositionDetermination(CacheClient.getInstance().getObservationCourante());
                propositionAjoutee.setId(CacheClient.getInstance().getObservationCourante().getId());

                String idUtilisateur = null;
                if (CacheClient.getInstance().getUtilisateur().estIdentifie()) {
                        idUtilisateur = CacheClient.getInstance().getUtilisateur().getId();
                }

                Contributeur contributeur = new Contributeur(idUtilisateur, vue.getNom(), vue.getPrenom(), vue.getCourriel());
                propositionAjoutee.setContributeur(contributeur);
                propositionAjoutee.setDate(new Date());
                
                String nomTaxon = autoCompletionNomTaxonsPresenteur.getValeur();
                propositionAjoutee.setEspece(nomTaxon);
                if(cacheTaxons.containsKey(nomTaxon)) {
                        propositionAjoutee.setNumNomenclatural(cacheTaxons.get(nomTaxon));
                }
                
                if(vue.getReferentiel() != "tous") {
                        propositionAjoutee.setReferentiel(vue.getReferentiel());
                }
                
                if (vue.getCommentaires().getText() != "") {
                        String contenuCommentaire = vue.getCommentaires().getText();
                        propositionAjoutee.setCommentaire(contenuCommentaire);
                }

                return propositionAjoutee;
        }
}