Subversion Repositories eFlore/Applications.cel

Rev

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