Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

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