Subversion Repositories eFlore/Applications.del

Rev

Rev 389 | Rev 391 | 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
 
3
import com.google.gwt.event.dom.client.ChangeEvent;
4
import com.google.gwt.event.dom.client.ChangeHandler;
5
import com.google.gwt.event.dom.client.ClickEvent;
6
import com.google.gwt.event.dom.client.ClickHandler;
389 aurelien 7
import com.google.gwt.user.client.Window;
120 gduche 8
import com.google.gwt.user.client.ui.Button;
9
import com.google.gwt.user.client.ui.HasWidgets;
10
import com.google.gwt.user.client.ui.HorizontalPanel;
11
import com.google.gwt.user.client.ui.ListBox;
12
 
269 gduche 13
/**
358 benjamin 14
 * @author gregoire Pagination GENERIQUE qui permet d'afficher un nombre donné
15
 *         d'éléments (pas) La méthode changerPage est abstraite et doit être
16
 *         définie lors de l'instanciation de la classe pagination pour
17
 *         permettre d'afficher la suite des éléments La méthode
18
 *         actualiserPasCache est abstraite car le pas est différent en fonction
19
 *         de la page où l'on se trouve
269 gduche 20
 * */
120 gduche 21
public abstract class PaginationPresenteur {
22
 
23
	private final PaginationVue vue;
269 gduche 24
	private int nbPage;
25
	private int pageCourante = 1;
120 gduche 26
	private int nbElementsTotal = 0;
263 gduche 27
	private int pas = 10;
358 benjamin 28
 
269 gduche 29
	/**
30
	 * Constructeur de l'application
358 benjamin 31
	 *
32
	 * @param nbElementsTotal
33
	 *            : le nombre total des éléments à paginer
34
	 * @param pas
35
	 *            : le nombre d'éléments à afficher par page
269 gduche 36
	 * */
37
	public PaginationPresenteur(int nbElementsTotal, int pas) {
38
		this.nbElementsTotal = nbElementsTotal;
120 gduche 39
		vue = new PaginationVue();
378 gduche 40
		changerPas(this.pas);
120 gduche 41
	}
358 benjamin 42
 
43
	/**
44
	 * Methode go du modèle MVP
45
	 *
46
	 * @param container
47
	 *            : la vue ou éxécuter l'affichage
48
	 */
49
	public void go(HasWidgets container) {
389 aurelien 50
		gererEvenementsBoutonsStatiques();
358 benjamin 51
		actualiserLiens();
52
		container.add(vue);
53
	}
54
 
269 gduche 55
	/** Met à jour le nombre de page en fonction du pas */
120 gduche 56
	private void actualiserNbPage() {
269 gduche 57
		Double nombrePages = Math.ceil((double) nbElementsTotal / (double) pas);
58
		this.nbPage = nombrePages.intValue();
120 gduche 59
	}
60
 
358 benjamin 61
	/**
62
	 * Changer le pas de la pagination
63
	 *
64
	 * @param pas
65
	 *            : le nombre d'éléments à afficher par page
66
	 */
269 gduche 67
	public void changerPas(int pas) {
390 aurelien 68
		int ancienPas = this.pas;
358 benjamin 69
		this.pas = pas;
120 gduche 70
		actualiserNbPage();
390 aurelien 71
		gererDecalagePageCourante(ancienPas, pas);
389 aurelien 72
		actualiserLiens();
382 aurelien 73
		changerPage(pas * (pageCourante -1), pas * pageCourante);
358 benjamin 74
		switch (pas) {
75
		case 5:
76
			vue.getSelecteurPas().setSelectedIndex(0);
77
			break;
78
		case 10:
79
			vue.getSelecteurPas().setSelectedIndex(1);
80
			break;
81
		case 15:
82
			vue.getSelecteurPas().setSelectedIndex(2);
83
			break;
84
		case 20:
85
			vue.getSelecteurPas().setSelectedIndex(3);
86
			break;
87
		default:
88
			break;
89
		}
263 gduche 90
		actualiserPasCache(pas);
120 gduche 91
	}
390 aurelien 92
 
93
	private void gererDecalagePageCourante(int ancienPas, int nouveauPas) {
94
		if(ancienPas != nouveauPas) {
95
			double rapportPas = (double)ancienPas/(double)nouveauPas;
96
			pageCourante = (int)(Math.ceil((double)pageCourante*(double)rapportPas));
97
			synchroniser();
98
		}
99
	}
358 benjamin 100
 
101
	/**
102
	 * Actualiser les liens pour n'afficher 5 avant et 5 après
269 gduche 103
	 * */
104
	public void actualiserLiens() {
358 benjamin 105
 
269 gduche 106
		HorizontalPanel zoneLiens = vue.zoneLiens;
120 gduche 107
		zoneLiens.clear();
358 benjamin 108
 
269 gduche 109
		int pageDebut = pagesAvant();
110
		int pageFin = pagesApres();
358 benjamin 111
 
269 gduche 112
		for (int i = pageDebut; i < pageFin; i++) {
389 aurelien 113
			Button bouton = new Button(i+"");
269 gduche 114
			zoneLiens.add(bouton);
115
		}
116
		setBoutonActif();
389 aurelien 117
		gererEvenementsBoutonsDynamiques();
269 gduche 118
	}
358 benjamin 119
 
269 gduche 120
	private int pagesAvant() {
264 gduche 121
		int pageDebut = pageCourante - 5;
281 gduche 122
		vue.afficherBoutonDebut();
263 gduche 123
		if (pageDebut < 1) {
124
			pageDebut = 1;
358 benjamin 125
			// Masquer le bouton de début
281 gduche 126
			vue.masquerBoutonDebut();
263 gduche 127
		}
269 gduche 128
		return pageDebut;
129
	}
358 benjamin 130
 
269 gduche 131
	private int pagesApres() {
132
		int pageFin = pageCourante + 5;
281 gduche 133
		vue.afficherBoutonSuivant();
263 gduche 134
		if (pageFin > nbPage) {
135
			pageFin = nbPage;
281 gduche 136
			vue.masquerBoutonSuivant();
263 gduche 137
		}
269 gduche 138
		return pageFin;
120 gduche 139
	}
358 benjamin 140
 
269 gduche 141
	private void setBoutonActif() {
142
		int nbLiens = vue.zoneLiens.getWidgetCount();
358 benjamin 143
		for (int i = 0; i < nbLiens; i++) {
269 gduche 144
			Button boutonCourant = (Button) vue.zoneLiens.getWidget(i);
145
			if (boutonCourant.getText().equals(String.valueOf(pageCourante))) {
146
				boutonCourant.setStyleName("actif");
147
			} else {
148
				boutonCourant.setStyleName("inactif");
120 gduche 149
			}
150
		}
269 gduche 151
	}
120 gduche 152
 
358 benjamin 153
	/**
389 aurelien 154
	 * Gérer les évènements sur les boutons statiques (précédent, suivant et selecteur pas)
269 gduche 155
	 * */
389 aurelien 156
	public void gererEvenementsBoutonsStatiques() {
269 gduche 157
		vue.selecteurPas.addChangeHandler(new ChangeHandler() {
120 gduche 158
			@Override
159
			public void onChange(ChangeEvent event) {
160
				ListBox nbElements = (ListBox) event.getSource();
161
				int index = nbElements.getSelectedIndex();
269 gduche 162
				changerPas(Integer.parseInt(nbElements.getValue(index)));
378 gduche 163
				synchroniser();
120 gduche 164
			}
165
 
166
		});
358 benjamin 167
 
269 gduche 168
		vue.boutonPrecedent.addClickHandler(new ClickHandler() {
169
			@Override
170
			public void onClick(ClickEvent event) {
171
				pagePrecedente();
172
			}
173
		});
120 gduche 174
 
269 gduche 175
		vue.boutonSuivant.addClickHandler(new ClickHandler() {
176
			@Override
177
			public void onClick(ClickEvent event) {
178
				pageSuivante();
179
			}
180
		});
389 aurelien 181
	}
182
 
183
	/**
184
	 * Gérer les évènements sur les boutons dynamiques (qui sont recréés à chaque fois)
185
	 * */
186
	public void gererEvenementsBoutonsDynamiques() {
269 gduche 187
		int nbLiens = vue.zoneLiens.getWidgetCount();
358 benjamin 188
		for (int i = 0; i < nbLiens; i++) {
269 gduche 189
			Button boutonCourant = (Button) vue.zoneLiens.getWidget(i);
120 gduche 190
 
269 gduche 191
			boutonCourant.addClickHandler(new ClickHandler() {
120 gduche 192
 
193
				@Override
194
				public void onClick(ClickEvent event) {
269 gduche 195
					Button boutonCourant = (Button) event.getSource();
196
					pageCourante = Integer.parseInt(boutonCourant.getText());
382 aurelien 197
					int debut = (Integer.parseInt(boutonCourant.getText()) - 1) * pas;
263 gduche 198
					int fin = (debut + pas);
137 gduche 199
					setBoutonActif();
120 gduche 200
					changerPage(debut, fin);
269 gduche 201
					actualiserLiens();
378 gduche 202
					synchroniser();
120 gduche 203
				}
204
			});
205
		}
206
	}
207
 
358 benjamin 208
	/**
390 aurelien 209
	 * Retourne la limite supèrieure du nombre de pages à afficher
269 gduche 210
	 * */
120 gduche 211
	public void pageSuivante() {
264 gduche 212
		if (pageCourante < nbPage - 1) {
213
			pageCourante++;
382 aurelien 214
			int debut = (pageCourante -1) * pas;
263 gduche 215
			int fin = debut + pas;
120 gduche 216
			changerPage(debut, fin);
269 gduche 217
			actualiserLiens();
378 gduche 218
			synchroniser();
120 gduche 219
		}
220
	}
358 benjamin 221
 
222
	/**
223
	 * Retourne la limite infèrieure du nombre de pages à afficher
269 gduche 224
	 * */
120 gduche 225
	public void pagePrecedente() {
269 gduche 226
		if (pageCourante > 1) {
264 gduche 227
			pageCourante--;
382 aurelien 228
			int debut = (pageCourante -1) * pas;
263 gduche 229
			int fin = debut + pas;
120 gduche 230
			changerPage(debut, fin);
269 gduche 231
			actualiserLiens();
378 gduche 232
			synchroniser();
120 gduche 233
		}
234
	}
358 benjamin 235
 
264 gduche 236
	protected int getPageCourante() {
237
		return this.pageCourante;
238
	}
378 gduche 239
 
240
	protected int getPas() {
241
		return this.pas;
242
	}
243
 
244
	public void setPageCourante(int pageCourante) {
245
		this.pageCourante = pageCourante;
246
	}
120 gduche 247
 
248
	public abstract void changerPage(int debut, int fin);
358 benjamin 249
 
263 gduche 250
	public abstract void actualiserPasCache(int pas);
378 gduche 251
 
252
	public abstract void synchroniser();
120 gduche 253
 
254
}