Subversion Repositories eFlore/Applications.del

Rev

Rev 1956 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1196 gduche 1
package org.tela_botanica.del.client.composants.forum.interventions;
2
 
1830 aurelien 3
 
1196 gduche 4
import org.tela_botanica.del.client.cache.CacheClient;
5
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlayDefilanteVue;
6
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlaySimplePresenteur;
7
import org.tela_botanica.del.client.composants.formulaires.formulairecommentaire.FormulaireCommentairePresenteur;
8
import org.tela_botanica.del.client.composants.formulaires.formulairecommentaire.FormulaireCommentaireVue;
9
import org.tela_botanica.del.client.composants.forum.ArbreCommentairePresenteur;
10
import org.tela_botanica.del.client.composants.forum.ArbreCommentaireVue;
11
import org.tela_botanica.del.client.composants.votes.barrerepartition.BarreRepartitionVotePresenteur;
12
import org.tela_botanica.del.client.composants.votes.barrerepartition.BarreRepartitionVoteVue;
13
import org.tela_botanica.del.client.composants.votes.details.DetailListeVotesDeterminationPresenteur;
14
import org.tela_botanica.del.client.composants.votes.details.DetailListeVotesDeterminationVue;
15
import org.tela_botanica.del.client.config.Config;
16
import org.tela_botanica.del.client.i18n.I18n;
17
import org.tela_botanica.del.client.modeles.Commentaire;
18
import org.tela_botanica.del.client.modeles.InterventionForum;
19
import org.tela_botanica.del.client.modeles.MoyenneVote;
20
import org.tela_botanica.del.client.modeles.PropositionDetermination;
1830 aurelien 21
import org.tela_botanica.del.client.modeles.Utilisateur;
1196 gduche 22
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
23
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.EvenementAjoutCommentaire;
24
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.GestionnaireEvenementAjoutCommentaire;
25
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.EvenementAjoutDetermination;
26
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.GestionnaireEvenementAjoutDetermination;
1830 aurelien 27
import org.tela_botanica.del.client.navigation.evenement.changementEtatUtilisateur.EvenementChangementEtatUtilisateur;
28
import org.tela_botanica.del.client.navigation.evenement.changementEtatUtilisateur.GestionnaireEvenementChangementEtatUtilisateur;
1196 gduche 29
import org.tela_botanica.del.client.navigation.evenement.suppressioncommentaire.EvenementSuppressionCommentaire;
30
import org.tela_botanica.del.client.navigation.evenement.suppressiondetermination.EvenementSuppressionDetermination;
1830 aurelien 31
import org.tela_botanica.del.client.navigation.evenement.validationPropositionDetermination.EvenementValidationPropositionDetermination;
1196 gduche 32
import org.tela_botanica.del.client.services.CalculVoteDeterminationService;
33
import org.tela_botanica.del.client.services.rest.CommentaireService;
34
import org.tela_botanica.del.client.services.rest.CommentaireServiceConcret;
35
import org.tela_botanica.del.client.services.rest.PropositionDeterminationService;
1830 aurelien 36
import org.tela_botanica.del.client.services.rest.PropositionDeterminationServiceConcret;
1196 gduche 37
import org.tela_botanica.del.client.services.rest.VoteDeterminationServiceConcret;
38
import org.tela_botanica.del.client.services.rest.async.SuppressionCommentaireCallback;
39
import org.tela_botanica.del.client.services.rest.async.SuppressionPropositionDeterminationCallback;
1830 aurelien 40
import org.tela_botanica.del.client.services.rest.async.ValidationPropositionCallback;
41
import org.tela_botanica.del.client.utils.ModerationUtils;
1196 gduche 42
 
43
import com.google.gwt.event.dom.client.ClickEvent;
44
import com.google.gwt.event.dom.client.ClickHandler;
45
import com.google.gwt.event.dom.client.HasClickHandlers;
46
import com.google.gwt.event.dom.client.HasMouseOutHandlers;
47
import com.google.gwt.event.dom.client.HasMouseOverHandlers;
48
import com.google.gwt.event.dom.client.MouseOutEvent;
49
import com.google.gwt.event.dom.client.MouseOutHandler;
50
import com.google.gwt.event.dom.client.MouseOverEvent;
51
import com.google.gwt.event.dom.client.MouseOverHandler;
1830 aurelien 52
import com.google.gwt.event.shared.HandlerRegistration;
1196 gduche 53
import com.google.gwt.user.client.Window;
54
import com.google.gwt.user.client.ui.HasWidgets;
55
import com.google.gwt.user.client.ui.IsWidget;
56
 
57
public class ForumInterventionPresenteur {
58
 
59
	public interface Vue extends IsWidget {
60
		void ajouterInterventionDetermination(PropositionDetermination determination, IsWidget barreRepartition, IsWidget arbreCommentaires);
61
		void ajouterInterventionCommentaire(Commentaire commentaire, IsWidget arbreCommentaires);
62
		HasClickHandlers getRepondre();
63
		HasWidgets getEnfants();
64
		HasClickHandlers getLienSuppression();
65
		void afficherLienSuppression();
66
		void cacherLienSuppression();
67
		HasMouseOverHandlers getConteneurInterventionMouseOver();
68
		HasMouseOutHandlers getConteneurInterventionMouseOut();
69
		HasClickHandlers getEspece();
70
		void ajouterLienEspece();
71
		HasClickHandlers getAuteur();
72
		void ajouterLienAuteur();
73
		void cacherDeterminationProposee();
74
		void ajouterLienVotes();
75
		void masquerLienVotes();
76
		void setNbVotes(int votes);
77
		public HasClickHandlers getZoneNbVotes();
1830 aurelien 78
		public HasClickHandlers getBoutonValidationTaxon();
79
		void cacherBoutonValidationTaxon();
80
		void afficherBoutonValidationTaxon();
1196 gduche 81
	}
82
 
83
	private Vue vue;
84
 
85
	private InterventionForum interventionForum;
86
 
87
	private CommentaireService commentaireService;
88
 
89
	private PropositionDeterminationService propositionDeterminationService;
90
 
91
	private FenetreOverlaySimplePresenteur overlay;
92
 
93
	private int nbVotes;
94
 
1830 aurelien 95
	private HandlerRegistration validationTaxonHandler;
96
 
1196 gduche 97
	public ForumInterventionPresenteur(Vue vue, InterventionForum interventionForum, CommentaireService commentaireService, PropositionDeterminationService propositionDeterminationService) {
98
		this.vue = vue;
99
		this.interventionForum = interventionForum;
100
		this.commentaireService = commentaireService;
101
		this.propositionDeterminationService = propositionDeterminationService;
102
	}
103
 
104
	public void go(HasWidgets composite) {
105
		chargerIntervention();
106
		composite.add(vue.asWidget());
107
		gererEvenements();
108
	}
109
 
110
	public void ajouterEnfant(ForumInterventionPresenteur presenteur) {
111
		presenteur.go(vue.getEnfants());
112
	}
113
 
114
	private void chargerIntervention() {
115
		if (interventionForum instanceof PropositionDetermination) {
116
			ajouterPropositionDetermination((PropositionDetermination) interventionForum);
117
		} else if (interventionForum instanceof Commentaire) {
118
			ajouterCommentaire((Commentaire) interventionForum);
119
			vue.cacherDeterminationProposee();
120
		}
121
	}
122
 
123
	private void ajouterPropositionDetermination(PropositionDetermination propositionDetermination) {
1830 aurelien 124
		final PropositionDetermination cetteProposition = propositionDetermination;
1196 gduche 125
		this.nbVotes = propositionDetermination.getVotesDeterminations().size();
126
 
127
		BarreRepartitionVotePresenteur barreRepartitionVotePresenteur = new BarreRepartitionVotePresenteur(new BarreRepartitionVoteVue(), new VoteDeterminationServiceConcret());
128
		barreRepartitionVotePresenteur.toggleNomEspece();
129
		calculerEtAfficherVoteDetermination(barreRepartitionVotePresenteur, propositionDetermination);
130
		ArbreCommentairePresenteur arbreCommentairePresenteur = new ArbreCommentairePresenteur(new ArbreCommentaireVue(), propositionDetermination);
131
		vue.ajouterInterventionDetermination(propositionDetermination, barreRepartitionVotePresenteur.getBarreRepartitionVoteVue(), arbreCommentairePresenteur.getArbreCommentaireVue());
132
 
133
		final String nn = propositionDetermination.getNumNomenclatural();
1393 aurelien 134
		final String referentiel = propositionDetermination.getReferentiel();
1531 mathias 135
		// @TODO harmoniser les valeurs qui veulent dire "y en n'a pas" plutôt que !equals("kedal") :-/
1437 aurelien 136
		if (nn != null && !nn.equals(0) && !nn.equals("0") && referentiel != null && !referentiel.equals("")) {
1196 gduche 137
			vue.ajouterLienEspece();
138
			vue.getEspece().addClickHandler(new ClickHandler() {
139
 
140
				@Override
141
				public void onClick(ClickEvent event) {
142
					Config config = new Config();
1393 aurelien 143
					String efloreUrlFicheTpl = config.getUrl("efloreTaxon");
1437 aurelien 144
					String efloreUrlFiche = efloreUrlFicheTpl.replaceAll("referentiel-nn-num_nom", referentiel.substring(0,5)+"-nn-"+nn);
1687 mathias 145
					Window.open(efloreUrlFiche, "Fiche eflore", config.getInfo("popupOptions"));
1196 gduche 146
				}
147
			});
148
		}
149
 
1830 aurelien 150
		gererAffichageBoutonValidationTaxon(cetteProposition);
151
 
1196 gduche 152
		final String idContributeur = propositionDetermination.getContributeur().getId();
1283 aurelien 153
		if (idContributeur != null && !idContributeur.equals("0")) {
1196 gduche 154
			vue.ajouterLienAuteur();
155
			vue.getAuteur().addClickHandler(new ClickHandler() {
156
				@Override
157
				public void onClick(ClickEvent event) {
158
					Config config = new Config();
1687 mathias 159
					Window.open(config.getUrl("profil") + idContributeur, "Consultation de l'annuaire", config.getInfo("popupOptions"));
1196 gduche 160
				}
161
			});
162
		}
163
	}
164
 
1830 aurelien 165
	private void gererAffichageBoutonValidationTaxon(final PropositionDetermination cetteProposition) {
166
		if (doitAfficherBoutonValidation(cetteProposition)) {
167
			vue.afficherBoutonValidationTaxon();
168
			if(validationTaxonHandler != null) {
169
				validationTaxonHandler.removeHandler();
170
			}
171
			validationTaxonHandler = vue.getBoutonValidationTaxon().addClickHandler(new ClickHandler() {
172
				@Override
173
				public void onClick(ClickEvent event) {
174
					if (Window.confirm(I18n.getVocabulary().confirmationValidationDetermination())) {
175
						validerProposition(cetteProposition);
176
					}
177
				}
178
			});
179
		} else {
180
			vue.cacherBoutonValidationTaxon();
181
		}
182
	}
183
 
1196 gduche 184
	private void ajouterCommentaire(Commentaire proposition) {
185
		ArbreCommentairePresenteur arbreCommentairePresenteur = new ArbreCommentairePresenteur(new ArbreCommentaireVue(), proposition);
186
		vue.ajouterInterventionCommentaire(proposition, arbreCommentairePresenteur.getArbreCommentaireVue());
187
	}
188
 
189
	private void calculerEtAfficherVoteDetermination(BarreRepartitionVotePresenteur barreRepartitionVotePresenteur, PropositionDetermination propositionDetermination) {
190
		MoyenneVote votes = CalculVoteDeterminationService.calculerVoteDetermination(propositionDetermination);
191
		barreRepartitionVotePresenteur.afficherVotes(votes);
192
	}
193
 
194
	private void gererEvenements() {
195
		if (this.nbVotes > 0) {
196
			vue.setNbVotes(this.nbVotes);
197
			vue.ajouterLienVotes();
198
			vue.getZoneNbVotes().addClickHandler(new ClickHandler() {
199
				@Override
200
				public void onClick(ClickEvent event) {
201
					if (nbVotes > 0) {
202
						FenetreOverlaySimplePresenteur fenetreOverlaySimplePresenteur = new FenetreOverlaySimplePresenteur(
203
								new FenetreOverlayDefilanteVue());
204
						DetailListeVotesDeterminationPresenteur detailListeVotesDeterminationPresenteur = new DetailListeVotesDeterminationPresenteur(
205
								new DetailListeVotesDeterminationVue());
206
						fenetreOverlaySimplePresenteur
207
								.ouvrirFenetreModale(detailListeVotesDeterminationPresenteur);
208
						detailListeVotesDeterminationPresenteur
209
								.afficherVotes((PropositionDetermination) interventionForum);
210
					}
211
				}
212
			});
213
		} else {
214
			vue.masquerLienVotes();
215
		}
216
 
217
		vue.getRepondre().addClickHandler(new ClickHandler() {
218
			@Override
219
			public void onClick(ClickEvent event) {
220
				FormulaireCommentairePresenteur commentairePresenteur = new FormulaireCommentairePresenteur(interventionForum, new CommentaireServiceConcret(), new FormulaireCommentaireVue());
221
				overlay = new FenetreOverlaySimplePresenteur(new FenetreOverlayDefilanteVue());
222
				overlay.ouvrirFenetreModale(commentairePresenteur);
223
			}
224
		});
225
 
226
		vue.getConteneurInterventionMouseOver().addMouseOverHandler(new MouseOverHandler() {
227
			@Override
228
			public void onMouseOver(MouseOverEvent event) {
229
				if(peutSupprimerIntervention()) {
230
					vue.afficherLienSuppression();
231
				}
232
			}
233
		});
234
 
235
		vue.getConteneurInterventionMouseOut().addMouseOutHandler(new MouseOutHandler() {
236
			@Override
237
			public void onMouseOut(MouseOutEvent event) {
238
				if(peutSupprimerIntervention()) {
239
					vue.cacherLienSuppression();
240
				}
241
			}
242
		});
243
 
244
		vue.getLienSuppression().addClickHandler(new ClickHandler() {
245
			@Override
246
			public void onClick(ClickEvent event) {
247
 
248
				String message = "";
249
				if (interventionForum instanceof PropositionDetermination) {
250
					message = I18n.getVocabulary().confirmationSuppressionDetermination();
251
				} else if (interventionForum instanceof Commentaire) {
252
					message = I18n.getVocabulary().confirmationSuppressionCommentaire();
253
				}
254
 
255
				if(Window.confirm(message)) {
256
					supprimerIntervention();
257
				}
258
			}
259
		});
260
		vue.cacherLienSuppression();
261
 
262
		BusEvenementiel.getInstance().addHandler(EvenementAjoutDetermination.TYPE, new GestionnaireEvenementAjoutDetermination() {
263
			@Override
264
			public void onAjoutDetermination(EvenementAjoutDetermination event) {
265
				if(overlay != null && overlay.fenetreModaleEstOuverte()) {
266
					overlay.fermerFenetreModale();
267
				}
268
			}
269
		});
270
 
271
		BusEvenementiel.getInstance().addHandler(EvenementAjoutCommentaire.TYPE, new GestionnaireEvenementAjoutCommentaire() {
272
			@Override
273
			public void onAjoutCommentaire(EvenementAjoutCommentaire event) {
274
				if(overlay != null && overlay.fenetreModaleEstOuverte()) {
275
					overlay.fermerFenetreModale();
276
				}
277
			}
278
		});
1830 aurelien 279
 
280
		BusEvenementiel.getInstance().addHandler(EvenementChangementEtatUtilisateur.TYPE, new GestionnaireEvenementChangementEtatUtilisateur() {
281
			@Override
282
			public void onModificationEtatUtilisateur(EvenementChangementEtatUtilisateur evenementChangementEtatUtilisateur) {
283
				if (interventionForum instanceof PropositionDetermination) {
284
					gererAffichageBoutonValidationTaxon((PropositionDetermination)interventionForum);
285
				}
286
			}
287
		});
1196 gduche 288
	}
289
 
290
	private boolean peutSupprimerIntervention() {
1956 aurelien 291
			boolean estPropositionInitiale = false;
292
			boolean estPropositionRetenue = false;
293
			if(interventionForum instanceof PropositionDetermination) {
294
				estPropositionInitiale = ((PropositionDetermination)interventionForum).estPropositionInitiale();
295
				estPropositionRetenue =  ((PropositionDetermination)interventionForum).estPropositionRetenue();
296
			}
297
		return (!interventionForum.aDesCommentaires() &&
298
				interventionForum.getContributeur() != null &&
299
				interventionForum.getContributeur().getId().equals(CacheClient.getInstance().getUtilisateur().getId())
300
				&& !estPropositionInitiale
301
				&& !estPropositionRetenue);
1196 gduche 302
	}
303
 
304
	private void supprimerIntervention() {
305
		if(interventionForum instanceof PropositionDetermination) {
306
			propositionDeterminationService.supprimerProposition((PropositionDetermination)interventionForum, new SuppressionPropositionDeterminationCallback() {
307
				@Override
308
				public void surRetour(String objetRetour) {
309
					CacheClient.getInstance().getObservationCourante().supprimerIntervention(interventionForum);
310
					BusEvenementiel.getInstance().fireEvent(new EvenementSuppressionDetermination((PropositionDetermination)interventionForum));
311
				}
312
			});
313
		}
314
 
315
		if(interventionForum instanceof Commentaire) {
316
			commentaireService.supprimerCommentaire((Commentaire)interventionForum, new SuppressionCommentaireCallback() {
317
				@Override
318
				public void surRetour(String objetRetour) {
319
					CacheClient.getInstance().getObservationCourante().supprimerIntervention(interventionForum);
320
					BusEvenementiel.getInstance().fireEvent(new EvenementSuppressionCommentaire((Commentaire)interventionForum));
321
				}
322
			});
323
		}
324
	}
1830 aurelien 325
 
326
	private boolean doitAfficherBoutonValidation(PropositionDetermination propositionDetermination) {
327
		boolean estPropositionRetenue = propositionDetermination.estPropositionRetenue();
328
		String numNomProp = propositionDetermination.getNumNomenclatural();
329
		String referentielProp = propositionDetermination.getReferentiel();
330
 
331
		boolean aUnNumNom = (numNomProp != null && !numNomProp.trim().equals("") && !numNomProp.trim().equals("0"));
332
		boolean aUnReferentiel = (referentielProp != null && !referentielProp.trim().equals("") && !referentielProp.trim().equals("0"));
333
 
334
		Utilisateur utilisateur = CacheClient.getInstance().getUtilisateur();
335
		boolean estAuteurObservation = false;
336
		if(utilisateur != null) {
337
			estAuteurObservation = utilisateur.estIdentifie() && utilisateur.getId().equals(CacheClient.getInstance().getObservationCourante().getIdAuteur());
338
		}
339
		boolean peutValiderObservation = ModerationUtils.utilisateurPeutValiderObservation(CacheClient.getInstance().getUtilisateur(), CacheClient.getInstance().getObservationCourante());
340
		return (peutValiderObservation || estAuteurObservation) && aUnReferentiel && aUnNumNom && !estPropositionRetenue;
341
	}
342
 
343
	private void validerProposition(PropositionDetermination propositionDetermination) {
344
		final PropositionDetermination cetteProposition = propositionDetermination;
345
		PropositionDeterminationServiceConcret propositionService = new PropositionDeterminationServiceConcret();
346
		propositionDetermination.setValideePar(CacheClient.getInstance().getUtilisateur().getId());
347
		propositionService.validerProposition(propositionDetermination, new ValidationPropositionCallback() {
348
			@Override
349
			public void surRetour(String objetRetour) {
350
				BusEvenementiel.getInstance().fireEvent(new EvenementValidationPropositionDetermination(cetteProposition));
351
			}
352
		});
353
	}
1196 gduche 354
}