Subversion Repositories eFlore/Applications.del

Rev

Rev 2054 | 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.resultats;
2
 
1283 aurelien 3
import java.util.List;
4
 
1196 gduche 5
import org.tela_botanica.del.client.cache.CacheClient;
6
import org.tela_botanica.del.client.composants.pagination.PaginationPresenteur;
7
import org.tela_botanica.del.client.composants.pagination.PaginationVue;
8
import org.tela_botanica.del.client.composants.presenteur.Presenteur;
2050 aurelien 9
import org.tela_botanica.del.client.gestionhistorique.ConstantesNavigation;
2054 aurelien 10
import org.tela_botanica.del.client.modeles.ActiviteUtilisateur;
1283 aurelien 11
import org.tela_botanica.del.client.modeles.Image;
1196 gduche 12
import org.tela_botanica.del.client.modeles.InformationsRecherche;
13
import org.tela_botanica.del.client.modeles.ModeTri;
14
import org.tela_botanica.del.client.modeles.Observation;
15
import org.tela_botanica.del.client.modeles.ObservationServiceResultat;
2050 aurelien 16
import org.tela_botanica.del.client.modeles.Utilisateur;
1196 gduche 17
import org.tela_botanica.del.client.services.rest.ObservationService;
2054 aurelien 18
import org.tela_botanica.del.client.services.rest.UtilisateurServiceConcret;
19
import org.tela_botanica.del.client.services.rest.async.ActiviteUtilisateurCallback;
1196 gduche 20
import org.tela_botanica.del.client.services.rest.async.ObservationsCallback;
2050 aurelien 21
import org.tela_botanica.del.client.utils.StringUtils;
1196 gduche 22
import org.tela_botanica.del.client.vues.identiplante.resultats.observations.ObservationPresenteur;
23
import org.tela_botanica.del.client.vues.identiplante.resultats.observations.ObservationVue;
24
 
25
import com.google.gwt.event.dom.client.ClickEvent;
26
import com.google.gwt.event.dom.client.ClickHandler;
27
import com.google.gwt.event.dom.client.HasClickHandlers;
2054 aurelien 28
import com.google.gwt.user.client.Timer;
1196 gduche 29
import com.google.gwt.user.client.Window;
30
import com.google.gwt.user.client.ui.HasWidgets;
31
import com.google.gwt.user.client.ui.IsWidget;
1934 aurelien 32
import com.google.gwt.user.client.ui.Label;
1196 gduche 33
 
34
public class ResultatsIdentiplantePresenteur extends Presenteur {
35
 
36
	/**
37
	 * Interface vue : création des composants graphiques
38
	 * */
39
	public abstract interface Vue extends IsWidget {
40
		public HasWidgets getZoneObservations();
41
 
42
		public HasWidgets getZonePaginationHaut();
43
 
44
		public HasWidgets getZonePaginationBas();
45
 
46
		public void startChargement();
47
 
48
		public void stopChargement();
49
 
50
		public void nettoyer();
51
 
1934 aurelien 52
		public HasClickHandlers getTriParDateObservationAscendant();
1196 gduche 53
 
1934 aurelien 54
		public HasClickHandlers getTriParDateObservationDescendant();
55
 
56
		public HasClickHandlers getTriParDatePublicationAscendant();
1196 gduche 57
 
1934 aurelien 58
		public HasClickHandlers getTriParDatePublicationDescendant();
59
 
60
		public HasClickHandlers getTriParNbCommentairesAscendant();
61
 
62
		public HasClickHandlers getTriParNbCommentairesDescendant();
63
 
1196 gduche 64
		public void afficherElementsAucunResultatTrouve();
65
 
66
		public void afficherElementsResultatsTrouves();
67
 
1934 aurelien 68
		public HasClickHandlers getLabelDateObservation();
69
 
70
		public HasClickHandlers getLabelDatePublication();
71
 
72
		public HasClickHandlers getLabelNbCommentaires();
1196 gduche 73
 
1934 aurelien 74
		void setModeTriPublication(ModeTri mode);
75
 
76
		void setModeTriObservation(ModeTri mode);
77
 
78
		void setModeTriNbCommentaires(ModeTri mode);
2050 aurelien 79
 
80
		void afficherCacherZoneTri(boolean afficher);
1196 gduche 81
	}
82
 
83
	private Vue vue;
84
	private ObservationService serviceObs;
1934 aurelien 85
	private ModeTri triCourantDatePublication = ModeTri.TRI_DESCENDANT;
86
	private ModeTri triCourantDateObservation = ModeTri.PAS_DE_TRI;
87
	private ModeTri triCourantNbCommentaires = ModeTri.PAS_DE_TRI;
1196 gduche 88
	private CacheClient cache = CacheClient.getInstance();
89
	private String statut;
90
 
91
	/**
92
	 * Constructeur de la classe
93
	 *
94
	 * @param ObservationService
95
	 *            serviceObs le service pour récupérer les observations
96
	 * @Vue Vue l'objet implémentant l'interface
97
	 * */
1234 gduche 98
	public ResultatsIdentiplantePresenteur(ObservationService serviceObs, Vue vue) {
99
		String statut = CacheClient.getInstance().getFiltreStatut();
1196 gduche 100
		this.vue = vue;
1934 aurelien 101
		InformationsRecherche infos = CacheClient.getInstance().getInformationsRechercheObservation();
102
 
103
		if (infos.getTriParDatePublication() != ModeTri.PAS_DE_TRI) {
104
			triCourantDatePublication = infos.getTriParDatePublication();
105
			vue.setModeTriPublication(triCourantDatePublication);
106
		}
107
 
108
		if (infos.getTriParDateObservation() != ModeTri.PAS_DE_TRI) {
109
			triCourantDateObservation = infos.getTriParDateObservation();
110
			vue.setModeTriObservation(triCourantDatePublication);
111
		}
112
 
113
		if (infos.getTriParNbCommentaires() != ModeTri.PAS_DE_TRI) {
114
			triCourantNbCommentaires = infos.getTriParNbCommentaires();
115
			vue.setModeTriNbCommentaires(triCourantNbCommentaires);
116
		}
117
 
1196 gduche 118
		this.serviceObs = serviceObs;
119
		this.statut = statut;
120
	}
121
 
122
	/**
123
	 * Lancer l'affichage de la recherche dans le composant passé en paramètre
124
	 *
1665 jpm 125
	 * @param HasWidgets composite le conteneur de widgets dans lequel ajouter la vue
1196 gduche 126
	 * */
127
	public void go(HasWidgets composite) {
128
		composite.add(vue.asWidget());
129
		lancerRechercheEtCreerWidgetPagination();
130
		gererEvenements();
131
	}
132
 
133
	/**
134
	 * Initier un callback pour créer le widget de pagination et afficher les
135
	 * observations recues et lancer la recherche avec le service
136
	 * */
137
	public void lancerRechercheEtCreerWidgetPagination() {
2050 aurelien 138
 
1196 gduche 139
		int debut = (cache.getPageCouranteRechercheObservations() - 1) * cache.getPasPagination();
140
		int fin = cache.getPageCouranteRechercheObservations() * cache.getPasPagination();
141
 
142
		ObservationsCallback callback = new ObservationsCallback() {
143
 
144
			@Override
145
			public void surRetour(ObservationServiceResultat observationsRecues) {
146
				creerWidgetPagination(observationsRecues.getNbTotalObservationsPourLaRecherche());
147
				afficherObservations(observationsRecues);
148
 
149
			}
150
 
151
			@Override
152
			public void surErreur(String messageErreur) {
153
				Window.alert(messageErreur);
154
 
155
			}
156
		};
157
 
158
		serviceObs.getObservations(cache.getInformationsRechercheObservation(), debut, fin, statut, callback);
159
	}
160
 
161
	/**
162
	 * Créer les widgets de pagination en fonction du nombre d'observation
163
	 *
164
	 * @param int nbObservations le nombre d'observations à afficher
165
	 * */
166
	private void creerWidgetPagination(int nbObservations) {
167
		vue.getZonePaginationHaut().clear();
168
		PaginationPresenteur paginationPresenteurHaut = creerPresenteurPagination(nbObservations);
169
		paginationPresenteurHaut.setGroupePagination("pagination_observations");
170
		paginationPresenteurHaut.go(vue.getZonePaginationHaut());
171
 
172
		vue.getZonePaginationBas().clear();
173
		PaginationPresenteur paginationPresenteurBas = creerPresenteurPagination(nbObservations);
174
		paginationPresenteurBas.setGroupePagination("pagination_observations");
175
		paginationPresenteurBas.go(vue.getZonePaginationBas());
176
	}
177
 
178
	/**
179
	 * Créer un présenteur du widget pagination
180
	 *
181
	 * @param int nbObservations le nombre total d'observation à afficher
182
	 * */
183
	private PaginationPresenteur creerPresenteurPagination(int nbObservations) {
184
		PaginationPresenteur presenteur = new PaginationPresenteur(new PaginationVue(), nbObservations, cache.getPasPagination(), cache.getPageCouranteRechercheObservations()) {
185
 
186
			@Override
187
			public void chargerElements(int debut, int fin) {
188
				chargerEtAfficherObservations(debut, fin);
189
				cache.setPageCouranteRechercheObservations(getPageCourante());
190
			}
191
 
192
			@Override
193
			public void actualiserPasCache(int pas) {
194
				cache.setPasPagination(pas);
195
			}
196
 
197
		};
198
		return presenteur;
199
	}
200
 
201
	/**
202
	 * Gestion des évènements de la vue recherche Observation
203
	 * */
204
	protected void gererEvenements() {
205
 
1934 aurelien 206
		ClickHandler surClicDateObservation = new ClickHandler() {
1196 gduche 207
			/**
208
			 * Gestion du clic sur l'option de tri par date d'observation Masque
209
			 * les éléments de tri qui sont en cours et affiche les autres
210
			 * */
211
			public void onClick(ClickEvent event) {
1934 aurelien 212
				toggleModeTriObservation();
1196 gduche 213
 
214
				InformationsRecherche informationsRechercheObservations = cache.getInformationsRechercheObservation();
1934 aurelien 215
				informationsRechercheObservations.setTriParDatePublication(ModeTri.PAS_DE_TRI);
216
				informationsRechercheObservations.setTriParNbCommentaires(ModeTri.PAS_DE_TRI);
217
				informationsRechercheObservations.setTriParDateObservation(triCourantDateObservation);
1196 gduche 218
				chercherEtAfficherObservationsPageEnCours();
219
			}
220
		};
1934 aurelien 221
 
222
		ClickHandler surClicDatePublication = new ClickHandler() {
223
			/**
224
			 * Gestion du clic sur l'option de tri par date d'observation Masque
225
			 * les éléments de tri qui sont en cours et affiche les autres
226
			 * */
227
			public void onClick(ClickEvent event) {
228
				toggleModeTriPublication();
1196 gduche 229
 
1934 aurelien 230
				InformationsRecherche informationsRechercheObservations = cache.getInformationsRechercheObservation();
231
				informationsRechercheObservations.setTriParDateObservation(ModeTri.PAS_DE_TRI);
232
				informationsRechercheObservations.setTriParNbCommentaires(ModeTri.PAS_DE_TRI);
233
				informationsRechercheObservations.setTriParDatePublication(triCourantDatePublication);
234
 
235
				chercherEtAfficherObservationsPageEnCours();
236
			}
237
		};
238
 
239
		ClickHandler surClicNbCommentaires = new ClickHandler() {
240
			/**
241
			 * Même comportement qu'au dessus mais pour le tri par nb de commentaires
242
			 */
243
			public void onClick(ClickEvent event) {
244
				toggleModeTriNbCommentaires();
245
 
246
				InformationsRecherche informationsRechercheObservations = cache.getInformationsRechercheObservation();
247
				informationsRechercheObservations.setTriParDateObservation(ModeTri.PAS_DE_TRI);
248
				informationsRechercheObservations.setTriParDatePublication(ModeTri.PAS_DE_TRI);
249
				informationsRechercheObservations.setTriParNbCommentaires(triCourantNbCommentaires);
250
				chercherEtAfficherObservationsPageEnCours();
251
			}
252
		};
253
 
254
		vue.getLabelDateObservation().addClickHandler(surClicDateObservation);
255
		vue.getTriParDateObservationAscendant().addClickHandler(surClicDateObservation);
256
		vue.getTriParDateObservationDescendant().addClickHandler(surClicDateObservation);
257
 
258
		vue.getLabelDatePublication().addClickHandler(surClicDatePublication);
259
		vue.getTriParDatePublicationAscendant().addClickHandler(surClicDatePublication);
260
		vue.getTriParDatePublicationDescendant().addClickHandler(surClicDatePublication);
261
 
262
		vue.getLabelNbCommentaires().addClickHandler(surClicNbCommentaires);
263
		vue.getTriParNbCommentairesAscendant().addClickHandler(surClicNbCommentaires);
264
		vue.getTriParNbCommentairesDescendant().addClickHandler(surClicNbCommentaires);
1196 gduche 265
	}
266
 
267
	/**
268
	 * Inverser le mode de tri en fonction du précédent
269
	 * */
1934 aurelien 270
	public void toggleModeTriPublication() {
271
		if (triCourantDatePublication == ModeTri.TRI_ASCENDANT) {
272
			triCourantDatePublication = ModeTri.TRI_DESCENDANT;
1969 aurelien 273
		} else if(triCourantDatePublication == ModeTri.TRI_DESCENDANT) {
274
			triCourantDatePublication = ModeTri.TRI_ASCENDANT;
1196 gduche 275
		} else {
1969 aurelien 276
			triCourantDatePublication = ModeTri.TRI_DESCENDANT;
1196 gduche 277
		}
1934 aurelien 278
 
279
		triCourantDateObservation = ModeTri.PAS_DE_TRI;
280
		triCourantNbCommentaires = ModeTri.PAS_DE_TRI;
1196 gduche 281
 
1934 aurelien 282
		vue.setModeTriPublication(triCourantDatePublication);
1196 gduche 283
	}
1934 aurelien 284
 
285
	/**
286
	 * Inverser le mode de tri en fonction du précédent
287
	 * */
288
	public void toggleModeTriObservation() {
289
		if (triCourantDateObservation == ModeTri.TRI_ASCENDANT) {
290
			triCourantDateObservation = ModeTri.TRI_DESCENDANT;
1969 aurelien 291
		} else if(triCourantDateObservation == ModeTri.TRI_DESCENDANT) {
292
			triCourantDateObservation = ModeTri.TRI_ASCENDANT;
1934 aurelien 293
		} else {
1969 aurelien 294
			triCourantDateObservation = ModeTri.TRI_DESCENDANT;
1934 aurelien 295
		}
296
 
297
		triCourantDatePublication = ModeTri.PAS_DE_TRI;
298
		triCourantNbCommentaires = ModeTri.PAS_DE_TRI;
1196 gduche 299
 
1934 aurelien 300
		vue.setModeTriObservation(triCourantDateObservation);
301
	}
302
 
1196 gduche 303
	/**
1934 aurelien 304
	 * Inverser le mode de tri en fonction du précédent
305
	 * */
306
	public void toggleModeTriNbCommentaires() {
307
		if (triCourantNbCommentaires == ModeTri.TRI_ASCENDANT) {
308
			triCourantNbCommentaires = ModeTri.TRI_DESCENDANT;
1969 aurelien 309
		} else if(triCourantNbCommentaires == ModeTri.TRI_DESCENDANT) {
310
			triCourantNbCommentaires = ModeTri.TRI_ASCENDANT;
1934 aurelien 311
		} else {
1969 aurelien 312
			triCourantNbCommentaires = ModeTri.TRI_DESCENDANT;
1934 aurelien 313
		}
314
 
315
		triCourantDateObservation = ModeTri.PAS_DE_TRI;
316
		triCourantDatePublication = ModeTri.PAS_DE_TRI;
317
 
318
		vue.setModeTriNbCommentaires(triCourantNbCommentaires);
319
	}
320
 
321
	/**
1196 gduche 322
	 * Initialiser les variable de début et fin et lancer le chargement des
323
	 * observations
324
	 * */
325
	public void chercherEtAfficherObservationsPageEnCours() {
326
		int debut = (cache.getPageCouranteRechercheObservations() - 1) * cache.getPasPagination();
327
		int fin = (cache.getPageCouranteRechercheObservations()) * cache.getPasPagination();
328
		chargerEtAfficherObservations(debut, fin);
329
	}
330
 
331
	/**
332
	 * Lancer le service pour charger les observations entre debut et fin et les
333
	 * afficher
334
	 *
335
	 * @param int debut l'entier de départ de la requete
336
	 * @param int fin l'entier de limite de la requete
337
	 * */
338
	public void chargerEtAfficherObservations(int debut, int fin) {
339
		vue.startChargement();
340
		vue.nettoyer();
341
 
342
		ObservationsCallback surReceptionObservation = new ObservationsCallback() {
343
 
344
			@Override
345
			public void surRetour(ObservationServiceResultat observationsRecues) {
346
				afficherObservations(observationsRecues);
347
 
348
			}
349
 
350
			@Override
351
			public void surErreur(String messageErreur) {
352
				Window.alert(messageErreur);
353
 
354
			}
355
		};
356
		serviceObs.getObservations(cache.getInformationsRechercheObservation(), debut, fin, statut, surReceptionObservation);
357
	}
358
 
359
	/**
360
	 * Parcrourir les résultats de la recherche pour initier l'affichage de
361
	 * chaque observation
362
	 *
363
	 * @param ObservationServiceResultat
364
	 *            resultats les résultats issus de la requête
365
	 * */
366
	private void afficherObservations(ObservationServiceResultat resultats) {
367
		vue.nettoyer();
368
 
369
		if (resultats.getObservations() == null || resultats.getObservations().size() == 0) {
370
			vue.afficherElementsAucunResultatTrouve();
371
		} else {
372
			vue.afficherElementsResultatsTrouves();
2050 aurelien 373
 
374
			// Si on consulte l'onglet mon activité, on cache le tri qui n'a pas de sens ici car c'est une timeline
375
			vue.afficherCacherZoneTri(!cache.getFiltreStatut().equals(ConstantesNavigation.PARAM_TYPE_MONACTIVITE));
376
			// S'il y a de nouveau évènements sur l'obs, elle doit être mise en valeur
377
			// les x premieres obs sont affichées un peu différemment (où x est le nombre de nouveaux évènements)
378
			int i = 0;
2054 aurelien 379
			int nbEvents = CacheClient.getInstance().getUtilisateur().getActivite().getNbEvenementsInt();
2050 aurelien 380
 
1196 gduche 381
			for (Observation observation : resultats.getObservations()) {
1283 aurelien 382
				List<Image> listeImagesObs = observation.getImages();
383
				Image imagePrincipale = null;
384
				if(listeImagesObs != null && listeImagesObs.size() > 0) {
385
					imagePrincipale = listeImagesObs.get(0);
386
				}
387
				ObservationPresenteur presenteur = new ObservationPresenteur(new ObservationVue(), observation, imagePrincipale);
1196 gduche 388
				presenteur.go(vue.getZoneObservations());
2050 aurelien 389
 
2054 aurelien 390
				// La taille de la page s'étant adaptée au nombre de nouveaux évènements, on applique
391
				// uniquement la mise en valeur sur la premiere
392
				if(nbEvents != 0 && i < nbEvents && cache.getPageCouranteRechercheObservations() == 1) {
2050 aurelien 393
					presenteur.mettreEnValeurEvenementsObs();
394
				}
395
				i++;
1196 gduche 396
			}
397
		}
1501 aurelien 398
		CacheClient.getInstance().mettreAjourUrlCourante();
1196 gduche 399
		vue.stopChargement();
400
	}
401
}