Subversion Repositories eFlore/Archives.cel-v2

Rev

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