Subversion Repositories eFlore/Applications.cel

Rev

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