Subversion Repositories eFlore/Applications.cel

Rev

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