Subversion Repositories eFlore/Applications.del

Rev

Rev 564 | Rev 567 | 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) {
446 aurelien 120
				changerPas(vue.getPasSelectionne());
120 gduche 121
			}
122
		});
358 benjamin 123
 
391 aurelien 124
		vue.getBoutonPrecedent().addClickHandler(new ClickHandler() {
269 gduche 125
			@Override
126
			public void onClick(ClickEvent event) {
445 benjamin 127
				allerALaPagePrecedente();
269 gduche 128
			}
129
		});
120 gduche 130
 
391 aurelien 131
		vue.getBoutonSuivant().addClickHandler(new ClickHandler() {
269 gduche 132
			@Override
133
			public void onClick(ClickEvent event) {
445 benjamin 134
				allerALapageSuivante();
269 gduche 135
			}
136
		});
436 benjamin 137
 
391 aurelien 138
		vue.getBoutonPremierePage().addClickHandler(new ClickHandler() {
139
			@Override
140
			public void onClick(ClickEvent event) {
446 aurelien 141
				allerALaPremierePage();
391 aurelien 142
			}
143
		});
144
 
145
		vue.getBoutonDernierePage().addClickHandler(new ClickHandler() {
146
			@Override
147
			public void onClick(ClickEvent event) {
446 aurelien 148
				allerAlaDernierePage();
391 aurelien 149
			}
150
		});
445 benjamin 151
 
152
		BusEvenementiel.getInstance().addHandler(EvenementChangementPage.TYPE, new GestionnaireEvenementChangementPage() {
153
 
154
			@Override
155
			public void onChangementPage(EvenementChangementPage event) {
564 benjamin 156
				if (event.getGroupePagination() == groupePagination) {
446 aurelien 157
					pageCourante = event.getPageAAfficher();
158
					mettreEnValeurPageCourante();
566 gduche 159
					actualiserAffichageBoutons();
446 aurelien 160
				}
445 benjamin 161
			}
162
		});
163
 
164
		BusEvenementiel.getInstance().addHandler(EvenementChangementPas.TYPE, new GestionnaireEvenementChangementPas() {
165
 
166
			@Override
167
			public void onChangementPas(EvenementChangementPas event) {
564 benjamin 168
				if (event.getGroupePagination() == groupePagination) {
446 aurelien 169
					// modifie le pas et les liens en fonction
170
					pas = event.getPas();
171
					actualiserPas();
172
					actualiserLiensPagesPagination();
173
				}
445 benjamin 174
			}
175
		});
389 aurelien 176
	}
564 benjamin 177
 
178
	private void gererDecalagePageCourante(int ancienPas, int nouveauPas) {
179
		if (ancienPas != nouveauPas) {
180
			double rapportPas = (double) ancienPas / (double) nouveauPas;
181
			pageCourante = (int) (Math.ceil((double) pageCourante * (double) rapportPas));
446 aurelien 182
		}
183
	}
564 benjamin 184
 
389 aurelien 185
	/**
436 benjamin 186
	 * Gérer les évènements sur les boutons dynamiques (qui sont recréés à
187
	 * chaque fois)
389 aurelien 188
	 * */
445 benjamin 189
	private void gererEvenementsBoutonsDynamiques() {
391 aurelien 190
		int nbLiens = vue.getNbWidgetsZoneLiens();
358 benjamin 191
		for (int i = 0; i < nbLiens; i++) {
391 aurelien 192
			HasClickHandlers boutonCourant = vue.getWidgetZoneLiensHasClickHandlers(i);
269 gduche 193
			boutonCourant.addClickHandler(new ClickHandler() {
120 gduche 194
				@Override
195
				public void onClick(ClickEvent event) {
436 benjamin 196
					HasText boutonCourant = (HasText) event.getSource();
445 benjamin 197
					int pageAAfficher = Integer.parseInt(boutonCourant.getText());
446 aurelien 198
					pageCourante = pageAAfficher;
445 benjamin 199
					chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
446 aurelien 200
					BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
120 gduche 201
				}
202
			});
203
		}
204
	}
436 benjamin 205
 
445 benjamin 206
	public void actualiserPas() {
207
		actualiserPasCache(pas);
208
		vue.afficherPas(pas);
391 aurelien 209
	}
436 benjamin 210
 
445 benjamin 211
	/**
212
	 * Actualiser les liens pour n'afficher 5 avant et 5 après
213
	 * */
214
	public void actualiserLiensPagesPagination() {
120 gduche 215
 
445 benjamin 216
		this.nbPage = calculerNbPage();
358 benjamin 217
 
488 benjamin 218
		vue.mettreNbTotalPages(nbPage);
445 benjamin 219
		HasWidgets zoneLiens = vue.getZoneLiens();
220
		zoneLiens.clear();
221
 
222
		int pageDebut = 1;
223
		int pageFin = nbPage;
224
 
488 benjamin 225
		for (int i = pageDebut; i <= pageFin; i++) {
445 benjamin 226
			vue.ajouterBoutonZoneLiens(i + "");
120 gduche 227
		}
445 benjamin 228
		gererEvenementsBoutonsDynamiques();
229
		mettreEnValeurPageCourante();
120 gduche 230
	}
358 benjamin 231
 
391 aurelien 232
	public int getPageCourante() {
264 gduche 233
		return this.pageCourante;
234
	}
436 benjamin 235
 
391 aurelien 236
	public int getPas() {
378 gduche 237
		return this.pas;
238
	}
436 benjamin 239
 
378 gduche 240
	public void setPageCourante(int pageCourante) {
241
		this.pageCourante = pageCourante;
242
	}
564 benjamin 243
 
446 aurelien 244
	public void changerPas(int nouveauPas) {
564 benjamin 245
 
246
		// TODO corriger bug qui ne charge pas la bonne page ds certains cas
247
		// gererDecalagePageCourante(pas, nouveauPas);
248
		// pas = nouveauPas;
249
		// chargerElements((pageCourante - 1)*pas, pageCourante*pas);
446 aurelien 250
		pas = nouveauPas;
564 benjamin 251
		chargerElements(0, pas);
446 aurelien 252
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPas(nouveauPas, groupePagination));
491 benjamin 253
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(1, groupePagination));
446 aurelien 254
	}
120 gduche 255
 
445 benjamin 256
	public void allerALaPagePrecedente() {
257
		if (pageCourante > 1) {
258
			int pageAAfficher = pageCourante - 1;
446 aurelien 259
			pageCourante = pageAAfficher;
445 benjamin 260
			chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
446 aurelien 261
			BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
445 benjamin 262
		}
358 benjamin 263
 
445 benjamin 264
	}
265
 
266
	public void allerALapageSuivante() {
564 benjamin 267
		if (pageCourante < nbPage) {
445 benjamin 268
			int pageAAfficher = pageCourante + 1;
446 aurelien 269
			pageCourante = pageAAfficher;
445 benjamin 270
			chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
446 aurelien 271
			BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
445 benjamin 272
		}
273
	}
274
 
446 aurelien 275
	public void allerALaPremierePage() {
445 benjamin 276
		int pageAAfficher = 1;
446 aurelien 277
		pageCourante = pageAAfficher;
445 benjamin 278
		chargerElements(0, pas);
446 aurelien 279
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
445 benjamin 280
	}
281
 
446 aurelien 282
	public void allerAlaDernierePage() {
564 benjamin 283
		int pageAAfficher = nbPage;
446 aurelien 284
		pageCourante = pageAAfficher;
445 benjamin 285
		chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
446 aurelien 286
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
445 benjamin 287
	}
288
 
289
	/** calcule le nombre de page en fonction du pas */
290
	private int calculerNbPage() {
291
		Double nombrePages = Math.ceil((double) nbElementsTotal / (double) pas);
292
		return nombrePages.intValue();
293
	}
294
 
295
	public void mettreEnValeurPageCourante() {
296
		getVue().mettreEnValeurPageActive(getPageCourante());
297
	}
298
 
299
	public void setNbPages(int nbPages) {
300
		this.nbPage = nbPages;
301
	}
302
 
303
	public int getNbPages() {
304
		return nbPage;
305
	}
306
 
307
	public Vue getVue() {
308
		return vue;
309
	}
310
 
311
	public abstract void chargerElements(int debut, int fin);
312
 
263 gduche 313
	public abstract void actualiserPasCache(int pas);
120 gduche 314
 
445 benjamin 315
	public void setPas(int pas) {
316
		this.pas = pas;
436 benjamin 317
	}
564 benjamin 318
 
446 aurelien 319
	public void setGroupePagination(String groupePagination) {
320
		this.groupePagination = groupePagination;
321
	}
564 benjamin 322
 
446 aurelien 323
	public String getGroupePagination() {
324
		return groupePagination;
325
	}
436 benjamin 326
 
566 gduche 327
	public void actualiserAffichageBoutons() {
328
		if (pageCourante == 1) {
329
			vue.masquerBoutonPrecedent();
330
			vue.afficherBoutonSuivant();
331
		} else {
332
			vue.afficherBoutonPrecedent();
333
			if (pageCourante == nbPage) {
334
				vue.masquerBoutonSuivant();
335
			}
336
		}
337
	}
120 gduche 338
}