Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 aperonnet 1
package org.tela_botanica.client.vues;
2
 
3
import org.tela_botanica.client.image.ImageMediateur;
4
import org.tela_botanica.client.interfaces.Rafraichissable;
5
 
77 jpm 6
import com.google.gwt.user.client.Window;
2 aperonnet 7
import com.google.gwt.user.client.ui.Label;
8
import com.gwtext.client.core.EventObject;
9
import com.gwtext.client.core.NameValuePair;
10
import com.gwtext.client.widgets.Button;
11
import com.gwtext.client.widgets.Panel;
12
import com.gwtext.client.widgets.TabPanel;
13
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
14
import com.gwtext.client.widgets.form.DateField;
15
import com.gwtext.client.widgets.form.TextArea;
16
import com.gwtext.client.widgets.form.TextField;
17
import com.gwtext.client.widgets.grid.GridPanel;
18
import com.gwtext.client.widgets.grid.GridView;
19
import com.gwtext.client.widgets.grid.PropertyGridPanel;
20
import com.gwtext.client.widgets.grid.event.GridCellListenerAdapter;
62 jpm 21
import com.gwtext.client.widgets.layout.FitLayout;
2 aperonnet 22
import com.gwtext.client.widgets.layout.VerticalLayout;
23
 
24
/**
5 aperonnet 25
 * Panneau contenant les infos, les métadonnées et l'arbre des mots clés, il
26
 * implémente l'interface rafraichissable
27
 *
2 aperonnet 28
 * @author aurelien
5 aperonnet 29
 *
2 aperonnet 30
 */
31
public class PanneauMetadonneesVue extends TabPanel implements Rafraichissable {
32
 
33
	/**
34
	 * Le médiateur associé à la vue
35
	 */
5 aperonnet 36
	private ImageMediateur imediateur = null;
2 aperonnet 37
	/**
38
	 * Le panneau des Exifs
39
	 */
5 aperonnet 40
	private PropertyGridPanel ExifGrid = null;
2 aperonnet 41
	/**
42
	 * Le panneau des Iptc
43
	 */
5 aperonnet 44
	private PropertyGridPanel IptcGrid = null;
45
 
2 aperonnet 46
	/**
47
	 * La grille pour le panneau des Exifs
48
	 */
5 aperonnet 49
	private GridView gViewExif = null;
2 aperonnet 50
	/**
51
	 * La grille pour le panneau de Iptc
52
	 */
5 aperonnet 53
	private GridView gViewIptc = null;
54
 
2 aperonnet 55
	/**
56
	 * L'onglet des Exifs
57
	 */
5 aperonnet 58
	private Panel panneauExifGrid = null;
2 aperonnet 59
	/**
60
	 * L'onglet des Iptc
61
	 */
5 aperonnet 62
	private Panel panneauIptcGrid = null;
2 aperonnet 63
	/**
64
	 * L'onglet des infos
65
	 */
5 aperonnet 66
	private Panel panneauInfoGrid = null;
2 aperonnet 67
	/**
68
	 * L'onglet des mots clés
69
	 */
5 aperonnet 70
	private ArbreMotsClesVue panneauMotsCles = null;
71
 
2 aperonnet 72
	/**
73
	 * Le champ commentaire
74
	 */
5 aperonnet 75
	private TextField commentaireGeneral = null;
2 aperonnet 76
	/**
77
	 * Le champ date
78
	 */
5 aperonnet 79
	private DateField dateImage = null;
80
 
2 aperonnet 81
	/**
5 aperonnet 82
	 * La mini liste des observations
83
	 */
84
	private MiniListeObservationVue miniListeObservation = null ;
85
	/**
2 aperonnet 86
	 * Le bouton de validation
87
	 */
5 aperonnet 88
	Button validerInfo = null;
89
 
2 aperonnet 90
	/**
91
	 * Barre de notation
92
	 */
5 aperonnet 93
	BarreNotationVue noteVue = null;
94
 
2 aperonnet 95
	/**
96
	 * Booleen d'instanciation
97
	 */
5 aperonnet 98
	boolean estInstancie = false;
99
 
2 aperonnet 100
	/**
101
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
102
	 */
103
	@SuppressWarnings("unused")
5 aperonnet 104
	private PanneauMetadonneesVue() {
105
		super();
2 aperonnet 106
	}
5 aperonnet 107
 
2 aperonnet 108
	/**
109
	 * Constructeur avec argument
5 aperonnet 110
	 *
2 aperonnet 111
	 * @param im
112
	 */
5 aperonnet 113
	public PanneauMetadonneesVue(ImageMediateur im) {
114
		super();
115
 
2 aperonnet 116
		// on associe le médiateur
5 aperonnet 117
		imediateur = im;
118
 
2 aperonnet 119
		// on crée et dispose les panneaux et les champs
5 aperonnet 120
		panneauExifGrid = new Panel("Exif");
121
		panneauIptcGrid = new Panel("Iptc");
122
		panneauInfoGrid = new Panel("info");
123
		panneauMotsCles = new ArbreMotsClesVue(im);
124
		panneauMotsCles.setHeight("500px");
125
 
126
		Panel sousPanneauInfosGenerales = new Panel("Infos Générales");
2 aperonnet 127
		sousPanneauInfosGenerales.setLayout(new VerticalLayout());
5 aperonnet 128
		sousPanneauInfosGenerales.setBorder(false);
2 aperonnet 129
		sousPanneauInfosGenerales.setHeight(200);
5 aperonnet 130
		sousPanneauInfosGenerales.setAutoWidth(true);
131
		sousPanneauInfosGenerales.setMargins(5);
132
		sousPanneauInfosGenerales.setPaddings(5);
133
		sousPanneauInfosGenerales.setCollapsible(true);
134
 
135
		Label labelComm = new Label("Commentaires :");
136
		labelComm.setHeight("20px");
137
		commentaireGeneral = new TextArea();
138
		commentaireGeneral.setWidth("90%");
139
		Label labelDate = new Label("Date :");
140
		Label labelNote = new Label("Note :");
141
 
142
		panneauMotsCles.setBorder(false);
143
 
144
		labelDate.setHeight("20px");
145
 
146
		dateImage = new DateField();
147
		dateImage.setAutoWidth(true);
148
		dateImage.setFormat("d/m/Y");
149
 
150
		validerInfo = new Button("OK");
151
 
152
		noteVue = new BarreNotationVue(im, 5);
2 aperonnet 153
 
62 jpm 154
		Panel panneauMiniListeObservation = new Panel("Observations") ;
155
		panneauMiniListeObservation.setLayout(new FitLayout()) ;
156
		panneauMiniListeObservation.setHeight(800) ;
157
		panneauMiniListeObservation.setAutoWidth(true) ;
5 aperonnet 158
		miniListeObservation = new MiniListeObservationVue(im) ;
62 jpm 159
		panneauMiniListeObservation.add(miniListeObservation) ;
5 aperonnet 160
 
161
		sousPanneauInfosGenerales.add(labelComm);
162
		sousPanneauInfosGenerales.add(commentaireGeneral);
163
		sousPanneauInfosGenerales.add(labelDate);
164
		sousPanneauInfosGenerales.add(dateImage);
165
		sousPanneauInfosGenerales.add(labelNote);
166
		sousPanneauInfosGenerales.add(noteVue);
167
		sousPanneauInfosGenerales.add(validerInfo);
2 aperonnet 168
		sousPanneauInfosGenerales.setAutoHeight(true);
5 aperonnet 169
		panneauMotsCles.setAutoHeight(true);
170
 
2 aperonnet 171
		panneauInfoGrid.setBorder(false);
172
		panneauInfoGrid.setAutoHeight(true);
5 aperonnet 173
 
174
		panneauInfoGrid.add(sousPanneauInfosGenerales);
175
		panneauInfoGrid.add(panneauMotsCles);
176
 
177
		this.add(panneauInfoGrid);
178
		this.add(panneauExifGrid);
179
		this.add(panneauIptcGrid);
62 jpm 180
		this.add(panneauMiniListeObservation) ;
5 aperonnet 181
 
2 aperonnet 182
		gViewExif = new GridView();
183
		gViewExif.setForceFit(true);
5 aperonnet 184
 
185
		ExifGrid = new PropertyGridPanel();
2 aperonnet 186
		ExifGrid.setId("meta_exif");
187
		ExifGrid.setView(gViewExif);
188
		ExifGrid.setNameText("Métadonnées Exif");
189
		ExifGrid.setAutoWidth(true);
190
		ExifGrid.setAutoHeight(true);
191
		ExifGrid.setSorted(false);
5 aperonnet 192
 
2 aperonnet 193
		gViewIptc = new GridView();
194
		gViewIptc.setForceFit(true);
5 aperonnet 195
 
196
		IptcGrid = new PropertyGridPanel();
2 aperonnet 197
		IptcGrid.setId("meta_iptc");
198
		IptcGrid.setView(gViewIptc);
5 aperonnet 199
 
2 aperonnet 200
		IptcGrid.setNameText("Métadonnées IPTC");
201
		IptcGrid.setAutoWidth(true);
202
		IptcGrid.setAutoHeight(true);
203
		IptcGrid.setSorted(false);
5 aperonnet 204
 
2 aperonnet 205
		panneauExifGrid.add(ExifGrid);
206
		panneauIptcGrid.add(IptcGrid);
5 aperonnet 207
 
2 aperonnet 208
		// on ajoute les listeners
5 aperonnet 209
		ajouterListeners();
210
 
2 aperonnet 211
		// on effectue le rendu
5 aperonnet 212
		this.doLayout(true);
213
 
2 aperonnet 214
	}
5 aperonnet 215
 
216
	private void ajouterListeners() {
2 aperonnet 217
		// on ajoute un écouteur
218
		validerInfo.addListener(new ButtonListenerAdapter() {
219
 
220
			// gestion du clic
5 aperonnet 221
 
2 aperonnet 222
			public void onClick(Button button, EventObject e) {
5 aperonnet 223
 
224
				button.focus();
225
				// lors du clic sur le bouton valider on met à jour les
226
				// commentaires et la date
227
				getIMediateur().mettreAJourInfo(commentaireGeneral.getText(),
228
						dateImage.getRawValue(), noteVue.getNote());
229
 
230
			}
2 aperonnet 231
		});
5 aperonnet 232
 
2 aperonnet 233
		// gestion des clics dans la grille
234
		ExifGrid.addGridCellListener(new GridCellListenerAdapter() {
235
 
236
			// lors d'un clic d'une cellule
5 aperonnet 237
 
2 aperonnet 238
			public void onCellClick(GridPanel grid, int rowIndex, int colIndex,
239
					EventObject e) {
5 aperonnet 240
 
2 aperonnet 241
				// on empeche l'édition
5 aperonnet 242
				e.stopEvent();
243
				ExifGrid.stopEditing();
244
 
2 aperonnet 245
			}
246
 
247
			// lors du double clic sur une cellule
5 aperonnet 248
 
2 aperonnet 249
			public void onCellDblClick(GridPanel grid, int rowIndex,
250
					int colIndex, EventObject e) {
5 aperonnet 251
 
2 aperonnet 252
				// on empêche l'édition
5 aperonnet 253
				e.stopEvent();
254
				ExifGrid.stopEditing();
255
 
2 aperonnet 256
			}
5 aperonnet 257
 
258
		});
259
 
2 aperonnet 260
		IptcGrid.addGridCellListener(new GridCellListenerAdapter() {
261
 
262
			// lors d'un clic d'une cellule
5 aperonnet 263
 
2 aperonnet 264
			public void onCellClick(GridPanel grid, int rowIndex, int colIndex,
265
					EventObject e) {
266
				// on empeche l'édition
5 aperonnet 267
				e.stopEvent();
268
				ExifGrid.stopEditing();
269
 
2 aperonnet 270
			}
271
 
272
			// lors d'un double clic d'une cellule
5 aperonnet 273
 
2 aperonnet 274
			public void onCellDblClick(GridPanel grid, int rowIndex,
275
					int colIndex, EventObject e) {
276
				// on empeche l'édition
5 aperonnet 277
				e.stopEvent();
278
				ExifGrid.stopEditing();
279
 
2 aperonnet 280
			}
5 aperonnet 281
 
282
		});
2 aperonnet 283
	}
5 aperonnet 284
 
2 aperonnet 285
	/**
286
	 * Desactive visuellement ce panneau
287
	 */
5 aperonnet 288
	public void desactiverPanneau() {
289
		this.setDisabled(true);
2 aperonnet 290
	}
5 aperonnet 291
 
2 aperonnet 292
	/**
293
	 * Active visuellement ce panneau
294
	 */
5 aperonnet 295
	public void activerPanneau() {
296
		this.setDisabled(false);
2 aperonnet 297
	}
5 aperonnet 298
 
2 aperonnet 299
	/**
300
	 * Accesseur pour le médiateur
5 aperonnet 301
	 *
2 aperonnet 302
	 * @return le médiateur associé à la vue
303
	 */
5 aperonnet 304
	public ImageMediateur getIMediateur() {
305
		return imediateur;
2 aperonnet 306
	}
5 aperonnet 307
 
2 aperonnet 308
	/**
309
	 * Méthode héritée de l'interface rafraichissable
5 aperonnet 310
	 *
311
	 * @param nouvelleDonnees
312
	 *            les nouvelles données
313
	 * @param repandreRafraichissement
314
	 *            le booleen de notification de mise à jour
2 aperonnet 315
	 */
5 aperonnet 316
	public void rafraichir(Object nouvelleDonnees,
317
			boolean repandreRafraichissement) {
318
 
2 aperonnet 319
		// si on reçoit un tableau d'objets
5 aperonnet 320
		if (nouvelleDonnees instanceof Object[]) {
2 aperonnet 321
			// extrait infos, exifs et iptc
5 aperonnet 322
			Object meta[] = (Object[]) nouvelleDonnees;
323
			String[][] exif = (String[][]) meta[0];
324
			String[][] iptc = (String[][]) meta[1];
325
			String[][] gen = (String[][]) meta[2];
326
 
327
			NameValuePair[] exifSource = new NameValuePair[exif.length];
328
			NameValuePair[] iptcSource = new NameValuePair[iptc.length];
329
 
330
			int maxLength;
331
			if (exif.length <= iptc.length) {
332
				maxLength = iptc.length;
333
			} else {
334
				maxLength = exif.length;
2 aperonnet 335
			}
5 aperonnet 336
 
337
			for (int i = 0; i < maxLength; i++) {
338
				if (i < exif.length && !exif[i][0].equals("null")) {
339
					exifSource[i] = new NameValuePair(exif[i][0], exif[i][1]);
2 aperonnet 340
				}
5 aperonnet 341
 
342
				if (i < iptc.length && !iptc[i][0].equals("null")) {
343
					iptcSource[i] = new NameValuePair(iptc[i][0], iptc[i][1]);
2 aperonnet 344
				}
345
			}
5 aperonnet 346
 
2 aperonnet 347
			// on met à jour les champs avec la bonne valeur
5 aperonnet 348
			commentaireGeneral.setValue(gen[0][1]);
349
			dateImage.setRawValue(gen[1][1]);
350
 
2 aperonnet 351
			// et on met à jour les données pour l'affichage
352
			ExifGrid.setSource(exifSource);
353
			IptcGrid.setSource(iptcSource);
354
 
5 aperonnet 355
		}
2 aperonnet 356
	}
357
 
358
	/**
359
	 * Accesseur pour le panneau des mots clés
5 aperonnet 360
	 *
2 aperonnet 361
	 * @return the panneauMotsCles
362
	 */
363
	public ArbreMotsClesVue getPanneauMotsCles() {
364
		return panneauMotsCles;
365
	}
5 aperonnet 366
 
2 aperonnet 367
	public BarreNotationVue getNoteVue() {
5 aperonnet 368
		return noteVue;
2 aperonnet 369
	}
5 aperonnet 370
 
371
	public MiniListeObservationVue getMiniListeObservation()
372
	{
373
		return miniListeObservation ;
374
	}
2 aperonnet 375
}