Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 47 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4 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;
19 aperonnet 5
import org.tela_botanica.client.interfaces.VueListable;
4 aperonnet 6
 
19 aperonnet 7
import com.gwtext.client.core.EventObject;
4 aperonnet 8
import com.gwtext.client.data.FieldDef;
12 aperonnet 9
import com.gwtext.client.data.IntegerFieldDef;
4 aperonnet 10
import com.gwtext.client.data.Record;
11
import com.gwtext.client.data.RecordDef;
12
import com.gwtext.client.data.Store;
13
import com.gwtext.client.data.StringFieldDef;
5 aperonnet 14
import com.gwtext.client.widgets.Component;
15
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
4 aperonnet 16
import com.gwtext.client.widgets.grid.CellMetadata;
17
import com.gwtext.client.widgets.grid.ColumnConfig;
18
import com.gwtext.client.widgets.grid.ColumnModel;
19
import com.gwtext.client.widgets.grid.GridPanel;
20
import com.gwtext.client.widgets.grid.Renderer;
22 aperonnet 21
import com.gwtext.client.widgets.grid.RowSelectionModel;
19 aperonnet 22
import com.gwtext.client.widgets.grid.event.GridRowListener;
22 aperonnet 23
import com.gwtext.client.widgets.grid.event.RowSelectionListenerAdapter;
4 aperonnet 24
 
12 aperonnet 25
/**
36 aperonnet 26
 * Liste d'image composée de miniatures et d'information sur l'image, implémente
27
 * l'interface rafraichissable et l'interface vueListable
27 aperonnet 28
 *
12 aperonnet 29
 * @author aurelien
30
 */
27 aperonnet 31
public class ListeImageVue extends GridPanel implements Rafraichissable,
32
		VueListable {
33
 
36 aperonnet 34
	/**
35
	 * Le médiateur associé à la vue
36
	 */
27 aperonnet 37
	private ImageMediateur	iMediateur		= null;
36 aperonnet 38
 
39
	/**
40
	 * Config de colonne
41
	 */
27 aperonnet 42
	private ColumnConfig	numImage;
36 aperonnet 43
	/**
44
	 * Config de colonne
45
	 */
27 aperonnet 46
	private ColumnConfig	urlImage;
36 aperonnet 47
	/**
48
	 * Config de colonne
49
	 */
27 aperonnet 50
	private ColumnConfig	lieImage;
36 aperonnet 51
	/**
52
	 * Config de colonne
53
	 */
27 aperonnet 54
	private ColumnConfig	datImage;
36 aperonnet 55
	/**
56
	 * Config de colonne
57
	 */
27 aperonnet 58
	private ColumnConfig	appImage;
36 aperonnet 59
	/**
47 aperonnet 60
	 * Config de colonne
61
	 */
62
	private ColumnConfig	noteImage;
63
	/**
36 aperonnet 64
	 * Modele de colonnes
65
	 */
27 aperonnet 66
	private ColumnModel		modeleColonnes;
67
 
36 aperonnet 68
	/**
69
	 * Booleen d'instanciation
70
	 */
27 aperonnet 71
	private boolean			estInstancie	= false;
72
 
36 aperonnet 73
	/**
74
	 * Store qui contient les données à afficher
75
	 */
27 aperonnet 76
	private Store			st				= null;
36 aperonnet 77
	/**
78
	 * Configuration des colonnes du store
79
	 */
27 aperonnet 80
	private ColumnConfig	cl				= null;
31 aperonnet 81
 
36 aperonnet 82
	/**
83
	 * Barre de pagination
84
	 */
31 aperonnet 85
	private pageToolBarVue bt = null ;
27 aperonnet 86
 
36 aperonnet 87
	/**
88
	 * Constructeur sans arguments (privé car ne doit pas être utilisé)
89
	 */
90
	private ListeImageVue()
91
	{
92
		super() ;
93
	}
94
 
95
	/**
96
	 * Constructeur avec argument
97
	 * @param im le médiateur à associer
98
	 */
4 aperonnet 99
	public ListeImageVue(ImageMediateur im) {
100
 
36 aperonnet 101
		new ListeImageVue() ;
4 aperonnet 102
 
27 aperonnet 103
		this.setId("listeImageGrid");
36 aperonnet 104
		// on associe le médiateur
27 aperonnet 105
		this.iMediateur = im;
31 aperonnet 106
 
36 aperonnet 107
		// on place la barre de pagination
31 aperonnet 108
		bt = new pageToolBarVue(im);
109
		this.setBottomToolbar(bt) ;
27 aperonnet 110
 
36 aperonnet 111
		// on construit le modèle de colonnes
47 aperonnet 112
		numImage = new ColumnConfig("numéro", "num_image", 30, true, new Renderer() {
113
 
114
			public String render(Object value, CellMetadata cellMetadata,
115
					Record record, int rowIndex, int colNum, Store store) {
116
 
117
				String ImgNum = record.getAsString("num_image");
118
				return "<div class=\"centered-list\">"+ ImgNum  +"</div>";
119
			}
120
 
121
		}) ;
122
 
123
		datImage = new ColumnConfig("date", "dat_image", 120, true, new Renderer() {
124
 
125
			public String render(Object value, CellMetadata cellMetadata,
126
					Record record, int rowIndex, int colNum, Store store) {
127
 
128
				String ImgDat = record.getAsString("dat_image");
129
				if(ImgDat == null)
130
				{
131
					ImgDat = " " ;
132
				}
133
				return "<div class=\"centered-list\">"+ ImgDat +"</div>";
134
			}
135
 
136
		}) ;
137
		lieImage = new ColumnConfig("lieu", "lie_image", 120, true, new Renderer() {
138
 
139
			public String render(Object value, CellMetadata cellMetadata,
140
					Record record, int rowIndex, int colNum, Store store) {
141
 
142
				String ImgLie = record.getAsString("lie_image");
143
				if(ImgLie == null)
144
				{
145
					ImgLie = " " ;
146
				}
147
				return "<div class=\"centered-list\">"+ ImgLie  +"</div>";
148
			}
149
 
150
		}) ;
151
		appImage = new ColumnConfig("appareil", "app_image", 120, true, new Renderer() {
152
 
153
			public String render(Object value, CellMetadata cellMetadata,
154
					Record record, int rowIndex, int colNum, Store store) {
155
 
156
				String ImgApp = record.getAsString("app_image");
157
				if(ImgApp == null)
158
				{
159
					ImgApp = " " ;
160
				}
161
				return "<div class=\"centered-list\">"+ ImgApp  +"</div>";
162
			}
163
 
164
		}) ;
36 aperonnet 165
		// la colonne url possède une méthode de rendu spéciale
31 aperonnet 166
		urlImage = new ColumnConfig("Image", "url_image_S", 30, true,
27 aperonnet 167
				new Renderer() {
168
 
169
					public String render(Object value,
170
							CellMetadata cellMetadata, Record record,
171
							int rowIndex, int colNum, Store store) {
36 aperonnet 172
						// on affiche une div contenant l'image pointée par l'url
27 aperonnet 173
						String ImgUrl = record.getAsString("url_image_S");
174
						String ImgNum = record.getAsString("num_image");
47 aperonnet 175
						return "<div class=\"img-list centered-list\"> <img src=\"" + ImgUrl
27 aperonnet 176
								+ "\" title='" + ImgNum + "'> </div>";
177
					}
178
 
179
				});
36 aperonnet 180
 
47 aperonnet 181
		noteImage = new ColumnConfig("note", "note_image", 80, true,
182
				new Renderer()
183
			{
184
				public String render(Object value, CellMetadata cellMetadata,
185
						Record record, int rowIndex, int colNum, Store store) {
186
 
187
					String htmlImage = "" ;
188
 
189
					int noteImg = record.getAsInteger("note_image") ;
190
					if(noteImg >= 0)
191
					{
192
						htmlImage += "<div class=\"img-note centered-list\">" ;
193
						for(int i = 0 ; i <= noteImg ; i++)
194
						{
48 aperonnet 195
							htmlImage += "<img src=\"etoile_petite.png\">" ;
47 aperonnet 196
						}
197
						htmlImage += "</div>" ;
198
					}
199
 
200
					return htmlImage ;
201
 
202
				}
203
 
204
			}) ;
205
 
36 aperonnet 206
		// on associe le modèle de colonnes
47 aperonnet 207
		ColumnConfig[] cm = {numImage, urlImage, datImage, lieImage, appImage, noteImage};
4 aperonnet 208
		modeleColonnes = new ColumnModel(cm);
209
		this.setColumnModel(modeleColonnes);
6 aperonnet 210
		this.setAutoScroll(true);
7 aperonnet 211
		this.setAutoWidth(true);
31 aperonnet 212
		this.setEnableColumnResize(true);
27 aperonnet 213
 
22 aperonnet 214
		// creation du store
215
		FieldDef defNumImage = new IntegerFieldDef("num_image");
12 aperonnet 216
		FieldDef defDatImage = new StringFieldDef("dat_image");
217
		FieldDef defLieImage = new StringFieldDef("lie_image");
218
		FieldDef defAppImage = new StringFieldDef("app_image");
19 aperonnet 219
		FieldDef defUrlImageS = new StringFieldDef("url_image_S");
22 aperonnet 220
		FieldDef defUrlImageM = new StringFieldDef("url_image_M");
221
		FieldDef defUrlImage = new StringFieldDef("url_image");
47 aperonnet 222
		FieldDef defNoteImage = new StringFieldDef("note_image");
27 aperonnet 223
		FieldDef[] defTab = { defNumImage, defDatImage, defLieImage,
47 aperonnet 224
				defAppImage, defUrlImageS, defUrlImageM, defUrlImage, defNoteImage };
27 aperonnet 225
		RecordDef rd = new RecordDef(defTab);
226
		st = new Store(rd);
36 aperonnet 227
		// on associe le store
4 aperonnet 228
		this.setStore(st);
27 aperonnet 229
		this.getView().setAutoFill(true);
36 aperonnet 230
 
231
		// on crée un masque de chargement qui s'affichera lors des mises à jour
27 aperonnet 232
		this.setLoadMask("chargement");
233
 
36 aperonnet 234
		// on ajoute les listeners
27 aperonnet 235
		ajouterListeners();
236
 
4 aperonnet 237
	}
27 aperonnet 238
 
36 aperonnet 239
	/**
240
	 * Ajoute les listeners pour la gestion des évènements
241
	 */
242
	private void ajouterListeners() {
5 aperonnet 243
		this.addListener(new ContainerListenerAdapter() {
4 aperonnet 244
 
47 aperonnet 245
 
5 aperonnet 246
			public void onHide(Component component) {
27 aperonnet 247
 
5 aperonnet 248
			}
249
 
36 aperonnet 250
			// lors du premier rendu on demande les données qui sont déjà contenues dans la galerie qui est le premier élément affiché
47 aperonnet 251
 
22 aperonnet 252
			public void onRender(Component component) {
5 aperonnet 253
 
27 aperonnet 254
				if (!isEstInstancie()) {
255
					setEstInstancie(true);
256
					getIMediateur().synchroniserSelection("galerie");
22 aperonnet 257
				}
5 aperonnet 258
			}
259
 
47 aperonnet 260
 
5 aperonnet 261
			public void onShow(Component component) {
27 aperonnet 262
 
5 aperonnet 263
			}
22 aperonnet 264
 
5 aperonnet 265
		});
27 aperonnet 266
 
19 aperonnet 267
		this.addGridRowListener(new GridRowListener() {
36 aperonnet 268
 
269
			// gestion du clic sur une ligne
27 aperonnet 270
			public void onRowClick(GridPanel grid, int rowIndex, EventObject e) {
19 aperonnet 271
 
36 aperonnet 272
				// on notifie le médiateur et on lui passe le nuémro de ligne
27 aperonnet 273
				getIMediateur().clicListeImage(rowIndex);
19 aperonnet 274
			}
36 aperonnet 275
 
276
			// gestion du clic droit
19 aperonnet 277
			public void onRowContextMenu(GridPanel grid, int rowIndex,
278
					EventObject e) {
36 aperonnet 279
				// on stoppe l'évenement pour empecher le navigateur d'afficher son propre menu
28 aperonnet 280
				e.stopEvent() ;
36 aperonnet 281
				// on notifie le médiateur en lui passant l'évenement
27 aperonnet 282
				getIMediateur().montrerContextMenu(e);
19 aperonnet 283
			}
284
 
36 aperonnet 285
			// gestion du double clic
19 aperonnet 286
			public void onRowDblClick(GridPanel grid, int rowIndex,
287
					EventObject e) {
36 aperonnet 288
				// on notifie le médiateur en lui passant le numéro de ligne
27 aperonnet 289
				getIMediateur().doubleClicListeImage(rowIndex);
19 aperonnet 290
			}
22 aperonnet 291
		});
27 aperonnet 292
 
22 aperonnet 293
		this.getSelectionModel().addListener(new RowSelectionListenerAdapter() {
19 aperonnet 294
 
36 aperonnet 295
			// gestion de la sélection
47 aperonnet 296
 
22 aperonnet 297
			public void onSelectionChange(RowSelectionModel sm) {
27 aperonnet 298
 
36 aperonnet 299
				// si on a rien de sélectionné
27 aperonnet 300
				if (sm.getCount() <= 0) {
36 aperonnet 301
					// on notifie le médiateur (qui désactive notamment l'accès à certaines infos)
27 aperonnet 302
					getIMediateur().aucuneSelection();
303
				} else {
36 aperonnet 304
					// sinon on notifie le médiateur
27 aperonnet 305
					getIMediateur().selection();
36 aperonnet 306
					// et on lui demande de synchroniser la selection avec les autres vues
22 aperonnet 307
					getIMediateur().synchroniserSelection("liste");
308
				}
309
			}
19 aperonnet 310
		});
5 aperonnet 311
	}
27 aperonnet 312
 
36 aperonnet 313
	/**
314
	 * Méthode héritée de l'interface VueListable
315
	 * Sélectionne les images dans la galerie suivant les identifiants donnés en paramètres
316
	 */
27 aperonnet 317
	public String[] getIdSelectionnees() {
318
		Record[] selection = this.getSelectionModel().getSelections();
319
		int taille = selection.length;
320
		String id_selection[] = new String[taille];
5 aperonnet 321
 
27 aperonnet 322
		for (int i = 0; i < selection.length; i++) {
323
 
324
			id_selection[i] = selection[i].getAsString("num_image");
12 aperonnet 325
		}
27 aperonnet 326
 
327
		return id_selection;
4 aperonnet 328
	}
5 aperonnet 329
 
36 aperonnet 330
	/**
331
	 * Accesseur pour la config de colonnes
332
	 * @return la config de colonnes
333
	 */
334
	public ColumnConfig getCl() {
335
		return cl;
336
	}
337
 
338
	/**
339
	 * Accesseur pour le médiateur
340
	 * @return le médiateur associé
341
	 */
5 aperonnet 342
	public ImageMediateur getIMediateur() {
343
		return iMediateur;
344
	}
345
 
36 aperonnet 346
	/**
347
	 * Accesseur pour le modèle de colonnes
348
	 * @return le modèle de colonnes
349
	 */
27 aperonnet 350
	public ColumnModel getModeleColonnes() {
351
		return modeleColonnes;
352
	}
5 aperonnet 353
 
36 aperonnet 354
	/**
355
	 * Accesseur pour le store
356
	 * @return le store contenant les données
357
	 */
27 aperonnet 358
	public Store getSt() {
359
		return st;
360
	}
36 aperonnet 361
 
27 aperonnet 362
	/**
36 aperonnet 363
	 * Accesseur pour le booleen d'instanciation
364
	 * @return le booleen d'instanciation
27 aperonnet 365
	 */
366
	public boolean isEstInstancie() {
367
		return estInstancie;
5 aperonnet 368
	}
369
 
36 aperonnet 370
	/**
371
	 * Méthode héritée de l'interface rafraichissable
372
	 * @param nouvelleDonnees les nouvelles données
373
	 * @param repandreRafraichissement le booleen de notification du rafraichissement
374
	 */
27 aperonnet 375
	public void rafraichir(Object nouvelleDonnees,
376
			boolean repandreRafraichissement) {
5 aperonnet 377
 
36 aperonnet 378
		// si on reçoit un store
27 aperonnet 379
		if (nouvelleDonnees instanceof Store) {
5 aperonnet 380
 
36 aperonnet 381
			// on affecte celui-ci comme gestionnaire de données
27 aperonnet 382
			st = (Store) nouvelleDonnees;
383
			st.load();
36 aperonnet 384
			// et on reconfigure et rafraichit la vue
27 aperonnet 385
			this.reconfigure(st, this.getColumnModel());
31 aperonnet 386
 
27 aperonnet 387
		}
5 aperonnet 388
 
36 aperonnet 389
		// si on doit répandre l'évenement
27 aperonnet 390
		if (repandreRafraichissement) {
36 aperonnet 391
			// on notifie le médiateur avec une copie des données
27 aperonnet 392
			getIMediateur().synchroniserDonneesZoomListeGalerie(
393
					nouvelleDonnees, this);
394
		}
5 aperonnet 395
	}
22 aperonnet 396
 
36 aperonnet 397
	/**
398
	 * Sélectionne des enregistrements donné
399
	 * @param sel un tableau d'enregistrement à selectionner
400
	 */
27 aperonnet 401
	public void selectionnerEnregistrements(Record[] sel) {
22 aperonnet 402
 
27 aperonnet 403
		if (isEstInstancie()) {
404
			getSelectionModel().clearSelections();
405
			getSelectionModel().selectRecords(sel);
406
		}
22 aperonnet 407
	}
31 aperonnet 408
 
36 aperonnet 409
	/**
410
	 * Accesseur pour la toolbar de pagination
411
	 * @return la toolbar de pagination
412
	 */
31 aperonnet 413
	public pageToolBarVue getToolBarVue()
414
	{
415
		return bt ;
416
	}
22 aperonnet 417
 
418
	/**
36 aperonnet 419
	 * Setteur pour le booleen d'instanciation
420
	 * @param estInstancie la nouvelle valeur du booleen
22 aperonnet 421
	 */
422
	public void setEstInstancie(boolean estInstancie) {
423
		this.estInstancie = estInstancie;
424
	}
425
 
47 aperonnet 426
	public void mettreAjourInfos(String commentaires, String date, String note) {
427
 
428
		for (int i = 0; i < getSelectionModel().getCount(); i++) {
429
 
430
			getSelectionModel().getSelections()[i].set("note_image", note) ;
431
			//this.getView().refresh() ;
432
 
433
		}
434
 
435
	}
436
 
4 aperonnet 437
}