Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 31 | Rev 47 | 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
 
12 aperonnet 3
import java.util.Iterator;
4
 
4 aperonnet 5
import org.tela_botanica.client.image.ImageMediateur;
6
import org.tela_botanica.client.interfaces.Rafraichissable;
19 aperonnet 7
import org.tela_botanica.client.interfaces.VueListable;
12 aperonnet 8
import org.tela_botanica.client.modeles.ImageCarnet;
19 aperonnet 9
import org.tela_botanica.client.modeles.ListeImageCarnet;
4 aperonnet 10
 
22 aperonnet 11
import com.google.gwt.core.client.JavaScriptObject;
6 aperonnet 12
import com.google.gwt.user.client.Window;
19 aperonnet 13
import com.gwtext.client.core.EventObject;
31 aperonnet 14
import com.gwtext.client.core.Ext;
15
import com.gwtext.client.core.ExtElement;
16
import com.gwtext.client.core.JsObject;
5 aperonnet 17
import com.gwtext.client.data.ArrayReader;
4 aperonnet 18
import com.gwtext.client.data.FieldDef;
12 aperonnet 19
import com.gwtext.client.data.IntegerFieldDef;
5 aperonnet 20
import com.gwtext.client.data.MemoryProxy;
4 aperonnet 21
import com.gwtext.client.data.Record;
22
import com.gwtext.client.data.RecordDef;
23
import com.gwtext.client.data.Store;
24
import com.gwtext.client.data.StoreMgr;
25
import com.gwtext.client.data.StringFieldDef;
31 aperonnet 26
import com.gwtext.client.util.JavaScriptObjectHelper;
22 aperonnet 27
import com.gwtext.client.widgets.BoxComponent;
5 aperonnet 28
import com.gwtext.client.widgets.Component;
22 aperonnet 29
import com.gwtext.client.widgets.Container;
30
import com.gwtext.client.widgets.Panel;
31
import com.gwtext.client.widgets.event.ComponentListenerAdapter;
6 aperonnet 32
import com.gwtext.client.widgets.event.ContainerListener;
5 aperonnet 33
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
34
import com.gwtext.client.widgets.event.PanelListener;
35
import com.gwtext.client.widgets.event.PanelListenerAdapter;
4 aperonnet 36
import com.gwtext.client.widgets.grid.CellMetadata;
37
import com.gwtext.client.widgets.grid.ColumnConfig;
38
import com.gwtext.client.widgets.grid.ColumnModel;
39
import com.gwtext.client.widgets.grid.GridPanel;
6 aperonnet 40
import com.gwtext.client.widgets.grid.GridView;
4 aperonnet 41
import com.gwtext.client.widgets.grid.Renderer;
22 aperonnet 42
import com.gwtext.client.widgets.grid.RowSelectionModel;
19 aperonnet 43
import com.gwtext.client.widgets.grid.event.GridCellListener;
44
import com.gwtext.client.widgets.grid.event.GridListener;
45
import com.gwtext.client.widgets.grid.event.GridRowListener;
22 aperonnet 46
import com.gwtext.client.widgets.grid.event.RowSelectionListener;
47
import com.gwtext.client.widgets.grid.event.RowSelectionListenerAdapter;
12 aperonnet 48
import com.gwtext.client.widgets.layout.AnchorLayout;
49
import com.gwtext.client.widgets.layout.FitLayout;
4 aperonnet 50
import com.gwtextux.client.data.BufferedStore;
51
 
12 aperonnet 52
/**
36 aperonnet 53
 * Liste d'image composée de miniatures et d'information sur l'image, implémente
54
 * l'interface rafraichissable et l'interface vueListable
27 aperonnet 55
 *
12 aperonnet 56
 * @author aurelien
57
 */
27 aperonnet 58
public class ListeImageVue extends GridPanel implements Rafraichissable,
59
		VueListable {
60
 
36 aperonnet 61
	/**
62
	 * Le médiateur associé à la vue
63
	 */
27 aperonnet 64
	private ImageMediateur	iMediateur		= null;
36 aperonnet 65
 
66
	/**
67
	 * Config de colonne
68
	 */
27 aperonnet 69
	private ColumnConfig	numImage;
36 aperonnet 70
	/**
71
	 * Config de colonne
72
	 */
27 aperonnet 73
	private ColumnConfig	urlImage;
36 aperonnet 74
	/**
75
	 * Config de colonne
76
	 */
27 aperonnet 77
	private ColumnConfig	lieImage;
36 aperonnet 78
	/**
79
	 * Config de colonne
80
	 */
27 aperonnet 81
	private ColumnConfig	datImage;
36 aperonnet 82
	/**
83
	 * Config de colonne
84
	 */
27 aperonnet 85
	private ColumnConfig	appImage;
36 aperonnet 86
	/**
87
	 * Modele de colonnes
88
	 */
27 aperonnet 89
	private ColumnModel		modeleColonnes;
90
 
36 aperonnet 91
	/**
92
	 * Booleen d'instanciation
93
	 */
27 aperonnet 94
	private boolean			estInstancie	= false;
95
 
36 aperonnet 96
	/**
97
	 * Store qui contient les données à afficher
98
	 */
27 aperonnet 99
	private Store			st				= null;
36 aperonnet 100
	/**
101
	 * Configuration des colonnes du store
102
	 */
27 aperonnet 103
	private ColumnConfig	cl				= null;
31 aperonnet 104
 
36 aperonnet 105
	/**
106
	 * Barre de pagination
107
	 */
31 aperonnet 108
	private pageToolBarVue bt = null ;
27 aperonnet 109
 
36 aperonnet 110
	/**
111
	 * Constructeur sans arguments (privé car ne doit pas être utilisé)
112
	 */
113
	private ListeImageVue()
114
	{
115
		super() ;
116
	}
117
 
118
	/**
119
	 * Constructeur avec argument
120
	 * @param im le médiateur à associer
121
	 */
4 aperonnet 122
	public ListeImageVue(ImageMediateur im) {
123
 
36 aperonnet 124
		new ListeImageVue() ;
4 aperonnet 125
 
27 aperonnet 126
		this.setId("listeImageGrid");
36 aperonnet 127
		// on associe le médiateur
27 aperonnet 128
		this.iMediateur = im;
31 aperonnet 129
 
36 aperonnet 130
		// on place la barre de pagination
31 aperonnet 131
		bt = new pageToolBarVue(im);
132
		this.setBottomToolbar(bt) ;
27 aperonnet 133
 
36 aperonnet 134
		// on construit le modèle de colonnes
31 aperonnet 135
		numImage = new ColumnConfig("numéro", "num_image", 30, true);
27 aperonnet 136
		datImage = new ColumnConfig("date", "dat_image", 120, true);
137
		lieImage = new ColumnConfig("lieu", "lie_image", 120, true);
138
		appImage = new ColumnConfig("appareil", "app_image", 200, true);
36 aperonnet 139
		// la colonne url possède une méthode de rendu spéciale
31 aperonnet 140
		urlImage = new ColumnConfig("Image", "url_image_S", 30, true,
27 aperonnet 141
				new Renderer() {
142
 
143
					public String render(Object value,
144
							CellMetadata cellMetadata, Record record,
145
							int rowIndex, int colNum, Store store) {
36 aperonnet 146
						// on affiche une div contenant l'image pointée par l'url
27 aperonnet 147
						String ImgUrl = record.getAsString("url_image_S");
148
						String ImgNum = record.getAsString("num_image");
149
						return "<div class=\"img-list\"> <img src=\"" + ImgUrl
150
								+ "\" title='" + ImgNum + "'> </div>";
151
					}
152
 
153
				});
36 aperonnet 154
 
155
		// on associe le modèle de colonnes
31 aperonnet 156
		ColumnConfig[] cm = {numImage, urlImage, datImage, lieImage, appImage};
4 aperonnet 157
		modeleColonnes = new ColumnModel(cm);
158
		this.setColumnModel(modeleColonnes);
6 aperonnet 159
		this.setAutoScroll(true);
7 aperonnet 160
		this.setAutoWidth(true);
31 aperonnet 161
		this.setEnableColumnResize(true);
27 aperonnet 162
 
22 aperonnet 163
		// creation du store
164
		FieldDef defNumImage = new IntegerFieldDef("num_image");
12 aperonnet 165
		FieldDef defDatImage = new StringFieldDef("dat_image");
166
		FieldDef defLieImage = new StringFieldDef("lie_image");
167
		FieldDef defAppImage = new StringFieldDef("app_image");
19 aperonnet 168
		FieldDef defUrlImageS = new StringFieldDef("url_image_S");
22 aperonnet 169
		FieldDef defUrlImageM = new StringFieldDef("url_image_M");
170
		FieldDef defUrlImage = new StringFieldDef("url_image");
27 aperonnet 171
		FieldDef[] defTab = { defNumImage, defDatImage, defLieImage,
172
				defAppImage, defUrlImageS, defUrlImageM, defUrlImage };
173
		RecordDef rd = new RecordDef(defTab);
174
		st = new Store(rd);
36 aperonnet 175
		// on associe le store
4 aperonnet 176
		this.setStore(st);
27 aperonnet 177
		this.getView().setAutoFill(true);
36 aperonnet 178
 
179
		// on crée un masque de chargement qui s'affichera lors des mises à jour
27 aperonnet 180
		this.setLoadMask("chargement");
181
 
36 aperonnet 182
		// on ajoute les listeners
27 aperonnet 183
		ajouterListeners();
184
 
4 aperonnet 185
	}
27 aperonnet 186
 
36 aperonnet 187
	/**
188
	 * Ajoute les listeners pour la gestion des évènements
189
	 */
190
	private void ajouterListeners() {
5 aperonnet 191
		this.addListener(new ContainerListenerAdapter() {
4 aperonnet 192
 
5 aperonnet 193
			public void onHide(Component component) {
27 aperonnet 194
 
5 aperonnet 195
			}
196
 
36 aperonnet 197
			// lors du premier rendu on demande les données qui sont déjà contenues dans la galerie qui est le premier élément affiché
22 aperonnet 198
			public void onRender(Component component) {
5 aperonnet 199
 
27 aperonnet 200
				if (!isEstInstancie()) {
201
					setEstInstancie(true);
202
					getIMediateur().synchroniserSelection("galerie");
22 aperonnet 203
				}
5 aperonnet 204
			}
205
 
206
			public void onShow(Component component) {
27 aperonnet 207
 
5 aperonnet 208
			}
22 aperonnet 209
 
5 aperonnet 210
		});
27 aperonnet 211
 
19 aperonnet 212
		this.addGridRowListener(new GridRowListener() {
36 aperonnet 213
 
214
			// gestion du clic sur une ligne
27 aperonnet 215
			public void onRowClick(GridPanel grid, int rowIndex, EventObject e) {
19 aperonnet 216
 
36 aperonnet 217
				// on notifie le médiateur et on lui passe le nuémro de ligne
27 aperonnet 218
				getIMediateur().clicListeImage(rowIndex);
19 aperonnet 219
			}
36 aperonnet 220
 
221
			// gestion du clic droit
19 aperonnet 222
			public void onRowContextMenu(GridPanel grid, int rowIndex,
223
					EventObject e) {
36 aperonnet 224
				// on stoppe l'évenement pour empecher le navigateur d'afficher son propre menu
28 aperonnet 225
				e.stopEvent() ;
36 aperonnet 226
				// on notifie le médiateur en lui passant l'évenement
27 aperonnet 227
				getIMediateur().montrerContextMenu(e);
19 aperonnet 228
			}
229
 
36 aperonnet 230
			// gestion du double clic
19 aperonnet 231
			public void onRowDblClick(GridPanel grid, int rowIndex,
232
					EventObject e) {
36 aperonnet 233
				// on notifie le médiateur en lui passant le numéro de ligne
27 aperonnet 234
				getIMediateur().doubleClicListeImage(rowIndex);
19 aperonnet 235
			}
22 aperonnet 236
		});
27 aperonnet 237
 
22 aperonnet 238
		this.getSelectionModel().addListener(new RowSelectionListenerAdapter() {
19 aperonnet 239
 
36 aperonnet 240
			// gestion de la sélection
22 aperonnet 241
			public void onSelectionChange(RowSelectionModel sm) {
27 aperonnet 242
 
36 aperonnet 243
				// si on a rien de sélectionné
27 aperonnet 244
				if (sm.getCount() <= 0) {
36 aperonnet 245
					// on notifie le médiateur (qui désactive notamment l'accès à certaines infos)
27 aperonnet 246
					getIMediateur().aucuneSelection();
247
				} else {
36 aperonnet 248
					// sinon on notifie le médiateur
27 aperonnet 249
					getIMediateur().selection();
36 aperonnet 250
					// et on lui demande de synchroniser la selection avec les autres vues
22 aperonnet 251
					getIMediateur().synchroniserSelection("liste");
252
				}
253
			}
19 aperonnet 254
		});
5 aperonnet 255
	}
27 aperonnet 256
 
36 aperonnet 257
	/**
258
	 * Méthode héritée de l'interface VueListable
259
	 * Sélectionne les images dans la galerie suivant les identifiants donnés en paramètres
260
	 */
27 aperonnet 261
	public String[] getIdSelectionnees() {
262
		Record[] selection = this.getSelectionModel().getSelections();
263
		int taille = selection.length;
264
		String id_selection[] = new String[taille];
5 aperonnet 265
 
27 aperonnet 266
		for (int i = 0; i < selection.length; i++) {
267
 
268
			id_selection[i] = selection[i].getAsString("num_image");
12 aperonnet 269
		}
27 aperonnet 270
 
271
		return id_selection;
4 aperonnet 272
	}
5 aperonnet 273
 
36 aperonnet 274
	/**
275
	 * Accesseur pour la config de colonnes
276
	 * @return la config de colonnes
277
	 */
278
	public ColumnConfig getCl() {
279
		return cl;
280
	}
281
 
282
	/**
283
	 * Accesseur pour le médiateur
284
	 * @return le médiateur associé
285
	 */
5 aperonnet 286
	public ImageMediateur getIMediateur() {
287
		return iMediateur;
288
	}
289
 
36 aperonnet 290
	/**
291
	 * Accesseur pour le modèle de colonnes
292
	 * @return le modèle de colonnes
293
	 */
27 aperonnet 294
	public ColumnModel getModeleColonnes() {
295
		return modeleColonnes;
296
	}
5 aperonnet 297
 
36 aperonnet 298
	/**
299
	 * Accesseur pour le store
300
	 * @return le store contenant les données
301
	 */
27 aperonnet 302
	public Store getSt() {
303
		return st;
304
	}
36 aperonnet 305
 
27 aperonnet 306
	/**
36 aperonnet 307
	 * Accesseur pour le booleen d'instanciation
308
	 * @return le booleen d'instanciation
27 aperonnet 309
	 */
310
	public boolean isEstInstancie() {
311
		return estInstancie;
5 aperonnet 312
	}
313
 
36 aperonnet 314
	/**
315
	 * Méthode héritée de l'interface rafraichissable
316
	 * @param nouvelleDonnees les nouvelles données
317
	 * @param repandreRafraichissement le booleen de notification du rafraichissement
318
	 */
27 aperonnet 319
	public void rafraichir(Object nouvelleDonnees,
320
			boolean repandreRafraichissement) {
5 aperonnet 321
 
36 aperonnet 322
		// si on reçoit un store
27 aperonnet 323
		if (nouvelleDonnees instanceof Store) {
5 aperonnet 324
 
36 aperonnet 325
			// on affecte celui-ci comme gestionnaire de données
27 aperonnet 326
			st = (Store) nouvelleDonnees;
327
			st.load();
36 aperonnet 328
			// et on reconfigure et rafraichit la vue
27 aperonnet 329
			this.reconfigure(st, this.getColumnModel());
31 aperonnet 330
 
27 aperonnet 331
		}
5 aperonnet 332
 
36 aperonnet 333
		// si on doit répandre l'évenement
27 aperonnet 334
		if (repandreRafraichissement) {
36 aperonnet 335
			// on notifie le médiateur avec une copie des données
27 aperonnet 336
			getIMediateur().synchroniserDonneesZoomListeGalerie(
337
					nouvelleDonnees, this);
338
		}
5 aperonnet 339
	}
22 aperonnet 340
 
36 aperonnet 341
	/**
342
	 * Sélectionne des enregistrements donné
343
	 * @param sel un tableau d'enregistrement à selectionner
344
	 */
27 aperonnet 345
	public void selectionnerEnregistrements(Record[] sel) {
22 aperonnet 346
 
27 aperonnet 347
		if (isEstInstancie()) {
348
			getSelectionModel().clearSelections();
349
			getSelectionModel().selectRecords(sel);
350
		}
22 aperonnet 351
	}
31 aperonnet 352
 
36 aperonnet 353
	/**
354
	 * Accesseur pour la toolbar de pagination
355
	 * @return la toolbar de pagination
356
	 */
31 aperonnet 357
	public pageToolBarVue getToolBarVue()
358
	{
359
		return bt ;
360
	}
22 aperonnet 361
 
362
	/**
36 aperonnet 363
	 * Setteur pour le booleen d'instanciation
364
	 * @param estInstancie la nouvelle valeur du booleen
22 aperonnet 365
	 */
366
	public void setEstInstancie(boolean estInstancie) {
367
		this.estInstancie = estInstancie;
368
	}
369
 
4 aperonnet 370
}