Subversion Repositories eFlore/Applications.del

Rev

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