Subversion Repositories eFlore/Applications.del

Rev

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