Subversion Repositories eFlore/Applications.cel

Rev

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