Subversion Repositories eFlore/Applications.del

Rev

Rev 445 | Rev 491 | 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);
391 aurelien 69
	}
436 benjamin 70
 
391 aurelien 71
	private Vue vue;
445 benjamin 72
	private int nbPage = 1;
269 gduche 73
	private int pageCourante = 1;
120 gduche 74
	private int nbElementsTotal = 0;
263 gduche 75
	private int pas = 10;
446 aurelien 76
 
77
	private String groupePagination = null;
358 benjamin 78
 
269 gduche 79
	/**
80
	 * Constructeur de l'application
358 benjamin 81
	 *
82
	 * @param nbElementsTotal
83
	 *            : le nombre total des éléments à paginer
84
	 * @param pas
85
	 *            : le nombre d'éléments à afficher par page
269 gduche 86
	 * */
445 benjamin 87
	public PaginationPresenteur(Vue vue, int nbElementsTotal, int pas, int pageCourante) {
269 gduche 88
		this.nbElementsTotal = nbElementsTotal;
391 aurelien 89
		this.vue = vue;
445 benjamin 90
		this.pas = pas;
91
		this.pageCourante = pageCourante;
446 aurelien 92
 
93
		this.nbPage = calculerNbPage();
120 gduche 94
	}
358 benjamin 95
 
96
	/**
97
	 * Methode go du modèle MVP
98
	 *
99
	 * @param container
100
	 *            : la vue ou éxécuter l'affichage
101
	 */
102
	public void go(HasWidgets container) {
391 aurelien 103
		container.add(vue.asWidget());
445 benjamin 104
		gererEvenements();
105
		actualiserLiensPagesPagination();
106
		actualiserPas();
358 benjamin 107
	}
108
 
109
	/**
436 benjamin 110
	 * Gérer les évènements sur les boutons statiques (précédent, suivant et
111
	 * selecteur pas)
269 gduche 112
	 * */
445 benjamin 113
	protected void gererEvenements() {
391 aurelien 114
		vue.getSelecteurPas().addChangeHandler(new ChangeHandler() {
120 gduche 115
			@Override
116
			public void onChange(ChangeEvent event) {
446 aurelien 117
				changerPas(vue.getPasSelectionne());
120 gduche 118
			}
119
		});
358 benjamin 120
 
391 aurelien 121
		vue.getBoutonPrecedent().addClickHandler(new ClickHandler() {
269 gduche 122
			@Override
123
			public void onClick(ClickEvent event) {
445 benjamin 124
				allerALaPagePrecedente();
269 gduche 125
			}
126
		});
120 gduche 127
 
391 aurelien 128
		vue.getBoutonSuivant().addClickHandler(new ClickHandler() {
269 gduche 129
			@Override
130
			public void onClick(ClickEvent event) {
445 benjamin 131
				allerALapageSuivante();
269 gduche 132
			}
133
		});
436 benjamin 134
 
391 aurelien 135
		vue.getBoutonPremierePage().addClickHandler(new ClickHandler() {
136
			@Override
137
			public void onClick(ClickEvent event) {
446 aurelien 138
				allerALaPremierePage();
391 aurelien 139
			}
140
		});
141
 
142
		vue.getBoutonDernierePage().addClickHandler(new ClickHandler() {
143
			@Override
144
			public void onClick(ClickEvent event) {
446 aurelien 145
				allerAlaDernierePage();
391 aurelien 146
			}
147
		});
445 benjamin 148
 
149
		BusEvenementiel.getInstance().addHandler(EvenementChangementPage.TYPE, new GestionnaireEvenementChangementPage() {
150
 
151
			@Override
152
			public void onChangementPage(EvenementChangementPage event) {
446 aurelien 153
				if(event.getGroupePagination() == groupePagination) {
154
					pageCourante = event.getPageAAfficher();
155
					mettreEnValeurPageCourante();
156
				}
445 benjamin 157
			}
158
		});
159
 
160
		BusEvenementiel.getInstance().addHandler(EvenementChangementPas.TYPE, new GestionnaireEvenementChangementPas() {
161
 
162
			@Override
163
			public void onChangementPas(EvenementChangementPas event) {
446 aurelien 164
				if(event.getGroupePagination() == groupePagination) {
165
					// modifie le pas et les liens en fonction
166
					pas = event.getPas();
167
					actualiserPas();
168
					actualiserLiensPagesPagination();
169
				}
445 benjamin 170
			}
171
		});
389 aurelien 172
	}
446 aurelien 173
 
174
	private void gererDecalagePageCourante(int ancienPas, int nouveauPas) {
175
		if(ancienPas != nouveauPas) {
176
			double rapportPas = (double)ancienPas/(double)nouveauPas;
177
			pageCourante = (int)(Math.ceil((double)pageCourante*(double)rapportPas));
178
		}
179
	}
180
 
389 aurelien 181
	/**
436 benjamin 182
	 * Gérer les évènements sur les boutons dynamiques (qui sont recréés à
183
	 * chaque fois)
389 aurelien 184
	 * */
445 benjamin 185
	private void gererEvenementsBoutonsDynamiques() {
391 aurelien 186
		int nbLiens = vue.getNbWidgetsZoneLiens();
358 benjamin 187
		for (int i = 0; i < nbLiens; i++) {
391 aurelien 188
			HasClickHandlers boutonCourant = vue.getWidgetZoneLiensHasClickHandlers(i);
269 gduche 189
			boutonCourant.addClickHandler(new ClickHandler() {
120 gduche 190
				@Override
191
				public void onClick(ClickEvent event) {
436 benjamin 192
					HasText boutonCourant = (HasText) event.getSource();
445 benjamin 193
					int pageAAfficher = Integer.parseInt(boutonCourant.getText());
446 aurelien 194
					pageCourante = pageAAfficher;
445 benjamin 195
					chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
446 aurelien 196
					BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
120 gduche 197
				}
198
			});
199
		}
200
	}
436 benjamin 201
 
445 benjamin 202
	public void actualiserPas() {
203
		actualiserPasCache(pas);
204
		vue.afficherPas(pas);
391 aurelien 205
	}
436 benjamin 206
 
445 benjamin 207
	/**
208
	 * Actualiser les liens pour n'afficher 5 avant et 5 après
209
	 * */
210
	public void actualiserLiensPagesPagination() {
120 gduche 211
 
445 benjamin 212
		this.nbPage = calculerNbPage();
358 benjamin 213
 
445 benjamin 214
		HasWidgets zoneLiens = vue.getZoneLiens();
215
		zoneLiens.clear();
216
 
217
		int pageDebut = 1;
218
		int pageFin = nbPage;
219
 
220
		for (int i = pageDebut; i < pageFin; i++) {
221
			vue.ajouterBoutonZoneLiens(i + "");
120 gduche 222
		}
445 benjamin 223
		gererEvenementsBoutonsDynamiques();
224
		mettreEnValeurPageCourante();
120 gduche 225
	}
358 benjamin 226
 
391 aurelien 227
	public int getPageCourante() {
264 gduche 228
		return this.pageCourante;
229
	}
436 benjamin 230
 
391 aurelien 231
	public int getPas() {
378 gduche 232
		return this.pas;
233
	}
436 benjamin 234
 
378 gduche 235
	public void setPageCourante(int pageCourante) {
236
		this.pageCourante = pageCourante;
237
	}
446 aurelien 238
 
239
	public void changerPas(int nouveauPas) {
240
		gererDecalagePageCourante(pas, nouveauPas);
241
		pas = nouveauPas;
242
		chargerElements((pageCourante - 1)*pas, pageCourante*pas);
243
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPas(nouveauPas, groupePagination));
244
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageCourante, groupePagination));
245
	}
120 gduche 246
 
445 benjamin 247
	public void allerALaPagePrecedente() {
248
		if (pageCourante > 1) {
249
			int pageAAfficher = pageCourante - 1;
446 aurelien 250
			pageCourante = pageAAfficher;
445 benjamin 251
			chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
446 aurelien 252
			BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
445 benjamin 253
		}
358 benjamin 254
 
445 benjamin 255
	}
256
 
257
	public void allerALapageSuivante() {
258
		if (pageCourante < nbPage - 1) {
259
			int pageAAfficher = pageCourante + 1;
446 aurelien 260
			pageCourante = pageAAfficher;
445 benjamin 261
			chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
446 aurelien 262
			BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
445 benjamin 263
		}
264
	}
265
 
446 aurelien 266
	public void allerALaPremierePage() {
445 benjamin 267
		int pageAAfficher = 1;
446 aurelien 268
		pageCourante = pageAAfficher;
445 benjamin 269
		chargerElements(0, pas);
446 aurelien 270
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
445 benjamin 271
	}
272
 
446 aurelien 273
	public void allerAlaDernierePage() {
445 benjamin 274
		int pageAAfficher = nbPage - 1;
446 aurelien 275
		pageCourante = pageAAfficher;
445 benjamin 276
		chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
446 aurelien 277
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
445 benjamin 278
	}
279
 
280
	/** calcule le nombre de page en fonction du pas */
281
	private int calculerNbPage() {
282
		Double nombrePages = Math.ceil((double) nbElementsTotal / (double) pas);
283
		return nombrePages.intValue();
284
	}
285
 
286
	public void mettreEnValeurPageCourante() {
287
		getVue().mettreEnValeurPageActive(getPageCourante());
288
	}
289
 
290
	public void setNbPages(int nbPages) {
291
		this.nbPage = nbPages;
292
	}
293
 
294
	public int getNbPages() {
295
		return nbPage;
296
	}
297
 
298
	public Vue getVue() {
299
		return vue;
300
	}
301
 
302
	public abstract void chargerElements(int debut, int fin);
303
 
263 gduche 304
	public abstract void actualiserPasCache(int pas);
120 gduche 305
 
445 benjamin 306
	public void setPas(int pas) {
307
		this.pas = pas;
436 benjamin 308
	}
446 aurelien 309
 
310
	public void setGroupePagination(String groupePagination) {
311
		this.groupePagination = groupePagination;
312
	}
313
 
314
	public String getGroupePagination() {
315
		return groupePagination;
316
	}
436 benjamin 317
 
120 gduche 318
}