Subversion Repositories eFlore/Applications.cel

Rev

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