Subversion Repositories eFlore/Applications.del

Rev

Rev 2095 | 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") :-/
1984 aurelien 136
		if (nn != null && !nn.isEmpty() && !nn.equals(0) && !nn.equals("0") && referentiel != null && !referentiel.isEmpty()) {
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");
2135 mathias 144
					// découpage pseudo-intelligent du nom de référentiel
145
					String refFmt;
146
					int positionDeuxPoints = referentiel.indexOf(':');
147
					if (positionDeuxPoints == -1) {
148
						refFmt = referentiel;
149
					} else {
150
						refFmt = referentiel.substring(0, positionDeuxPoints);
151
					}
152
					String efloreUrlFiche = efloreUrlFicheTpl.replaceAll("referentiel-nn-num_nom", refFmt+"-nn-"+nn);
1687 mathias 153
					Window.open(efloreUrlFiche, "Fiche eflore", config.getInfo("popupOptions"));
1196 gduche 154
				}
155
			});
156
		}
157
 
1830 aurelien 158
		gererAffichageBoutonValidationTaxon(cetteProposition);
159
 
1196 gduche 160
		final String idContributeur = propositionDetermination.getContributeur().getId();
1283 aurelien 161
		if (idContributeur != null && !idContributeur.equals("0")) {
1196 gduche 162
			vue.ajouterLienAuteur();
163
			vue.getAuteur().addClickHandler(new ClickHandler() {
164
				@Override
165
				public void onClick(ClickEvent event) {
166
					Config config = new Config();
1687 mathias 167
					Window.open(config.getUrl("profil") + idContributeur, "Consultation de l'annuaire", config.getInfo("popupOptions"));
1196 gduche 168
				}
169
			});
170
		}
171
	}
172
 
1830 aurelien 173
	private void gererAffichageBoutonValidationTaxon(final PropositionDetermination cetteProposition) {
174
		if (doitAfficherBoutonValidation(cetteProposition)) {
175
			vue.afficherBoutonValidationTaxon();
176
			if(validationTaxonHandler != null) {
177
				validationTaxonHandler.removeHandler();
178
			}
179
			validationTaxonHandler = vue.getBoutonValidationTaxon().addClickHandler(new ClickHandler() {
180
				@Override
181
				public void onClick(ClickEvent event) {
182
					if (Window.confirm(I18n.getVocabulary().confirmationValidationDetermination())) {
183
						validerProposition(cetteProposition);
184
					}
185
				}
186
			});
187
		} else {
188
			vue.cacherBoutonValidationTaxon();
189
		}
190
	}
191
 
1196 gduche 192
	private void ajouterCommentaire(Commentaire proposition) {
193
		ArbreCommentairePresenteur arbreCommentairePresenteur = new ArbreCommentairePresenteur(new ArbreCommentaireVue(), proposition);
194
		vue.ajouterInterventionCommentaire(proposition, arbreCommentairePresenteur.getArbreCommentaireVue());
195
	}
196
 
197
	private void calculerEtAfficherVoteDetermination(BarreRepartitionVotePresenteur barreRepartitionVotePresenteur, PropositionDetermination propositionDetermination) {
198
		MoyenneVote votes = CalculVoteDeterminationService.calculerVoteDetermination(propositionDetermination);
199
		barreRepartitionVotePresenteur.afficherVotes(votes);
200
	}
201
 
202
	private void gererEvenements() {
203
		if (this.nbVotes > 0) {
204
			vue.setNbVotes(this.nbVotes);
205
			vue.ajouterLienVotes();
206
			vue.getZoneNbVotes().addClickHandler(new ClickHandler() {
207
				@Override
208
				public void onClick(ClickEvent event) {
209
					if (nbVotes > 0) {
210
						FenetreOverlaySimplePresenteur fenetreOverlaySimplePresenteur = new FenetreOverlaySimplePresenteur(
211
								new FenetreOverlayDefilanteVue());
212
						DetailListeVotesDeterminationPresenteur detailListeVotesDeterminationPresenteur = new DetailListeVotesDeterminationPresenteur(
213
								new DetailListeVotesDeterminationVue());
214
						fenetreOverlaySimplePresenteur
215
								.ouvrirFenetreModale(detailListeVotesDeterminationPresenteur);
216
						detailListeVotesDeterminationPresenteur
217
								.afficherVotes((PropositionDetermination) interventionForum);
218
					}
219
				}
220
			});
221
		} else {
222
			vue.masquerLienVotes();
223
		}
224
 
225
		vue.getRepondre().addClickHandler(new ClickHandler() {
226
			@Override
227
			public void onClick(ClickEvent event) {
228
				FormulaireCommentairePresenteur commentairePresenteur = new FormulaireCommentairePresenteur(interventionForum, new CommentaireServiceConcret(), new FormulaireCommentaireVue());
229
				overlay = new FenetreOverlaySimplePresenteur(new FenetreOverlayDefilanteVue());
230
				overlay.ouvrirFenetreModale(commentairePresenteur);
231
			}
232
		});
233
 
234
		vue.getConteneurInterventionMouseOver().addMouseOverHandler(new MouseOverHandler() {
235
			@Override
236
			public void onMouseOver(MouseOverEvent event) {
237
				if(peutSupprimerIntervention()) {
238
					vue.afficherLienSuppression();
239
				}
240
			}
241
		});
242
 
243
		vue.getConteneurInterventionMouseOut().addMouseOutHandler(new MouseOutHandler() {
244
			@Override
245
			public void onMouseOut(MouseOutEvent event) {
246
				if(peutSupprimerIntervention()) {
247
					vue.cacherLienSuppression();
248
				}
249
			}
250
		});
251
 
252
		vue.getLienSuppression().addClickHandler(new ClickHandler() {
253
			@Override
254
			public void onClick(ClickEvent event) {
255
 
256
				String message = "";
257
				if (interventionForum instanceof PropositionDetermination) {
258
					message = I18n.getVocabulary().confirmationSuppressionDetermination();
259
				} else if (interventionForum instanceof Commentaire) {
260
					message = I18n.getVocabulary().confirmationSuppressionCommentaire();
261
				}
262
 
263
				if(Window.confirm(message)) {
264
					supprimerIntervention();
265
				}
266
			}
267
		});
268
		vue.cacherLienSuppression();
269
 
270
		BusEvenementiel.getInstance().addHandler(EvenementAjoutDetermination.TYPE, new GestionnaireEvenementAjoutDetermination() {
271
			@Override
272
			public void onAjoutDetermination(EvenementAjoutDetermination event) {
273
				if(overlay != null && overlay.fenetreModaleEstOuverte()) {
274
					overlay.fermerFenetreModale();
275
				}
276
			}
277
		});
278
 
279
		BusEvenementiel.getInstance().addHandler(EvenementAjoutCommentaire.TYPE, new GestionnaireEvenementAjoutCommentaire() {
280
			@Override
281
			public void onAjoutCommentaire(EvenementAjoutCommentaire event) {
282
				if(overlay != null && overlay.fenetreModaleEstOuverte()) {
283
					overlay.fermerFenetreModale();
284
				}
285
			}
286
		});
1830 aurelien 287
 
288
		BusEvenementiel.getInstance().addHandler(EvenementChangementEtatUtilisateur.TYPE, new GestionnaireEvenementChangementEtatUtilisateur() {
289
			@Override
290
			public void onModificationEtatUtilisateur(EvenementChangementEtatUtilisateur evenementChangementEtatUtilisateur) {
291
				if (interventionForum instanceof PropositionDetermination) {
292
					gererAffichageBoutonValidationTaxon((PropositionDetermination)interventionForum);
293
				}
294
			}
295
		});
1196 gduche 296
	}
297
 
298
	private boolean peutSupprimerIntervention() {
1956 aurelien 299
			boolean estPropositionInitiale = false;
300
			boolean estPropositionRetenue = false;
301
			if(interventionForum instanceof PropositionDetermination) {
302
				estPropositionInitiale = ((PropositionDetermination)interventionForum).estPropositionInitiale();
303
				estPropositionRetenue =  ((PropositionDetermination)interventionForum).estPropositionRetenue();
304
			}
305
		return (!interventionForum.aDesCommentaires() &&
306
				interventionForum.getContributeur() != null &&
307
				interventionForum.getContributeur().getId().equals(CacheClient.getInstance().getUtilisateur().getId())
308
				&& !estPropositionInitiale
309
				&& !estPropositionRetenue);
1196 gduche 310
	}
311
 
312
	private void supprimerIntervention() {
313
		if(interventionForum instanceof PropositionDetermination) {
314
			propositionDeterminationService.supprimerProposition((PropositionDetermination)interventionForum, new SuppressionPropositionDeterminationCallback() {
315
				@Override
316
				public void surRetour(String objetRetour) {
317
					CacheClient.getInstance().getObservationCourante().supprimerIntervention(interventionForum);
318
					BusEvenementiel.getInstance().fireEvent(new EvenementSuppressionDetermination((PropositionDetermination)interventionForum));
319
				}
320
			});
321
		}
322
 
323
		if(interventionForum instanceof Commentaire) {
324
			commentaireService.supprimerCommentaire((Commentaire)interventionForum, new SuppressionCommentaireCallback() {
325
				@Override
326
				public void surRetour(String objetRetour) {
327
					CacheClient.getInstance().getObservationCourante().supprimerIntervention(interventionForum);
328
					BusEvenementiel.getInstance().fireEvent(new EvenementSuppressionCommentaire((Commentaire)interventionForum));
329
				}
330
			});
331
		}
332
	}
1830 aurelien 333
 
334
	private boolean doitAfficherBoutonValidation(PropositionDetermination propositionDetermination) {
335
		boolean estPropositionRetenue = propositionDetermination.estPropositionRetenue();
336
		String numNomProp = propositionDetermination.getNumNomenclatural();
337
		String referentielProp = propositionDetermination.getReferentiel();
338
 
339
		boolean aUnNumNom = (numNomProp != null && !numNomProp.trim().equals("") && !numNomProp.trim().equals("0"));
340
		boolean aUnReferentiel = (referentielProp != null && !referentielProp.trim().equals("") && !referentielProp.trim().equals("0"));
341
 
342
		Utilisateur utilisateur = CacheClient.getInstance().getUtilisateur();
343
		boolean estAuteurObservation = false;
344
		if(utilisateur != null) {
345
			estAuteurObservation = utilisateur.estIdentifie() && utilisateur.getId().equals(CacheClient.getInstance().getObservationCourante().getIdAuteur());
346
		}
347
		boolean peutValiderObservation = ModerationUtils.utilisateurPeutValiderObservation(CacheClient.getInstance().getUtilisateur(), CacheClient.getInstance().getObservationCourante());
348
		return (peutValiderObservation || estAuteurObservation) && aUnReferentiel && aUnNumNom && !estPropositionRetenue;
349
	}
350
 
351
	private void validerProposition(PropositionDetermination propositionDetermination) {
352
		final PropositionDetermination cetteProposition = propositionDetermination;
353
		PropositionDeterminationServiceConcret propositionService = new PropositionDeterminationServiceConcret();
354
		propositionDetermination.setValideePar(CacheClient.getInstance().getUtilisateur().getId());
355
		propositionService.validerProposition(propositionDetermination, new ValidationPropositionCallback() {
356
			@Override
357
			public void surRetour(String objetRetour) {
358
				BusEvenementiel.getInstance().fireEvent(new EvenementValidationPropositionDetermination(cetteProposition));
359
			}
360
		});
361
	}
1196 gduche 362
}