Subversion Repositories eFlore/Applications.cel

Rev

Rev 5 | 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
 
42 jpm 247
 
2 aperonnet 248
		// on crée un masque de chargement qui s'affichera lors des mises à jour
249
		this.setLoadMask("chargement");
250
 
5 aperonnet 251
		//Enable drag and drop
252
		this.setEnableDragDrop(true);
253
		//You need to set the same group for both grids
254
		this.setDdGroup("DragGroupName");
255
 
2 aperonnet 256
		// on ajoute les listeners
257
		ajouterListeners();
258
 
259
	}
5 aperonnet 260
 
2 aperonnet 261
 
262
	/**
263
	 * Ajoute les listeners pour la gestion des évènements
264
	 */
265
	private void ajouterListeners() {
266
		this.addListener(new ContainerListenerAdapter() {
267
 
268
			public void onHide(Component component) {
269
 
270
			}
271
 
5 aperonnet 272
			// lors du premier rendu on demande les données qui sont déjà
273
			// contenues dans la galerie qui est le premier élément affiché
274
 
2 aperonnet 275
			public void onRender(Component component) {
276
 
277
				if (!isEstInstancie()) {
278
					setEstInstancie(true);
5 aperonnet 279
					setDragDropText("Glissez les images sur la liste d'observation pour les lier") ;
2 aperonnet 280
					getIMediateur().synchroniserSelection("galerie");
281
				}
282
			}
283
 
284
			public void onShow(Component component) {
285
 
286
			}
287
 
288
		});
289
 
290
		this.addGridRowListener(new GridRowListener() {
5 aperonnet 291
 
2 aperonnet 292
			// gestion du clic sur une ligne
293
			public void onRowClick(GridPanel grid, int rowIndex, EventObject e) {
294
 
295
				// on notifie le médiateur et on lui passe le nuémro de ligne
296
				getIMediateur().clicListeImage(rowIndex);
297
			}
5 aperonnet 298
 
2 aperonnet 299
			// gestion du clic droit
300
			public void onRowContextMenu(GridPanel grid, int rowIndex,
301
					EventObject e) {
5 aperonnet 302
				// on stoppe l'évenement pour empecher le navigateur d'afficher
303
				// son propre menu
304
				e.stopEvent();
2 aperonnet 305
				// on notifie le médiateur en lui passant l'évenement
306
				getIMediateur().montrerContextMenu(e);
307
			}
308
 
309
			// gestion du double clic
310
			public void onRowDblClick(GridPanel grid, int rowIndex,
311
					EventObject e) {
312
				// on notifie le médiateur en lui passant le numéro de ligne
313
				getIMediateur().doubleClicListeImage(rowIndex);
314
			}
315
		});
316
 
317
		this.getSelectionModel().addListener(new RowSelectionListenerAdapter() {
318
 
319
			// gestion de la sélection
5 aperonnet 320
 
2 aperonnet 321
			public void onSelectionChange(RowSelectionModel sm) {
322
 
323
				// si on a rien de sélectionné
324
				if (sm.getCount() <= 0) {
5 aperonnet 325
					// on notifie le médiateur (qui désactive notamment l'accès
326
					// à certaines infos)
2 aperonnet 327
					getIMediateur().aucuneSelection();
328
				} else {
329
					// sinon on notifie le médiateur
330
					getIMediateur().selection();
5 aperonnet 331
					// et on lui demande de synchroniser la selection avec les
332
					// autres vues
2 aperonnet 333
					getIMediateur().synchroniserSelection("liste");
334
				}
335
			}
336
		});
5 aperonnet 337
 
338
		//Enable drag and drop
339
		this.setEnableDragDrop(true);
340
 
341
		//Same name in destination
342
		this.setDdGroup("DragGroupName");
343
		DropTargetConfig dtc = new DropTargetConfig();
344
		dtc.setdDdGroup("DragGroupName");
345
 
346
		//Now this is the important part, you need a drop target
347
		@SuppressWarnings("unused")
348
		DropTarget tg = new DropTarget(this, dtc)
349
		{
350
			public boolean notifyDrop(DragSource source, EventObject e, DragData data){
351
 
352
				if(data instanceof GridDragData)
353
				{
354
					GridDragData gdd = (GridDragData)data ;
355
	    		  	if(gdd.getGrid().getId().equals("listeImageGrid"))
356
	    		  	{
357
	    		  		return false ;
358
	    		  	}
359
	    		  	else
360
	    		  	{
361
	    		  		return iMediateur.lierObsDD(source, e, data, getId()) ;
362
	    		  	}
363
				}
364
				else
365
				{
366
					return false ;
367
				}
368
 
369
 
370
			}
371
 
372
			public String notifyOver(DragSource source, EventObject e, DragData data){
373
			    return "x-dd-drop-ok";
374
			}
375
		};
2 aperonnet 376
	}
377
 
378
	/**
5 aperonnet 379
	 * Méthode héritée de l'interface VueListable Sélectionne les images dans la
380
	 * galerie suivant les identifiants donnés en paramètres
2 aperonnet 381
	 */
382
	public String[] getIdSelectionnees() {
383
		Record[] selection = this.getSelectionModel().getSelections();
384
		int taille = selection.length;
385
		String id_selection[] = new String[taille];
386
 
387
		for (int i = 0; i < selection.length; i++) {
388
 
389
			id_selection[i] = selection[i].getAsString("num_image");
390
		}
391
 
392
		return id_selection;
393
	}
394
 
395
	/**
396
	 * Accesseur pour la config de colonnes
5 aperonnet 397
	 *
2 aperonnet 398
	 * @return la config de colonnes
399
	 */
400
	public ColumnConfig getCl() {
401
		return cl;
402
	}
5 aperonnet 403
 
2 aperonnet 404
	/**
405
	 * Accesseur pour le médiateur
5 aperonnet 406
	 *
2 aperonnet 407
	 * @return le médiateur associé
408
	 */
409
	public ImageMediateur getIMediateur() {
410
		return iMediateur;
411
	}
412
 
413
	/**
414
	 * Accesseur pour le modèle de colonnes
5 aperonnet 415
	 *
2 aperonnet 416
	 * @return le modèle de colonnes
417
	 */
418
	public ColumnModel getModeleColonnes() {
419
		return modeleColonnes;
420
	}
421
 
422
	/**
423
	 * Accesseur pour le store
5 aperonnet 424
	 *
2 aperonnet 425
	 * @return le store contenant les données
426
	 */
427
	public Store getSt() {
428
		return st;
429
	}
5 aperonnet 430
 
2 aperonnet 431
	/**
432
	 * Accesseur pour le booleen d'instanciation
5 aperonnet 433
	 *
2 aperonnet 434
	 * @return le booleen d'instanciation
435
	 */
436
	public boolean isEstInstancie() {
437
		return estInstancie;
438
	}
439
 
440
	/**
441
	 * Méthode héritée de l'interface rafraichissable
5 aperonnet 442
	 *
443
	 * @param nouvelleDonnees
444
	 *            les nouvelles données
445
	 * @param repandreRafraichissement
446
	 *            le booleen de notification du rafraichissement
2 aperonnet 447
	 */
448
	public void rafraichir(Object nouvelleDonnees,
449
			boolean repandreRafraichissement) {
450
 
451
		// si on reçoit un store
452
		if (nouvelleDonnees instanceof Store) {
453
 
454
			// on affecte celui-ci comme gestionnaire de données
455
			st = (Store) nouvelleDonnees;
456
			st.load();
457
			// et on reconfigure et rafraichit la vue
458
			this.reconfigure(st, this.getColumnModel());
5 aperonnet 459
 
2 aperonnet 460
		}
461
 
462
		// si on doit répandre l'évenement
463
		if (repandreRafraichissement) {
464
			// on notifie le médiateur avec une copie des données
465
			getIMediateur().synchroniserDonneesZoomListeGalerie(
466
					nouvelleDonnees, this);
467
		}
468
	}
469
 
470
	/**
5 aperonnet 471
	 * Sélectionne des enregistrements donné
472
	 *
473
	 * @param sel
474
	 *            un tableau d'enregistrement à selectionner
2 aperonnet 475
	 */
476
	public void selectionnerEnregistrements(Record[] sel) {
477
 
478
		if (isEstInstancie()) {
479
			getSelectionModel().clearSelections();
480
			getSelectionModel().selectRecords(sel);
481
		}
482
	}
5 aperonnet 483
 
2 aperonnet 484
	/**
485
	 * Accesseur pour la toolbar de pagination
5 aperonnet 486
	 *
2 aperonnet 487
	 * @return la toolbar de pagination
488
	 */
5 aperonnet 489
	public pageToolBarVue getToolBarVue() {
490
		return bt;
2 aperonnet 491
	}
492
 
493
	/**
494
	 * Setteur pour le booleen d'instanciation
5 aperonnet 495
	 *
496
	 * @param estInstancie
497
	 *            la nouvelle valeur du booleen
2 aperonnet 498
	 */
499
	public void setEstInstancie(boolean estInstancie) {
500
		this.estInstancie = estInstancie;
501
	}
502
 
5 aperonnet 503
	public void mettreAjourInfos(String commentaires, String date, String note) {
504
 
2 aperonnet 505
		for (int i = 0; i < getSelectionModel().getCount(); i++) {
5 aperonnet 506
 
507
			getSelectionModel().getSelections()[i].set("note_image", note);
508
			getSelectionModel().getSelections()[i].set("dat_image", date);
509
 
2 aperonnet 510
		}
5 aperonnet 511
 
2 aperonnet 512
	}
513
 
514
}