Subversion Repositories eFlore/Applications.cel

Rev

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

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