Subversion Repositories eFlore/Applications.del

Rev

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