Subversion Repositories eFlore/Archives.cel-v2

Rev

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