Subversion Repositories eFlore/Applications.cel

Rev

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

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