Subversion Repositories eFlore/Applications.cel

Rev

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