Subversion Repositories eFlore/Applications.del

Rev

Rev 264 | Rev 281 | 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;
263 gduche 84
		if (pageDebut < 1) {
85
			pageDebut = 1;
86
		}
269 gduche 87
		return pageDebut;
88
	}
89
 
90
	private int pagesApres() {
91
		int pageFin = pageCourante + 5;
263 gduche 92
		if (pageFin > nbPage) {
93
			pageFin = nbPage;
94
		}
269 gduche 95
		return pageFin;
120 gduche 96
	}
269 gduche 97
 
98
	private void setBoutonActif() {
99
		int nbLiens = vue.zoneLiens.getWidgetCount();
100
		for (int i=0; i < nbLiens; i++) {
101
			Button boutonCourant = (Button) vue.zoneLiens.getWidget(i);
102
			if (boutonCourant.getText().equals(String.valueOf(pageCourante))) {
103
				boutonCourant.setStyleName("actif");
104
			} else {
105
				boutonCourant.setStyleName("inactif");
120 gduche 106
			}
107
		}
269 gduche 108
	}
120 gduche 109
 
269 gduche 110
	/** Gérer les évènements sur les boutons
111
	 * */
112
	public void gererEvenements() {
113
		vue.selecteurPas.addChangeHandler(new ChangeHandler() {
120 gduche 114
			@Override
115
			public void onChange(ChangeEvent event) {
116
				ListBox nbElements = (ListBox) event.getSource();
117
				int index = nbElements.getSelectedIndex();
269 gduche 118
				changerPas(Integer.parseInt(nbElements.getValue(index)));
120 gduche 119
			}
120
 
121
		});
269 gduche 122
 
123
		vue.boutonPrecedent.addClickHandler(new ClickHandler() {
124
			@Override
125
			public void onClick(ClickEvent event) {
126
				pagePrecedente();
127
			}
128
		});
120 gduche 129
 
269 gduche 130
		vue.boutonSuivant.addClickHandler(new ClickHandler() {
131
			@Override
132
			public void onClick(ClickEvent event) {
133
				pageSuivante();
134
			}
135
		});
136
 
137
 
138
		int nbLiens = vue.zoneLiens.getWidgetCount();
139
		for (int i=0; i < nbLiens; i++) {
140
			Button boutonCourant = (Button) vue.zoneLiens.getWidget(i);
120 gduche 141
 
269 gduche 142
			boutonCourant.addClickHandler(new ClickHandler() {
120 gduche 143
 
144
				@Override
145
				public void onClick(ClickEvent event) {
269 gduche 146
					Button boutonCourant = (Button) event.getSource();
147
					pageCourante = Integer.parseInt(boutonCourant.getText());
148
					int debut = Integer.parseInt(boutonCourant.getText()) * pas;
263 gduche 149
					int fin = (debut + pas);
137 gduche 150
					setBoutonActif();
120 gduche 151
					changerPage(debut, fin);
269 gduche 152
					actualiserLiens();
120 gduche 153
				}
154
			});
155
		}
156
	}
157
 
269 gduche 158
	/** Retourne la limite supèrieur du nombre de pages à afficher
159
	 * */
120 gduche 160
	public void pageSuivante() {
264 gduche 161
		if (pageCourante < nbPage - 1) {
162
			pageCourante++;
163
			int debut = pageCourante * pas;
263 gduche 164
			int fin = debut + pas;
120 gduche 165
			changerPage(debut, fin);
269 gduche 166
			actualiserLiens();
120 gduche 167
		}
168
	}
269 gduche 169
 
170
	/** Retourne la limite infèrieure du nombre de pages à afficher
171
	 * */
120 gduche 172
	public void pagePrecedente() {
269 gduche 173
		if (pageCourante > 1) {
264 gduche 174
			pageCourante--;
175
			int debut = pageCourante * pas;
263 gduche 176
			int fin = debut + pas;
120 gduche 177
			changerPage(debut, fin);
269 gduche 178
			actualiserLiens();
120 gduche 179
		}
180
	}
264 gduche 181
 
182
	protected int getPageCourante() {
183
		return this.pageCourante;
184
	}
120 gduche 185
 
186
	public abstract void changerPage(int debut, int fin);
263 gduche 187
	public abstract void actualiserPasCache(int pas);
120 gduche 188
 
189
}