Subversion Repositories eFlore/Applications.cel

Rev

Rev 2615 | Rev 2653 | 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
 
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();
137
 
2 aperonnet 138
		// on associe le médiateur
5 aperonnet 139
		imediateur = im;
140
 
2 aperonnet 141
		// on crée et dispose les panneaux et les champs
2628 aurelien 142
		panneauExifGrid = new Panel(Msg.get("infos-exif"));
143
		panneauIptcGrid = new Panel(Msg.get("infos-iptc"));
2615 aurelien 144
		panneauInfoGrid = new Panel(Msg.get("infos-generales"));
1018 aurelien 145
		panneauMotsCles = new ImageMotsClesVue(im);
146
		panneauMotsCles.setHeight("50%");
5 aperonnet 147
 
2615 aurelien 148
		Panel sousPanneauInfosGenerales = new Panel(Msg.get("infos-generales"));
2 aperonnet 149
		sousPanneauInfosGenerales.setLayout(new VerticalLayout());
5 aperonnet 150
		sousPanneauInfosGenerales.setBorder(false);
2 aperonnet 151
		sousPanneauInfosGenerales.setHeight(200);
5 aperonnet 152
		sousPanneauInfosGenerales.setAutoWidth(true);
153
		sousPanneauInfosGenerales.setMargins(5);
154
		sousPanneauInfosGenerales.setPaddings(5);
155
		sousPanneauInfosGenerales.setCollapsible(true);
156
 
2615 aurelien 157
		Label labelComm = new Label(Msg.get("commentaires")+" :");
5 aperonnet 158
		labelComm.setHeight("20px");
159
		commentaireGeneral = new TextArea();
160
		commentaireGeneral.setWidth("90%");
2615 aurelien 161
		Label labelDate = new Label(Msg.get("date")+" :");
162
		Label labelNote = new Label(Msg.get("note")+" :");
5 aperonnet 163
 
164
		panneauMotsCles.setBorder(false);
165
 
166
		labelDate.setHeight("20px");
167
 
168
		dateImage = new DateField();
169
		dateImage.setAutoWidth(true);
170
		dateImage.setFormat("d/m/Y");
171
 
2615 aurelien 172
		validerInfo = new Button(Msg.get("ok"));
5 aperonnet 173
 
174
		noteVue = new BarreNotationVue(im, 5);
2615 aurelien 175
		panneauMiniListeObservation = new Panel(Msg.get("observations")) ;
2 aperonnet 176
 
408 aurelien 177
		if(!Ext.isIE()) {
178
			panneauMiniListeObservation.setLayout(new RowLayout());
179
		}
180
 
181
		miniListeObservation = new MiniListeObservationVue(im);
182
		rechercheFiltreTaxonVue = new RechercheFiltreTaxonVue(im);
2615 aurelien 183
		rechercheFiltreTaxonVue.setTitle(Msg.get("recherche-dans-observations"));
408 aurelien 184
		if(Ext.isIE()) {
185
			panneauMiniListeObservation.add(rechercheFiltreTaxonVue);
186
			rechercheFiltreTaxonVue.setHeight(90);
187
		} else {
188
			panneauMiniListeObservation.add(rechercheFiltreTaxonVue, new RowLayoutData(90));
189
		}
190
		rechercheFiltreTaxonVue.setWidth("100%") ;
191
		rechercheFiltreTaxonVue.setBorder(false);
192
 
193
		if(Ext.isIE()) {
194
			panneauMiniListeObservation.add(miniListeObservation, new RowLayoutData(400)) ;
195
		} else {
196
			panneauMiniListeObservation.add(miniListeObservation, new RowLayoutData()) ;
197
		}
5 aperonnet 198
 
199
		sousPanneauInfosGenerales.add(labelComm);
200
		sousPanneauInfosGenerales.add(commentaireGeneral);
201
		sousPanneauInfosGenerales.add(labelDate);
202
		sousPanneauInfosGenerales.add(dateImage);
203
		sousPanneauInfosGenerales.add(labelNote);
204
		sousPanneauInfosGenerales.add(noteVue);
205
		sousPanneauInfosGenerales.add(validerInfo);
2 aperonnet 206
		sousPanneauInfosGenerales.setAutoHeight(true);
5 aperonnet 207
		panneauMotsCles.setAutoHeight(true);
208
 
2 aperonnet 209
		panneauInfoGrid.setBorder(false);
210
		panneauInfoGrid.setAutoHeight(true);
592 aurelien 211
 
212
		panneauExifGrid.setAutoScroll(true);
213
		panneauIptcGrid.setAutoScroll(true);
5 aperonnet 214
 
215
		panneauInfoGrid.add(sousPanneauInfosGenerales);
216
		panneauInfoGrid.add(panneauMotsCles);
408 aurelien 217
 
5 aperonnet 218
 
394 aurelien 219
		this.add(panneauMiniListeObservation) ;
5 aperonnet 220
		this.add(panneauInfoGrid);
221
		this.add(panneauExifGrid);
222
		this.add(panneauIptcGrid);
223
 
2 aperonnet 224
		gViewExif = new GridView();
225
		gViewExif.setForceFit(true);
5 aperonnet 226
 
227
		ExifGrid = new PropertyGridPanel();
2 aperonnet 228
		ExifGrid.setId("meta_exif");
229
		ExifGrid.setView(gViewExif);
2615 aurelien 230
		ExifGrid.setNameText(Msg.get("exif-metadonnees"));
2 aperonnet 231
		ExifGrid.setAutoWidth(true);
592 aurelien 232
		ExifGrid.setHeight(500);
2 aperonnet 233
		ExifGrid.setSorted(false);
592 aurelien 234
		ExifGrid.setAutoScroll(true);
5 aperonnet 235
 
2 aperonnet 236
		gViewIptc = new GridView();
237
		gViewIptc.setForceFit(true);
5 aperonnet 238
 
239
		IptcGrid = new PropertyGridPanel();
2 aperonnet 240
		IptcGrid.setId("meta_iptc");
241
		IptcGrid.setView(gViewIptc);
5 aperonnet 242
 
2615 aurelien 243
		IptcGrid.setNameText(Msg.get("iptc-metadonnees"));
2 aperonnet 244
		IptcGrid.setAutoWidth(true);
592 aurelien 245
		IptcGrid.setHeight(500);
2 aperonnet 246
		IptcGrid.setSorted(false);
592 aurelien 247
		IptcGrid.setAutoScroll(true);
5 aperonnet 248
 
2 aperonnet 249
		panneauExifGrid.add(ExifGrid);
250
		panneauIptcGrid.add(IptcGrid);
5 aperonnet 251
 
2 aperonnet 252
		// on ajoute les listeners
5 aperonnet 253
		ajouterListeners();
254
 
2 aperonnet 255
		// on effectue le rendu
408 aurelien 256
		//this.doLayout(true);
5 aperonnet 257
 
2 aperonnet 258
	}
5 aperonnet 259
 
260
	private void ajouterListeners() {
2 aperonnet 261
		// on ajoute un écouteur
262
		validerInfo.addListener(new ButtonListenerAdapter() {
263
 
264
			// gestion du clic
5 aperonnet 265
 
1292 aurelien 266
			@Override
2 aperonnet 267
			public void onClick(Button button, EventObject e) {
5 aperonnet 268
 
269
				button.focus();
270
				// lors du clic sur le bouton valider on met à jour les
271
				// commentaires et la date
272
				getIMediateur().mettreAJourInfo(commentaireGeneral.getText(),
273
						dateImage.getRawValue(), noteVue.getNote());
274
 
275
			}
2 aperonnet 276
		});
5 aperonnet 277
 
2 aperonnet 278
		// gestion des clics dans la grille
279
		ExifGrid.addGridCellListener(new GridCellListenerAdapter() {
280
 
281
			// lors d'un clic d'une cellule
5 aperonnet 282
 
1292 aurelien 283
			@Override
2 aperonnet 284
			public void onCellClick(GridPanel grid, int rowIndex, int colIndex,
285
					EventObject e) {
5 aperonnet 286
 
2 aperonnet 287
				// on empeche l'édition
5 aperonnet 288
				e.stopEvent();
289
				ExifGrid.stopEditing();
290
 
2 aperonnet 291
			}
292
 
293
			// lors du double clic sur une cellule
5 aperonnet 294
 
1292 aurelien 295
			@Override
2 aperonnet 296
			public void onCellDblClick(GridPanel grid, int rowIndex,
297
					int colIndex, EventObject e) {
5 aperonnet 298
 
2 aperonnet 299
				// on empêche l'édition
5 aperonnet 300
				e.stopEvent();
301
				ExifGrid.stopEditing();
302
 
2 aperonnet 303
			}
5 aperonnet 304
 
305
		});
306
 
2 aperonnet 307
		IptcGrid.addGridCellListener(new GridCellListenerAdapter() {
308
 
309
			// lors d'un clic d'une cellule
5 aperonnet 310
 
1292 aurelien 311
			@Override
2 aperonnet 312
			public void onCellClick(GridPanel grid, int rowIndex, int colIndex,
313
					EventObject e) {
314
				// on empeche l'édition
5 aperonnet 315
				e.stopEvent();
316
				ExifGrid.stopEditing();
317
 
2 aperonnet 318
			}
319
 
320
			// lors d'un double clic d'une cellule
1292 aurelien 321
			@Override
2 aperonnet 322
			public void onCellDblClick(GridPanel grid, int rowIndex,
323
					int colIndex, EventObject e) {
324
				// on empeche l'édition
5 aperonnet 325
				e.stopEvent();
326
				ExifGrid.stopEditing();
327
 
2 aperonnet 328
			}
5 aperonnet 329
 
330
		});
131 aurelien 331
 
408 aurelien 332
		panneauMiniListeObservation.addListener(new ContainerListenerAdapter() {
333
 
1292 aurelien 334
			@Override
408 aurelien 335
			public void onResize(BoxComponent component, int adjWidth, int adjHeight,
336
					int rawWidth, int rawHeight) {
337
 
338
				timerRedimensionnement = new Timer() {
1292 aurelien 339
					@Override
408 aurelien 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
 
1292 aurelien 357
			@Override
592 aurelien 358
			public void onResize(BoxComponent component, int adjWidth, int adjHeight,
359
					int rawWidth, int rawHeight) {
360
 
361
				timerRedimensionnement = new Timer() {
1292 aurelien 362
					@Override
592 aurelien 363
					public void run() {
364
 
365
						int taille = 500;
366
 
367
						taille = Window.getClientHeight() - 150;
368
 
369
						ExifGrid.setHeight(taille);
370
						panneauExifGrid.setHeight(taille);
371
					}
372
				};
373
 
374
				timerRedimensionnement.schedule(300);
375
			}
376
		});
377
 
378
		panneauExifGrid.addListener(new ContainerListenerAdapter() {
379
 
1292 aurelien 380
			@Override
592 aurelien 381
			public void onResize(BoxComponent component, int adjWidth, int adjHeight,
382
					int rawWidth, int rawHeight) {
383
 
384
				timerRedimensionnement = new Timer() {
1292 aurelien 385
					@Override
592 aurelien 386
					public void run() {
387
 
388
						int taille = 500;
389
 
390
						taille = Window.getClientHeight() - 150;
391
 
392
						IptcGrid.setHeight(taille);
393
						panneauIptcGrid.setHeight(taille);
394
					}
395
				};
396
 
397
				timerRedimensionnement.schedule(300);
398
			}
399
		});
2 aperonnet 400
	}
5 aperonnet 401
 
2 aperonnet 402
	/**
403
	 * Desactive visuellement ce panneau
404
	 */
5 aperonnet 405
	public void desactiverPanneau() {
595 aurelien 406
		panneauInfoGrid.setDisabled(true);
407
		panneauExifGrid.setDisabled(true);
408
		panneauIptcGrid.setDisabled(true);
2 aperonnet 409
	}
5 aperonnet 410
 
2 aperonnet 411
	/**
412
	 * Active visuellement ce panneau
413
	 */
5 aperonnet 414
	public void activerPanneau() {
595 aurelien 415
		panneauInfoGrid.setDisabled(false);
416
		panneauExifGrid.setDisabled(false);
417
		panneauIptcGrid.setDisabled(false);
2 aperonnet 418
	}
5 aperonnet 419
 
2 aperonnet 420
	/**
421
	 * Accesseur pour le médiateur
5 aperonnet 422
	 *
2 aperonnet 423
	 * @return le médiateur associé à la vue
424
	 */
5 aperonnet 425
	public ImageMediateur getIMediateur() {
426
		return imediateur;
2 aperonnet 427
	}
5 aperonnet 428
 
2 aperonnet 429
	/**
430
	 * Méthode héritée de l'interface rafraichissable
5 aperonnet 431
	 *
432
	 * @param nouvelleDonnees
433
	 *            les nouvelles données
434
	 * @param repandreRafraichissement
435
	 *            le booleen de notification de mise à jour
2 aperonnet 436
	 */
1292 aurelien 437
	@Override
5 aperonnet 438
	public void rafraichir(Object nouvelleDonnees,
439
			boolean repandreRafraichissement) {
440
 
2 aperonnet 441
		// si on reçoit un tableau d'objets
5 aperonnet 442
		if (nouvelleDonnees instanceof Object[]) {
408 aurelien 443
 
444
			final Object ressourceObject = nouvelleDonnees;
445
 
446
			if(!this.isRendered()) {
447
				addListener(new PanelListenerAdapter() {
448
 
1292 aurelien 449
					@Override
408 aurelien 450
					public void onRender(Component component) {
451
						rafraichir(ressourceObject, false);
452
					}
453
				});
454
 
455
				return ;
456
			}
457
 
2 aperonnet 458
			// extrait infos, exifs et iptc
5 aperonnet 459
			Object meta[] = (Object[]) nouvelleDonnees;
460
			String[][] exif = (String[][]) meta[0];
461
			String[][] iptc = (String[][]) meta[1];
408 aurelien 462
			final String[][] gen = (String[][]) meta[2];
5 aperonnet 463
 
464
			NameValuePair[] exifSource = new NameValuePair[exif.length];
465
			NameValuePair[] iptcSource = new NameValuePair[iptc.length];
466
 
467
			int maxLength;
468
			if (exif.length <= iptc.length) {
469
				maxLength = iptc.length;
470
			} else {
471
				maxLength = exif.length;
2 aperonnet 472
			}
5 aperonnet 473
 
474
			for (int i = 0; i < maxLength; i++) {
475
				if (i < exif.length && !exif[i][0].equals("null")) {
476
					exifSource[i] = new NameValuePair(exif[i][0], exif[i][1]);
2 aperonnet 477
				}
5 aperonnet 478
 
479
				if (i < iptc.length && !iptc[i][0].equals("null")) {
480
					iptcSource[i] = new NameValuePair(iptc[i][0], iptc[i][1]);
2 aperonnet 481
				}
482
			}
5 aperonnet 483
 
2 aperonnet 484
			// on met à jour les champs avec la bonne valeur
5 aperonnet 485
			commentaireGeneral.setValue(gen[0][1]);
408 aurelien 486
			dateImage.setValue(gen[1][1]);
487
 
2 aperonnet 488
			// et on met à jour les données pour l'affichage
489
			ExifGrid.setSource(exifSource);
490
			IptcGrid.setSource(iptcSource);
491
 
5 aperonnet 492
		}
2 aperonnet 493
	}
494
 
495
	/**
496
	 * Accesseur pour le panneau des mots clés
5 aperonnet 497
	 *
2 aperonnet 498
	 * @return the panneauMotsCles
499
	 */
1018 aurelien 500
	public ImageMotsClesVue getPanneauMotsCles() {
2 aperonnet 501
		return panneauMotsCles;
502
	}
5 aperonnet 503
 
2 aperonnet 504
	public BarreNotationVue getNoteVue() {
5 aperonnet 505
		return noteVue;
2 aperonnet 506
	}
5 aperonnet 507
 
508
	public MiniListeObservationVue getMiniListeObservation()
509
	{
510
		return miniListeObservation ;
511
	}
408 aurelien 512
 
513
	public RechercheFiltreTaxonVue getRechercheFiltreTaxonVue()
514
	{
515
		return rechercheFiltreTaxonVue ;
516
	}
155 aurelien 517
 
518
	public void redimensionner() {
519
 
520
		if(panneauMiniListeObservation.isCreated() && panneauMiniListeObservation.isVisible()) {
521
			panneauMiniListeObservation.doLayout();
522
			//panneauMiniListeObservation.show();
523
			miniListeObservation.redimensionner();
524
		}
525
 
526
	}
2 aperonnet 527
}