Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
202 david 1
package org.tela_botanica.client.vues.image;
2 aperonnet 2
 
2615 aurelien 3
import org.tela_botanica.client.i18n.Msg;
2 aperonnet 4
import org.tela_botanica.client.image.ImageMediateur;
5
import org.tela_botanica.client.interfaces.Rafraichissable;
1018 aurelien 6
import org.tela_botanica.client.vues.image.ImageMotsClesVue;
679 aurelien 7
import org.tela_botanica.client.vues.image.filtres.RechercheFiltreTaxonVue;
2 aperonnet 8
 
408 aurelien 9
import com.google.gwt.user.client.Timer;
77 jpm 10
import com.google.gwt.user.client.Window;
2 aperonnet 11
import com.google.gwt.user.client.ui.Label;
12
import com.gwtext.client.core.EventObject;
408 aurelien 13
import com.gwtext.client.core.Ext;
2 aperonnet 14
import com.gwtext.client.core.NameValuePair;
408 aurelien 15
import com.gwtext.client.widgets.BoxComponent;
2 aperonnet 16
import com.gwtext.client.widgets.Button;
131 aurelien 17
import com.gwtext.client.widgets.Component;
2 aperonnet 18
import com.gwtext.client.widgets.Panel;
19
import com.gwtext.client.widgets.TabPanel;
20
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
408 aurelien 21
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
131 aurelien 22
import com.gwtext.client.widgets.event.PanelListenerAdapter;
2 aperonnet 23
import com.gwtext.client.widgets.form.DateField;
24
import com.gwtext.client.widgets.form.TextArea;
25
import com.gwtext.client.widgets.form.TextField;
26
import com.gwtext.client.widgets.grid.GridPanel;
27
import com.gwtext.client.widgets.grid.GridView;
28
import com.gwtext.client.widgets.grid.PropertyGridPanel;
29
import com.gwtext.client.widgets.grid.event.GridCellListenerAdapter;
408 aurelien 30
import com.gwtext.client.widgets.layout.RowLayout;
31
import com.gwtext.client.widgets.layout.RowLayoutData;
2 aperonnet 32
import com.gwtext.client.widgets.layout.VerticalLayout;
33
 
34
/**
5 aperonnet 35
 * Panneau contenant les infos, les métadonnées et l'arbre des mots clés, il
36
 * implémente l'interface rafraichissable
37
 *
2 aperonnet 38
 * @author aurelien
5 aperonnet 39
 *
2 aperonnet 40
 */
41
public class PanneauMetadonneesVue extends TabPanel implements Rafraichissable {
42
 
43
	/**
44
	 * Le médiateur associé à la vue
45
	 */
5 aperonnet 46
	private ImageMediateur imediateur = null;
2 aperonnet 47
	/**
48
	 * Le panneau des Exifs
49
	 */
5 aperonnet 50
	private PropertyGridPanel ExifGrid = null;
2 aperonnet 51
	/**
52
	 * Le panneau des Iptc
53
	 */
5 aperonnet 54
	private PropertyGridPanel IptcGrid = null;
55
 
2 aperonnet 56
	/**
57
	 * La grille pour le panneau des Exifs
58
	 */
5 aperonnet 59
	private GridView gViewExif = null;
2 aperonnet 60
	/**
61
	 * La grille pour le panneau de Iptc
62
	 */
5 aperonnet 63
	private GridView gViewIptc = null;
64
 
2 aperonnet 65
	/**
66
	 * L'onglet des Exifs
67
	 */
5 aperonnet 68
	private Panel panneauExifGrid = null;
2 aperonnet 69
	/**
70
	 * L'onglet des Iptc
71
	 */
5 aperonnet 72
	private Panel panneauIptcGrid = null;
2 aperonnet 73
	/**
74
	 * L'onglet des infos
75
	 */
5 aperonnet 76
	private Panel panneauInfoGrid = null;
2 aperonnet 77
	/**
78
	 * L'onglet des mots clés
79
	 */
1018 aurelien 80
	private ImageMotsClesVue panneauMotsCles = null;
155 aurelien 81
 
82
	/**
83
	 * l'onglet des observations
84
	 */
85
	private Panel panneauMiniListeObservation = null;
5 aperonnet 86
 
2 aperonnet 87
	/**
88
	 * Le champ commentaire
89
	 */
5 aperonnet 90
	private TextField commentaireGeneral = null;
2 aperonnet 91
	/**
92
	 * Le champ date
93
	 */
5 aperonnet 94
	private DateField dateImage = null;
95
 
2 aperonnet 96
	/**
408 aurelien 97
	 * La barre de recherche rapide des taxons
98
	 */
99
	private RechercheFiltreTaxonVue rechercheFiltreTaxonVue = null;
100
 
101
	/**
5 aperonnet 102
	 * La mini liste des observations
103
	 */
104
	private MiniListeObservationVue miniListeObservation = null ;
105
	/**
2 aperonnet 106
	 * Le bouton de validation
107
	 */
5 aperonnet 108
	Button validerInfo = null;
109
 
2 aperonnet 110
	/**
111
	 * Barre de notation
112
	 */
5 aperonnet 113
	BarreNotationVue noteVue = null;
114
 
2 aperonnet 115
	/**
116
	 * Booleen d'instanciation
117
	 */
5 aperonnet 118
	boolean estInstancie = false;
408 aurelien 119
 
120
	Timer timerRedimensionnement = null;
5 aperonnet 121
 
2 aperonnet 122
	/**
123
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
124
	 */
125
	@SuppressWarnings("unused")
5 aperonnet 126
	private PanneauMetadonneesVue() {
127
		super();
2 aperonnet 128
	}
5 aperonnet 129
 
2 aperonnet 130
	/**
131
	 * Constructeur avec argument
5 aperonnet 132
	 *
2 aperonnet 133
	 * @param im
134
	 */
5 aperonnet 135
	public PanneauMetadonneesVue(ImageMediateur im) {
136
		super();
2653 aurelien 137
 
138
		// TODO : un bug mystérieux n'apparait que lorsqu'on compile
139
		// en obfuscated et empêche de consulter les exifs et iptc
5 aperonnet 140
 
2 aperonnet 141
		// on associe le médiateur
5 aperonnet 142
		imediateur = im;
143
 
2 aperonnet 144
		// on crée et dispose les panneaux et les champs
2628 aurelien 145
		panneauExifGrid = new Panel(Msg.get("infos-exif"));
146
		panneauIptcGrid = new Panel(Msg.get("infos-iptc"));
2615 aurelien 147
		panneauInfoGrid = new Panel(Msg.get("infos-generales"));
1018 aurelien 148
		panneauMotsCles = new ImageMotsClesVue(im);
149
		panneauMotsCles.setHeight("50%");
5 aperonnet 150
 
2615 aurelien 151
		Panel sousPanneauInfosGenerales = new Panel(Msg.get("infos-generales"));
2 aperonnet 152
		sousPanneauInfosGenerales.setLayout(new VerticalLayout());
5 aperonnet 153
		sousPanneauInfosGenerales.setBorder(false);
2 aperonnet 154
		sousPanneauInfosGenerales.setHeight(200);
5 aperonnet 155
		sousPanneauInfosGenerales.setAutoWidth(true);
156
		sousPanneauInfosGenerales.setMargins(5);
157
		sousPanneauInfosGenerales.setPaddings(5);
158
		sousPanneauInfosGenerales.setCollapsible(true);
159
 
2615 aurelien 160
		Label labelComm = new Label(Msg.get("commentaires")+" :");
5 aperonnet 161
		labelComm.setHeight("20px");
162
		commentaireGeneral = new TextArea();
163
		commentaireGeneral.setWidth("90%");
2615 aurelien 164
		Label labelDate = new Label(Msg.get("date")+" :");
165
		Label labelNote = new Label(Msg.get("note")+" :");
5 aperonnet 166
 
167
		panneauMotsCles.setBorder(false);
168
 
169
		labelDate.setHeight("20px");
170
 
171
		dateImage = new DateField();
172
		dateImage.setAutoWidth(true);
173
		dateImage.setFormat("d/m/Y");
174
 
2615 aurelien 175
		validerInfo = new Button(Msg.get("ok"));
5 aperonnet 176
 
177
		noteVue = new BarreNotationVue(im, 5);
2615 aurelien 178
		panneauMiniListeObservation = new Panel(Msg.get("observations")) ;
2 aperonnet 179
 
408 aurelien 180
		if(!Ext.isIE()) {
181
			panneauMiniListeObservation.setLayout(new RowLayout());
182
		}
183
 
184
		miniListeObservation = new MiniListeObservationVue(im);
185
		rechercheFiltreTaxonVue = new RechercheFiltreTaxonVue(im);
2615 aurelien 186
		rechercheFiltreTaxonVue.setTitle(Msg.get("recherche-dans-observations"));
408 aurelien 187
		if(Ext.isIE()) {
188
			panneauMiniListeObservation.add(rechercheFiltreTaxonVue);
189
			rechercheFiltreTaxonVue.setHeight(90);
190
		} else {
191
			panneauMiniListeObservation.add(rechercheFiltreTaxonVue, new RowLayoutData(90));
192
		}
193
		rechercheFiltreTaxonVue.setWidth("100%") ;
194
		rechercheFiltreTaxonVue.setBorder(false);
195
 
196
		if(Ext.isIE()) {
197
			panneauMiniListeObservation.add(miniListeObservation, new RowLayoutData(400)) ;
198
		} else {
199
			panneauMiniListeObservation.add(miniListeObservation, new RowLayoutData()) ;
200
		}
5 aperonnet 201
 
202
		sousPanneauInfosGenerales.add(labelComm);
203
		sousPanneauInfosGenerales.add(commentaireGeneral);
204
		sousPanneauInfosGenerales.add(labelDate);
205
		sousPanneauInfosGenerales.add(dateImage);
206
		sousPanneauInfosGenerales.add(labelNote);
207
		sousPanneauInfosGenerales.add(noteVue);
208
		sousPanneauInfosGenerales.add(validerInfo);
2 aperonnet 209
		sousPanneauInfosGenerales.setAutoHeight(true);
5 aperonnet 210
		panneauMotsCles.setAutoHeight(true);
211
 
2 aperonnet 212
		panneauInfoGrid.setBorder(false);
213
		panneauInfoGrid.setAutoHeight(true);
592 aurelien 214
 
215
		panneauExifGrid.setAutoScroll(true);
216
		panneauIptcGrid.setAutoScroll(true);
5 aperonnet 217
 
218
		panneauInfoGrid.add(sousPanneauInfosGenerales);
219
		panneauInfoGrid.add(panneauMotsCles);
408 aurelien 220
 
5 aperonnet 221
 
394 aurelien 222
		this.add(panneauMiniListeObservation) ;
5 aperonnet 223
		this.add(panneauInfoGrid);
224
		this.add(panneauExifGrid);
225
		this.add(panneauIptcGrid);
226
 
2 aperonnet 227
		gViewExif = new GridView();
228
		gViewExif.setForceFit(true);
5 aperonnet 229
 
230
		ExifGrid = new PropertyGridPanel();
2 aperonnet 231
		ExifGrid.setId("meta_exif");
232
		ExifGrid.setView(gViewExif);
2615 aurelien 233
		ExifGrid.setNameText(Msg.get("exif-metadonnees"));
2 aperonnet 234
		ExifGrid.setAutoWidth(true);
592 aurelien 235
		ExifGrid.setHeight(500);
2 aperonnet 236
		ExifGrid.setSorted(false);
592 aurelien 237
		ExifGrid.setAutoScroll(true);
5 aperonnet 238
 
2 aperonnet 239
		gViewIptc = new GridView();
240
		gViewIptc.setForceFit(true);
5 aperonnet 241
 
242
		IptcGrid = new PropertyGridPanel();
2 aperonnet 243
		IptcGrid.setId("meta_iptc");
244
		IptcGrid.setView(gViewIptc);
5 aperonnet 245
 
2615 aurelien 246
		IptcGrid.setNameText(Msg.get("iptc-metadonnees"));
2 aperonnet 247
		IptcGrid.setAutoWidth(true);
592 aurelien 248
		IptcGrid.setHeight(500);
2 aperonnet 249
		IptcGrid.setSorted(false);
592 aurelien 250
		IptcGrid.setAutoScroll(true);
5 aperonnet 251
 
2 aperonnet 252
		panneauExifGrid.add(ExifGrid);
253
		panneauIptcGrid.add(IptcGrid);
5 aperonnet 254
 
2 aperonnet 255
		// on ajoute les listeners
5 aperonnet 256
		ajouterListeners();
2 aperonnet 257
	}
5 aperonnet 258
 
259
	private void ajouterListeners() {
2 aperonnet 260
		// on ajoute un écouteur
261
		validerInfo.addListener(new ButtonListenerAdapter() {
262
 
263
			// gestion du clic
5 aperonnet 264
 
1292 aurelien 265
			@Override
2 aperonnet 266
			public void onClick(Button button, EventObject e) {
5 aperonnet 267
 
268
				button.focus();
269
				// lors du clic sur le bouton valider on met à jour les
270
				// commentaires et la date
271
				getIMediateur().mettreAJourInfo(commentaireGeneral.getText(),
272
						dateImage.getRawValue(), noteVue.getNote());
273
 
274
			}
2 aperonnet 275
		});
5 aperonnet 276
 
2 aperonnet 277
		// gestion des clics dans la grille
278
		ExifGrid.addGridCellListener(new GridCellListenerAdapter() {
279
 
280
			// lors d'un clic d'une cellule
5 aperonnet 281
 
1292 aurelien 282
			@Override
2 aperonnet 283
			public void onCellClick(GridPanel grid, int rowIndex, int colIndex,
284
					EventObject e) {
5 aperonnet 285
 
2 aperonnet 286
				// on empeche l'édition
5 aperonnet 287
				e.stopEvent();
288
				ExifGrid.stopEditing();
289
 
2 aperonnet 290
			}
291
 
292
			// lors du double clic sur une cellule
5 aperonnet 293
 
1292 aurelien 294
			@Override
2 aperonnet 295
			public void onCellDblClick(GridPanel grid, int rowIndex,
296
					int colIndex, EventObject e) {
5 aperonnet 297
 
2 aperonnet 298
				// on empêche l'édition
5 aperonnet 299
				e.stopEvent();
300
				ExifGrid.stopEditing();
301
 
2 aperonnet 302
			}
5 aperonnet 303
 
304
		});
305
 
2 aperonnet 306
		IptcGrid.addGridCellListener(new GridCellListenerAdapter() {
307
 
308
			// lors d'un clic d'une cellule
5 aperonnet 309
 
1292 aurelien 310
			@Override
2 aperonnet 311
			public void onCellClick(GridPanel grid, int rowIndex, int colIndex,
312
					EventObject e) {
313
				// on empeche l'édition
5 aperonnet 314
				e.stopEvent();
315
				ExifGrid.stopEditing();
316
 
2 aperonnet 317
			}
318
 
319
			// lors d'un double clic d'une cellule
1292 aurelien 320
			@Override
2 aperonnet 321
			public void onCellDblClick(GridPanel grid, int rowIndex,
322
					int colIndex, EventObject e) {
323
				// on empeche l'édition
5 aperonnet 324
				e.stopEvent();
325
				ExifGrid.stopEditing();
326
 
2 aperonnet 327
			}
5 aperonnet 328
 
329
		});
131 aurelien 330
 
408 aurelien 331
		panneauMiniListeObservation.addListener(new ContainerListenerAdapter() {
332
 
1292 aurelien 333
			@Override
408 aurelien 334
			public void onResize(BoxComponent component, int adjWidth, int adjHeight,
335
					int rawWidth, int rawHeight) {
336
 
337
				timerRedimensionnement = new Timer() {
1292 aurelien 338
					@Override
408 aurelien 339
					public void run() {
340
 
341
						int taille = 500;
342
 
343
						if(Window.getClientHeight() > 800 ) {
344
							taille = Window.getClientHeight() - 226;
345
						}
346
						panneauMiniListeObservation.setHeight(taille);
347
					}
348
				};
349
 
350
				timerRedimensionnement.schedule(300);
351
			}
352
		});
592 aurelien 353
 
354
		panneauExifGrid.addListener(new ContainerListenerAdapter() {
355
 
1292 aurelien 356
			@Override
592 aurelien 357
			public void onResize(BoxComponent component, int adjWidth, int adjHeight,
358
					int rawWidth, int rawHeight) {
359
 
360
				timerRedimensionnement = new Timer() {
1292 aurelien 361
					@Override
592 aurelien 362
					public void run() {
363
 
364
						int taille = 500;
365
 
366
						taille = Window.getClientHeight() - 150;
367
 
368
						ExifGrid.setHeight(taille);
369
						panneauExifGrid.setHeight(taille);
370
					}
371
				};
372
 
373
				timerRedimensionnement.schedule(300);
374
			}
375
		});
376
 
377
		panneauExifGrid.addListener(new ContainerListenerAdapter() {
378
 
1292 aurelien 379
			@Override
592 aurelien 380
			public void onResize(BoxComponent component, int adjWidth, int adjHeight,
381
					int rawWidth, int rawHeight) {
382
 
383
				timerRedimensionnement = new Timer() {
1292 aurelien 384
					@Override
592 aurelien 385
					public void run() {
386
 
387
						int taille = 500;
388
 
389
						taille = Window.getClientHeight() - 150;
390
 
391
						IptcGrid.setHeight(taille);
392
						panneauIptcGrid.setHeight(taille);
393
					}
394
				};
395
 
396
				timerRedimensionnement.schedule(300);
397
			}
398
		});
2 aperonnet 399
	}
5 aperonnet 400
 
2 aperonnet 401
	/**
402
	 * Desactive visuellement ce panneau
403
	 */
5 aperonnet 404
	public void desactiverPanneau() {
595 aurelien 405
		panneauInfoGrid.setDisabled(true);
406
		panneauExifGrid.setDisabled(true);
407
		panneauIptcGrid.setDisabled(true);
2 aperonnet 408
	}
5 aperonnet 409
 
2 aperonnet 410
	/**
411
	 * Active visuellement ce panneau
412
	 */
5 aperonnet 413
	public void activerPanneau() {
595 aurelien 414
		panneauInfoGrid.setDisabled(false);
415
		panneauExifGrid.setDisabled(false);
416
		panneauIptcGrid.setDisabled(false);
2 aperonnet 417
	}
5 aperonnet 418
 
2 aperonnet 419
	/**
420
	 * Accesseur pour le médiateur
5 aperonnet 421
	 *
2 aperonnet 422
	 * @return le médiateur associé à la vue
423
	 */
5 aperonnet 424
	public ImageMediateur getIMediateur() {
425
		return imediateur;
2 aperonnet 426
	}
5 aperonnet 427
 
2 aperonnet 428
	/**
429
	 * Méthode héritée de l'interface rafraichissable
5 aperonnet 430
	 *
431
	 * @param nouvelleDonnees
432
	 *            les nouvelles données
433
	 * @param repandreRafraichissement
434
	 *            le booleen de notification de mise à jour
2 aperonnet 435
	 */
1292 aurelien 436
	@Override
5 aperonnet 437
	public void rafraichir(Object nouvelleDonnees,
438
			boolean repandreRafraichissement) {
439
 
2 aperonnet 440
		// si on reçoit un tableau d'objets
5 aperonnet 441
		if (nouvelleDonnees instanceof Object[]) {
408 aurelien 442
 
443
			final Object ressourceObject = nouvelleDonnees;
444
 
445
			if(!this.isRendered()) {
446
				addListener(new PanelListenerAdapter() {
447
 
1292 aurelien 448
					@Override
408 aurelien 449
					public void onRender(Component component) {
450
						rafraichir(ressourceObject, false);
451
					}
452
				});
453
 
454
				return ;
455
			}
456
 
2 aperonnet 457
			// extrait infos, exifs et iptc
5 aperonnet 458
			Object meta[] = (Object[]) nouvelleDonnees;
459
			String[][] exif = (String[][]) meta[0];
460
			String[][] iptc = (String[][]) meta[1];
408 aurelien 461
			final String[][] gen = (String[][]) meta[2];
5 aperonnet 462
 
463
			NameValuePair[] exifSource = new NameValuePair[exif.length];
464
			NameValuePair[] iptcSource = new NameValuePair[iptc.length];
465
 
466
			int maxLength;
467
			if (exif.length <= iptc.length) {
468
				maxLength = iptc.length;
469
			} else {
470
				maxLength = exif.length;
2 aperonnet 471
			}
5 aperonnet 472
 
473
			for (int i = 0; i < maxLength; i++) {
474
				if (i < exif.length && !exif[i][0].equals("null")) {
475
					exifSource[i] = new NameValuePair(exif[i][0], exif[i][1]);
2 aperonnet 476
				}
5 aperonnet 477
 
478
				if (i < iptc.length && !iptc[i][0].equals("null")) {
479
					iptcSource[i] = new NameValuePair(iptc[i][0], iptc[i][1]);
2 aperonnet 480
				}
481
			}
5 aperonnet 482
 
2 aperonnet 483
			// on met à jour les champs avec la bonne valeur
5 aperonnet 484
			commentaireGeneral.setValue(gen[0][1]);
408 aurelien 485
			dateImage.setValue(gen[1][1]);
486
 
2 aperonnet 487
			// et on met à jour les données pour l'affichage
488
			ExifGrid.setSource(exifSource);
489
			IptcGrid.setSource(iptcSource);
490
 
5 aperonnet 491
		}
2 aperonnet 492
	}
493
 
494
	/**
495
	 * Accesseur pour le panneau des mots clés
5 aperonnet 496
	 *
2 aperonnet 497
	 * @return the panneauMotsCles
498
	 */
1018 aurelien 499
	public ImageMotsClesVue getPanneauMotsCles() {
2 aperonnet 500
		return panneauMotsCles;
501
	}
5 aperonnet 502
 
2 aperonnet 503
	public BarreNotationVue getNoteVue() {
5 aperonnet 504
		return noteVue;
2 aperonnet 505
	}
5 aperonnet 506
 
507
	public MiniListeObservationVue getMiniListeObservation()
508
	{
509
		return miniListeObservation ;
510
	}
408 aurelien 511
 
512
	public RechercheFiltreTaxonVue getRechercheFiltreTaxonVue()
513
	{
514
		return rechercheFiltreTaxonVue ;
515
	}
155 aurelien 516
 
517
	public void redimensionner() {
518
 
519
		if(panneauMiniListeObservation.isCreated() && panneauMiniListeObservation.isVisible()) {
520
			panneauMiniListeObservation.doLayout();
521
			//panneauMiniListeObservation.show();
522
			miniListeObservation.redimensionner();
523
		}
524
 
525
	}
2 aperonnet 526
}