Subversion Repositories eFlore/Applications.del

Rev

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