Subversion Repositories eFlore/Applications.del

Rev

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