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
import org.tela_botanica.client.interfaces.VueListable;
6
 
7
import com.gwtext.client.core.EventObject;
8
import com.gwtext.client.data.FieldDef;
9
import com.gwtext.client.data.IntegerFieldDef;
10
import com.gwtext.client.data.Record;
11
import com.gwtext.client.data.RecordDef;
12
import com.gwtext.client.data.Store;
13
import com.gwtext.client.data.StringFieldDef;
14
import com.gwtext.client.widgets.Component;
15
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
16
import com.gwtext.client.widgets.grid.CellMetadata;
17
import com.gwtext.client.widgets.grid.ColumnConfig;
18
import com.gwtext.client.widgets.grid.ColumnModel;
19
import com.gwtext.client.widgets.grid.GridPanel;
20
import com.gwtext.client.widgets.grid.Renderer;
21
import com.gwtext.client.widgets.grid.RowSelectionModel;
22
import com.gwtext.client.widgets.grid.event.GridRowListener;
23
import com.gwtext.client.widgets.grid.event.RowSelectionListenerAdapter;
24
 
25
/**
26
 * Liste d'image composée de miniatures et d'information sur l'image, implémente
27
 * l'interface rafraichissable et l'interface vueListable
28
 *
29
 * @author aurelien
30
 */
31
public class ListeImageVue extends GridPanel implements Rafraichissable,
32
		VueListable {
33
 
34
	/**
35
	 * Le médiateur associé à la vue
36
	 */
37
	private ImageMediateur	iMediateur		= null;
38
 
39
	/**
40
	 * Config de colonne
41
	 */
42
	private ColumnConfig	numImage;
43
	/**
44
	 * Config de colonne
45
	 */
46
	private ColumnConfig	urlImage;
47
	/**
48
	 * Config de colonne
49
	 */
50
	private ColumnConfig	lieImage;
51
	/**
52
	 * Config de colonne
53
	 */
54
	private ColumnConfig	datImage;
55
	/**
56
	 * Config de colonne
57
	 */
58
	private ColumnConfig	appImage;
59
	/**
60
	 * Config de colonne
61
	 */
62
	private ColumnConfig	noteImage;
63
	/**
64
	 * Modele de colonnes
65
	 */
66
	private ColumnModel		modeleColonnes;
67
 
68
	/**
69
	 * Booleen d'instanciation
70
	 */
71
	private boolean			estInstancie	= false;
72
 
73
	/**
74
	 * Store qui contient les données à afficher
75
	 */
76
	private Store			st				= null;
77
	/**
78
	 * Configuration des colonnes du store
79
	 */
80
	private ColumnConfig	cl				= null;
81
 
82
	/**
83
	 * Barre de pagination
84
	 */
85
	private pageToolBarVue bt = null ;
86
 
87
	/**
88
	 * Constructeur sans arguments (privé car ne doit pas être utilisé)
89
	 */
90
	private ListeImageVue()
91
	{
92
		super() ;
93
	}
94
 
95
	/**
96
	 * Constructeur avec argument
97
	 * @param im le médiateur à associer
98
	 */
99
	public ListeImageVue(ImageMediateur im) {
100
 
101
		new ListeImageVue() ;
102
 
103
		this.setId("listeImageGrid");
104
		// on associe le médiateur
105
		this.iMediateur = im;
106
 
107
		// on place la barre de pagination
108
		bt = new pageToolBarVue(iMediateur);
109
		setBottomToolbar(bt) ;
110
 
111
		// on construit le modèle de colonnes
112
		numImage = new ColumnConfig("numéro", "num_image", 30, true, new Renderer() {
113
 
114
			public String render(Object value, CellMetadata cellMetadata,
115
					Record record, int rowIndex, int colNum, Store store) {
116
 
117
				String ImgNum = record.getAsString("num_image");
118
				return "<div class=\"centered-list\">"+ ImgNum  +"</div>";
119
			}
120
 
121
		}) ;
122
 
123
		datImage = new ColumnConfig("date", "dat_image", 120, true, new Renderer() {
124
 
125
			public String render(Object value, CellMetadata cellMetadata,
126
					Record record, int rowIndex, int colNum, Store store) {
127
 
128
				String ImgDat = record.getAsString("dat_image");
129
				if(ImgDat == null)
130
				{
131
					ImgDat = " " ;
132
				}
133
				return "<div class=\"centered-list\">"+ ImgDat +"</div>";
134
			}
135
 
136
		}) ;
137
		lieImage = new ColumnConfig("lieu", "lie_image", 120, true, new Renderer() {
138
 
139
			public String render(Object value, CellMetadata cellMetadata,
140
					Record record, int rowIndex, int colNum, Store store) {
141
 
142
				String ImgLie = record.getAsString("lie_image");
143
				if(ImgLie == null)
144
				{
145
					ImgLie = " " ;
146
				}
147
				return "<div class=\"centered-list\">"+ ImgLie  +"</div>";
148
			}
149
 
150
		}) ;
151
		appImage = new ColumnConfig("appareil", "app_image", 120, true, new Renderer() {
152
 
153
			public String render(Object value, CellMetadata cellMetadata,
154
					Record record, int rowIndex, int colNum, Store store) {
155
 
156
				String ImgApp = record.getAsString("app_image");
157
				if(ImgApp == null)
158
				{
159
					ImgApp = " " ;
160
				}
161
				return "<div class=\"centered-list\">"+ ImgApp  +"</div>";
162
			}
163
 
164
		}) ;
165
		// la colonne url possède une méthode de rendu spéciale
166
		urlImage = new ColumnConfig("Image", "url_image_S", 30, true,
167
				new Renderer() {
168
 
169
					public String render(Object value,
170
							CellMetadata cellMetadata, Record record,
171
							int rowIndex, int colNum, Store store) {
172
						// on affiche une div contenant l'image pointée par l'url
173
						String ImgUrl = record.getAsString("url_image_S");
174
						String ImgNum = record.getAsString("num_image");
175
						return "<div class=\"img-list centered-list\"> <img src=\"" + ImgUrl
176
								+ "\" title='" + ImgNum + "'> </div>";
177
					}
178
 
179
				});
180
 
181
		noteImage = new ColumnConfig("note", "note_image", 80, true,
182
				new Renderer()
183
			{
184
				public String render(Object value, CellMetadata cellMetadata,
185
						Record record, int rowIndex, int colNum, Store store) {
186
 
187
					String htmlImage = "" ;
188
 
189
					int noteImg = record.getAsInteger("note_image") ;
190
					if(noteImg >= 0)
191
					{
192
						htmlImage += "<div class=\"img-note centered-list\">" ;
193
						for(int i = 0 ; i <= noteImg ; i++)
194
						{
195
							htmlImage += "<img src=\"note-on.gif\">" ;
196
						}
197
						htmlImage += "</div>" ;
198
					}
199
 
200
					return htmlImage ;
201
 
202
				}
203
 
204
			}) ;
205
 
206
		// on associe le modèle de colonnes
207
		ColumnConfig[] cm = {numImage, urlImage, datImage, lieImage, appImage, noteImage};
208
		modeleColonnes = new ColumnModel(cm);
209
		this.setColumnModel(modeleColonnes);
210
		this.setAutoScroll(true);
211
		this.setAutoWidth(true);
212
		this.setEnableColumnResize(true);
213
 
214
		// creation du store
215
		FieldDef defNumImage = new IntegerFieldDef("num_image");
216
		FieldDef defDatImage = new StringFieldDef("dat_image");
217
		FieldDef defLieImage = new StringFieldDef("lie_image");
218
		FieldDef defAppImage = new StringFieldDef("app_image");
219
		FieldDef defUrlImageS = new StringFieldDef("url_image_S");
220
		FieldDef defUrlImageM = new StringFieldDef("url_image_M");
221
		FieldDef defUrlImage = new StringFieldDef("url_image");
222
		FieldDef defNoteImage = new StringFieldDef("note_image");
223
		FieldDef[] defTab = { defNumImage, defDatImage, defLieImage,
224
				defAppImage, defUrlImageS, defUrlImageM, defUrlImage, defNoteImage };
225
		RecordDef rd = new RecordDef(defTab);
226
		st = new Store(rd);
227
		// on associe le store
228
		this.setStore(st);
229
		this.getView().setAutoFill(true);
230
 
231
		// on crée un masque de chargement qui s'affichera lors des mises à jour
232
		this.setLoadMask("chargement");
233
 
234
		// on ajoute les listeners
235
		ajouterListeners();
236
 
237
	}
238
 
239
	/**
240
	 * Ajoute les listeners pour la gestion des évènements
241
	 */
242
	private void ajouterListeners() {
243
		this.addListener(new ContainerListenerAdapter() {
244
 
245
 
246
			public void onHide(Component component) {
247
 
248
			}
249
 
250
			// lors du premier rendu on demande les données qui sont déjà contenues dans la galerie qui est le premier élément affiché
251
 
252
			public void onRender(Component component) {
253
 
254
				if (!isEstInstancie()) {
255
					setEstInstancie(true);
256
					getIMediateur().synchroniserSelection("galerie");
257
				}
258
			}
259
 
260
 
261
			public void onShow(Component component) {
262
 
263
			}
264
 
265
		});
266
 
267
		this.addGridRowListener(new GridRowListener() {
268
 
269
			// gestion du clic sur une ligne
270
			public void onRowClick(GridPanel grid, int rowIndex, EventObject e) {
271
 
272
				// on notifie le médiateur et on lui passe le nuémro de ligne
273
				getIMediateur().clicListeImage(rowIndex);
274
			}
275
 
276
			// gestion du clic droit
277
			public void onRowContextMenu(GridPanel grid, int rowIndex,
278
					EventObject e) {
279
				// on stoppe l'évenement pour empecher le navigateur d'afficher son propre menu
280
				e.stopEvent() ;
281
				// on notifie le médiateur en lui passant l'évenement
282
				getIMediateur().montrerContextMenu(e);
283
			}
284
 
285
			// gestion du double clic
286
			public void onRowDblClick(GridPanel grid, int rowIndex,
287
					EventObject e) {
288
				// on notifie le médiateur en lui passant le numéro de ligne
289
				getIMediateur().doubleClicListeImage(rowIndex);
290
			}
291
		});
292
 
293
		this.getSelectionModel().addListener(new RowSelectionListenerAdapter() {
294
 
295
			// gestion de la sélection
296
 
297
			public void onSelectionChange(RowSelectionModel sm) {
298
 
299
				// si on a rien de sélectionné
300
				if (sm.getCount() <= 0) {
301
					// on notifie le médiateur (qui désactive notamment l'accès à certaines infos)
302
					getIMediateur().aucuneSelection();
303
				} else {
304
					// sinon on notifie le médiateur
305
					getIMediateur().selection();
306
					// et on lui demande de synchroniser la selection avec les autres vues
307
					getIMediateur().synchroniserSelection("liste");
308
				}
309
			}
310
		});
311
	}
312
 
313
	/**
314
	 * Méthode héritée de l'interface VueListable
315
	 * Sélectionne les images dans la galerie suivant les identifiants donnés en paramètres
316
	 */
317
	public String[] getIdSelectionnees() {
318
		Record[] selection = this.getSelectionModel().getSelections();
319
		int taille = selection.length;
320
		String id_selection[] = new String[taille];
321
 
322
		for (int i = 0; i < selection.length; i++) {
323
 
324
			id_selection[i] = selection[i].getAsString("num_image");
325
		}
326
 
327
		return id_selection;
328
	}
329
 
330
	/**
331
	 * Accesseur pour la config de colonnes
332
	 * @return la config de colonnes
333
	 */
334
	public ColumnConfig getCl() {
335
		return cl;
336
	}
337
 
338
	/**
339
	 * Accesseur pour le médiateur
340
	 * @return le médiateur associé
341
	 */
342
	public ImageMediateur getIMediateur() {
343
		return iMediateur;
344
	}
345
 
346
	/**
347
	 * Accesseur pour le modèle de colonnes
348
	 * @return le modèle de colonnes
349
	 */
350
	public ColumnModel getModeleColonnes() {
351
		return modeleColonnes;
352
	}
353
 
354
	/**
355
	 * Accesseur pour le store
356
	 * @return le store contenant les données
357
	 */
358
	public Store getSt() {
359
		return st;
360
	}
361
 
362
	/**
363
	 * Accesseur pour le booleen d'instanciation
364
	 * @return le booleen d'instanciation
365
	 */
366
	public boolean isEstInstancie() {
367
		return estInstancie;
368
	}
369
 
370
	/**
371
	 * Méthode héritée de l'interface rafraichissable
372
	 * @param nouvelleDonnees les nouvelles données
373
	 * @param repandreRafraichissement le booleen de notification du rafraichissement
374
	 */
375
	public void rafraichir(Object nouvelleDonnees,
376
			boolean repandreRafraichissement) {
377
 
378
		// si on reçoit un store
379
		if (nouvelleDonnees instanceof Store) {
380
 
381
			// on affecte celui-ci comme gestionnaire de données
382
			st = (Store) nouvelleDonnees;
383
			st.load();
384
			// et on reconfigure et rafraichit la vue
385
			this.reconfigure(st, this.getColumnModel());
386
 
387
		}
388
 
389
		// si on doit répandre l'évenement
390
		if (repandreRafraichissement) {
391
			// on notifie le médiateur avec une copie des données
392
			getIMediateur().synchroniserDonneesZoomListeGalerie(
393
					nouvelleDonnees, this);
394
		}
395
	}
396
 
397
	/**
398
	 * Sélectionne des enregistrements donné
399
	 * @param sel un tableau d'enregistrement à selectionner
400
	 */
401
	public void selectionnerEnregistrements(Record[] sel) {
402
 
403
		if (isEstInstancie()) {
404
			getSelectionModel().clearSelections();
405
			getSelectionModel().selectRecords(sel);
406
		}
407
	}
408
 
409
	/**
410
	 * Accesseur pour la toolbar de pagination
411
	 * @return la toolbar de pagination
412
	 */
413
	public pageToolBarVue getToolBarVue()
414
	{
415
		return bt ;
416
	}
417
 
418
	/**
419
	 * Setteur pour le booleen d'instanciation
420
	 * @param estInstancie la nouvelle valeur du booleen
421
	 */
422
	public void setEstInstancie(boolean estInstancie) {
423
		this.estInstancie = estInstancie;
424
	}
425
 
426
	public void mettreAjourInfos(String commentaires, String date, String note) {
427
 
428
		for (int i = 0; i < getSelectionModel().getCount(); i++) {
429
 
430
			getSelectionModel().getSelections()[i].set("note_image", note) ;
431
			getSelectionModel().getSelections()[i].set("dat_image", date) ;
432
 
433
		}
434
 
435
	}
436
 
437
}