Subversion Repositories eFlore/Applications.del

Rev

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