Subversion Repositories eFlore/Applications.cel

Rev

Rev 94 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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