Subversion Repositories eFlore/Archives.cel-v2

Rev

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

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