Subversion Repositories eFlore/Applications.cel

Rev

Rev 59 | 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;
60 jpm 4
import org.tela_botanica.client.interfaces.ListePaginable;
2 aperonnet 5
import org.tela_botanica.client.interfaces.Rafraichissable;
6
import org.tela_botanica.client.interfaces.VueListable;
7
 
8
import com.google.gwt.user.client.Element;
9
import com.gwtext.client.core.EventObject;
10
import com.gwtext.client.core.XTemplate;
11
import com.gwtext.client.data.FieldDef;
12
import com.gwtext.client.data.IntegerFieldDef;
13
import com.gwtext.client.data.Record;
14
import com.gwtext.client.data.RecordDef;
15
import com.gwtext.client.data.Store;
16
import com.gwtext.client.data.StringFieldDef;
5 aperonnet 17
import com.gwtext.client.dd.DragData;
18
import com.gwtext.client.dd.DragSource;
19
import com.gwtext.client.dd.DropTarget;
20
import com.gwtext.client.dd.DropTargetConfig;
2 aperonnet 21
import com.gwtext.client.util.Format;
22
import com.gwtext.client.widgets.Component;
23
import com.gwtext.client.widgets.DataView;
24
import com.gwtext.client.widgets.Panel;
25
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
26
import com.gwtext.client.widgets.event.DataViewListenerAdapter;
5 aperonnet 27
import com.gwtext.client.widgets.grid.GridDragData;
2 aperonnet 28
 
29
/**
5 aperonnet 30
 * Galerie d'images miniatures Avec barre de pagination
31
 *
2 aperonnet 32
 * @author aurelien
33
 */
5 aperonnet 34
public class GalerieImageVue extends Panel implements Rafraichissable,
60 jpm 35
		VueListable, ListePaginable {
2 aperonnet 36
 
37
	/**
38
	 * instance du médiateur
5 aperonnet 39
	 */
40
	private ImageMediateur iMediateur = null;
2 aperonnet 41
	/**
5 aperonnet 42
	 * Dataview, littéralement "vue de données" qui permet de définir la manière
43
	 * d'afficher les données
44
	 */
45
	private DataView dView = null;
2 aperonnet 46
	/**
5 aperonnet 47
	 * Dataview, littéralement "vue de données" qui permet de définir la manière
48
	 * d'afficher les données
49
	 */
50
	private Store st = null;
2 aperonnet 51
	/**
5 aperonnet 52
	 * Barre de pagination gérant l'affichage d'un nombre donné d'élements par
53
	 * page et la navigation entre eux
54
	 */
59 david 55
	private BarrePaginationVue pt = null;
2 aperonnet 56
	/**
57
	 * Booleen indiquant si la galerie est instanciée ou pas
5 aperonnet 58
	 */
59
	private boolean estInstancie = false;
2 aperonnet 60
 
61
	/**
62
	 * Constructeur sans argument, privé car ne doit pas être utilisé
63
	 */
64
	@SuppressWarnings("unused")
5 aperonnet 65
	private GalerieImageVue() {
66
		super();
2 aperonnet 67
	}
5 aperonnet 68
 
2 aperonnet 69
	/**
70
	 * Constructeur avec argument
5 aperonnet 71
	 *
72
	 * @param im
73
	 *            le médiateur avec lequel la vue va communiquer
2 aperonnet 74
	 */
75
	public GalerieImageVue(ImageMediateur im) {
76
		super("Galerie");
77
		iMediateur = im;
5 aperonnet 78
 
2 aperonnet 79
		// on ajoute des listeners au composant tout entier
80
		this.addListener(new ContainerListenerAdapter() {
81
 
5 aperonnet 82
			// pour gagner du temps on n'instancie la vue en elle même que lors
83
			// du premier affichage (lazy rendering)
84
 
2 aperonnet 85
			public void onShow(Component component) {
86
 
87
				if (!estInstancie) {
88
					initialiser();
89
				}
90
			}
91
 
92
		});
5 aperonnet 93
 
2 aperonnet 94
		// et on ajoute la tool bar
60 jpm 95
		pt = new BarrePaginationVue(this);
59 david 96
		pt.setLabelElement("Images");
97
		pt.setTaillePageParDefaut(50);
5 aperonnet 98
		this.setBottomToolbar(pt);
2 aperonnet 99
 
100
	}
101
 
102
	/**
5 aperonnet 103
	 * Ajoute tous les listeners nécessaires à l'intercation utilisateur avec la
104
	 * vue de données
2 aperonnet 105
	 */
106
	public void ajouterListenersDataView() {
107
 
108
		// ajout de listeners pour la gestion de la selection
109
		// dans la galerie
110
		dView.addListener(new DataViewListenerAdapter() {
5 aperonnet 111
 
2 aperonnet 112
			// gestion du clic sur une image
5 aperonnet 113
 
2 aperonnet 114
			public void onClick(DataView source, int index, Element node,
115
					EventObject e) {
5 aperonnet 116
 
2 aperonnet 117
				// on en notifie le médiateur
118
				getIMediateur().clicGalerieImage(index, node, e);
119
 
120
			}
121
 
122
			// gestion du clic droit
5 aperonnet 123
 
2 aperonnet 124
			public void onContextMenu(DataView source, int index, Element node,
125
					EventObject e) {
126
 
5 aperonnet 127
				// on stoppe l'évenement
2 aperonnet 128
				e.stopEvent();
129
				// et on notifie le médiateur
130
				getIMediateur().montrerContextMenu(e);
131
 
132
			}
133
 
134
			// gestion du double clic
5 aperonnet 135
 
2 aperonnet 136
			public void onDblClick(DataView source, int index, Element node,
137
					EventObject e) {
138
 
139
				// on notife le mediateur
140
				getIMediateur().clicGalerieImage(index, node, e);
5 aperonnet 141
 
2 aperonnet 142
			}
143
 
144
			// gestion des actions en fonction de la selection
5 aperonnet 145
 
2 aperonnet 146
			public void onSelectionChange(DataView view, Element[] selections) {
147
 
148
				// s'il n'y a aucun élement sélectionné
149
				if (selections.length <= 0) {
150
					// on en notifie le médiateur
151
					getIMediateur().aucuneSelection();
152
				} else {
153
					// sinon on notifie le médiateur
154
					getIMediateur().selection();
5 aperonnet 155
					// et on lui demande de synchroniser la séléction avec les
156
					// autres vues
2 aperonnet 157
					getIMediateur().synchroniserSelection("galerie");
158
				}
159
			}
160
 
161
		});
162
	}
163
 
164
	/**
165
	 * Accesseur pour la dataview
5 aperonnet 166
	 *
167
	 * @return la dataview
2 aperonnet 168
	 */
169
	public DataView getDView() {
170
		return dView;
171
	}
172
 
173
	/**
174
	 * Renvoie les ids des images sélectionnées
5 aperonnet 175
	 *
176
	 * @return un tableau de String contenant les identifiants des images
177
	 *         sélectionnées
2 aperonnet 178
	 */
179
	public String[] getIdSelectionnees() {
180
		Record[] selection = getDView().getSelectedRecords();
181
		int taille = selection.length;
182
		String id_selection[] = new String[taille];
183
 
184
		for (int i = 0; i < selection.length; i++) {
185
 
186
			id_selection[i] = selection[i].getAsString("num_image");
187
		}
188
 
189
		return id_selection;
190
	}
191
 
192
	/**
193
	 * Accesseur pour le médiateur
5 aperonnet 194
	 *
2 aperonnet 195
	 * @return le médiateur associé à la vue
196
	 */
197
	public ImageMediateur getIMediateur() {
198
		return iMediateur;
199
	}
200
 
201
	/**
202
	 * Accesseur pour le store
5 aperonnet 203
	 *
2 aperonnet 204
	 * @return le store associé à la vue
205
	 */
206
	public Store getSt() {
207
		return st;
208
	}
5 aperonnet 209
 
2 aperonnet 210
	/**
5 aperonnet 211
	 * Accesseur pour la toolbar
212
	 *
2 aperonnet 213
	 * @return la toolbar associée à la vue
214
	 */
59 david 215
	public BarrePaginationVue getToolBarVue() {
5 aperonnet 216
		return pt;
2 aperonnet 217
	}
218
 
219
	/**
5 aperonnet 220
	 * Fonction d'initialisation du contenu (appelée lors du premier affichage
221
	 * de la liste)
2 aperonnet 222
	 */
223
	public void initialiser() {
5 aperonnet 224
 
2 aperonnet 225
		// Preparation de la dataview et du template
226
		// le template va créer une div contenant une image
227
		// pour chacune des photos
228
		final XTemplate template = new XTemplate(
229
				new String[] {
230
						"<tpl for='.'>",
231
						"<div class='thumb-wrap' id='{num_image}'>",
232
						"<div class='thumb'><img src='{url_image_M}' title='{num_image}'></div>",
233
						"<span>{nom}</span></div>", "</tpl>",
234
						"<div class='x-clear'></div>" });
5 aperonnet 235
		// pour des raisons de performances on compile le template en une
236
		// fonction
2 aperonnet 237
		template.compile();
238
 
239
		// la dataview affichera les images en accord avec le template
240
		// cree precedemment
241
		dView = new DataView("div.thumb-wrap") {
242
 
243
			public void prepareData(Data data) {
244
				data.setProperty("shortName", Format.ellipsis(data
5 aperonnet 245
						.getProperty("num_image"), 15));
2 aperonnet 246
			}
5 aperonnet 247
 
2 aperonnet 248
		};
249
		dView.setTpl(template);
250
 
251
		// parametre d'affichage de la dataview
252
		this.setAutoScroll(true);
253
		dView.setAutoHeight(true);
254
		dView.setMultiSelect(true);
255
		dView.setOverCls("x-view-over");
256
		dView.setEmptyText("Aucune image à afficher");
257
 
258
		// creation du store
259
		FieldDef defNumImage = new IntegerFieldDef("num_image");
260
		FieldDef defDatImage = new StringFieldDef("dat_image");
261
		FieldDef defLieImage = new StringFieldDef("lie_image");
262
		FieldDef defAppImage = new StringFieldDef("app_image");
263
		FieldDef defUrlImageS = new StringFieldDef("url_image_S");
264
		FieldDef defUrlImageM = new StringFieldDef("url_image_M");
265
		FieldDef defUrlImage = new StringFieldDef("url_image");
266
		FieldDef[] defTab = { defNumImage, defDatImage, defLieImage,
267
				defAppImage, defUrlImageS, defUrlImageM, defUrlImage };
268
		RecordDef rd = new RecordDef(defTab);
269
		st = new Store(rd);
270
		dView.setStore(st);
271
 
272
		this.getDView().setLoadingText("chargement");
273
 
274
		// ajouts de la gestion des evenements pour la dataview
275
		ajouterListenersDataView();
5 aperonnet 276
		configDragAndDrop() ;
2 aperonnet 277
 
278
		this.add(dView);
5 aperonnet 279
 
2 aperonnet 280
		// enfin on envoie une demande de données au médiateur
281
		getIMediateur().obtenirPhotoGalerie(this);
282
		// et on déclare le composant comme instancié
5 aperonnet 283
		estInstancie = true;
2 aperonnet 284
	}
5 aperonnet 285
 
286
	public void configDragAndDrop()
287
	{
288
		// on fabrique la nouvelle configuration
289
		// les éléments sur lesquels on fait du drag 'n drop doivent tous avoir le même ddGroup
290
		DropTargetConfig dtc = new DropTargetConfig();
291
		dtc.setdDdGroup("DragGroupName");
2 aperonnet 292
 
5 aperonnet 293
		//La drop target permet de gérer l'évenement onDrop sur l'élement courant
294
		@SuppressWarnings("unused")
295
		DropTarget tg = new DropTarget(this, dtc)
296
		{
297
			public boolean notifyDrop(DragSource source, EventObject e, DragData data){
298
 
299
				// si les données proviennent d'une grille
300
				if(data instanceof GridDragData)
301
		    	{
302
					// on appelle le médiateur
303
		    		  	return iMediateur.lierObsDD(source, e, data,getId()) ;
304
		    	}
305
				return false ;
306
			}
307
 
308
			public String notifyOver(DragSource source, EventObject e, DragData data){
309
			    return "x-dd-drop-ok";
310
			}
311
		};
312
 
313
	}
314
 
2 aperonnet 315
	/**
316
	 * Méthode héritée de l'interface rafraichissable
317
	 */
318
	public void rafraichir(Object nouvelleDonnees,
319
			boolean repandreRafraichissement) {
320
 
321
		// si l'objet reçu est un store
322
		if (nouvelleDonnees instanceof Store) {
5 aperonnet 323
 
2 aperonnet 324
			st = (Store) nouvelleDonnees;
325
			// on le charge
326
			st.load();
327
			// on l'affecte à la vue
328
			dView.setStore(st);
329
			// et on rafrachit la vue
330
			dView.refresh();
5 aperonnet 331
 
2 aperonnet 332
		}
333
 
334
		// si le composant doit répandre le rafraichissement
335
		if (repandreRafraichissement) {
5 aperonnet 336
			// il en notifie le médiateur en lui donnant une copie des données
337
			// et en notifiant qu'il en est l'expéditeur
2 aperonnet 338
			getIMediateur().synchroniserDonneesZoomListeGalerie(
339
					nouvelleDonnees, this);
340
		}
5 aperonnet 341
 
2 aperonnet 342
		// si c'est la première mise à jour que l'on reçoit
5 aperonnet 343
		if (!estInstancie) {
2 aperonnet 344
			// alors le composant est considéré comme instancié
5 aperonnet 345
			estInstancie = true;
2 aperonnet 346
		}
347
	}
348
 
349
	/**
5 aperonnet 350
	 * Méthode héritée de l'interface VueListable Sélectionne les images dans la
351
	 * galerie suivant les identifiants donnés en paramètres
352
	 *
353
	 * @param ids
354
	 *            les identifiants des images à sélectionner
2 aperonnet 355
	 */
356
	public void selectionnerImages(int[] ids) {
357
 
358
		getDView().select(ids);
359
 
360
	}
5 aperonnet 361
 
60 jpm 362
	public void changerNumeroPage(int pageCourante) {
363
 
364
		iMediateur.changerNumeroPage(pageCourante) ;
365
 
366
	}
367
 
368
	public void changerTaillePage(int nouvelleTaillePage) {
369
 
370
		iMediateur.changerTaillePage(nouvelleTaillePage) ;
371
	}
372
 
2 aperonnet 373
}