Subversion Repositories eFlore/Applications.del

Rev

Rev 382 | Rev 390 | 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) {
358 benjamin 68
		this.pas = pas;
120 gduche 69
		actualiserNbPage();
389 aurelien 70
		actualiserLiens();
382 aurelien 71
		changerPage(pas * (pageCourante -1), pas * pageCourante);
358 benjamin 72
		switch (pas) {
73
		case 5:
74
			vue.getSelecteurPas().setSelectedIndex(0);
75
			break;
76
		case 10:
77
			vue.getSelecteurPas().setSelectedIndex(1);
78
			break;
79
		case 15:
80
			vue.getSelecteurPas().setSelectedIndex(2);
81
			break;
82
		case 20:
83
			vue.getSelecteurPas().setSelectedIndex(3);
84
			break;
85
		default:
86
			break;
87
		}
263 gduche 88
		actualiserPasCache(pas);
120 gduche 89
	}
358 benjamin 90
 
91
	/**
92
	 * Actualiser les liens pour n'afficher 5 avant et 5 après
269 gduche 93
	 * */
94
	public void actualiserLiens() {
358 benjamin 95
 
269 gduche 96
		HorizontalPanel zoneLiens = vue.zoneLiens;
120 gduche 97
		zoneLiens.clear();
358 benjamin 98
 
269 gduche 99
		int pageDebut = pagesAvant();
100
		int pageFin = pagesApres();
358 benjamin 101
 
269 gduche 102
		for (int i = pageDebut; i < pageFin; i++) {
389 aurelien 103
			Button bouton = new Button(i+"");
269 gduche 104
			zoneLiens.add(bouton);
105
		}
106
		setBoutonActif();
389 aurelien 107
		gererEvenementsBoutonsDynamiques();
269 gduche 108
	}
358 benjamin 109
 
269 gduche 110
	private int pagesAvant() {
264 gduche 111
		int pageDebut = pageCourante - 5;
281 gduche 112
		vue.afficherBoutonDebut();
263 gduche 113
		if (pageDebut < 1) {
114
			pageDebut = 1;
358 benjamin 115
			// Masquer le bouton de début
281 gduche 116
			vue.masquerBoutonDebut();
263 gduche 117
		}
269 gduche 118
		return pageDebut;
119
	}
358 benjamin 120
 
269 gduche 121
	private int pagesApres() {
122
		int pageFin = pageCourante + 5;
281 gduche 123
		vue.afficherBoutonSuivant();
263 gduche 124
		if (pageFin > nbPage) {
125
			pageFin = nbPage;
281 gduche 126
			vue.masquerBoutonSuivant();
263 gduche 127
		}
269 gduche 128
		return pageFin;
120 gduche 129
	}
358 benjamin 130
 
269 gduche 131
	private void setBoutonActif() {
132
		int nbLiens = vue.zoneLiens.getWidgetCount();
358 benjamin 133
		for (int i = 0; i < nbLiens; i++) {
269 gduche 134
			Button boutonCourant = (Button) vue.zoneLiens.getWidget(i);
135
			if (boutonCourant.getText().equals(String.valueOf(pageCourante))) {
136
				boutonCourant.setStyleName("actif");
137
			} else {
138
				boutonCourant.setStyleName("inactif");
120 gduche 139
			}
140
		}
269 gduche 141
	}
120 gduche 142
 
358 benjamin 143
	/**
389 aurelien 144
	 * Gérer les évènements sur les boutons statiques (précédent, suivant et selecteur pas)
269 gduche 145
	 * */
389 aurelien 146
	public void gererEvenementsBoutonsStatiques() {
269 gduche 147
		vue.selecteurPas.addChangeHandler(new ChangeHandler() {
120 gduche 148
			@Override
149
			public void onChange(ChangeEvent event) {
150
				ListBox nbElements = (ListBox) event.getSource();
151
				int index = nbElements.getSelectedIndex();
269 gduche 152
				changerPas(Integer.parseInt(nbElements.getValue(index)));
378 gduche 153
				synchroniser();
120 gduche 154
			}
155
 
156
		});
358 benjamin 157
 
269 gduche 158
		vue.boutonPrecedent.addClickHandler(new ClickHandler() {
159
			@Override
160
			public void onClick(ClickEvent event) {
161
				pagePrecedente();
162
			}
163
		});
120 gduche 164
 
269 gduche 165
		vue.boutonSuivant.addClickHandler(new ClickHandler() {
166
			@Override
167
			public void onClick(ClickEvent event) {
168
				pageSuivante();
169
			}
170
		});
389 aurelien 171
	}
172
 
173
	/**
174
	 * Gérer les évènements sur les boutons dynamiques (qui sont recréés à chaque fois)
175
	 * */
176
	public void gererEvenementsBoutonsDynamiques() {
269 gduche 177
		int nbLiens = vue.zoneLiens.getWidgetCount();
358 benjamin 178
		for (int i = 0; i < nbLiens; i++) {
269 gduche 179
			Button boutonCourant = (Button) vue.zoneLiens.getWidget(i);
120 gduche 180
 
269 gduche 181
			boutonCourant.addClickHandler(new ClickHandler() {
120 gduche 182
 
183
				@Override
184
				public void onClick(ClickEvent event) {
269 gduche 185
					Button boutonCourant = (Button) event.getSource();
186
					pageCourante = Integer.parseInt(boutonCourant.getText());
382 aurelien 187
					int debut = (Integer.parseInt(boutonCourant.getText()) - 1) * pas;
263 gduche 188
					int fin = (debut + pas);
137 gduche 189
					setBoutonActif();
120 gduche 190
					changerPage(debut, fin);
269 gduche 191
					actualiserLiens();
378 gduche 192
					synchroniser();
120 gduche 193
				}
194
			});
195
		}
196
	}
197
 
358 benjamin 198
	/**
199
	 * Retourne la limite supèrieur du nombre de pages à afficher
269 gduche 200
	 * */
120 gduche 201
	public void pageSuivante() {
264 gduche 202
		if (pageCourante < nbPage - 1) {
203
			pageCourante++;
382 aurelien 204
			int debut = (pageCourante -1) * pas;
263 gduche 205
			int fin = debut + pas;
120 gduche 206
			changerPage(debut, fin);
269 gduche 207
			actualiserLiens();
378 gduche 208
			synchroniser();
120 gduche 209
		}
210
	}
358 benjamin 211
 
212
	/**
213
	 * Retourne la limite infèrieure du nombre de pages à afficher
269 gduche 214
	 * */
120 gduche 215
	public void pagePrecedente() {
269 gduche 216
		if (pageCourante > 1) {
264 gduche 217
			pageCourante--;
382 aurelien 218
			int debut = (pageCourante -1) * pas;
263 gduche 219
			int fin = debut + pas;
120 gduche 220
			changerPage(debut, fin);
269 gduche 221
			actualiserLiens();
378 gduche 222
			synchroniser();
120 gduche 223
		}
224
	}
358 benjamin 225
 
264 gduche 226
	protected int getPageCourante() {
227
		return this.pageCourante;
228
	}
378 gduche 229
 
230
	protected int getPas() {
231
		return this.pas;
232
	}
233
 
234
	public void setPageCourante(int pageCourante) {
235
		this.pageCourante = pageCourante;
236
	}
120 gduche 237
 
238
	public abstract void changerPage(int debut, int fin);
358 benjamin 239
 
263 gduche 240
	public abstract void actualiserPasCache(int pas);
378 gduche 241
 
242
	public abstract void synchroniser();
120 gduche 243
 
244
}