Subversion Repositories eFlore/Applications.del

Rev

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

Rev Author Line No. Line
256 gduche 1
package org.tela_botanica.del.client.composants.pagination;
120 gduche 2
 
445 benjamin 3
import org.tela_botanica.del.client.navigation.evenement.BusEvenementiel;
4
import org.tela_botanica.del.client.navigation.evenement.pagination.EvenementChangementPage;
5
import org.tela_botanica.del.client.navigation.evenement.pagination.EvenementChangementPas;
6
import org.tela_botanica.del.client.navigation.evenement.pagination.GestionnaireEvenementChangementPage;
7
import org.tela_botanica.del.client.navigation.evenement.pagination.GestionnaireEvenementChangementPas;
8
 
120 gduche 9
import com.google.gwt.event.dom.client.ChangeEvent;
10
import com.google.gwt.event.dom.client.ChangeHandler;
11
import com.google.gwt.event.dom.client.ClickEvent;
12
import com.google.gwt.event.dom.client.ClickHandler;
391 aurelien 13
import com.google.gwt.event.dom.client.HasChangeHandlers;
14
import com.google.gwt.event.dom.client.HasClickHandlers;
566 gduche 15
import com.google.gwt.user.client.Window;
391 aurelien 16
import com.google.gwt.user.client.ui.HasText;
120 gduche 17
import com.google.gwt.user.client.ui.HasWidgets;
391 aurelien 18
import com.google.gwt.user.client.ui.IsWidget;
436 benjamin 19
 
269 gduche 20
/**
358 benjamin 21
 * @author gregoire Pagination GENERIQUE qui permet d'afficher un nombre donné
22
 *         d'éléments (pas) La méthode changerPage est abstraite et doit être
23
 *         définie lors de l'instanciation de la classe pagination pour
24
 *         permettre d'afficher la suite des éléments La méthode
25
 *         actualiserPasCache est abstraite car le pas est différent en fonction
26
 *         de la page où l'on se trouve
269 gduche 27
 * */
120 gduche 28
public abstract class PaginationPresenteur {
29
 
391 aurelien 30
	public interface Vue extends IsWidget {
31
		public HasWidgets getZoneLiens();
436 benjamin 32
 
391 aurelien 33
		public int getNbWidgetsZoneLiens();
436 benjamin 34
 
391 aurelien 35
		public HasClickHandlers getWidgetZoneLiensHasClickHandlers(int index);
436 benjamin 36
 
391 aurelien 37
		public HasText getWidgetZoneLiensAsText(int index);
436 benjamin 38
 
391 aurelien 39
		public void changerStyleBoutonZoneLiens(int index, String style);
436 benjamin 40
 
391 aurelien 41
		public void ajouterBoutonZoneLiens(String label);
436 benjamin 42
 
391 aurelien 43
		public HasClickHandlers getBoutonSuivant();
436 benjamin 44
 
391 aurelien 45
		public HasClickHandlers getBoutonPrecedent();
436 benjamin 46
 
391 aurelien 47
		public HasClickHandlers getBoutonPremierePage();
436 benjamin 48
 
391 aurelien 49
		public HasClickHandlers getBoutonDernierePage();
436 benjamin 50
 
412 aurelien 51
		public void masquerBoutonPrecedent();
436 benjamin 52
 
412 aurelien 53
		public void afficherBoutonPrecedent();
436 benjamin 54
 
391 aurelien 55
		public void masquerBoutonSuivant();
436 benjamin 56
 
391 aurelien 57
		public void afficherBoutonSuivant();
436 benjamin 58
 
412 aurelien 59
		public boolean boutonPrecedentEstAffiche();
436 benjamin 60
 
412 aurelien 61
		public boolean boutonSuivantEstAffiche();
436 benjamin 62
 
391 aurelien 63
		public HasChangeHandlers getSelecteurPas();
436 benjamin 64
 
391 aurelien 65
		public int getPasSelectionne();
436 benjamin 66
 
445 benjamin 67
		public void afficherPas(int pas);
68
 
69
		public void mettreEnValeurPageActive(int pageActive);
564 benjamin 70
 
488 benjamin 71
		public void mettreNbTotalPages(int nbPages);
391 aurelien 72
	}
436 benjamin 73
 
391 aurelien 74
	private Vue vue;
445 benjamin 75
	private int nbPage = 1;
269 gduche 76
	private int pageCourante = 1;
120 gduche 77
	private int nbElementsTotal = 0;
263 gduche 78
	private int pas = 10;
564 benjamin 79
 
446 aurelien 80
	private String groupePagination = null;
358 benjamin 81
 
269 gduche 82
	/**
83
	 * Constructeur de l'application
358 benjamin 84
	 *
85
	 * @param nbElementsTotal
86
	 *            : le nombre total des éléments à paginer
87
	 * @param pas
88
	 *            : le nombre d'éléments à afficher par page
269 gduche 89
	 * */
445 benjamin 90
	public PaginationPresenteur(Vue vue, int nbElementsTotal, int pas, int pageCourante) {
269 gduche 91
		this.nbElementsTotal = nbElementsTotal;
391 aurelien 92
		this.vue = vue;
445 benjamin 93
		this.pas = pas;
94
		this.pageCourante = pageCourante;
446 aurelien 95
		this.nbPage = calculerNbPage();
120 gduche 96
	}
358 benjamin 97
 
98
	/**
99
	 * Methode go du modèle MVP
100
	 *
101
	 * @param container
102
	 *            : la vue ou éxécuter l'affichage
103
	 */
104
	public void go(HasWidgets container) {
391 aurelien 105
		container.add(vue.asWidget());
445 benjamin 106
		gererEvenements();
107
		actualiserLiensPagesPagination();
108
		actualiserPas();
566 gduche 109
		actualiserAffichageBoutons();
358 benjamin 110
	}
111
 
112
	/**
436 benjamin 113
	 * Gérer les évènements sur les boutons statiques (précédent, suivant et
114
	 * selecteur pas)
269 gduche 115
	 * */
445 benjamin 116
	protected void gererEvenements() {
391 aurelien 117
		vue.getSelecteurPas().addChangeHandler(new ChangeHandler() {
120 gduche 118
			@Override
119
			public void onChange(ChangeEvent event) {
567 gduche 120
				int pasSelectionne;
121
				try {
122
					pasSelectionne = vue.getPasSelectionne();
123
					if (pasSelectionne < 0) {
124
						pasSelectionne = 1;
125
					} else if (pasSelectionne > 99){
126
						pasSelectionne = 99;
127
					}
128
				} catch (NumberFormatException e) {
129
					pasSelectionne = pas;
130
				}
131
 
132
				changerPas(pasSelectionne);
120 gduche 133
			}
134
		});
358 benjamin 135
 
391 aurelien 136
		vue.getBoutonPrecedent().addClickHandler(new ClickHandler() {
269 gduche 137
			@Override
138
			public void onClick(ClickEvent event) {
445 benjamin 139
				allerALaPagePrecedente();
269 gduche 140
			}
141
		});
120 gduche 142
 
391 aurelien 143
		vue.getBoutonSuivant().addClickHandler(new ClickHandler() {
269 gduche 144
			@Override
145
			public void onClick(ClickEvent event) {
445 benjamin 146
				allerALapageSuivante();
269 gduche 147
			}
148
		});
436 benjamin 149
 
391 aurelien 150
		vue.getBoutonPremierePage().addClickHandler(new ClickHandler() {
151
			@Override
152
			public void onClick(ClickEvent event) {
446 aurelien 153
				allerALaPremierePage();
391 aurelien 154
			}
155
		});
156
 
157
		vue.getBoutonDernierePage().addClickHandler(new ClickHandler() {
158
			@Override
159
			public void onClick(ClickEvent event) {
446 aurelien 160
				allerAlaDernierePage();
391 aurelien 161
			}
162
		});
445 benjamin 163
 
164
		BusEvenementiel.getInstance().addHandler(EvenementChangementPage.TYPE, new GestionnaireEvenementChangementPage() {
165
 
166
			@Override
167
			public void onChangementPage(EvenementChangementPage event) {
564 benjamin 168
				if (event.getGroupePagination() == groupePagination) {
446 aurelien 169
					pageCourante = event.getPageAAfficher();
170
					mettreEnValeurPageCourante();
566 gduche 171
					actualiserAffichageBoutons();
446 aurelien 172
				}
445 benjamin 173
			}
174
		});
175
 
176
		BusEvenementiel.getInstance().addHandler(EvenementChangementPas.TYPE, new GestionnaireEvenementChangementPas() {
177
 
178
			@Override
179
			public void onChangementPas(EvenementChangementPas event) {
564 benjamin 180
				if (event.getGroupePagination() == groupePagination) {
446 aurelien 181
					// modifie le pas et les liens en fonction
182
					pas = event.getPas();
183
					actualiserPas();
184
					actualiserLiensPagesPagination();
185
				}
445 benjamin 186
			}
187
		});
389 aurelien 188
	}
564 benjamin 189
 
190
	private void gererDecalagePageCourante(int ancienPas, int nouveauPas) {
191
		if (ancienPas != nouveauPas) {
192
			double rapportPas = (double) ancienPas / (double) nouveauPas;
193
			pageCourante = (int) (Math.ceil((double) pageCourante * (double) rapportPas));
446 aurelien 194
		}
195
	}
564 benjamin 196
 
389 aurelien 197
	/**
436 benjamin 198
	 * Gérer les évènements sur les boutons dynamiques (qui sont recréés à
199
	 * chaque fois)
389 aurelien 200
	 * */
445 benjamin 201
	private void gererEvenementsBoutonsDynamiques() {
391 aurelien 202
		int nbLiens = vue.getNbWidgetsZoneLiens();
358 benjamin 203
		for (int i = 0; i < nbLiens; i++) {
391 aurelien 204
			HasClickHandlers boutonCourant = vue.getWidgetZoneLiensHasClickHandlers(i);
269 gduche 205
			boutonCourant.addClickHandler(new ClickHandler() {
120 gduche 206
				@Override
207
				public void onClick(ClickEvent event) {
436 benjamin 208
					HasText boutonCourant = (HasText) event.getSource();
445 benjamin 209
					int pageAAfficher = Integer.parseInt(boutonCourant.getText());
446 aurelien 210
					pageCourante = pageAAfficher;
445 benjamin 211
					chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
446 aurelien 212
					BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
120 gduche 213
				}
214
			});
215
		}
216
	}
436 benjamin 217
 
445 benjamin 218
	public void actualiserPas() {
219
		actualiserPasCache(pas);
220
		vue.afficherPas(pas);
391 aurelien 221
	}
436 benjamin 222
 
445 benjamin 223
	/**
224
	 * Actualiser les liens pour n'afficher 5 avant et 5 après
225
	 * */
226
	public void actualiserLiensPagesPagination() {
120 gduche 227
 
445 benjamin 228
		this.nbPage = calculerNbPage();
358 benjamin 229
 
488 benjamin 230
		vue.mettreNbTotalPages(nbPage);
445 benjamin 231
		HasWidgets zoneLiens = vue.getZoneLiens();
232
		zoneLiens.clear();
233
 
234
		int pageDebut = 1;
235
		int pageFin = nbPage;
236
 
488 benjamin 237
		for (int i = pageDebut; i <= pageFin; i++) {
445 benjamin 238
			vue.ajouterBoutonZoneLiens(i + "");
120 gduche 239
		}
445 benjamin 240
		gererEvenementsBoutonsDynamiques();
241
		mettreEnValeurPageCourante();
120 gduche 242
	}
358 benjamin 243
 
391 aurelien 244
	public int getPageCourante() {
264 gduche 245
		return this.pageCourante;
246
	}
436 benjamin 247
 
391 aurelien 248
	public int getPas() {
378 gduche 249
		return this.pas;
250
	}
436 benjamin 251
 
378 gduche 252
	public void setPageCourante(int pageCourante) {
253
		this.pageCourante = pageCourante;
254
	}
564 benjamin 255
 
446 aurelien 256
	public void changerPas(int nouveauPas) {
564 benjamin 257
 
258
		// TODO corriger bug qui ne charge pas la bonne page ds certains cas
259
		// gererDecalagePageCourante(pas, nouveauPas);
260
		// pas = nouveauPas;
261
		// chargerElements((pageCourante - 1)*pas, pageCourante*pas);
446 aurelien 262
		pas = nouveauPas;
564 benjamin 263
		chargerElements(0, pas);
446 aurelien 264
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPas(nouveauPas, groupePagination));
491 benjamin 265
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(1, groupePagination));
446 aurelien 266
	}
120 gduche 267
 
445 benjamin 268
	public void allerALaPagePrecedente() {
269
		if (pageCourante > 1) {
270
			int pageAAfficher = pageCourante - 1;
446 aurelien 271
			pageCourante = pageAAfficher;
445 benjamin 272
			chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
446 aurelien 273
			BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
445 benjamin 274
		}
358 benjamin 275
 
445 benjamin 276
	}
277
 
278
	public void allerALapageSuivante() {
564 benjamin 279
		if (pageCourante < nbPage) {
445 benjamin 280
			int pageAAfficher = pageCourante + 1;
446 aurelien 281
			pageCourante = pageAAfficher;
445 benjamin 282
			chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
446 aurelien 283
			BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
445 benjamin 284
		}
285
	}
286
 
446 aurelien 287
	public void allerALaPremierePage() {
445 benjamin 288
		int pageAAfficher = 1;
446 aurelien 289
		pageCourante = pageAAfficher;
445 benjamin 290
		chargerElements(0, pas);
446 aurelien 291
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
445 benjamin 292
	}
293
 
446 aurelien 294
	public void allerAlaDernierePage() {
564 benjamin 295
		int pageAAfficher = nbPage;
446 aurelien 296
		pageCourante = pageAAfficher;
445 benjamin 297
		chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
446 aurelien 298
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
445 benjamin 299
	}
300
 
301
	/** calcule le nombre de page en fonction du pas */
302
	private int calculerNbPage() {
303
		Double nombrePages = Math.ceil((double) nbElementsTotal / (double) pas);
304
		return nombrePages.intValue();
305
	}
306
 
307
	public void mettreEnValeurPageCourante() {
308
		getVue().mettreEnValeurPageActive(getPageCourante());
309
	}
310
 
311
	public void setNbPages(int nbPages) {
312
		this.nbPage = nbPages;
313
	}
314
 
315
	public int getNbPages() {
316
		return nbPage;
317
	}
318
 
319
	public Vue getVue() {
320
		return vue;
321
	}
322
 
323
	public abstract void chargerElements(int debut, int fin);
324
 
263 gduche 325
	public abstract void actualiserPasCache(int pas);
120 gduche 326
 
445 benjamin 327
	public void setPas(int pas) {
328
		this.pas = pas;
436 benjamin 329
	}
564 benjamin 330
 
446 aurelien 331
	public void setGroupePagination(String groupePagination) {
332
		this.groupePagination = groupePagination;
333
	}
564 benjamin 334
 
446 aurelien 335
	public String getGroupePagination() {
336
		return groupePagination;
337
	}
436 benjamin 338
 
566 gduche 339
	public void actualiserAffichageBoutons() {
340
		if (pageCourante == 1) {
341
			vue.masquerBoutonPrecedent();
342
			vue.afficherBoutonSuivant();
343
		} else {
344
			vue.afficherBoutonPrecedent();
345
			if (pageCourante == nbPage) {
346
				vue.masquerBoutonSuivant();
347
			}
348
		}
349
	}
120 gduche 350
}