Subversion Repositories eFlore/Applications.cel

Rev

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