Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
403 aurelien 1
package org.tela_botanica.client.vues;
2
 
3
import org.tela_botanica.client.interfaces.ListePaginable;
4
import org.tela_botanica.client.interfaces.Rafraichissable;
5
 
6
import com.google.gwt.user.client.Window;
7
import com.gwtext.client.core.EventCallback;
8
import com.gwtext.client.core.EventObject;
9
import com.gwtext.client.core.Template;
10
import com.gwtext.client.data.Record;
11
import com.gwtext.client.data.SimpleStore;
12
import com.gwtext.client.data.Store;
13
import com.gwtext.client.widgets.Button;
14
import com.gwtext.client.widgets.Toolbar;
15
import com.gwtext.client.widgets.ToolbarButton;
16
import com.gwtext.client.widgets.ToolbarTextItem;
17
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
18
import com.gwtext.client.widgets.form.ComboBox;
19
import com.gwtext.client.widgets.form.Field;
20
import com.gwtext.client.widgets.form.TextField;
21
import com.gwtext.client.widgets.form.event.ComboBoxListenerAdapter;
22
import com.gwtext.client.widgets.form.event.TextFieldListenerAdapter;
23
 
24
public class MiniBarrePaginationVue extends Toolbar implements Rafraichissable {
25
 
26
	/**
27
	 * Instance du médiateur à qui on notifie les évnènements
28
	 */
29
	private ListePaginable listePaginable = null;
30
 
31
	/**
32
	 * Bouton précédent
33
	 */
34
	private ToolbarButton prevPage = new ToolbarButton();
35
	/**
36
	 * Bouton suivant
37
	 */
38
	private ToolbarButton suivPage = new ToolbarButton();
39
	/**
40
	 * Numéro de la page courante (attention, commence à zéro pour des raisons
41
	 * pratiques)
42
	 */
43
	private int pageCourante = 0;
44
	/**
45
	 * Nombre de page total
46
	 */
47
	private int pageTotale = 1;
48
	/**
49
	 * Nombre d'élements total
50
	 */
51
	private int nbElement = 0;
52
	/**
53
	 * Nombre d'élément par page
54
	 */
55
	private int taillePage = 0;
56
	/**
57
	 * Texte statique de la toolbar 2
58
	 */
59
	private ToolbarTextItem afficherNbElem = new ToolbarTextItem("Afficher ");
60
	/**
61
	 * Combobox permettant de selectionner le nombre d'élements à afficher par
62
	 * page et donc de changer la variable taillePage
63
	 */
64
	private ComboBox selecteurTaillePage = new ComboBox();
65
 
66
	/**
67
	 * Les différents intervalles de page possibles (intialisé par défaut)
68
	 */
69
	String[] pages = { "200","100","50", "20", "10" };
70
 
71
	Store storeIntervalle = null ;
72
 
73
 
74
 
75
	/**
76
	 * Label indiquant le type d'element affiché
77
	 *
78
	 */
79
 
80
	private String labelElement="Elements";
81
 
82
	/**
83
	 * taille de la page par defaut
84
	 *
85
	 */
86
 
87
	private int taillePageDefaut = 50;
88
 
89
 
90
	/**
91
	 * Texte statique de la toolbar 3
92
	 */
93
	private ToolbarTextItem nbElemParPage = new ToolbarTextItem(
94
			labelElement + " par page ");
95
 
96
	/**
97
	 * retourne la liste associé à la barre
98
	 */
99
 
100
	public ListePaginable getlistePaginable() {
101
		return listePaginable;
102
	}
103
 
104
	/***************************************************************************
105
	 * constructeur sans argument (privé car ne doit pas être utilisé)
106
	 */
107
	@SuppressWarnings("unused")
108
	private MiniBarrePaginationVue() {
109
		super();
110
	}
111
 
112
	/**
113
	 * constructeur avec paramètres
114
	 *
115
	 * @param im
116
	 *            le médiateur à associer à la barre
117
	 */
118
	public MiniBarrePaginationVue(ListePaginable lst) {
119
		super();
120
 
121
		listePaginable = lst;
122
 
123
		// on dispose un peu de texte et quelques espaces pour séparer les
124
		// éléments
125
		addButton(prevPage);
126
		addSpacer();
127
		addButton(suivPage);
128
 
129
		addSpacer();
130
		addItem(afficherNbElem);
131
 
132
		prevPage.setIcon("page_prev.png");
133
		suivPage.setIcon("page_suiv.png");
134
 
135
		setIntervallesPages(pages) ;
136
 
137
		// le template definit ce que l'on affiche pour chaque element du store
138
		// dans la combobox
139
		final Template tp = new Template("<div class=\"x-combo-list-item\">"
140
				+ "{nb_page}" + "<div class=\"x-clear\"></div></div>");
141
		tp.compile();
142
 
143
		selecteurTaillePage.setTpl(tp);
144
		selecteurTaillePage.setStore(storeIntervalle);
145
		selecteurTaillePage.setEditable(false);
146
		addField(selecteurTaillePage);
147
		selecteurTaillePage.setValue(""+taillePageDefaut);
148
		selecteurTaillePage.setWidth(50);
149
		addItem(nbElemParPage);
150
 
151
 
152
		// on ajoute les différents listeners
153
		ajouterListeners();
154
	}
155
 
156
 
157
	/**
158
	 *  Texte nommant les elements pagines (Images, Observation, truc, machin etc...).
159
	 * 	@param label
160
	 */
161
 
162
	public void setLabelElement(String label) {
163
		this.labelElement = label;
164
		nbElemParPage.setText(labelElement + " par page ");
165
	}
166
 
167
	public void setTaillePageParDefaut(int taille) {
168
		this.taillePageDefaut = taille;
169
		selecteurTaillePage.setValue(""+taillePageDefaut);
170
	}
171
 
172
	public void setIntervallesPages(String[] intervalle)
173
	{
174
		String[][] intervallesPages = new String[intervalle.length][1] ;
175
 
176
		for(int i = 0 ; i < intervalle.length ; i++)
177
		{
178
			intervallesPages[i][0] = intervalle[i] ;
179
		}
180
 
181
		storeIntervalle = new SimpleStore(new String[] { "nb_page" },
182
				intervallesPages );
183
		storeIntervalle.load();
184
		selecteurTaillePage.setStore(storeIntervalle);
185
	}
186
 
187
 
188
	/**
189
	 * ajoute les différents listeners nécessaires au bon fonctionnement des
190
	 * éléments de la barre de pagination
191
	 */
192
	private void ajouterListeners() {
193
 
194
 
195
 
196
		// boutons suivants et précédents
197
		prevPage.addListener(new ButtonListenerAdapter() {
198
 
199
			public void onClick(Button button, EventObject e) {
200
 
201
				// si la page courante n'est pas la première
202
				if (pageCourante > 0) {
203
					// on décrémente la page courante de 1
204
					pageCourante--;
205
					// on rafraichit l'affichage
206
					// et on notifie le médiateur de l'évenement
207
					listePaginable.changerNumeroPage(pageCourante);
208
 
209
				}
210
			}
211
		});
212
 
213
		suivPage.addListener(new ButtonListenerAdapter() {
214
 
215
			public void onClick(Button button, EventObject e) {
216
 
217
				// si la page courante n'est pas la dernière
218
				if (pageCourante < pageTotale - 1) {
219
					// on incrémente la page courante de 1
220
					pageCourante++;
221
					// on rafraichit l'affichage
222
					// et on notifie le médiateur de l'évenement
223
					listePaginable.changerNumeroPage(pageCourante);
224
 
225
				}
226
			}
227
		});
228
 
229
		// listener pour la selection dans la combobox
230
		selecteurTaillePage.addListener(new ComboBoxListenerAdapter() {
231
 
232
			public void onSelect(ComboBox comboBox, Record record, int index) {
233
 
234
				String nouvelleTaillePageString = comboBox.getStore()
235
						.getRecordAt(index).getAsString("nb_page");
236
				int nouvelleTaillePage = Integer
237
						.parseInt(nouvelleTaillePageString);
238
 
239
				// si la taille de page est différente de l'ancienne
240
				if (nouvelleTaillePage != taillePage) {
241
					// on la change
242
					changerTaillePage(nouvelleTaillePage);
243
				}
244
				// et on met la valeur à jour dans la combobox
245
				comboBox.setValue(nouvelleTaillePageString);
246
				Window.alert("la nouvelle taille est :"+nouvelleTaillePageString);
247
			}
248
 
249
		});
250
	}
251
 
252
	/**
253
	 * Met à jour la page en cours
254
	 *
255
	 * @param nouvellePageCourante
256
	 *            la nouvelle page en cours
257
	 */
258
	public void changerPageCourante(int nouvellePageCourante) {
259
		pageCourante = nouvellePageCourante;
260
	}
261
 
262
	/**
263
	 * Methode héritée de l'interface rafraichissable
264
	 */
265
	public void rafraichir(Object nouvelleDonnees,
266
			boolean repandreRaffraichissement) {
267
 
268
		// si on reçoit un tableau de int
269
		if (nouvelleDonnees instanceof int[]) {
270
			int[] page = (int[]) nouvelleDonnees;
271
			// le premier élement est le nombre de pages totales
272
			pageTotale = page[0];
273
			// le second la page en cours
274
			pageCourante = page[1];
275
			// le troisième la taille de la page
276
			taillePage = page[2];
277
			// et le dernier le nombre total d'éléments
278
			nbElement = page[3];
279
 
280
			// si la page courante dépasse la page totale (cas normalement
281
			// improbable car géré en amont)
282
			// on met le numéro de page à la page courante -1 (car la page
283
			// courante est comptée à partir
284
			// de zéro)
285
			if (pageCourante >= pageTotale && pageCourante != 0) {
286
				pageCourante = pageTotale - 1;
287
				// le cas échéant on en notifie le médiateur
288
				listePaginable.changerNumeroPage(pageCourante);
289
			}
290
		}
291
	}
292
 
293
	/**
294
	 * Renvoie les différents intervalles de pages possibles
295
	 *
296
	 * @return un tableau de string qui contient les différentes
297
	 *         taille de pages
298
	 */
299
	public String[] getNbPages() {
300
 
301
		return pages;
302
	}
303
 
304
	/**
305
	 * Envoie au médiateur une demande pour modifier la taille de la page (qui
306
	 * va à son tour faire les modifications nécessaires)
307
	 *
308
	 * @param nouvelleTaillePage
309
	 *            la nouvelle taille de page (élement appartenant au tableau
310
	 *            renvoyé par getNbPages())
311
	 */
312
	public void changerTaillePage(int nouvelleTaillePage) {
313
 
314
		listePaginable.changerTaillePage(nouvelleTaillePage);
315
 
316
	}
317
 
318
	/**
319
	 * Selectionne la valeur correspond à celle passée en paramètre dans la
320
	 * combobox (si elle existe)
321
	 *
322
	 * @param nouvelleTaillePage
323
	 *            la nouvelle taille de page
324
	 */
325
	public void selectionnerTaillePage(int nouvelleTaillePage) {
326
 
327
		selecteurTaillePage.setValue("" + nouvelleTaillePage);
328
	}
329
}