Subversion Repositories eFlore/Applications.cel

Rev

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