Subversion Repositories eFlore/Applications.del

Rev

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

package org.tela_botanica.del.client.composants.votes.barrerepartition;

import java.util.Date;

import org.tela_botanica.del.client.cache.CacheClient;
import org.tela_botanica.del.client.modeles.MoyenneVote;
import org.tela_botanica.del.client.modeles.PropositionDetermination;
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.voteDetermination.EvenementVoteDetermination;
import org.tela_botanica.del.client.services.CalculVoteDeterminationService;
import org.tela_botanica.del.client.services.rest.VoteDeterminationService;
import org.tela_botanica.del.client.services.rest.async.AjoutVoteDeterminationCallback;

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

public class BarreRepartitionVotePresenteur {

        public interface Vue extends IsWidget {
                public void afficherVotes(int pourcentage, String NomTaxon, String auteur, boolean estPropositionInitiale);
                public HasClickHandlers getBoutonOui();
                public HasClickHandlers getBoutonNon();
                public void desactiverBoutons();
                public void activerBoutons();
                public void setVoteOuiEffectue();
                public void setVoteNonEffectue();
                public void afficherVotePrisEnCompte(boolean b);
                public void afficherVoteModifie(boolean b);
                public void toggleNomEspece();
                public HasText getScore();
        }

        private Vue vue;
        private MoyenneVote moyenneVote;

        // TODO: classe conteneur qui est passé en paramètre au constructeur
        private VoteDeterminationService voteDeterminationService;

        public BarreRepartitionVotePresenteur(Vue vue, VoteDeterminationService voteDeterminationService) {
                this.vue = vue;
                this.voteDeterminationService = voteDeterminationService;
                gererEvenements();
        }

        public void go(HasWidgets container) {
                container.add(vue.asWidget());
        }

        public void afficherVotes(MoyenneVote moyenneVote) {
                this.moyenneVote = moyenneVote;
                int score = moyenneVote.getScore();
                String intitule = moyenneVote.getIntituleAssocie();
                PropositionDetermination proposition = moyenneVote.getPropositionAssociee();
                boolean estPropositionInitiale = false;
                if (proposition != null) {
                        estPropositionInitiale = moyenneVote.getPropositionAssociee().estPropositionInitiale();
                } 
                vue.afficherVotes(score, intitule, moyenneVote.getPropositionAssociee().getAuteur(), estPropositionInitiale);
                afficherValeurVoteUtilisateur();
        }
        
        public void afficherValeurVoteUtilisateur() {
                String idUtilisateur = CacheClient.getInstance().getUtilisateur().getId();
                if(moyenneVote.getPropositionAssociee().utilisateurAVotePourDetermination(idUtilisateur)) {
                        boolean valeurVote = (moyenneVote.getPropositionAssociee().getVotesDeterminations().get(idUtilisateur).getVote() == 1) ? true : false; 
                        if(valeurVote) {
                                vue.setVoteOuiEffectue();
                        } else {
                                vue.setVoteNonEffectue();
                        }
                }
        }

        public Vue getBarreRepartitionVoteVue() {
                return vue;
        }

        public MoyenneVote getMoyenneVote() {
                return moyenneVote;
        }

        public void gererEvenements() {

                vue.getBoutonOui().addClickHandler(new ClickHandler() {
                        @Override
                        public void onClick(ClickEvent event) {
                                voter(true);
                                
                        }
                });

                vue.getBoutonNon().addClickHandler(new ClickHandler() {
                        @Override
                        public void onClick(ClickEvent event) {
                                voter(false);
                        
                        }
                });
        }

        private void surVoteDetermination(final VoteDetermination vd) {
                if (vd.getPropositionDetermination().equals(moyenneVote.getPropositionAssociee())) {
                        AjoutVoteDeterminationCallback vdc = new AjoutVoteDeterminationCallback() {

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

                                @Override
                                public void surRetour(Void objetRetour) {
                                        moyenneVote.getPropositionAssociee().ajouterVoteDetermination(vd);
                                        moyenneVote = CalculVoteDeterminationService.calculerVoteDetermination(moyenneVote.getPropositionAssociee());
                                        afficherVotes(moyenneVote);
                                        vue.activerBoutons();
                                        boolean valeurVote = (vd.getVote() == 1) ? true : false; 
                                        if(valeurVote) {
                                                vue.setVoteOuiEffectue();
                                        } else {
                                                vue.setVoteNonEffectue();
                                        }
                                        // l'évènement n'est lancé que si le vote est validé
                                        BusEvenementiel.getInstance().fireEvent(new EvenementVoteDetermination(vd));
                                }
                        };

                        if (moyenneVote.getPropositionAssociee().utilisateurAVotePourDetermination(vd.getContributeur())) {
                                
                                voteDeterminationService.modifierVote(vd, vdc);
                                vue.afficherVoteModifie(vd.getVote()==1);
                        } else {
                                
                                voteDeterminationService.ajouterVote(vd, vdc);
                                vue.afficherVotePrisEnCompte(vd.getVote()==1);
                        }
                }
        }
        
        public void toggleNomEspece() {
                vue.toggleNomEspece();
        }

        public void voter(boolean oui) {

                VoteDetermination vd = new VoteDetermination();
                vd.setPropositionDetermination(moyenneVote.getPropositionAssociee());
                vd.setContributeur(CacheClient.getInstance().getUtilisateur().getId());
                vd.setDate(new Date());

                int valeurVote = oui ? 1 : 0;
                vd.setVote(valeurVote);
                vd.setId(CacheClient.getInstance().getUtilisateur().getId());

                if (oui) {
                        vue.setVoteOuiEffectue();
                } else {
                        vue.setVoteNonEffectue();
                }
                vue.desactiverBoutons();
                surVoteDetermination(vd);
        }
}