Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 31 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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