Subversion Repositories eFlore/Applications.del

Rev

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