Subversion Repositories eFlore/Applications.del

Rev

Rev 1690 | Rev 1777 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1196 gduche 1
package org.tela_botanica.del.client.vues.identiplante.plateformedetermination;
2
 
3
import java.util.List;
4
 
5
import org.tela_botanica.del.client.cache.CacheClient;
6
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlayDefilanteVue;
7
import org.tela_botanica.del.client.composants.fenetreoverlay.FenetreOverlaySimplePresenteur;
8
import org.tela_botanica.del.client.composants.formulaires.formulairecommentaire.FormulaireCommentairePresenteur;
9
import org.tela_botanica.del.client.composants.formulaires.formulairecommentaire.FormulaireCommentaireVue;
10
import org.tela_botanica.del.client.composants.formulaires.formulaireproposition.FormulairePropositionPresenteur;
11
import org.tela_botanica.del.client.composants.formulaires.formulaireproposition.FormulairePropositionVue;
12
import org.tela_botanica.del.client.composants.metadonnees.MetadonneesEnLigneVue;
13
import org.tela_botanica.del.client.composants.metadonnees.MetadonneesPresenteur;
14
import org.tela_botanica.del.client.composants.observations.ObservationImagesPresenteur;
15
import org.tela_botanica.del.client.composants.observations.ObservationImagesVue;
16
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
17
import org.tela_botanica.del.client.composants.rss.RssPresenteur;
18
import org.tela_botanica.del.client.composants.rss.RssVue;
19
import org.tela_botanica.del.client.config.Config;
1257 aurelien 20
import org.tela_botanica.del.client.i18n.I18n;
1196 gduche 21
import org.tela_botanica.del.client.modeles.Image;
22
import org.tela_botanica.del.client.modeles.ModeRecherche;
23
import org.tela_botanica.del.client.modeles.MoyenneVote;
24
import org.tela_botanica.del.client.modeles.Observation;
25
import org.tela_botanica.del.client.modeles.ObservationServiceResultat;
1257 aurelien 26
import org.tela_botanica.del.client.modeles.PropositionDetermination;
27
import org.tela_botanica.del.client.modeles.Utilisateur;
1196 gduche 28
import org.tela_botanica.del.client.modeles.VoteDetermination;
29
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
30
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.EvenementAjoutCommentaire;
31
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.GestionnaireEvenementAjoutCommentaire;
32
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.EvenementAjoutDetermination;
33
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.GestionnaireEvenementAjoutDetermination;
1314 aurelien 34
import org.tela_botanica.del.client.navigation.evenement.changementEtatUtilisateur.EvenementChangementEtatUtilisateur;
35
import org.tela_botanica.del.client.navigation.evenement.changementEtatUtilisateur.GestionnaireEvenementChangementEtatUtilisateur;
1196 gduche 36
import org.tela_botanica.del.client.navigation.evenement.changementimagevalidation.EvenementChangementImageValidation;
37
import org.tela_botanica.del.client.navigation.evenement.changementimagevalidation.GestionnaireEvenementChangementImageValidation;
1689 jpm 38
import org.tela_botanica.del.client.navigation.evenement.depublierObs.EvenementDepublierObs;
39
import org.tela_botanica.del.client.navigation.evenement.depublierObs.GestionnaireEvenementDepublierObs;
1196 gduche 40
import org.tela_botanica.del.client.navigation.evenement.voteDetermination.EvenementVoteDetermination;
41
import org.tela_botanica.del.client.navigation.evenement.voteDetermination.GestionnaireEvenementVoteDetermination;
42
import org.tela_botanica.del.client.services.CalculVoteDeterminationService;
43
import org.tela_botanica.del.client.services.rest.CommentaireServiceConcret;
44
import org.tela_botanica.del.client.services.rest.ObservationService;
45
import org.tela_botanica.del.client.services.rest.PropositionDeterminationServiceConcret;
1689 jpm 46
import org.tela_botanica.del.client.services.rest.async.DepublicationObservationCallBack;
1196 gduche 47
import org.tela_botanica.del.client.services.rest.async.ObservationsCallback;
1257 aurelien 48
import org.tela_botanica.del.client.services.rest.async.ValidationPropositionCallback;
1775 aurelien 49
import org.tela_botanica.del.client.utils.ModerationUtils;
1196 gduche 50
import org.tela_botanica.del.client.utils.URLUtils;
1689 jpm 51
import org.tela_botanica.del.client.navigation.evenement.rechercheobservation.EvenementRechercheObservation;
1196 gduche 52
import org.tela_botanica.del.client.composants.formulairerechercheeflore.FormulaireRechercheEflorePresenteur;
53
import org.tela_botanica.del.client.composants.forum.ForumPresenteur;
54
import org.tela_botanica.del.client.composants.forum.ForumVue;
55
 
1689 jpm 56
import com.google.gwt.core.shared.GWT;
1196 gduche 57
import com.google.gwt.event.dom.client.ClickEvent;
58
import com.google.gwt.event.dom.client.ClickHandler;
59
import com.google.gwt.event.dom.client.HasClickHandlers;
60
import com.google.gwt.user.client.Window;
61
import com.google.gwt.user.client.ui.Button;
62
import com.google.gwt.user.client.ui.HasWidgets;
63
import com.google.gwt.user.client.ui.IsWidget;
64
import com.google.gwt.user.client.ui.Panel;
65
 
66
public class IdentiplanteDeterminationPresenteur extends Presenteur {
67
 
68
	/**
69
	 * Vue de l'interface de détermination
70
	 * */
71
	public interface Vue extends IsWidget {
72
		public Panel getForum();
73
 
74
		public Panel getDetailImageObservation();
75
 
76
		public Panel getFormulaireRechercheEflore();
77
 
78
		public Button getBoutonAjoutProposition();
79
 
80
		public Button getBoutonAjoutCommentaire();
81
 
82
		public Button getBoutonAjoutPropositionBas();
83
 
84
		public Button getBoutonAjoutCommentaireBas();
1689 jpm 85
 
86
		public HasClickHandlers getBoutonDepublierObs();
1196 gduche 87
 
88
		public HasWidgets getMetadonnees();
89
 
90
		public void afficherNomTaxonProbable(String nomTaxon);
91
 
92
		public HasClickHandlers getLienOuvrages();
93
 
94
		public HasClickHandlers getLienBonnier();
95
 
96
		public HasClickHandlers getLienCles();
97
 
98
		public HasClickHandlers getLienEflore();
99
 
100
		public HasWidgets getZoneRss();
1257 aurelien 101
 
102
		HasClickHandlers getBoutonValidationTaxon();
103
 
104
		void cacherBoutonValidationTaxon();
105
 
106
		void afficherBoutonValidationTaxon();
107
 
108
		public void viderMetadonnees();
1690 jpm 109
 
110
		void afficherZoneActionsObs();
111
 
112
		void cacherZoneActionsObs();
1196 gduche 113
	}
114
 
1689 jpm 115
	private Observation observation;
1196 gduche 116
	private Vue vue;
117
	private FenetreOverlaySimplePresenteur fenetreOverlaySimplePresenteur;
118
 
119
	// Déclaration des services à utiliser
120
	private ObservationService observationService;
121
 
122
	private CacheClient cache = CacheClient.getInstance();
1257 aurelien 123
 
124
	private PropositionDetermination propositionPlusPopulaire;
1196 gduche 125
 
126
	public IdentiplanteDeterminationPresenteur(Vue vue, ObservationService observationService) {
127
		this.vue = vue;
128
		this.observationService = observationService;
129
	}
130
 
131
	public void go(final HasWidgets composite) {
132
		// TODO afficher une icone de chargement si le chargement devient trop
133
		// long
134
		// car tout l'écran est asynchrone ici
135
		String observationId = URLUtils.getURLSpecialParameterValue();
136
		observationService.getObservation(observationId, new ObservationsCallback() {
137
			@Override
138
			public void surRetour(ObservationServiceResultat objetRetour) {
1689 jpm 139
				observation = cache.getObservationCourante();
1196 gduche 140
				afficherRss(cache.getObservationCourante());
141
				// trouve l'image courante si elle n'est pas deja en cache
142
				List<Image> listeImages = cache.getObservationCourante().getImages();
143
				if (listeImages.size() > 0) {
144
					CacheClient.getInstance().setImageCourante(listeImages.get(0));
145
				} else {
146
					CacheClient.getInstance().setImageCourante(null);
147
				}
1314 aurelien 148
 
1196 gduche 149
				new MetadonneesPresenteur(new MetadonneesEnLigneVue(), cache.getObservationCourante(), ModeRecherche.MODE_OBSERVATION, false).go(vue.getMetadonnees());
1553 jpm 150
				new ObservationImagesPresenteur(new ObservationImagesVue(), cache.getObservationCourante(), CacheClient.getInstance().getImageCourante()).go(vue.getDetailImageObservation());
1196 gduche 151
				new ForumPresenteur(new ForumVue()).go(vue.getForum());
152
				new FormulaireRechercheEflorePresenteur().go(vue.getFormulaireRechercheEflore());
153
 
1314 aurelien 154
				composite.add(vue.asWidget());
1196 gduche 155
				calculerEtAfficherVoteDeterminationPlusPopulaire();
156
			}
157
 
158
			@Override
159
			public void surErreur(String messageErreur) {
1542 mathias 160
				Window.alert(messageErreur + " - l'identifiant d'observation est incorrect; l'observation a peut-être été supprimée");
1196 gduche 161
			}
162
		});
1690 jpm 163
		afficherZoneActionsObs();
1196 gduche 164
		gererEvenements();
165
	}
166
 
167
	public void afficherRss(Observation observation) {
168
		new RssPresenteur(new RssVue(), observation, "Suivre cette observation").go(vue.getZoneRss());
169
	}
170
 
171
	private void calculerEtAfficherVoteDeterminationPlusPopulaire() {
1689 jpm 172
		if (cache.getObservationCourante() != null) {
1393 aurelien 173
			Observation observation = cache.getObservationCourante();
174
			String nomTaxon = observation.getNomRetenuFormateReferentiel();
175
			List<MoyenneVote> votesOrdonnes = CalculVoteDeterminationService.calculerVoteDeterminationPlusPopulaire(cache.getObservationCourante().getPropositionDeterminations());
176
			if (votesOrdonnes.size() > 0) {
177
				nomTaxon = votesOrdonnes.get(0).getIntituleAssocie();
178
				propositionPlusPopulaire = votesOrdonnes.get(0).getPropositionAssociee();
179
 
1689 jpm 180
				if (doitAfficherBoutonValidation(votesOrdonnes)) {
1393 aurelien 181
					vue.afficherBoutonValidationTaxon();
182
				} else {
183
					vue.cacherBoutonValidationTaxon();
184
				}
1689 jpm 185
			}
1393 aurelien 186
			vue.afficherNomTaxonProbable(nomTaxon);
1196 gduche 187
		}
188
	}
1314 aurelien 189
 
190
	private boolean doitAfficherBoutonValidation(List<MoyenneVote> votesOrdonnes) {
191
		boolean estPropositionRetenue = votesOrdonnes.get(0).getPropositionAssociee().estPropositionRetenue();
192
 
193
		Utilisateur utilisateur = CacheClient.getInstance().getUtilisateur();
1316 aurelien 194
		boolean estAuteurObservation = false;
195
		if(utilisateur != null) {
196
			estAuteurObservation = utilisateur.estIdentifie() && utilisateur.getId().equals(cache.getObservationCourante().getIdAuteur());
197
		}
1775 aurelien 198
		boolean peutValiderObservation = ModerationUtils.utilisateurPeutValiderObservation(CacheClient.getInstance().getUtilisateur(), observation);
199
		return (peutValiderObservation || estAuteurObservation) && !estPropositionRetenue;
1314 aurelien 200
	}
1196 gduche 201
 
202
	public void gererEvenements() {
1314 aurelien 203
		BusEvenementiel.getInstance().addHandler(EvenementChangementEtatUtilisateur.TYPE, new GestionnaireEvenementChangementEtatUtilisateur() {
204
			@Override
205
			public void onModificationEtatUtilisateur(EvenementChangementEtatUtilisateur evenementChangementEtatUtilisateur) {
206
				calculerEtAfficherVoteDeterminationPlusPopulaire();
207
			};
208
		});
209
 
1196 gduche 210
		BusEvenementiel.getInstance().addHandler(EvenementVoteDetermination.TYPE, new GestionnaireEvenementVoteDetermination() {
211
			@Override
212
			public void onVoteDetermination(VoteDetermination event) {
213
				calculerEtAfficherVoteDeterminationPlusPopulaire();
214
			}
215
		});
1689 jpm 216
 
1196 gduche 217
		BusEvenementiel.getInstance().addHandler(EvenementAjoutDetermination.TYPE, new GestionnaireEvenementAjoutDetermination() {
218
			@Override
219
			public void onAjoutDetermination(EvenementAjoutDetermination event) {
220
				if (fenetreOverlaySimplePresenteur != null && fenetreOverlaySimplePresenteur.fenetreModaleEstOuverte()) {
221
					fenetreOverlaySimplePresenteur.fermerFenetreModale();
222
				}
223
			}
224
		});
225
 
226
		BusEvenementiel.getInstance().addHandler(EvenementAjoutCommentaire.TYPE, new GestionnaireEvenementAjoutCommentaire() {
227
			@Override
228
			public void onAjoutCommentaire(EvenementAjoutCommentaire event) {
229
				if (fenetreOverlaySimplePresenteur != null && fenetreOverlaySimplePresenteur.fenetreModaleEstOuverte()) {
230
					fenetreOverlaySimplePresenteur.fermerFenetreModale();
231
				}
232
			}
233
		});
234
 
235
		BusEvenementiel.getInstance().addHandler(EvenementChangementImageValidation.TYPE, new GestionnaireEvenementChangementImageValidation() {
236
			@Override
237
			public void onChangementImage(EvenementChangementImageValidation event) {
238
				vue.getDetailImageObservation().clear();
1553 jpm 239
				new ObservationImagesPresenteur(
240
					new ObservationImagesVue(),
241
					cache.getObservationCourante(),
242
					CacheClient.getInstance().getImageCourante()).go(vue.getDetailImageObservation());
1196 gduche 243
			}
244
		});
1689 jpm 245
 
246
		ClickHandler clicAjoutProposition = new ClickHandler() {
247
			@Override
248
			public void onClick(ClickEvent event) {
249
				fenetreOverlaySimplePresenteur = new FenetreOverlaySimplePresenteur(new FenetreOverlayDefilanteVue());
250
				fenetreOverlaySimplePresenteur.ouvrirFenetreModale(new FormulairePropositionPresenteur(new FormulairePropositionVue(), new PropositionDeterminationServiceConcret()));
251
			}
252
		};
253
		vue.getBoutonAjoutProposition().addClickHandler(clicAjoutProposition);
254
		vue.getBoutonAjoutPropositionBas().addClickHandler(clicAjoutProposition);
255
 
256
		ClickHandler clicAjoutCommentaire = new ClickHandler() {
257
			@Override
258
			public void onClick(ClickEvent event) {
259
				FormulaireCommentairePresenteur commentairePresenteur = new FormulaireCommentairePresenteur(cache.getObservationCourante(), new CommentaireServiceConcret(), new FormulaireCommentaireVue());
260
				fenetreOverlaySimplePresenteur = new FenetreOverlaySimplePresenteur(new FenetreOverlayDefilanteVue());
261
				fenetreOverlaySimplePresenteur.ouvrirFenetreModale(commentairePresenteur);
262
			}
263
		};
264
		vue.getBoutonAjoutCommentaire().addClickHandler(clicAjoutCommentaire);
265
		vue.getBoutonAjoutCommentaireBas().addClickHandler(clicAjoutCommentaire);
266
 
1196 gduche 267
		vue.getLienOuvrages().addClickHandler(new ClickHandler() {
268
			@Override
269
			public void onClick(ClickEvent event) {
270
				Config config = new Config();
1687 mathias 271
				Window.open(config.getUrl("ouvragesFlore"), "Flores numérisées", config.getInfo("popupOptions"));
1196 gduche 272
			}
273
		});
274
 
275
		vue.getLienBonnier().addClickHandler(new ClickHandler() {
276
			@Override
277
			public void onClick(ClickEvent event) {
278
				Config config = new Config();
1687 mathias 279
				Window.open(config.getUrl("bonnierPda"), "Flore Bonnier PDA", config.getInfo("popupOptions"));
1196 gduche 280
			}
281
		});
282
 
283
		vue.getLienCles().addClickHandler(new ClickHandler() {
284
			@Override
285
			public void onClick(ClickEvent event) {
286
				Config config = new Config();
1687 mathias 287
				Window.open(config.getUrl("clesDetermination"), "Clés de determination", config.getInfo("popupOptions"));
1196 gduche 288
			}
289
		});
290
 
291
		vue.getLienEflore().addClickHandler(new ClickHandler() {
292
			@Override
293
			public void onClick(ClickEvent event) {
294
				Config config = new Config();
1687 mathias 295
				Window.open(config.getUrl("eflore"), "eFlore", config.getInfo("popupOptions"));
1196 gduche 296
			}
297
		});
1257 aurelien 298
 
299
		vue.getBoutonValidationTaxon().addClickHandler(new ClickHandler() {
300
			@Override
301
			public void onClick(ClickEvent event) {
1689 jpm 302
				if (Window.confirm(I18n.getVocabulary().confirmationValidationDetermination())) {
1257 aurelien 303
					validerPropositionPlusPopulaire();
304
				}
305
			}
306
		});
1689 jpm 307
 
308
		vue.getBoutonDepublierObs().addClickHandler(new ClickHandler() {
309
			@Override
310
			public void onClick(ClickEvent event) {
311
				GWT.log("Lancer evnt : EvenementDepublierObs");
1690 jpm 312
				if (Window.confirm(I18n.getVocabulary().confirmationDepublicationObs())) {
313
					BusEvenementiel.getInstance().fireEvent(new EvenementDepublierObs(observation.getId()));
314
				}
1689 jpm 315
			}
316
		});
317
 
318
		BusEvenementiel.getInstance().addHandler(EvenementDepublierObs.TYPE, new GestionnaireEvenementDepublierObs() {
319
			@Override
320
			public void onDepublicationObs(EvenementDepublierObs event) {
321
				GWT.log("Attraper evnt : EvenementDepublierObs (obs:"+event.getIdObs()+")");
322
				if (event.getIdObs().equals(observation.getId())) {
1690 jpm 323
					depublierObs();
1689 jpm 324
				}
325
			}
326
		});
1690 jpm 327
 
328
		BusEvenementiel.getInstance().addHandler(EvenementChangementEtatUtilisateur.TYPE, new GestionnaireEvenementChangementEtatUtilisateur() {
329
			@Override
330
			public void onModificationEtatUtilisateur(EvenementChangementEtatUtilisateur evenementChangementEtatUtilisateur) {
331
				afficherZoneActionsObs();
332
			}
333
		});
1196 gduche 334
	}
1257 aurelien 335
 
336
	private void validerPropositionPlusPopulaire() {
337
		PropositionDeterminationServiceConcret propositionService = new PropositionDeterminationServiceConcret();
1775 aurelien 338
		propositionPlusPopulaire.setValideePar(CacheClient.getInstance().getUtilisateur().getId());
1257 aurelien 339
		propositionService.validerProposition(propositionPlusPopulaire, new ValidationPropositionCallback() {
340
			@Override
341
			public void surRetour(String objetRetour) {
342
				String observationId = URLUtils.getURLSpecialParameterValue();
343
				observationService.getObservation(observationId, new ObservationsCallback() {
344
 
345
					@Override
346
					public void surRetour(ObservationServiceResultat objetRetour) {
347
						vue.viderMetadonnees();
348
						new MetadonneesPresenteur(new MetadonneesEnLigneVue(), cache.getObservationCourante(), ModeRecherche.MODE_OBSERVATION, false).go(vue.getMetadonnees());
349
						calculerEtAfficherVoteDeterminationPlusPopulaire();
350
					}
351
 
352
					@Override
353
					public void surErreur(String messageErreur) {
354
						Window.alert(messageErreur);
355
					}
356
				});
357
			}
358
		});
359
	}
1689 jpm 360
 
361
	private void depublierObs() {
1690 jpm 362
		if (avoirUtilisateurAdmin()) {
363
			GWT.log("depublierObs :"+observation.getId());
364
			observationService.depublier(observation, new DepublicationObservationCallBack() {
365
 
366
				@Override
367
				public void surRetour(String depublicationOk) {
368
					GWT.log("Dépublication obs "+observation.getId()+" "+depublicationOk);
369
					if (depublicationOk.equals("OK")) {
370
						BusEvenementiel.getInstance().fireEvent(new EvenementRechercheObservation());
371
					}
1689 jpm 372
				}
1690 jpm 373
			});
374
		}
1689 jpm 375
	}
1690 jpm 376
 
377
	private void afficherZoneActionsObs() {
378
		if (avoirUtilisateurAdmin()) {
379
			vue.afficherZoneActionsObs();
380
		} else {
381
			vue.cacherZoneActionsObs();
382
		}
383
	}
384
 
385
	private boolean avoirUtilisateurAdmin() {
386
		Utilisateur utilisateur = CacheClient.getInstance().getUtilisateur();
387
		boolean etreAdmin = false;
388
		if (utilisateur != null) {
389
			etreAdmin = utilisateur.estIdentifie() && utilisateur.etreAdmin();
390
		}
391
		return etreAdmin;
392
	}
1196 gduche 393
}