Subversion Repositories eFlore/Applications.cel

Rev

Rev 1292 | 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;
1018 aurelien 5
import org.tela_botanica.client.vues.image.ImageMotsClesVue;
679 aurelien 6
import org.tela_botanica.client.vues.image.filtres.RechercheFiltreTaxonVue;
2 aperonnet 7
 
408 aurelien 8
import com.google.gwt.user.client.Timer;
77 jpm 9
import com.google.gwt.user.client.Window;
2 aperonnet 10
import com.google.gwt.user.client.ui.Label;
11
import com.gwtext.client.core.EventObject;
408 aurelien 12
import com.gwtext.client.core.Ext;
2 aperonnet 13
import com.gwtext.client.core.NameValuePair;
408 aurelien 14
import com.gwtext.client.widgets.BoxComponent;
2 aperonnet 15
import com.gwtext.client.widgets.Button;
131 aurelien 16
import com.gwtext.client.widgets.Component;
2 aperonnet 17
import com.gwtext.client.widgets.Panel;
18
import com.gwtext.client.widgets.TabPanel;
19
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
408 aurelien 20
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
131 aurelien 21
import com.gwtext.client.widgets.event.PanelListenerAdapter;
2 aperonnet 22
import com.gwtext.client.widgets.form.DateField;
23
import com.gwtext.client.widgets.form.TextArea;
24
import com.gwtext.client.widgets.form.TextField;
25
import com.gwtext.client.widgets.grid.GridPanel;
26
import com.gwtext.client.widgets.grid.GridView;
27
import com.gwtext.client.widgets.grid.PropertyGridPanel;
28
import com.gwtext.client.widgets.grid.event.GridCellListenerAdapter;
408 aurelien 29
import com.gwtext.client.widgets.layout.RowLayout;
30
import com.gwtext.client.widgets.layout.RowLayoutData;
2 aperonnet 31
import com.gwtext.client.widgets.layout.VerticalLayout;
32
 
33
/**
5 aperonnet 34
 * Panneau contenant les infos, les métadonnées et l'arbre des mots clés, il
35
 * implémente l'interface rafraichissable
36
 *
2 aperonnet 37
 * @author aurelien
5 aperonnet 38
 *
2 aperonnet 39
 */
40
public class PanneauMetadonneesVue extends TabPanel implements Rafraichissable {
41
 
42
	/**
43
	 * Le médiateur associé à la vue
44
	 */
5 aperonnet 45
	private ImageMediateur imediateur = null;
2 aperonnet 46
	/**
47
	 * Le panneau des Exifs
48
	 */
5 aperonnet 49
	private PropertyGridPanel ExifGrid = null;
2 aperonnet 50
	/**
51
	 * Le panneau des Iptc
52
	 */
5 aperonnet 53
	private PropertyGridPanel IptcGrid = null;
54
 
2 aperonnet 55
	/**
56
	 * La grille pour le panneau des Exifs
57
	 */
5 aperonnet 58
	private GridView gViewExif = null;
2 aperonnet 59
	/**
60
	 * La grille pour le panneau de Iptc
61
	 */
5 aperonnet 62
	private GridView gViewIptc = null;
63
 
2 aperonnet 64
	/**
65
	 * L'onglet des Exifs
66
	 */
5 aperonnet 67
	private Panel panneauExifGrid = null;
2 aperonnet 68
	/**
69
	 * L'onglet des Iptc
70
	 */
5 aperonnet 71
	private Panel panneauIptcGrid = null;
2 aperonnet 72
	/**
73
	 * L'onglet des infos
74
	 */
5 aperonnet 75
	private Panel panneauInfoGrid = null;
2 aperonnet 76
	/**
77
	 * L'onglet des mots clés
78
	 */
1018 aurelien 79
	private ImageMotsClesVue panneauMotsCles = null;
155 aurelien 80
 
81
	/**
82
	 * l'onglet des observations
83
	 */
84
	private Panel panneauMiniListeObservation = null;
5 aperonnet 85
 
2 aperonnet 86
	/**
87
	 * Le champ commentaire
88
	 */
5 aperonnet 89
	private TextField commentaireGeneral = null;
2 aperonnet 90
	/**
91
	 * Le champ date
92
	 */
5 aperonnet 93
	private DateField dateImage = null;
94
 
2 aperonnet 95
	/**
408 aurelien 96
	 * La barre de recherche rapide des taxons
97
	 */
98
	private RechercheFiltreTaxonVue rechercheFiltreTaxonVue = null;
99
 
100
	/**
5 aperonnet 101
	 * La mini liste des observations
102
	 */
103
	private MiniListeObservationVue miniListeObservation = null ;
104
	/**
2 aperonnet 105
	 * Le bouton de validation
106
	 */
5 aperonnet 107
	Button validerInfo = null;
108
 
2 aperonnet 109
	/**
110
	 * Barre de notation
111
	 */
5 aperonnet 112
	BarreNotationVue noteVue = null;
113
 
2 aperonnet 114
	/**
115
	 * Booleen d'instanciation
116
	 */
5 aperonnet 117
	boolean estInstancie = false;
408 aurelien 118
 
119
	Timer timerRedimensionnement = null;
5 aperonnet 120
 
2 aperonnet 121
	/**
122
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
123
	 */
124
	@SuppressWarnings("unused")
5 aperonnet 125
	private PanneauMetadonneesVue() {
126
		super();
2 aperonnet 127
	}
5 aperonnet 128
 
2 aperonnet 129
	/**
130
	 * Constructeur avec argument
5 aperonnet 131
	 *
2 aperonnet 132
	 * @param im
133
	 */
5 aperonnet 134
	public PanneauMetadonneesVue(ImageMediateur im) {
135
		super();
136
 
2 aperonnet 137
		// on associe le médiateur
5 aperonnet 138
		imediateur = im;
139
 
2 aperonnet 140
		// on crée et dispose les panneaux et les champs
5 aperonnet 141
		panneauExifGrid = new Panel("Exif");
142
		panneauIptcGrid = new Panel("Iptc");
227 aurelien 143
		panneauInfoGrid = new Panel("Infos");
1018 aurelien 144
		panneauMotsCles = new ImageMotsClesVue(im);
145
		panneauMotsCles.setHeight("50%");
5 aperonnet 146
 
147
		Panel sousPanneauInfosGenerales = new Panel("Infos Générales");
2 aperonnet 148
		sousPanneauInfosGenerales.setLayout(new VerticalLayout());
5 aperonnet 149
		sousPanneauInfosGenerales.setBorder(false);
2 aperonnet 150
		sousPanneauInfosGenerales.setHeight(200);
5 aperonnet 151
		sousPanneauInfosGenerales.setAutoWidth(true);
152
		sousPanneauInfosGenerales.setMargins(5);
153
		sousPanneauInfosGenerales.setPaddings(5);
154
		sousPanneauInfosGenerales.setCollapsible(true);
155
 
156
		Label labelComm = new Label("Commentaires :");
157
		labelComm.setHeight("20px");
158
		commentaireGeneral = new TextArea();
159
		commentaireGeneral.setWidth("90%");
160
		Label labelDate = new Label("Date :");
161
		Label labelNote = new Label("Note :");
162
 
163
		panneauMotsCles.setBorder(false);
164
 
165
		labelDate.setHeight("20px");
166
 
167
		dateImage = new DateField();
168
		dateImage.setAutoWidth(true);
169
		dateImage.setFormat("d/m/Y");
170
 
171
		validerInfo = new Button("OK");
172
 
173
		noteVue = new BarreNotationVue(im, 5);
408 aurelien 174
		panneauMiniListeObservation = new Panel("Observations") ;
2 aperonnet 175
 
408 aurelien 176
		if(!Ext.isIE()) {
177
			panneauMiniListeObservation.setLayout(new RowLayout());
178
		}
179
 
180
		miniListeObservation = new MiniListeObservationVue(im);
181
		rechercheFiltreTaxonVue = new RechercheFiltreTaxonVue(im);
182
		rechercheFiltreTaxonVue.setTitle("Recherche dans les observations");
183
		if(Ext.isIE()) {
184
			panneauMiniListeObservation.add(rechercheFiltreTaxonVue);
185
			rechercheFiltreTaxonVue.setHeight(90);
186
		} else {
187
			panneauMiniListeObservation.add(rechercheFiltreTaxonVue, new RowLayoutData(90));
188
		}
189
		rechercheFiltreTaxonVue.setWidth("100%") ;
190
		rechercheFiltreTaxonVue.setBorder(false);
191
 
192
		if(Ext.isIE()) {
193
			panneauMiniListeObservation.add(miniListeObservation, new RowLayoutData(400)) ;
194
		} else {
195
			panneauMiniListeObservation.add(miniListeObservation, new RowLayoutData()) ;
196
		}
5 aperonnet 197
 
198
		sousPanneauInfosGenerales.add(labelComm);
199
		sousPanneauInfosGenerales.add(commentaireGeneral);
200
		sousPanneauInfosGenerales.add(labelDate);
201
		sousPanneauInfosGenerales.add(dateImage);
202
		sousPanneauInfosGenerales.add(labelNote);
203
		sousPanneauInfosGenerales.add(noteVue);
204
		sousPanneauInfosGenerales.add(validerInfo);
2 aperonnet 205
		sousPanneauInfosGenerales.setAutoHeight(true);
5 aperonnet 206
		panneauMotsCles.setAutoHeight(true);
207
 
2 aperonnet 208
		panneauInfoGrid.setBorder(false);
209
		panneauInfoGrid.setAutoHeight(true);
592 aurelien 210
 
211
		panneauExifGrid.setAutoScroll(true);
212
		panneauIptcGrid.setAutoScroll(true);
5 aperonnet 213
 
214
		panneauInfoGrid.add(sousPanneauInfosGenerales);
215
		panneauInfoGrid.add(panneauMotsCles);
408 aurelien 216
 
5 aperonnet 217
 
394 aurelien 218
		this.add(panneauMiniListeObservation) ;
5 aperonnet 219
		this.add(panneauInfoGrid);
220
		this.add(panneauExifGrid);
221
		this.add(panneauIptcGrid);
222
 
2 aperonnet 223
		gViewExif = new GridView();
224
		gViewExif.setForceFit(true);
5 aperonnet 225
 
226
		ExifGrid = new PropertyGridPanel();
2 aperonnet 227
		ExifGrid.setId("meta_exif");
228
		ExifGrid.setView(gViewExif);
229
		ExifGrid.setNameText("Métadonnées Exif");
230
		ExifGrid.setAutoWidth(true);
592 aurelien 231
		ExifGrid.setHeight(500);
2 aperonnet 232
		ExifGrid.setSorted(false);
592 aurelien 233
		ExifGrid.setAutoScroll(true);
5 aperonnet 234
 
2 aperonnet 235
		gViewIptc = new GridView();
236
		gViewIptc.setForceFit(true);
5 aperonnet 237
 
238
		IptcGrid = new PropertyGridPanel();
2 aperonnet 239
		IptcGrid.setId("meta_iptc");
240
		IptcGrid.setView(gViewIptc);
5 aperonnet 241
 
2 aperonnet 242
		IptcGrid.setNameText("Métadonnées IPTC");
243
		IptcGrid.setAutoWidth(true);
592 aurelien 244
		IptcGrid.setHeight(500);
2 aperonnet 245
		IptcGrid.setSorted(false);
592 aurelien 246
		IptcGrid.setAutoScroll(true);
5 aperonnet 247
 
2 aperonnet 248
		panneauExifGrid.add(ExifGrid);
249
		panneauIptcGrid.add(IptcGrid);
5 aperonnet 250
 
2 aperonnet 251
		// on ajoute les listeners
5 aperonnet 252
		ajouterListeners();
253
 
2 aperonnet 254
		// on effectue le rendu
408 aurelien 255
		//this.doLayout(true);
5 aperonnet 256
 
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
}