Subversion Repositories eFlore/Applications.del

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2211 arthur 1
package org.tela_botanica.del.client.composants.pagination;
2
 
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
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;
12
import com.google.gwt.event.dom.client.HasChangeHandlers;
13
import com.google.gwt.event.dom.client.HasClickHandlers;
14
import com.google.gwt.user.client.ui.HasWidgets;
15
import com.google.gwt.user.client.ui.IsWidget;
16
 
17
/**
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
24
 * */
25
public abstract class PaginationPresenteur {
26
 
27
	public interface Vue extends IsWidget {
28
		public HasClickHandlers getBoutonSuivant();
29
		public HasClickHandlers getBoutonPrecedent();
30
		public HasClickHandlers getBoutonPremierePage();
31
		public HasClickHandlers getBoutonDernierePage();
32
		public void masquerBoutonPrecedent();
33
		public void afficherBoutonPrecedent();
34
		public void masquerBoutonSuivant();
35
		public void afficherBoutonSuivant();
36
		public boolean boutonPrecedentEstAffiche();
37
		public boolean boutonSuivantEstAffiche();
38
		public HasChangeHandlers getSelecteurPas();
39
		public int getPasSelectionne();
40
		public void afficherPas(int pas);
41
		public void mettreNbTotalPages(int nbPages);
42
		public void mettreNbTotalResultats(int nbResultats);
43
		public HasChangeHandlers getSaisiePageCourante();
44
		public int getPageSaisie();
45
		public void setPageCourante(int pageCourante);
46
	}
47
 
48
	private Vue vue;
49
	private int nbPage = 1;
50
	//private int nbPage = 1;
51
	private int pageCourante = 1;
52
	private int nbElementsTotal = 0;
53
	private int pas = 10;
54
 
55
	private String groupePagination = null;
56
 
57
	/**
58
	 * Constructeur de l'application
59
	 *
60
	 * @param nbElementsTotal
61
	 *            : le nombre total des éléments à paginer
62
	 * @param pas
63
	 *            : le nombre d'éléments à afficher par page
64
	 * */
65
	public PaginationPresenteur(Vue vue, int nbElementsTotal, int pas, int pageCourante) {
66
		this.nbElementsTotal = nbElementsTotal;
67
		this.vue = vue;
68
		this.pas = pas;
69
		this.pageCourante = pageCourante;
70
		vue.setPageCourante(pageCourante);
71
		this.nbPage = calculerNbPage();
72
	}
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) {
81
		container.add(vue.asWidget());
82
		gererEvenements();
83
		actualiserPas();
84
		actualiserAffichageBoutons();
85
		vue.mettreNbTotalPages(nbPage);
86
		vue.mettreNbTotalResultats(nbElementsTotal);
87
	}
88
 
89
	/**
90
	 * Gérer les évènements sur les boutons statiques (précédent, suivant et
91
	 * selecteur pas)
92
	 * */
93
	protected void gererEvenements() {
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
 
116
		vue.getSelecteurPas().addChangeHandler(new ChangeHandler() {
117
			@Override
118
			public void onChange(ChangeEvent event) {
119
				int pasSelectionne;
120
				try {
121
					pasSelectionne = vue.getPasSelectionne();
122
					if (pasSelectionne < 0) {
123
						pasSelectionne = 1;
124
					} else if (pasSelectionne > 100){
125
						pasSelectionne = 100;
126
					}
127
				} catch (NumberFormatException e) {
128
					pasSelectionne = pas;
129
				}
130
 
131
				changerPas(pasSelectionne);
132
			}
133
		});
134
 
135
		vue.getBoutonPrecedent().addClickHandler(new ClickHandler() {
136
			@Override
137
			public void onClick(ClickEvent event) {
138
				allerALaPagePrecedente();
139
			}
140
		});
141
 
142
		vue.getBoutonSuivant().addClickHandler(new ClickHandler() {
143
			@Override
144
			public void onClick(ClickEvent event) {
145
				allerALapageSuivante();
146
			}
147
		});
148
 
149
		vue.getBoutonPremierePage().addClickHandler(new ClickHandler() {
150
			@Override
151
			public void onClick(ClickEvent event) {
152
				allerALaPremierePage();
153
			}
154
		});
155
 
156
		vue.getBoutonDernierePage().addClickHandler(new ClickHandler() {
157
			@Override
158
			public void onClick(ClickEvent event) {
159
				allerAlaDernierePage();
160
			}
161
		});
162
 
163
		BusEvenementiel.getInstance().addHandler(EvenementChangementPage.TYPE, new GestionnaireEvenementChangementPage() {
164
 
165
			@Override
166
			public void onChangementPage(EvenementChangementPage event) {
167
				if (event.getGroupePagination() == groupePagination) {
168
					pageCourante = event.getPageAAfficher();
169
					vue.setPageCourante(pageCourante);
170
					actualiserAffichageBoutons();
171
					vue.mettreNbTotalPages(nbPage);
172
					vue.mettreNbTotalResultats(nbElementsTotal);
173
				}
174
			}
175
		});
176
 
177
		BusEvenementiel.getInstance().addHandler(EvenementChangementPas.TYPE, new GestionnaireEvenementChangementPas() {
178
 
179
			@Override
180
			public void onChangementPas(EvenementChangementPas event) {
181
				if (event.getGroupePagination() == groupePagination) {
182
					// modifie le pas et les liens en fonction
183
					pas = event.getPas();
184
					actualiserPas();
185
				}
186
			}
187
		});
188
	}
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));
194
		}
195
	}
196
 
197
	public void actualiserPas() {
198
		actualiserPasCache(pas);
199
		vue.afficherPas(pas);
200
	}
201
 
202
		public int getPageCourante() {
203
		return this.pageCourante;
204
	}
205
 
206
	public int getPas() {
207
		return this.pas;
208
	}
209
 
210
	public void setPageCourante(int pageCourante) {
211
		this.pageCourante = pageCourante;
212
	}
213
 
214
	public void changerPas(int nouveauPas) {
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);
220
		pas = nouveauPas;
221
		this.nbPage = calculerNbPage();
222
		chargerElements(0, pas);
223
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPas(nouveauPas, groupePagination));
224
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(1, groupePagination));
225
	}
226
 
227
	public void allerALaPagePrecedente() {
228
		if (pageCourante > 1) {
229
			int pageAAfficher = pageCourante - 1;
230
			pageCourante = pageAAfficher;
231
			chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
232
			BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
233
		}
234
 
235
	}
236
 
237
	public void allerALapageSuivante() {
238
		if (pageCourante < nbPage) {
239
			int pageAAfficher = pageCourante + 1;
240
			pageCourante = pageAAfficher;
241
			chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
242
			BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
243
		}
244
	}
245
 
246
	public void allerALaPremierePage() {
247
		int pageAAfficher = 1;
248
		pageCourante = pageAAfficher;
249
		chargerElements(0, pas);
250
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
251
	}
252
 
253
	public void allerAlaDernierePage() {
254
		int pageAAfficher = nbPage;
255
		pageCourante = pageAAfficher;
256
		chargerElements(pas * (pageAAfficher - 1), pas * (pageAAfficher));
257
		BusEvenementiel.getInstance().fireEvent(new EvenementChangementPage(pageAAfficher, groupePagination));
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
 
280
	public abstract void actualiserPasCache(int pas);
281
 
282
	public void setPas(int pas) {
283
		this.pas = pas;
284
	}
285
 
286
	public void setGroupePagination(String groupePagination) {
287
		this.groupePagination = groupePagination;
288
	}
289
 
290
	public String getGroupePagination() {
291
		return groupePagination;
292
	}
293
 
294
	public void actualiserAffichageBoutons() {
295
		if (nbPage == 1) {
296
			vue.masquerBoutonPrecedent();
297
			vue.masquerBoutonSuivant();
298
		} else if (pageCourante == 1) {
299
			vue.masquerBoutonPrecedent();
300
			vue.afficherBoutonSuivant();
301
		} else {
302
			vue.afficherBoutonPrecedent();
303
			if (pageCourante == nbPage) {
304
				vue.masquerBoutonSuivant();
305
			}
306
		}
307
	}
308
}