Subversion Repositories eFlore/Applications.cel

Rev

Rev 5 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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