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;
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);
5 aperonnet 217
 
218
		panneauInfoGrid.add(sousPanneauInfosGenerales);
219
		panneauInfoGrid.add(panneauMotsCles);
408 aurelien 220
 
5 aperonnet 221
 
394 aurelien 222
		this.add(panneauMiniListeObservation) ;
5 aperonnet 223
		this.add(panneauInfoGrid);
224
		this.add(panneauExifGrid);
225
		this.add(panneauIptcGrid);
226
 
2 aperonnet 227
		gViewExif = new GridView();
228
		gViewExif.setForceFit(true);
5 aperonnet 229
 
230
		ExifGrid = new PropertyGridPanel();
2 aperonnet 231
		ExifGrid.setId("meta_exif");
232
		ExifGrid.setView(gViewExif);
233
		ExifGrid.setNameText("Métadonnées Exif");
234
		ExifGrid.setAutoWidth(true);
235
		ExifGrid.setAutoHeight(true);
236
		ExifGrid.setSorted(false);
5 aperonnet 237
 
2 aperonnet 238
		gViewIptc = new GridView();
239
		gViewIptc.setForceFit(true);
5 aperonnet 240
 
241
		IptcGrid = new PropertyGridPanel();
2 aperonnet 242
		IptcGrid.setId("meta_iptc");
243
		IptcGrid.setView(gViewIptc);
5 aperonnet 244
 
2 aperonnet 245
		IptcGrid.setNameText("Métadonnées IPTC");
246
		IptcGrid.setAutoWidth(true);
247
		IptcGrid.setAutoHeight(true);
248
		IptcGrid.setSorted(false);
5 aperonnet 249
 
2 aperonnet 250
		panneauExifGrid.add(ExifGrid);
251
		panneauIptcGrid.add(IptcGrid);
5 aperonnet 252
 
2 aperonnet 253
		// on ajoute les listeners
5 aperonnet 254
		ajouterListeners();
255
 
2 aperonnet 256
		// on effectue le rendu
408 aurelien 257
		//this.doLayout(true);
5 aperonnet 258
 
2 aperonnet 259
	}
5 aperonnet 260
 
261
	private void ajouterListeners() {
2 aperonnet 262
		// on ajoute un écouteur
263
		validerInfo.addListener(new ButtonListenerAdapter() {
264
 
265
			// gestion du clic
5 aperonnet 266
 
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
 
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
 
2 aperonnet 294
			public void onCellDblClick(GridPanel grid, int rowIndex,
295
					int colIndex, EventObject e) {
5 aperonnet 296
 
2 aperonnet 297
				// on empêche l'édition
5 aperonnet 298
				e.stopEvent();
299
				ExifGrid.stopEditing();
300
 
2 aperonnet 301
			}
5 aperonnet 302
 
303
		});
304
 
2 aperonnet 305
		IptcGrid.addGridCellListener(new GridCellListenerAdapter() {
306
 
307
			// lors d'un clic d'une cellule
5 aperonnet 308
 
2 aperonnet 309
			public void onCellClick(GridPanel grid, int rowIndex, int colIndex,
310
					EventObject e) {
311
				// on empeche l'édition
5 aperonnet 312
				e.stopEvent();
313
				ExifGrid.stopEditing();
314
 
2 aperonnet 315
			}
316
 
317
			// lors d'un double clic d'une cellule
318
			public void onCellDblClick(GridPanel grid, int rowIndex,
319
					int colIndex, EventObject e) {
320
				// on empeche l'édition
5 aperonnet 321
				e.stopEvent();
322
				ExifGrid.stopEditing();
323
 
2 aperonnet 324
			}
5 aperonnet 325
 
326
		});
131 aurelien 327
 
408 aurelien 328
		panneauMiniListeObservation.addListener(new ContainerListenerAdapter() {
329
 
330
			public void onResize(BoxComponent component, int adjWidth, int adjHeight,
331
					int rawWidth, int rawHeight) {
332
 
333
				timerRedimensionnement = new Timer() {
334
					public void run() {
335
 
336
						int taille = 500;
337
 
338
						if(Window.getClientHeight() > 800 ) {
339
							taille = Window.getClientHeight() - 226;
340
						}
341
						panneauMiniListeObservation.setHeight(taille);
342
					}
343
				};
344
 
345
				timerRedimensionnement.schedule(300);
346
			}
347
		});
2 aperonnet 348
	}
5 aperonnet 349
 
2 aperonnet 350
	/**
351
	 * Desactive visuellement ce panneau
352
	 */
5 aperonnet 353
	public void desactiverPanneau() {
354
		this.setDisabled(true);
2 aperonnet 355
	}
5 aperonnet 356
 
2 aperonnet 357
	/**
358
	 * Active visuellement ce panneau
359
	 */
5 aperonnet 360
	public void activerPanneau() {
361
		this.setDisabled(false);
2 aperonnet 362
	}
5 aperonnet 363
 
2 aperonnet 364
	/**
365
	 * Accesseur pour le médiateur
5 aperonnet 366
	 *
2 aperonnet 367
	 * @return le médiateur associé à la vue
368
	 */
5 aperonnet 369
	public ImageMediateur getIMediateur() {
370
		return imediateur;
2 aperonnet 371
	}
5 aperonnet 372
 
2 aperonnet 373
	/**
374
	 * Méthode héritée de l'interface rafraichissable
5 aperonnet 375
	 *
376
	 * @param nouvelleDonnees
377
	 *            les nouvelles données
378
	 * @param repandreRafraichissement
379
	 *            le booleen de notification de mise à jour
2 aperonnet 380
	 */
5 aperonnet 381
	public void rafraichir(Object nouvelleDonnees,
382
			boolean repandreRafraichissement) {
383
 
2 aperonnet 384
		// si on reçoit un tableau d'objets
5 aperonnet 385
		if (nouvelleDonnees instanceof Object[]) {
408 aurelien 386
 
387
			final Object ressourceObject = nouvelleDonnees;
388
 
389
			if(!this.isRendered()) {
390
				addListener(new PanelListenerAdapter() {
391
 
392
					public void onRender(Component component) {
393
						rafraichir(ressourceObject, false);
394
					}
395
				});
396
 
397
				return ;
398
			}
399
 
2 aperonnet 400
			// extrait infos, exifs et iptc
5 aperonnet 401
			Object meta[] = (Object[]) nouvelleDonnees;
402
			String[][] exif = (String[][]) meta[0];
403
			String[][] iptc = (String[][]) meta[1];
408 aurelien 404
			final String[][] gen = (String[][]) meta[2];
5 aperonnet 405
 
406
			NameValuePair[] exifSource = new NameValuePair[exif.length];
407
			NameValuePair[] iptcSource = new NameValuePair[iptc.length];
408
 
409
			int maxLength;
410
			if (exif.length <= iptc.length) {
411
				maxLength = iptc.length;
412
			} else {
413
				maxLength = exif.length;
2 aperonnet 414
			}
5 aperonnet 415
 
416
			for (int i = 0; i < maxLength; i++) {
417
				if (i < exif.length && !exif[i][0].equals("null")) {
418
					exifSource[i] = new NameValuePair(exif[i][0], exif[i][1]);
2 aperonnet 419
				}
5 aperonnet 420
 
421
				if (i < iptc.length && !iptc[i][0].equals("null")) {
422
					iptcSource[i] = new NameValuePair(iptc[i][0], iptc[i][1]);
2 aperonnet 423
				}
424
			}
5 aperonnet 425
 
2 aperonnet 426
			// on met à jour les champs avec la bonne valeur
5 aperonnet 427
			commentaireGeneral.setValue(gen[0][1]);
408 aurelien 428
			dateImage.setValue(gen[1][1]);
429
 
2 aperonnet 430
			// et on met à jour les données pour l'affichage
431
			ExifGrid.setSource(exifSource);
432
			IptcGrid.setSource(iptcSource);
433
 
5 aperonnet 434
		}
2 aperonnet 435
	}
436
 
437
	/**
438
	 * Accesseur pour le panneau des mots clés
5 aperonnet 439
	 *
2 aperonnet 440
	 * @return the panneauMotsCles
441
	 */
442
	public ArbreMotsClesVue getPanneauMotsCles() {
443
		return panneauMotsCles;
444
	}
5 aperonnet 445
 
2 aperonnet 446
	public BarreNotationVue getNoteVue() {
5 aperonnet 447
		return noteVue;
2 aperonnet 448
	}
5 aperonnet 449
 
450
	public MiniListeObservationVue getMiniListeObservation()
451
	{
452
		return miniListeObservation ;
453
	}
408 aurelien 454
 
455
	public RechercheFiltreTaxonVue getRechercheFiltreTaxonVue()
456
	{
457
		return rechercheFiltreTaxonVue ;
458
	}
155 aurelien 459
 
460
	public void redimensionner() {
461
 
462
		if(panneauMiniListeObservation.isCreated() && panneauMiniListeObservation.isVisible()) {
463
			panneauMiniListeObservation.doLayout();
464
			//panneauMiniListeObservation.show();
465
			miniListeObservation.redimensionner();
466
		}
467
 
468
	}
2 aperonnet 469
}