Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | 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
 
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
 
2 aperonnet 265
			public void onClick(Button button, EventObject e) {
5 aperonnet 266
 
267
				button.focus();
268
				// lors du clic sur le bouton valider on met à jour les
269
				// commentaires et la date
270
				getIMediateur().mettreAJourInfo(commentaireGeneral.getText(),
271
						dateImage.getRawValue(), noteVue.getNote());
272
 
273
			}
2 aperonnet 274
		});
5 aperonnet 275
 
2 aperonnet 276
		// gestion des clics dans la grille
277
		ExifGrid.addGridCellListener(new GridCellListenerAdapter() {
278
 
279
			// lors d'un clic d'une cellule
5 aperonnet 280
 
2 aperonnet 281
			public void onCellClick(GridPanel grid, int rowIndex, int colIndex,
282
					EventObject e) {
5 aperonnet 283
 
2 aperonnet 284
				// on empeche l'édition
5 aperonnet 285
				e.stopEvent();
286
				ExifGrid.stopEditing();
287
 
2 aperonnet 288
			}
289
 
290
			// lors du double clic sur une cellule
5 aperonnet 291
 
2 aperonnet 292
			public void onCellDblClick(GridPanel grid, int rowIndex,
293
					int colIndex, EventObject e) {
5 aperonnet 294
 
2 aperonnet 295
				// on empêche l'édition
5 aperonnet 296
				e.stopEvent();
297
				ExifGrid.stopEditing();
298
 
2 aperonnet 299
			}
5 aperonnet 300
 
301
		});
302
 
2 aperonnet 303
		IptcGrid.addGridCellListener(new GridCellListenerAdapter() {
304
 
305
			// lors d'un clic d'une cellule
5 aperonnet 306
 
2 aperonnet 307
			public void onCellClick(GridPanel grid, int rowIndex, int colIndex,
308
					EventObject e) {
309
				// on empeche l'édition
5 aperonnet 310
				e.stopEvent();
311
				ExifGrid.stopEditing();
312
 
2 aperonnet 313
			}
314
 
315
			// lors d'un double clic d'une cellule
316
			public void onCellDblClick(GridPanel grid, int rowIndex,
317
					int colIndex, EventObject e) {
318
				// on empeche l'édition
5 aperonnet 319
				e.stopEvent();
320
				ExifGrid.stopEditing();
321
 
2 aperonnet 322
			}
5 aperonnet 323
 
324
		});
131 aurelien 325
 
408 aurelien 326
		panneauMiniListeObservation.addListener(new ContainerListenerAdapter() {
327
 
328
			public void onResize(BoxComponent component, int adjWidth, int adjHeight,
329
					int rawWidth, int rawHeight) {
330
 
331
				timerRedimensionnement = new Timer() {
332
					public void run() {
333
 
334
						int taille = 500;
335
 
336
						if(Window.getClientHeight() > 800 ) {
337
							taille = Window.getClientHeight() - 226;
338
						}
339
						panneauMiniListeObservation.setHeight(taille);
340
					}
341
				};
342
 
343
				timerRedimensionnement.schedule(300);
344
			}
345
		});
592 aurelien 346
 
347
		panneauExifGrid.addListener(new ContainerListenerAdapter() {
348
 
349
			public void onResize(BoxComponent component, int adjWidth, int adjHeight,
350
					int rawWidth, int rawHeight) {
351
 
352
				timerRedimensionnement = new Timer() {
353
					public void run() {
354
 
355
						int taille = 500;
356
 
357
						taille = Window.getClientHeight() - 150;
358
 
359
						ExifGrid.setHeight(taille);
360
						panneauExifGrid.setHeight(taille);
361
					}
362
				};
363
 
364
				timerRedimensionnement.schedule(300);
365
			}
366
		});
367
 
368
		panneauExifGrid.addListener(new ContainerListenerAdapter() {
369
 
370
			public void onResize(BoxComponent component, int adjWidth, int adjHeight,
371
					int rawWidth, int rawHeight) {
372
 
373
				timerRedimensionnement = new Timer() {
374
					public void run() {
375
 
376
						int taille = 500;
377
 
378
						taille = Window.getClientHeight() - 150;
379
 
380
						IptcGrid.setHeight(taille);
381
						panneauIptcGrid.setHeight(taille);
382
					}
383
				};
384
 
385
				timerRedimensionnement.schedule(300);
386
			}
387
		});
2 aperonnet 388
	}
5 aperonnet 389
 
2 aperonnet 390
	/**
391
	 * Desactive visuellement ce panneau
392
	 */
5 aperonnet 393
	public void desactiverPanneau() {
595 aurelien 394
		panneauInfoGrid.setDisabled(true);
395
		panneauExifGrid.setDisabled(true);
396
		panneauIptcGrid.setDisabled(true);
2 aperonnet 397
	}
5 aperonnet 398
 
2 aperonnet 399
	/**
400
	 * Active visuellement ce panneau
401
	 */
5 aperonnet 402
	public void activerPanneau() {
595 aurelien 403
		panneauInfoGrid.setDisabled(false);
404
		panneauExifGrid.setDisabled(false);
405
		panneauIptcGrid.setDisabled(false);
2 aperonnet 406
	}
5 aperonnet 407
 
2 aperonnet 408
	/**
409
	 * Accesseur pour le médiateur
5 aperonnet 410
	 *
2 aperonnet 411
	 * @return le médiateur associé à la vue
412
	 */
5 aperonnet 413
	public ImageMediateur getIMediateur() {
414
		return imediateur;
2 aperonnet 415
	}
5 aperonnet 416
 
2 aperonnet 417
	/**
418
	 * Méthode héritée de l'interface rafraichissable
5 aperonnet 419
	 *
420
	 * @param nouvelleDonnees
421
	 *            les nouvelles données
422
	 * @param repandreRafraichissement
423
	 *            le booleen de notification de mise à jour
2 aperonnet 424
	 */
5 aperonnet 425
	public void rafraichir(Object nouvelleDonnees,
426
			boolean repandreRafraichissement) {
427
 
2 aperonnet 428
		// si on reçoit un tableau d'objets
5 aperonnet 429
		if (nouvelleDonnees instanceof Object[]) {
408 aurelien 430
 
431
			final Object ressourceObject = nouvelleDonnees;
432
 
433
			if(!this.isRendered()) {
434
				addListener(new PanelListenerAdapter() {
435
 
436
					public void onRender(Component component) {
437
						rafraichir(ressourceObject, false);
438
					}
439
				});
440
 
441
				return ;
442
			}
443
 
2 aperonnet 444
			// extrait infos, exifs et iptc
5 aperonnet 445
			Object meta[] = (Object[]) nouvelleDonnees;
446
			String[][] exif = (String[][]) meta[0];
447
			String[][] iptc = (String[][]) meta[1];
408 aurelien 448
			final String[][] gen = (String[][]) meta[2];
5 aperonnet 449
 
450
			NameValuePair[] exifSource = new NameValuePair[exif.length];
451
			NameValuePair[] iptcSource = new NameValuePair[iptc.length];
452
 
453
			int maxLength;
454
			if (exif.length <= iptc.length) {
455
				maxLength = iptc.length;
456
			} else {
457
				maxLength = exif.length;
2 aperonnet 458
			}
5 aperonnet 459
 
460
			for (int i = 0; i < maxLength; i++) {
461
				if (i < exif.length && !exif[i][0].equals("null")) {
462
					exifSource[i] = new NameValuePair(exif[i][0], exif[i][1]);
2 aperonnet 463
				}
5 aperonnet 464
 
465
				if (i < iptc.length && !iptc[i][0].equals("null")) {
466
					iptcSource[i] = new NameValuePair(iptc[i][0], iptc[i][1]);
2 aperonnet 467
				}
468
			}
5 aperonnet 469
 
2 aperonnet 470
			// on met à jour les champs avec la bonne valeur
5 aperonnet 471
			commentaireGeneral.setValue(gen[0][1]);
408 aurelien 472
			dateImage.setValue(gen[1][1]);
473
 
2 aperonnet 474
			// et on met à jour les données pour l'affichage
475
			ExifGrid.setSource(exifSource);
476
			IptcGrid.setSource(iptcSource);
477
 
5 aperonnet 478
		}
2 aperonnet 479
	}
480
 
481
	/**
482
	 * Accesseur pour le panneau des mots clés
5 aperonnet 483
	 *
2 aperonnet 484
	 * @return the panneauMotsCles
485
	 */
1018 aurelien 486
	public ImageMotsClesVue getPanneauMotsCles() {
2 aperonnet 487
		return panneauMotsCles;
488
	}
5 aperonnet 489
 
2 aperonnet 490
	public BarreNotationVue getNoteVue() {
5 aperonnet 491
		return noteVue;
2 aperonnet 492
	}
5 aperonnet 493
 
494
	public MiniListeObservationVue getMiniListeObservation()
495
	{
496
		return miniListeObservation ;
497
	}
408 aurelien 498
 
499
	public RechercheFiltreTaxonVue getRechercheFiltreTaxonVue()
500
	{
501
		return rechercheFiltreTaxonVue ;
502
	}
155 aurelien 503
 
504
	public void redimensionner() {
505
 
506
		if(panneauMiniListeObservation.isCreated() && panneauMiniListeObservation.isVisible()) {
507
			panneauMiniListeObservation.doLayout();
508
			//panneauMiniListeObservation.show();
509
			miniListeObservation.redimensionner();
510
		}
511
 
512
	}
2 aperonnet 513
}