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