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