Subversion Repositories eFlore/Applications.del

Rev

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

package org.tela_botanica.del.client.composants.forum.interventions;


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.formulaires.formulairecommentaire.FormulaireCommentairePresenteur;
import org.tela_botanica.del.client.composants.formulaires.formulairecommentaire.FormulaireCommentaireVue;
import org.tela_botanica.del.client.composants.forum.ArbreCommentairePresenteur;
import org.tela_botanica.del.client.composants.forum.ArbreCommentaireVue;
import org.tela_botanica.del.client.composants.votes.barrerepartition.BarreRepartitionVotePresenteur;
import org.tela_botanica.del.client.composants.votes.barrerepartition.BarreRepartitionVoteVue;
import org.tela_botanica.del.client.composants.votes.details.DetailListeVotesDeterminationPresenteur;
import org.tela_botanica.del.client.composants.votes.details.DetailListeVotesDeterminationVue;
import org.tela_botanica.del.client.config.Config;
import org.tela_botanica.del.client.i18n.I18n;
import org.tela_botanica.del.client.modeles.Commentaire;
import org.tela_botanica.del.client.modeles.InterventionForum;
import org.tela_botanica.del.client.modeles.MoyenneVote;
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.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.changementEtatUtilisateur.EvenementChangementEtatUtilisateur;
import org.tela_botanica.del.client.navigation.evenement.changementEtatUtilisateur.GestionnaireEvenementChangementEtatUtilisateur;
import org.tela_botanica.del.client.navigation.evenement.suppressioncommentaire.EvenementSuppressionCommentaire;
import org.tela_botanica.del.client.navigation.evenement.suppressiondetermination.EvenementSuppressionDetermination;
import org.tela_botanica.del.client.navigation.evenement.validationPropositionDetermination.EvenementValidationPropositionDetermination;
import org.tela_botanica.del.client.services.CalculVoteDeterminationService;
import org.tela_botanica.del.client.services.rest.CommentaireService;
import org.tela_botanica.del.client.services.rest.CommentaireServiceConcret;
import org.tela_botanica.del.client.services.rest.PropositionDeterminationService;
import org.tela_botanica.del.client.services.rest.PropositionDeterminationServiceConcret;
import org.tela_botanica.del.client.services.rest.VoteDeterminationServiceConcret;
import org.tela_botanica.del.client.services.rest.async.SuppressionCommentaireCallback;
import org.tela_botanica.del.client.services.rest.async.SuppressionPropositionDeterminationCallback;
import org.tela_botanica.del.client.services.rest.async.ValidationPropositionCallback;
import org.tela_botanica.del.client.utils.ModerationUtils;

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.HasMouseOutHandlers;
import com.google.gwt.event.dom.client.HasMouseOverHandlers;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.IsWidget;

public class ForumInterventionPresenteur {

        public interface Vue extends IsWidget {
                void ajouterInterventionDetermination(PropositionDetermination determination, IsWidget barreRepartition, IsWidget arbreCommentaires);
                void ajouterInterventionCommentaire(Commentaire commentaire, IsWidget arbreCommentaires);
                HasClickHandlers getRepondre();
                HasWidgets getEnfants();
                HasClickHandlers getLienSuppression();
                void afficherLienSuppression();
                void cacherLienSuppression();
                HasMouseOverHandlers getConteneurInterventionMouseOver();
                HasMouseOutHandlers getConteneurInterventionMouseOut();
                HasClickHandlers getEspece();
                void ajouterLienEspece();
                HasClickHandlers getAuteur();
                void ajouterLienAuteur();
                void cacherDeterminationProposee();
                void ajouterLienVotes();
                void masquerLienVotes();
                void setNbVotes(int votes);
                public HasClickHandlers getZoneNbVotes();
                public HasClickHandlers getBoutonValidationTaxon();
                void cacherBoutonValidationTaxon();
                void afficherBoutonValidationTaxon();
        }

        private Vue vue;

        private InterventionForum interventionForum;
        
        private CommentaireService commentaireService;
        
        private PropositionDeterminationService propositionDeterminationService;
        
        private FenetreOverlaySimplePresenteur overlay;

        private int nbVotes;
        
        private HandlerRegistration validationTaxonHandler;
        
        public ForumInterventionPresenteur(Vue vue, InterventionForum interventionForum, CommentaireService commentaireService, PropositionDeterminationService propositionDeterminationService) {
                this.vue = vue;
                this.interventionForum = interventionForum;
                this.commentaireService = commentaireService;
                this.propositionDeterminationService = propositionDeterminationService;
        }

        public void go(HasWidgets composite) {
                chargerIntervention();
                composite.add(vue.asWidget());
                gererEvenements();
        }
        
        public void ajouterEnfant(ForumInterventionPresenteur presenteur) {
                presenteur.go(vue.getEnfants());
        }

        private void chargerIntervention() {
                if (interventionForum instanceof PropositionDetermination) {
                        ajouterPropositionDetermination((PropositionDetermination) interventionForum);
                } else if (interventionForum instanceof Commentaire) {
                        ajouterCommentaire((Commentaire) interventionForum);
                        vue.cacherDeterminationProposee();
                }
        }

        private void ajouterPropositionDetermination(PropositionDetermination propositionDetermination) {
                final PropositionDetermination cetteProposition = propositionDetermination;
                this.nbVotes = propositionDetermination.getVotesDeterminations().size();
                
                BarreRepartitionVotePresenteur barreRepartitionVotePresenteur = new BarreRepartitionVotePresenteur(new BarreRepartitionVoteVue(), new VoteDeterminationServiceConcret());
                barreRepartitionVotePresenteur.toggleNomEspece();
                calculerEtAfficherVoteDetermination(barreRepartitionVotePresenteur, propositionDetermination);
                ArbreCommentairePresenteur arbreCommentairePresenteur = new ArbreCommentairePresenteur(new ArbreCommentaireVue(), propositionDetermination);
                vue.ajouterInterventionDetermination(propositionDetermination, barreRepartitionVotePresenteur.getBarreRepartitionVoteVue(), arbreCommentairePresenteur.getArbreCommentaireVue());
                
                final String nn = propositionDetermination.getNumNomenclatural();
                final String referentiel = propositionDetermination.getReferentiel();
                // @TODO harmoniser les valeurs qui veulent dire "y en n'a pas" plutôt que !equals("kedal") :-/
                if (nn != null && !nn.equals(0) && !nn.equals("0") && referentiel != null && !referentiel.equals("")) {
                        vue.ajouterLienEspece();
                        vue.getEspece().addClickHandler(new ClickHandler() {
                                
                                @Override
                                public void onClick(ClickEvent event) {
                                        Config config = new Config();
                                        String efloreUrlFicheTpl = config.getUrl("efloreTaxon");
                                        String efloreUrlFiche = efloreUrlFicheTpl.replaceAll("referentiel-nn-num_nom", referentiel.substring(0,5)+"-nn-"+nn);
                                        Window.open(efloreUrlFiche, "Fiche eflore", config.getInfo("popupOptions"));
                                }
                        });
                }
                
                gererAffichageBoutonValidationTaxon(cetteProposition);
                
                final String idContributeur = propositionDetermination.getContributeur().getId();
                if (idContributeur != null && !idContributeur.equals("0")) {
                        vue.ajouterLienAuteur();
                        vue.getAuteur().addClickHandler(new ClickHandler() {
                                @Override
                                public void onClick(ClickEvent event) {
                                        Config config = new Config();
                                        Window.open(config.getUrl("profil") + idContributeur, "Consultation de l'annuaire", config.getInfo("popupOptions"));
                                }
                        });
                }
        }

        private void gererAffichageBoutonValidationTaxon(final PropositionDetermination cetteProposition) {
                if (doitAfficherBoutonValidation(cetteProposition)) {
                        vue.afficherBoutonValidationTaxon();    
                        if(validationTaxonHandler != null) {
                                validationTaxonHandler.removeHandler();
                        }
                        validationTaxonHandler = vue.getBoutonValidationTaxon().addClickHandler(new ClickHandler() {                    
                                @Override
                                public void onClick(ClickEvent event) {
                                        if (Window.confirm(I18n.getVocabulary().confirmationValidationDetermination())) {
                                                validerProposition(cetteProposition);
                                        }
                                }
                        });
                } else {
                        vue.cacherBoutonValidationTaxon();
                }
        }

        private void ajouterCommentaire(Commentaire proposition) {
                ArbreCommentairePresenteur arbreCommentairePresenteur = new ArbreCommentairePresenteur(new ArbreCommentaireVue(), proposition);
                vue.ajouterInterventionCommentaire(proposition, arbreCommentairePresenteur.getArbreCommentaireVue());
        }

        private void calculerEtAfficherVoteDetermination(BarreRepartitionVotePresenteur barreRepartitionVotePresenteur, PropositionDetermination propositionDetermination) {
                MoyenneVote votes = CalculVoteDeterminationService.calculerVoteDetermination(propositionDetermination);
                barreRepartitionVotePresenteur.afficherVotes(votes);
        }
        
        private void gererEvenements() {
                if (this.nbVotes > 0) {
                        vue.setNbVotes(this.nbVotes);
                        vue.ajouterLienVotes();
                        vue.getZoneNbVotes().addClickHandler(new ClickHandler() {
                                @Override
                                public void onClick(ClickEvent event) {
                                        if (nbVotes > 0) {
                                                FenetreOverlaySimplePresenteur fenetreOverlaySimplePresenteur = new FenetreOverlaySimplePresenteur(
                                                                new FenetreOverlayDefilanteVue());
                                                DetailListeVotesDeterminationPresenteur detailListeVotesDeterminationPresenteur = new DetailListeVotesDeterminationPresenteur(
                                                                new DetailListeVotesDeterminationVue());
                                                fenetreOverlaySimplePresenteur
                                                                .ouvrirFenetreModale(detailListeVotesDeterminationPresenteur);
                                                detailListeVotesDeterminationPresenteur
                                                                .afficherVotes((PropositionDetermination) interventionForum);
                                        }
                                }
                        });
                } else {
                        vue.masquerLienVotes();
                }
                
                vue.getRepondre().addClickHandler(new ClickHandler() {
                        @Override
                        public void onClick(ClickEvent event) {
                                FormulaireCommentairePresenteur commentairePresenteur = new FormulaireCommentairePresenteur(interventionForum, new CommentaireServiceConcret(), new FormulaireCommentaireVue());
                                overlay = new FenetreOverlaySimplePresenteur(new FenetreOverlayDefilanteVue());
                                overlay.ouvrirFenetreModale(commentairePresenteur);
                        }
                });
                
                vue.getConteneurInterventionMouseOver().addMouseOverHandler(new MouseOverHandler() {            
                        @Override
                        public void onMouseOver(MouseOverEvent event) {
                                if(peutSupprimerIntervention()) {
                                        vue.afficherLienSuppression();
                                }
                        }
                });
                
                vue.getConteneurInterventionMouseOut().addMouseOutHandler(new MouseOutHandler() {
                        @Override
                        public void onMouseOut(MouseOutEvent event) {
                                if(peutSupprimerIntervention()) {
                                        vue.cacherLienSuppression();
                                }
                        }               
                });

                vue.getLienSuppression().addClickHandler(new ClickHandler() {           
                        @Override
                        public void onClick(ClickEvent event) {
                                
                                String message = "";
                                if (interventionForum instanceof PropositionDetermination) {
                                        message = I18n.getVocabulary().confirmationSuppressionDetermination();
                                } else if (interventionForum instanceof Commentaire) {
                                        message = I18n.getVocabulary().confirmationSuppressionCommentaire();
                                }
                                
                                if(Window.confirm(message)) {
                                        supprimerIntervention();
                                }
                        }
                });
                vue.cacherLienSuppression();
                
                BusEvenementiel.getInstance().addHandler(EvenementAjoutDetermination.TYPE, new GestionnaireEvenementAjoutDetermination() {
                        @Override
                        public void onAjoutDetermination(EvenementAjoutDetermination event) {
                                if(overlay != null && overlay.fenetreModaleEstOuverte()) {
                                        overlay.fermerFenetreModale();
                                }
                        }
                });

                BusEvenementiel.getInstance().addHandler(EvenementAjoutCommentaire.TYPE, new GestionnaireEvenementAjoutCommentaire() {
                        @Override
                        public void onAjoutCommentaire(EvenementAjoutCommentaire event) {
                                if(overlay != null && overlay.fenetreModaleEstOuverte()) {
                                        overlay.fermerFenetreModale();
                                }
                        }
                });
                
                BusEvenementiel.getInstance().addHandler(EvenementChangementEtatUtilisateur.TYPE, new GestionnaireEvenementChangementEtatUtilisateur() {
                        @Override
                        public void onModificationEtatUtilisateur(EvenementChangementEtatUtilisateur evenementChangementEtatUtilisateur) {
                                if (interventionForum instanceof PropositionDetermination) {
                                        gererAffichageBoutonValidationTaxon((PropositionDetermination)interventionForum);
                                }
                        }
                });
        }
        
        private boolean peutSupprimerIntervention() {
                return (!interventionForum.aDesCommentaires() && interventionForum.getContributeur() != null && interventionForum.getContributeur().getId().equals(CacheClient.getInstance().getUtilisateur().getId()));
        }
        
        private void supprimerIntervention() {
                if(interventionForum instanceof PropositionDetermination) {
                        propositionDeterminationService.supprimerProposition((PropositionDetermination)interventionForum, new SuppressionPropositionDeterminationCallback() {   
                                @Override
                                public void surRetour(String objetRetour) {
                                        CacheClient.getInstance().getObservationCourante().supprimerIntervention(interventionForum);
                                        BusEvenementiel.getInstance().fireEvent(new EvenementSuppressionDetermination((PropositionDetermination)interventionForum));
                                }
                        });
                }
                
                if(interventionForum instanceof Commentaire) {
                        commentaireService.supprimerCommentaire((Commentaire)interventionForum, new SuppressionCommentaireCallback() {                  
                                @Override
                                public void surRetour(String objetRetour) {
                                        CacheClient.getInstance().getObservationCourante().supprimerIntervention(interventionForum);
                                        BusEvenementiel.getInstance().fireEvent(new EvenementSuppressionCommentaire((Commentaire)interventionForum));
                                }
                        });
                }
        }
        
        private boolean doitAfficherBoutonValidation(PropositionDetermination propositionDetermination) {               
                boolean estPropositionRetenue = propositionDetermination.estPropositionRetenue();
                String numNomProp = propositionDetermination.getNumNomenclatural();
                String referentielProp = propositionDetermination.getReferentiel();
                
                boolean aUnNumNom = (numNomProp != null && !numNomProp.trim().equals("") && !numNomProp.trim().equals("0"));
                boolean aUnReferentiel = (referentielProp != null && !referentielProp.trim().equals("") && !referentielProp.trim().equals("0"));
                
                Utilisateur utilisateur = CacheClient.getInstance().getUtilisateur();
                boolean estAuteurObservation = false;
                if(utilisateur != null) {
                        estAuteurObservation = utilisateur.estIdentifie() && utilisateur.getId().equals(CacheClient.getInstance().getObservationCourante().getIdAuteur());
                }
                boolean peutValiderObservation = ModerationUtils.utilisateurPeutValiderObservation(CacheClient.getInstance().getUtilisateur(), CacheClient.getInstance().getObservationCourante());
                return (peutValiderObservation || estAuteurObservation) && aUnReferentiel && aUnNumNom && !estPropositionRetenue;
        }
        
        private void validerProposition(PropositionDetermination propositionDetermination) {
                final PropositionDetermination cetteProposition = propositionDetermination;
                PropositionDeterminationServiceConcret propositionService = new PropositionDeterminationServiceConcret();
                propositionDetermination.setValideePar(CacheClient.getInstance().getUtilisateur().getId());
                propositionService.validerProposition(propositionDetermination, new ValidationPropositionCallback() {
                        @Override
                        public void surRetour(String objetRetour) {
                                BusEvenementiel.getInstance().fireEvent(new EvenementValidationPropositionDetermination(cetteProposition));
                        }
                });
        }
}