Subversion Repositories eFlore/Applications.cel

Rev

Rev 56 | Rev 60 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 aperonnet 1
package org.tela_botanica.client.vues;
2
 
56 david 3
 
4
import org.tela_botanica.client.interfaces.ListePaginable;
2 aperonnet 5
import org.tela_botanica.client.interfaces.Rafraichissable;
6
 
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
/**
5 aperonnet 25
 * Barre de pagination asynchrone avec filtrage des touches et accès directs et
26
 * séquentiels à une page
27
 *
2 aperonnet 28
 * @author aurelien
5 aperonnet 29
 *
2 aperonnet 30
 */
59 david 31
public class BarrePaginationVue extends Toolbar implements Rafraichissable {
5 aperonnet 32
 
2 aperonnet 33
	/**
34
	 * Instance du médiateur à qui on notifie les évnènements
35
	 */
56 david 36
	private ListePaginable listePaginable = null;
5 aperonnet 37
 
2 aperonnet 38
	/**
39
	 * Bouton précédent
40
	 */
5 aperonnet 41
	private ToolbarButton prevPage = new ToolbarButton();
2 aperonnet 42
	/**
43
	 * Bouton suivant
44
	 */
5 aperonnet 45
	private ToolbarButton suivPage = new ToolbarButton();
2 aperonnet 46
	/**
5 aperonnet 47
	 * Numéro de la page courante (attention, commence à zéro pour des raisons
48
	 * pratiques)
2 aperonnet 49
	 */
5 aperonnet 50
	private int pageCourante = 0;
2 aperonnet 51
	/**
52
	 * Nombre de page total
53
	 */
5 aperonnet 54
	private int pageTotale = 1;
2 aperonnet 55
	/**
56
	 * Nombre d'élements total
57
	 */
5 aperonnet 58
	private int nbElement = 0;
2 aperonnet 59
	/**
60
	 * Nombre d'élément par page
61
	 */
5 aperonnet 62
	private int taillePage = 0;
2 aperonnet 63
	/**
64
	 * Texte statique de la toolbar 1
65
	 */
5 aperonnet 66
	private ToolbarTextItem page = new ToolbarTextItem("Page ");
2 aperonnet 67
	/**
68
	 * Affichage de la page courante
69
	 */
5 aperonnet 70
	private TextField champPage = new TextField("" + (pageCourante + 1));
2 aperonnet 71
	/**
72
	 * Affichage de "sur pageTotale "
73
	 */
5 aperonnet 74
	private ToolbarTextItem surTotalPage = new ToolbarTextItem(" sur "
75
			+ pageTotale);
2 aperonnet 76
	/**
77
	 * Texte statique de la toolbar 2
78
	 */
5 aperonnet 79
	private ToolbarTextItem afficherNbElem = new ToolbarTextItem("Afficher ");
2 aperonnet 80
	/**
5 aperonnet 81
	 * Combobox permettant de selectionner le nombre d'élements à afficher par
82
	 * page et donc de changer la variable taillePage
2 aperonnet 83
	 */
5 aperonnet 84
	private ComboBox selecteurTaillePage = new ComboBox();
59 david 85
 
86
 
87
 
2 aperonnet 88
	/**
59 david 89
	 * Label indiquant le type d'element affiché
90
	 *
91
	 */
92
 
93
	private String labelElement="Elements";
94
 
95
	/**
96
	 * taille de la page par defaut
97
	 *
98
	 */
99
 
100
	private int taillePageDefaut = 50;
101
 
102
 
103
	/**
2 aperonnet 104
	 * Texte statique de la toolbar 3
105
	 */
5 aperonnet 106
	private ToolbarTextItem nbElemParPage = new ToolbarTextItem(
59 david 107
			labelElement + " par page ");
2 aperonnet 108
	/**
109
	 * Affiche l'intervalle des éléments contenus dans la page
110
	 */
59 david 111
	private ToolbarTextItem intervalleElements = new ToolbarTextItem(labelElement + " "
5 aperonnet 112
			+ pageCourante * taillePage + " sur " + nbElement);
2 aperonnet 113
 
59 david 114
 
2 aperonnet 115
	/**
56 david 116
	 * retourne la liste associé à la barre
2 aperonnet 117
	 */
56 david 118
 
119
	public ListePaginable getlistePaginable() {
120
		return listePaginable;
2 aperonnet 121
	}
5 aperonnet 122
 
123
	/***************************************************************************
2 aperonnet 124
	 * constructeur sans argument (privé car ne doit pas être utilisé)
125
	 */
126
	@SuppressWarnings("unused")
59 david 127
	private BarrePaginationVue() {
5 aperonnet 128
		super();
2 aperonnet 129
	}
5 aperonnet 130
 
2 aperonnet 131
	/**
132
	 * constructeur avec paramètres
5 aperonnet 133
	 *
134
	 * @param im
135
	 *            le médiateur à associer à la barre
2 aperonnet 136
	 */
59 david 137
	public BarrePaginationVue(ListePaginable lst) {
5 aperonnet 138
		super();
139
 
56 david 140
		listePaginable = lst;
5 aperonnet 141
 
142
		// on dispose un peu de texte et quelques espaces pour séparer les
143
		// éléments
144
		addButton(prevPage);
145
		addSpacer();
146
		addItem(page);
147
		addField(champPage);
148
		addItem(surTotalPage);
149
		addSpacer();
150
		addButton(suivPage);
151
 
152
		champPage.setWidth(30);
153
 
154
		addSpacer();
155
		addItem(afficherNbElem);
156
 
157
		prevPage.setIcon("page_prev.png");
158
		suivPage.setIcon("page_suiv.png");
159
 
2 aperonnet 160
		// le store contient les valeur possibles pour les tailles de page
5 aperonnet 161
		final Store store = new SimpleStore(new String[] { "nb_page" },
162
				getNbPages());
163
		store.load();
164
 
165
		// le template definit ce que l'on affiche pour chaque element du store
166
		// dans la combobox
167
		final Template tp = new Template("<div class=\"x-combo-list-item\">"
168
				+ "{nb_page}" + "<div class=\"x-clear\"></div></div>");
2 aperonnet 169
		tp.compile();
5 aperonnet 170
 
171
		selecteurTaillePage.setTpl(tp);
172
		selecteurTaillePage.setStore(store);
173
		selecteurTaillePage.setWidth(40);
174
		selecteurTaillePage.setEditable(false);
175
		addField(selecteurTaillePage);
59 david 176
		selecteurTaillePage.setValue(""+taillePageDefaut);
5 aperonnet 177
		selecteurTaillePage.setWidth(50);
178
		addItem(nbElemParPage);
59 david 179
 
180
 
5 aperonnet 181
 
182
		// on remplit l'espace pour que l'intervalle d'élement se place à droite
183
		// de la barre
184
		addFill();
185
		addItem(intervalleElements);
186
		addSpacer();
187
 
2 aperonnet 188
		// on ajoute les différents listeners
5 aperonnet 189
		ajouterListeners();
2 aperonnet 190
	}
5 aperonnet 191
 
59 david 192
 
2 aperonnet 193
	/**
59 david 194
	 *  Texte nommant les elements pagines (Images, Observation, truc, machin etc...).
195
	 * 	@param label
196
	 */
197
 
198
	public void setLabelElement(String label) {
199
		this.labelElement = label;
200
		nbElemParPage.setText(labelElement + " par page ");
201
		intervalleElements.setText(labelElement + " " + pageCourante * taillePage + " sur " + nbElement);
202
	}
203
 
204
	public void setTaillePageParDefaut(int taille) {
205
		this.taillePageDefaut = taille;
206
		selecteurTaillePage.setValue(""+taillePageDefaut);
207
	}
208
 
209
 
210
	/**
5 aperonnet 211
	 * ajoute les différents listeners nécessaires au bon fonctionnement des
212
	 * éléments de la barre de pagination
2 aperonnet 213
	 */
5 aperonnet 214
	private void ajouterListeners() {
59 david 215
 
216
 
217
 
5 aperonnet 218
		// boutons suivants et précédents
2 aperonnet 219
		prevPage.addListener(new ButtonListenerAdapter() {
220
 
221
			public void onClick(Button button, EventObject e) {
5 aperonnet 222
 
2 aperonnet 223
				// si la page courante n'est pas la première
5 aperonnet 224
				if (pageCourante > 0) {
2 aperonnet 225
					// on décrémente la page courante de 1
5 aperonnet 226
					pageCourante--;
2 aperonnet 227
					// on rafraichit l'affichage
5 aperonnet 228
					rafraichirNumeroPage();
2 aperonnet 229
					// et on notifie le médiateur de l'évenement
56 david 230
					listePaginable.changerNumeroPage(pageCourante);
5 aperonnet 231
 
2 aperonnet 232
				}
233
			}
5 aperonnet 234
		});
235
 
2 aperonnet 236
		suivPage.addListener(new ButtonListenerAdapter() {
5 aperonnet 237
 
2 aperonnet 238
			public void onClick(Button button, EventObject e) {
5 aperonnet 239
 
2 aperonnet 240
				// si la page courante n'est pas la dernière
5 aperonnet 241
				if (pageCourante < pageTotale - 1) {
2 aperonnet 242
					// on incrémente la page courante de 1
5 aperonnet 243
					pageCourante++;
2 aperonnet 244
					// on rafraichit l'affichage
5 aperonnet 245
					rafraichirNumeroPage();
2 aperonnet 246
					// et on notifie le médiateur de l'évenement
56 david 247
					listePaginable.changerNumeroPage(pageCourante);
5 aperonnet 248
 
249
				}
2 aperonnet 250
			}
5 aperonnet 251
		});
252
 
2 aperonnet 253
		champPage.addListener(new TextFieldListenerAdapter() {
254
 
255
			public void onSpecialKey(Field field, EventObject e) {
5 aperonnet 256
 
2 aperonnet 257
				// on teste si la touche entrée a été pressée
5 aperonnet 258
				if (e.getKey() == EventObject.ENTER) {
259
					int nouvellePage = pageCourante;
2 aperonnet 260
					// on teste avec parseInt si la valeur entrée est un entier
5 aperonnet 261
					try {
262
						nouvellePage = Integer
263
								.parseInt(champPage.getRawValue());
264
					}
265
					// si ce n'est pas le cas alors on remet le numéro de page
266
					// correct
267
					catch (NumberFormatException nfe) {
268
						rafraichirNumeroPage();
269
						champPage.focus(true);
270
						return;
271
					}
2 aperonnet 272
 
5 aperonnet 273
					// si la conversion reussit on verifie s'il est nécessaire
274
					// de changer de page
275
					// et si la nouvelle est comprise dans l'intervalle des
276
					// pages existantes (0..pageTotale)
277
					if (nouvellePage != pageCourante + 1 && nouvellePage > 0
278
							&& nouvellePage <= pageTotale) {
279
						// le cas échéant, on charge la nouvelle page et on
280
						// notifie le médiateur
281
						changerPageCourante(nouvellePage - 1);
56 david 282
						listePaginable.changerNumeroPage(pageCourante);
5 aperonnet 283
 
284
					} else {
285
						// sinon on reaffiche l'ancien numero de page sans rien
286
						// changer
287
						rafraichirNumeroPage();
288
						champPage.focus(true);
2 aperonnet 289
					}
290
				}
291
			}
5 aperonnet 292
 
2 aperonnet 293
			public void onFocus(Field field) {
5 aperonnet 294
 
295
				champPage.focus(true);
2 aperonnet 296
			}
5 aperonnet 297
 
2 aperonnet 298
		});
5 aperonnet 299
 
300
		// pour éviter de se compliquer la vie, on filtre tous les charactères
301
		// non numériques
2 aperonnet 302
		champPage.addKeyPressListener(new EventCallback() {
303
 
304
			public void execute(EventObject e) {
5 aperonnet 305
 
2 aperonnet 306
				// si c'est un numerique
5 aperonnet 307
				if (Character.isDigit((char) e.getCharCode())) {
2 aperonnet 308
					// on laisse passer
5 aperonnet 309
					return;
2 aperonnet 310
				}
5 aperonnet 311
 
2 aperonnet 312
				// si c'est la touche entrée ou backspace (valider ou effacer)
5 aperonnet 313
				if (e.getKey() == EventObject.ENTER
314
						|| e.getKey() == EventObject.BACKSPACE) {
2 aperonnet 315
					// on laisse passer
5 aperonnet 316
					return;
317
				} else {
318
					// sinon on remet le numero de page correct et on annule
319
					// l'évenement
320
					rafraichirNumeroPage();
321
					e.stopEvent();
2 aperonnet 322
				}
323
			}
5 aperonnet 324
 
325
		});
326
 
327
		// listener pour la selection dans la combobox
2 aperonnet 328
		selecteurTaillePage.addListener(new ComboBoxListenerAdapter() {
5 aperonnet 329
 
2 aperonnet 330
			public void onSelect(ComboBox comboBox, Record record, int index) {
5 aperonnet 331
 
332
				String nouvelleTaillePageString = comboBox.getStore()
333
						.getRecordAt(index).getAsString("nb_page");
334
				int nouvelleTaillePage = Integer
335
						.parseInt(nouvelleTaillePageString);
336
 
2 aperonnet 337
				// si la taille de page est différente de l'ancienne
5 aperonnet 338
				if (nouvelleTaillePage != taillePage) {
2 aperonnet 339
					// on la change
5 aperonnet 340
					changerTaillePage(nouvelleTaillePage);
2 aperonnet 341
				}
342
				// et on met la valeur à jour dans la combobox
5 aperonnet 343
				comboBox.setValue(nouvelleTaillePageString);
2 aperonnet 344
			}
5 aperonnet 345
 
346
		});
2 aperonnet 347
	}
5 aperonnet 348
 
2 aperonnet 349
	/**
5 aperonnet 350
	 * Met à jour les affichage sur les numéros de pages et d'intervalle
351
	 * d'éléments à partir des variables de classes
2 aperonnet 352
	 */
5 aperonnet 353
	public void rafraichirNumeroPage() {
354
		surTotalPage.setText(" sur " + pageTotale);
355
 
356
		if (nbElement == 0) {
357
			champPage.setValue("" + (0));
358
			// on met simplement à jour l'intervalle qui contient toujours le
359
			// même nombre d'éléments
59 david 360
			intervalleElements.setText(labelElement + " 0 - 0 sur 0");
5 aperonnet 361
		} else {
362
			champPage.setValue("" + (pageCourante + 1));
363
 
364
			// si la page n'est pas la dernière
365
			if (pageCourante + 1 != pageTotale) {
366
				// sauf pour la dernière page qui contient souvent moins
367
				// d'élements que le nombre d'élements par page
59 david 368
				intervalleElements.setText(labelElement + " " + pageCourante
5 aperonnet 369
						* taillePage + " - " + (pageCourante + 1) * taillePage
370
						+ " sur " + nbElement);
371
			} else {
372
				// on met simplement à jour l'intervalle qui contient toujours
373
				// le même nombre d'éléments
59 david 374
				intervalleElements.setText(labelElement + " " + pageCourante
5 aperonnet 375
						* taillePage + " - " + nbElement + " sur " + nbElement);
376
			}
2 aperonnet 377
		}
378
	}
5 aperonnet 379
 
2 aperonnet 380
	/**
5 aperonnet 381
	 * Met à jour la page en cours
382
	 *
383
	 * @param nouvellePageCourante
384
	 *            la nouvelle page en cours
2 aperonnet 385
	 */
5 aperonnet 386
	public void changerPageCourante(int nouvellePageCourante) {
387
		pageCourante = nouvellePageCourante;
2 aperonnet 388
	}
5 aperonnet 389
 
2 aperonnet 390
	/**
391
	 * Methode héritée de l'interface rafraichissable
392
	 */
393
	public void rafraichir(Object nouvelleDonnees,
394
			boolean repandreRaffraichissement) {
5 aperonnet 395
 
2 aperonnet 396
		// si on reçoit un tableau de int
5 aperonnet 397
		if (nouvelleDonnees instanceof int[]) {
398
			int[] page = (int[]) nouvelleDonnees;
399
			// le premier élement est le nombre de pages totales
400
			pageTotale = page[0];
2 aperonnet 401
			// le second la page en cours
5 aperonnet 402
			pageCourante = page[1];
2 aperonnet 403
			// le troisième la taille de la page
5 aperonnet 404
			taillePage = page[2];
2 aperonnet 405
			// et le dernier le nombre total d'éléments
5 aperonnet 406
			nbElement = page[3];
407
 
408
			// si la page courante dépasse la page totale (cas normalement
409
			// improbable car géré en amont)
410
			// on met le numéro de page à la page courante -1 (car la page
411
			// courante est comptée à partir
2 aperonnet 412
			// de zéro)
5 aperonnet 413
			if (pageCourante >= pageTotale && pageCourante != 0) {
414
				pageCourante = pageTotale - 1;
2 aperonnet 415
				// le cas échéant on en notifie le médiateur
56 david 416
				listePaginable.changerNumeroPage(pageCourante);
2 aperonnet 417
			}
418
		}
5 aperonnet 419
 
420
		// enfin on rafraichit les informations affichées à partir des nouvelles
421
		// variables de classes mises à jour
422
		rafraichirNumeroPage();
2 aperonnet 423
	}
5 aperonnet 424
 
2 aperonnet 425
	/**
426
	 * Renvoie les différents intervalles de pages possibles
5 aperonnet 427
	 *
428
	 * @return un tableau de tableau de string qui contient les différentes
429
	 *         taille de pages
2 aperonnet 430
	 */
5 aperonnet 431
	public String[][] getNbPages() {
432
		String[][] pages = { { "200" }, { "100" }, { "50" }, { "20" }, { "10" } };
433
 
434
		return pages;
2 aperonnet 435
	}
436
 
437
	/**
5 aperonnet 438
	 * Envoie au médiateur une demande pour modifier la taille de la page (qui
439
	 * va à son tour faire les modifications nécessaires)
440
	 *
441
	 * @param nouvelleTaillePage
442
	 *            la nouvelle taille de page (élement appartenant au tableau
443
	 *            renvoyé par getNbPages())
2 aperonnet 444
	 */
445
	public void changerTaillePage(int nouvelleTaillePage) {
5 aperonnet 446
 
56 david 447
		listePaginable.changerTaillePage(nouvelleTaillePage);
5 aperonnet 448
 
2 aperonnet 449
	}
5 aperonnet 450
 
2 aperonnet 451
	/**
5 aperonnet 452
	 * Selectionne la valeur correspond à celle passée en paramètre dans la
453
	 * combobox (si elle existe)
454
	 *
455
	 * @param nouvelleTaillePage
456
	 *            la nouvelle taille de page
2 aperonnet 457
	 */
458
	public void selectionnerTaillePage(int nouvelleTaillePage) {
5 aperonnet 459
 
460
		selecteurTaillePage.setValue("" + nouvelleTaillePage);
2 aperonnet 461
	}
5 aperonnet 462
 
2 aperonnet 463
}