Subversion Repositories eFlore/Applications.del

Rev

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