Subversion Repositories eFlore/Applications.del

Rev

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

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

import java.util.Iterator;
import java.util.List;

import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlayDefilanteVue;
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlaySimplePresenteur;
import org.tela_botanica.del.client.composants.formulairerechercheeflore.FormulaireRechercheEflorePresenteur;
import org.tela_botanica.del.client.composants.formulaires.formulairecommentaire.FormulaireCommentairePresenteur;
import org.tela_botanica.del.client.composants.formulaires.formulairecommentaire.FormulaireCommentaireVue;
import org.tela_botanica.del.client.composants.formulaires.formulaireproposition.FormulairePropositionPresenteur;
import org.tela_botanica.del.client.composants.formulaires.formulaireproposition.FormulairePropositionVue;
import org.tela_botanica.del.client.composants.forum.ForumPresenteur;
import org.tela_botanica.del.client.composants.forum.ForumVue;
import org.tela_botanica.del.client.composants.metadonnees.MetadonneesEnLigneVue;
import org.tela_botanica.del.client.composants.metadonnees.MetadonneesPresenteur;
import org.tela_botanica.del.client.composants.observations.ObservationImagesPresenteur;
import org.tela_botanica.del.client.composants.observations.ObservationImagesVue;
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.gestionhistorique.ConstantesNavigation;
import org.tela_botanica.del.client.modeles.Image;
import org.tela_botanica.del.client.modeles.ModeRecherche;
import org.tela_botanica.del.client.modeles.MoyenneVote;
import org.tela_botanica.del.client.modeles.Observation;
import org.tela_botanica.del.client.modeles.ObservationServiceResultat;
import org.tela_botanica.del.client.modeles.Protocole;
import org.tela_botanica.del.client.modeles.ProtocoleServiceResultat;
import org.tela_botanica.del.client.modeles.VoteDetermination;
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.EvenementAjoutCommentaire;
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.GestionnaireEvenementAjoutCommentaire;
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.EvenementAjoutDetermination;
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.GestionnaireEvenementAjoutDetermination;
import org.tela_botanica.del.client.navigation.evenement.changementimagevalidation.EvenementChangementImageValidation;
import org.tela_botanica.del.client.navigation.evenement.changementimagevalidation.GestionnaireEvenementChangementImageValidation;
import org.tela_botanica.del.client.navigation.evenement.voteDetermination.EvenementVoteDetermination;
import org.tela_botanica.del.client.navigation.evenement.voteDetermination.GestionnaireEvenementVoteDetermination;
import org.tela_botanica.del.client.services.CalculVoteDeterminationService;
import org.tela_botanica.del.client.services.rest.CommentaireServiceConcret;
import org.tela_botanica.del.client.services.rest.ObservationService;
import org.tela_botanica.del.client.services.rest.PropositionDeterminationServiceConcret;
import org.tela_botanica.del.client.services.rest.ProtocoleService;
import org.tela_botanica.del.client.services.rest.async.ObservationsCallback;
import org.tela_botanica.del.client.services.rest.async.ProtocolesCallback;
import org.tela_botanica.del.client.utils.URLUtils;
import org.tela_botanica.del.client.vues.pictoflora.plateformedetermination.ligneProtocole.LigneProtocolePresenteur;
import org.tela_botanica.del.client.vues.pictoflora.plateformedetermination.ligneProtocole.LigneProtocoleVue;

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.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Panel;

public class PictofloraDeterminationPresenteur extends Presenteur {

        /**
         * Vue de l'interface de détermination
         * */
        public interface Vue extends IsWidget {
                public Panel getForum();

                public Panel getDetailImageObservation();

                public Panel getFormulaireRechercheEflore();

                public Panel getVoteProtocole();

                public Button getBoutonAjoutProposition();

                public Button getBoutonAjoutCommentaire();

                public Button getBoutonAjoutPropositionBas();

                public Button getBoutonAjoutCommentaireBas();

                public HasWidgets getMetadonnees();

                public HasWidgets getNouvelleLigneProtocole();

                public void afficherNomTaxonProbable(String nomTaxon);
                
                public HasClickHandlers getLienOuvrages();
                
                public HasClickHandlers getLienBonnier();
                
                public HasClickHandlers getLienCles();
                
                public HasClickHandlers getLienEflore();
        
                public HasWidgets getZoneRss();
        }

        private Vue vue;
        private FenetreOverlaySimplePresenteur fenetreOverlaySimplePresenteur;

        // Déclaration des services à utiliser
        private ProtocoleService protocoleService;
        private ObservationService observationService;

        private CacheClient cache = CacheClient.getInstance();

        public PictofloraDeterminationPresenteur(Vue vue, ObservationService observationService, ProtocoleService protocoleService) {
                this.vue = vue;
                this.protocoleService = protocoleService;
                this.observationService = observationService;
        }

        public void go(final HasWidgets composite) {

                // TODO afficher une icone de chargement si le chargement devient trop
                // long
                // car tout l'écran est asynchrone ici
                String observationId = URLUtils.getURLSpecialParameterValue();

                observationService.getObservation(observationId, new ObservationsCallback() {

                        @Override
                        public void surRetour(ObservationServiceResultat objetRetour) {
                                afficherRss(cache.getObservationCourante());
                                // trouve l'image courante si elle n'est pas deja en cache
                                List<Image> listeImages = cache.getObservationCourante().getImages();
                                if (listeImages.size() > 0) {
                                        CacheClient.getInstance().setImageCourante(listeImages.get(0));
                                } else {
                                        CacheClient.getInstance().setImageCourante(null);
                                }

                                new MetadonneesPresenteur(new MetadonneesEnLigneVue(), cache.getObservationCourante(), ModeRecherche.MODE_OBSERVATION, false).go(vue.getMetadonnees());
                                new ObservationImagesPresenteur(new ObservationImagesVue(), cache.getObservationCourante(), CacheClient.getInstance().getImageCourante(), ConstantesNavigation.PAGE_VALIDATION_PICTOFLORA).go(vue.getDetailImageObservation());
                                chargerEtAjouterLignesVotesProtocole();
                                new ForumPresenteur(new ForumVue()).go(vue.getForum());
                                new FormulaireRechercheEflorePresenteur().go(vue.getFormulaireRechercheEflore());

                                calculerEtAfficherVoteDeterminationPlusPopulaire();
                                composite.add(vue.asWidget());

                        }

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

        public void afficherRss(Observation observation) {
                new RssPresenteur(new RssVue(), observation, "Suivre cette observation").go(vue.getZoneRss());
        }
        private void chargerEtAjouterLignesVotesProtocole() {
                if (cache.getListeProtocoles() == null) {
                        protocoleService.getProtocoles(new ProtocolesCallback() {

                                @Override
                                public void surRetour(ProtocoleServiceResultat protocolesRecus) {
                                        List<Protocole> listeProtocoles = protocolesRecus.getProtocoles();
                                        ajouterLignesVotesProtocole(listeProtocoles);
                                }
                        });
                } else {
                        List<Protocole> listeProtocoles = cache.getListeProtocoles();
                        ajouterLignesVotesProtocole(listeProtocoles);
                }
        }

        private void ajouterLignesVotesProtocole(List<Protocole> listeProtocoles) {
                for (Iterator<Protocole> iterator = listeProtocoles.iterator(); iterator.hasNext();) {
                        Protocole protocole = iterator.next();
                        LigneProtocolePresenteur presenteurLigneProtocole = new LigneProtocolePresenteur(protocole, new LigneProtocoleVue());
                        presenteurLigneProtocole.go(vue.getNouvelleLigneProtocole());
                }
        }

        private void calculerEtAfficherVoteDeterminationPlusPopulaire() {

                Observation observation = cache.getObservationCourante();
                String nomTaxon = observation.getNomRetenu();

                List<MoyenneVote> votesOrdonnes = CalculVoteDeterminationService.calculerVoteDeterminationPlusPopulaire(cache.getObservationCourante().getPropositionDeterminations());
                if (votesOrdonnes.size() > 0) {
                        nomTaxon = votesOrdonnes.get(0).getIntituleAssocie();
                }

                vue.afficherNomTaxonProbable(nomTaxon);
        }

        public void gererEvenements() {
                
                BusEvenementiel.getInstance().addHandler(EvenementVoteDetermination.TYPE, new GestionnaireEvenementVoteDetermination() {
                        @Override
                        public void onVoteDetermination(VoteDetermination event) {
                                calculerEtAfficherVoteDeterminationPlusPopulaire();
                        }
                });

                ClickHandler clicAjoutProposition = new ClickHandler() {
                        @Override
                        public void onClick(ClickEvent event) {
                                fenetreOverlaySimplePresenteur = new FenetreOverlaySimplePresenteur(new FenetreOverlayDefilanteVue());
                                fenetreOverlaySimplePresenteur.ouvrirFenetreModale(new FormulairePropositionPresenteur(new FormulairePropositionVue(), new PropositionDeterminationServiceConcret()));
                        }
                };
                vue.getBoutonAjoutProposition().addClickHandler(clicAjoutProposition);
                vue.getBoutonAjoutPropositionBas().addClickHandler(clicAjoutProposition);

                ClickHandler clicAjoutCommentaire = new ClickHandler() {
                        @Override
                        public void onClick(ClickEvent event) {
                                FormulaireCommentairePresenteur commentairePresenteur = new FormulaireCommentairePresenteur(cache.getObservationCourante(), new CommentaireServiceConcret(), new FormulaireCommentaireVue());
                                fenetreOverlaySimplePresenteur = new FenetreOverlaySimplePresenteur(new FenetreOverlayDefilanteVue());
                                fenetreOverlaySimplePresenteur.ouvrirFenetreModale(commentairePresenteur);
                        }
                };
                vue.getBoutonAjoutCommentaire().addClickHandler(clicAjoutCommentaire);
                vue.getBoutonAjoutCommentaireBas().addClickHandler(clicAjoutCommentaire);

                BusEvenementiel.getInstance().addHandler(EvenementAjoutDetermination.TYPE, new GestionnaireEvenementAjoutDetermination() {
                        @Override
                        public void onAjoutDetermination(EvenementAjoutDetermination event) {
                                if (fenetreOverlaySimplePresenteur != null && fenetreOverlaySimplePresenteur.fenetreModaleEstOuverte()) {
                                        fenetreOverlaySimplePresenteur.fermerFenetreModale();
                                }
                        }
                });

                BusEvenementiel.getInstance().addHandler(EvenementAjoutCommentaire.TYPE, new GestionnaireEvenementAjoutCommentaire() {

                        @Override
                        public void onAjoutCommentaire(EvenementAjoutCommentaire event) {
                                if (fenetreOverlaySimplePresenteur != null && fenetreOverlaySimplePresenteur.fenetreModaleEstOuverte()) {
                                        fenetreOverlaySimplePresenteur.fermerFenetreModale();
                                }
                        }
                });

                BusEvenementiel.getInstance().addHandler(EvenementChangementImageValidation.TYPE, new GestionnaireEvenementChangementImageValidation() {

                        @Override
                        public void onChangementImage(EvenementChangementImageValidation event) {
                                vue.getDetailImageObservation().clear();
                                vue.getVoteProtocole().clear();
                                new ObservationImagesPresenteur(new ObservationImagesVue(), cache.getObservationCourante(), CacheClient.getInstance().getImageCourante(), ConstantesNavigation.PAGE_VALIDATION_PICTOFLORA).go(vue.getDetailImageObservation());
                                chargerEtAjouterLignesVotesProtocole();
                        }
                });
                
                
                vue.getLienOuvrages().addClickHandler(new ClickHandler() {
                        
                        @Override
                        public void onClick(ClickEvent event) {
                                Config config = new Config();
                                Window.open(config.getUrl("ouvragesFlore"), "Flores numérisées", null);
                        }
                });

                vue.getLienBonnier().addClickHandler(new ClickHandler() {
                
                        @Override
                        public void onClick(ClickEvent event) {
                                Config config = new Config();
                                Window.open(config.getUrl("bonnierPda"), "Flore Bonnier PDA", null);
                        }
                });
                
                vue.getLienCles().addClickHandler(new ClickHandler() {
                        
                        @Override
                        public void onClick(ClickEvent event) {
                                Config config = new Config();
                                Window.open(config.getUrl("clesDetermination"), "Clés de determination", null);
                        }
                });
                
                vue.getLienEflore().addClickHandler(new ClickHandler() {
                        
                        @Override
                        public void onClick(ClickEvent event) {
                                Config config = new Config();
                                Window.open(config.getUrl("eflore"), "eFlore", null);
                        }
                });
        }
}