Subversion Repositories eFlore/Applications.del

Rev

Rev 1687 | Rev 1690 | 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;
1199 gduche 16
import org.tela_botanica.del.client.composants.partageurl.PartageUrlPresenteur;
17
import org.tela_botanica.del.client.composants.partageurl.PartageUrlVue;
1196 gduche 18
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
19
import org.tela_botanica.del.client.composants.rss.RssPresenteur;
20
import org.tela_botanica.del.client.composants.rss.RssVue;
21
import org.tela_botanica.del.client.config.Config;
22
import org.tela_botanica.del.client.gestionhistorique.ConstantesNavigation;
1257 aurelien 23
import org.tela_botanica.del.client.i18n.I18n;
1196 gduche 24
import org.tela_botanica.del.client.modeles.Image;
25
import org.tela_botanica.del.client.modeles.ModeRecherche;
26
import org.tela_botanica.del.client.modeles.MoyenneVote;
27
import org.tela_botanica.del.client.modeles.Observation;
28
import org.tela_botanica.del.client.modeles.ObservationServiceResultat;
1257 aurelien 29
import org.tela_botanica.del.client.modeles.PropositionDetermination;
30
import org.tela_botanica.del.client.modeles.Utilisateur;
1196 gduche 31
import org.tela_botanica.del.client.modeles.VoteDetermination;
32
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
33
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.EvenementAjoutCommentaire;
34
import org.tela_botanica.del.client.navigation.evenement.ajoutcommentaire.GestionnaireEvenementAjoutCommentaire;
35
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.EvenementAjoutDetermination;
36
import org.tela_botanica.del.client.navigation.evenement.ajoutdetermination.GestionnaireEvenementAjoutDetermination;
1314 aurelien 37
import org.tela_botanica.del.client.navigation.evenement.changementEtatUtilisateur.EvenementChangementEtatUtilisateur;
38
import org.tela_botanica.del.client.navigation.evenement.changementEtatUtilisateur.GestionnaireEvenementChangementEtatUtilisateur;
1196 gduche 39
import org.tela_botanica.del.client.navigation.evenement.changementimagevalidation.EvenementChangementImageValidation;
40
import org.tela_botanica.del.client.navigation.evenement.changementimagevalidation.GestionnaireEvenementChangementImageValidation;
1689 jpm 41
import org.tela_botanica.del.client.navigation.evenement.depublierObs.EvenementDepublierObs;
42
import org.tela_botanica.del.client.navigation.evenement.depublierObs.GestionnaireEvenementDepublierObs;
43
import org.tela_botanica.del.client.navigation.evenement.supprimerImage.EvenementSupprimerImage;
1196 gduche 44
import org.tela_botanica.del.client.navigation.evenement.voteDetermination.EvenementVoteDetermination;
45
import org.tela_botanica.del.client.navigation.evenement.voteDetermination.GestionnaireEvenementVoteDetermination;
46
import org.tela_botanica.del.client.services.CalculVoteDeterminationService;
47
import org.tela_botanica.del.client.services.rest.CommentaireServiceConcret;
48
import org.tela_botanica.del.client.services.rest.ObservationService;
49
import org.tela_botanica.del.client.services.rest.PropositionDeterminationServiceConcret;
1689 jpm 50
import org.tela_botanica.del.client.services.rest.async.DepublicationObservationCallBack;
1196 gduche 51
import org.tela_botanica.del.client.services.rest.async.ObservationsCallback;
1689 jpm 52
import org.tela_botanica.del.client.services.rest.async.SuppressionImageCallback;
1257 aurelien 53
import org.tela_botanica.del.client.services.rest.async.ValidationPropositionCallback;
1196 gduche 54
import org.tela_botanica.del.client.utils.URLUtils;
1689 jpm 55
import org.tela_botanica.del.client.navigation.evenement.rechercheobservation.EvenementRechercheObservation;
1196 gduche 56
import org.tela_botanica.del.client.composants.formulairerechercheeflore.FormulaireRechercheEflorePresenteur;
57
import org.tela_botanica.del.client.composants.forum.ForumPresenteur;
58
import org.tela_botanica.del.client.composants.forum.ForumVue;
59
 
1689 jpm 60
import com.google.gwt.core.shared.GWT;
1196 gduche 61
import com.google.gwt.event.dom.client.ClickEvent;
62
import com.google.gwt.event.dom.client.ClickHandler;
63
import com.google.gwt.event.dom.client.HasClickHandlers;
64
import com.google.gwt.user.client.Window;
65
import com.google.gwt.user.client.ui.Button;
66
import com.google.gwt.user.client.ui.HasWidgets;
67
import com.google.gwt.user.client.ui.IsWidget;
68
import com.google.gwt.user.client.ui.Panel;
69
 
70
public class IdentiplanteDeterminationPresenteur extends Presenteur {
71
 
72
	/**
73
	 * Vue de l'interface de détermination
74
	 * */
75
	public interface Vue extends IsWidget {
76
		public Panel getForum();
77
 
78
		public Panel getDetailImageObservation();
79
 
80
		public Panel getFormulaireRechercheEflore();
81
 
82
		public Button getBoutonAjoutProposition();
83
 
84
		public Button getBoutonAjoutCommentaire();
85
 
86
		public Button getBoutonAjoutPropositionBas();
87
 
88
		public Button getBoutonAjoutCommentaireBas();
1689 jpm 89
 
90
		public HasClickHandlers getBoutonDepublierObs();
1196 gduche 91
 
92
		public HasWidgets getMetadonnees();
93
 
94
		public void afficherNomTaxonProbable(String nomTaxon);
95
 
96
		public HasClickHandlers getLienOuvrages();
97
 
98
		public HasClickHandlers getLienBonnier();
99
 
100
		public HasClickHandlers getLienCles();
101
 
102
		public HasClickHandlers getLienEflore();
103
 
104
		public HasWidgets getZoneRss();
1257 aurelien 105
 
106
		HasClickHandlers getBoutonValidationTaxon();
107
 
108
		void cacherBoutonValidationTaxon();
109
 
110
		void afficherBoutonValidationTaxon();
111
 
112
		public void viderMetadonnees();
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
		});
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");
310
				BusEvenementiel.getInstance().fireEvent(new EvenementDepublierObs(observation.getId()));
311
			}
312
		});
313
 
314
		BusEvenementiel.getInstance().addHandler(EvenementDepublierObs.TYPE, new GestionnaireEvenementDepublierObs() {
315
			@Override
316
			public void onDepublicationObs(EvenementDepublierObs event) {
317
				GWT.log("Attraper evnt : EvenementDepublierObs (obs:"+event.getIdObs()+")");
318
				if (event.getIdObs().equals(observation.getId())) {
319
					if (Window.confirm(I18n.getVocabulary().confirmationDepublicationObs())) {
320
						depublierObs();
321
					}
322
				}
323
			}
324
		});
1196 gduche 325
	}
1257 aurelien 326
 
327
	private void validerPropositionPlusPopulaire() {
328
		PropositionDeterminationServiceConcret propositionService = new PropositionDeterminationServiceConcret();
329
		propositionService.validerProposition(propositionPlusPopulaire, new ValidationPropositionCallback() {
330
			@Override
331
			public void surRetour(String objetRetour) {
332
				String observationId = URLUtils.getURLSpecialParameterValue();
333
				observationService.getObservation(observationId, new ObservationsCallback() {
334
 
335
					@Override
336
					public void surRetour(ObservationServiceResultat objetRetour) {
337
						vue.viderMetadonnees();
338
						new MetadonneesPresenteur(new MetadonneesEnLigneVue(), cache.getObservationCourante(), ModeRecherche.MODE_OBSERVATION, false).go(vue.getMetadonnees());
339
						calculerEtAfficherVoteDeterminationPlusPopulaire();
340
					}
341
 
342
					@Override
343
					public void surErreur(String messageErreur) {
344
						Window.alert(messageErreur);
345
					}
346
				});
347
			}
348
		});
349
	}
1689 jpm 350
 
351
	private void depublierObs() {
352
		GWT.log("depublierObs :"+observation.getId());
353
		observationService.depublier(observation, new DepublicationObservationCallBack() {
354
 
355
			@Override
356
			public void surRetour(String depublicationOk) {
357
				GWT.log("Dépublication obs "+observation.getId()+" "+depublicationOk);
358
				if (depublicationOk.equals("OK")) {
359
					BusEvenementiel.getInstance().fireEvent(new EvenementRechercheObservation());
360
				}
361
			}
362
		});
363
	}
1196 gduche 364
}