Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 40 | Rev 47 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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