Subversion Repositories eFlore/Applications.cel

Rev

Rev 195 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
195 david 1
package org.tela_botanica.client.vues.image;
3 aperonnet 2
 
61 jpm 3
import java.util.Iterator;
4
 
3 aperonnet 5
import org.tela_botanica.client.image.ImageMediateur;
401 aurelien 6
import org.tela_botanica.client.interfaces.ListePaginable;
3 aperonnet 7
import org.tela_botanica.client.interfaces.Rafraichissable;
61 jpm 8
import org.tela_botanica.client.modeles.ListeObservation;
9
import org.tela_botanica.client.modeles.Observation;
401 aurelien 10
import org.tela_botanica.client.vues.MiniBarrePaginationVue;
3 aperonnet 11
 
61 jpm 12
import com.google.gwt.user.client.Window;
99 jpm 13
import com.gwtext.client.data.Record;
3 aperonnet 14
import com.gwtext.client.data.SimpleStore;
15
import com.gwtext.client.data.Store;
16
import com.gwtext.client.dd.DragSource;
17
import com.gwtext.client.dd.DropTarget;
18
import com.gwtext.client.dd.DropTargetConfig;
19
import com.gwtext.client.widgets.Component;
155 aurelien 20
import com.gwtext.client.widgets.Container;
99 jpm 21
import com.gwtext.client.widgets.Toolbar;
3 aperonnet 22
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
99 jpm 23
import com.gwtext.client.widgets.form.ComboBox;
24
import com.gwtext.client.widgets.form.event.ComboBoxListenerAdapter;
401 aurelien 25
import com.gwtext.client.widgets.grid.CellMetadata;
3 aperonnet 26
import com.gwtext.client.widgets.grid.ColumnConfig;
27
import com.gwtext.client.widgets.grid.ColumnModel;
28
import com.gwtext.client.widgets.grid.GridDragData;
29
import com.gwtext.client.widgets.grid.GridPanel;
401 aurelien 30
import com.gwtext.client.widgets.grid.Renderer;
62 jpm 31
import com.gwtext.client.widgets.grid.event.GridListenerAdapter;
401 aurelien 32
import com.gwtext.client.widgets.grid.event.GridRowListenerAdapter;
33
import com.gwtext.client.widgets.menu.BaseItem;
34
import com.gwtext.client.widgets.menu.Item;
35
import com.gwtext.client.widgets.menu.Menu;
36
import com.gwtext.client.widgets.menu.event.MenuListenerAdapter;
3 aperonnet 37
import com.gwtext.client.core.EventObject;
99 jpm 38
import com.gwtext.client.core.Ext;
39
import com.gwtext.client.core.ExtElement;
3 aperonnet 40
import com.gwtext.client.dd.DragData;
41
 
5 aperonnet 42
/**
63 jpm 43
 * liste d'observation pour l'association d'images aux observations
5 aperonnet 44
 * @author aurelien
45
 *
46
 */
401 aurelien 47
public class MiniListeObservationVue extends GridPanel implements Rafraichissable, ListePaginable {
3 aperonnet 48
 
5 aperonnet 49
	/**
50
	 * Le médiateur associé à la vue
51
	 */
3 aperonnet 52
	private ImageMediateur iMediateur = null ;
53
 
5 aperonnet 54
	/**
55
	 * Booléen d'instanciation
56
	 */
3 aperonnet 57
	private boolean estInstancie = false ;
58
 
5 aperonnet 59
	/**
60
	 * Le modèle de colonnes
61
	 */
62
	private ColumnModel colModel = null ;
63
 
61 jpm 64
	private SimpleStore store = null ;
65
 
401 aurelien 66
	private MiniBarrePaginationVue pgBar = new MiniBarrePaginationVue(iMediateur) ;
99 jpm 67
 
68
	private Toolbar bt = new Toolbar() ;
69
 
5 aperonnet 70
	/**
99 jpm 71
	 * Combobox permettant de selectionner le mode
72
	 * modification ou bien création
73
	 */
74
	private ComboBox selecteurMode = new ComboBox();
75
 
76
	Store storeMode = null ;
77
 
78
	private boolean liaison;
79
 
401 aurelien 80
	int pageEnCours = 0;
81
 
99 jpm 82
	/**
5 aperonnet 83
	 * Constructeur avec arguments
84
	 * @param im le médiateur à associer à la vue
85
	 */
3 aperonnet 86
	public MiniListeObservationVue(ImageMediateur im)
87
	{
88
		iMediateur = im ;
89
 
90
		this.setId("x-view-mini-obs") ;
5 aperonnet 91
 
92
		// on crée un store simple contenant un petit set de données et deux colonnes
401 aurelien 93
		store = new SimpleStore(new String[]{"transmis","id_obs","plante","date","lieu"}, getObs());
94
		ColumnConfig[] columns = {
95
		new ColumnConfig("", "transmis", 30, true, new Renderer() {
96
 
97
			public String render(Object value, CellMetadata cellMetadata,
98
					Record record, int rowIndex, int colNum, Store store) {
99
				if(value.equals("1"))
100
				{
101
					return "<img src=\"tela.png\"/></img>" ;
102
				}
103
				else
104
				{
105
					return "" ;
106
				}
107
			}
108
 
109
		}),
62 jpm 110
		new ColumnConfig("Numero", "id_obs", 50, true),
111
		new ColumnConfig("Taxon", "plante", 145, true),
155 aurelien 112
		new ColumnConfig("Date", "date", 68, true),
113
		new ColumnConfig("Lieu", "lieu", 145, true) } ;
3 aperonnet 114
 
5 aperonnet 115
        ColumnModel columnModel = new ColumnModel(columns);
116
 
117
        colModel = columnModel ;
155 aurelien 118
 
5 aperonnet 119
 
120
        setTitle("Observations");
121
        // on associe le modèle de colonnes
122
        setColumnModel(columnModel);
62 jpm 123
        setAutoScroll(true) ;
124
        setHeight("100%") ;
125
		setAutoWidth(true) ;
5 aperonnet 126
        // on autorise le drag 'n drop pour un certain groupe
3 aperonnet 127
 		this.setEnableDragDrop(true);
128
 		this.setDdGroup("DragGroupName");
5 aperonnet 129
        store.load();
130
		setStore(store) ;
131
 
401 aurelien 132
		setBottomToolbar(pgBar) ;
99 jpm 133
 
134
		Object[][] mode = {{"toutes les observations",false} , {"observations liées", true} };
135
		storeMode = new SimpleStore(new String[] { "nom_mode", "mode" },
136
				mode);
137
		storeMode.load();
138
		selecteurMode.setStore(storeMode);
139
		selecteurMode.setDisplayField("nom_mode") ;
140
		selecteurMode.setLabel("mode ") ;
141
		selecteurMode.setForceSelection(true) ;
142
		selecteurMode.setValue("toutes les observations") ;
143
		selecteurMode.setEditable(false) ;
100 jpm 144
		selecteurMode.setCls("x-selec-consult") ;
99 jpm 145
 
146
		bt = new Toolbar() ;
147
		bt.addField(selecteurMode) ;
148
 
155 aurelien 149
		//this.setAutoExpandColumn("plante");
150
 
99 jpm 151
		setTopToolbar(bt) ;
152
 
153
		selecteurMode.addListener(new ComboBoxListenerAdapter() {
154
 
155
			public void onSelect(ComboBox comboBox, Record record, int index) {
156
 
157
				// et on met la valeur à jour dans la combobox
158
				comboBox.setValue(record.getAsString("nom_mode"));
159
				setModification(record.getAsString("mode")) ;
160
			}
161
 
162
		});
163
 
62 jpm 164
		setAutoScroll(true) ;
5 aperonnet 165
		// on configure le drag 'n drop
166
		configDragAndDrop() ;
61 jpm 167
 
173 aurelien 168
		this.addListener(new ContainerListenerAdapter() {
61 jpm 169
 
170
			public void onRender(Component c) {
171
 
172
				obtenirMiniListeObservations() ;
173
 
174
			}
175
 
173 aurelien 176
			public void onAfterLayout(Container c)
177
			{
178
				obtenirMiniListeObservations() ;
179
			}
180
 
61 jpm 181
		}) ;
62 jpm 182
 
183
		this.addGridListener(new GridListenerAdapter() {
184
 
185
			public void onContextMenu(EventObject e) {
186
 
401 aurelien 187
				// si pas de selection, on selection au moins la ligne sur laquelle on a fait le clic
188
				if(getSelectionModel().getSelections().length <= 0) {
189
					int index = getView().findRowIndex(e);
190
			  		Record rddrop = getStore().getRecordAt(index) ;
191
					getSelectionModel().selectRecords(rddrop);
192
				}
193
 
62 jpm 194
				e.stopEvent() ;
104 jpm 195
				MenuLiaisonVue mlv = new MenuLiaisonVue(iMediateur,liaison) ;
62 jpm 196
				mlv.showAt(e.getXY()) ;
197
 
198
			}
199
 
401 aurelien 200
		}) ;
3 aperonnet 201
	}
202
 
5 aperonnet 203
	/**
204
	 * Configure le drag 'n drop pour la liste
205
	 */
206
	private void configDragAndDrop()
3 aperonnet 207
	{
208
		// on choisit le texte qui sera affiché lors d'un drag 'n drop
209
		setDragDropText("Faites glisser la selection d'observations sur une image pour les lier") ;
210
 
211
		//On active le drag 'n drop
212
		this.setEnableDragDrop(true);
213
 
214
		// on fabrique la nouvelle configuration
215
		// les éléments sur lesquels on fait du drag 'n drop doivent tous avoir le même ddGroup
216
		this.setDdGroup("DragGroupName");
217
		DropTargetConfig dtc = new DropTargetConfig();
218
		dtc.setdDdGroup("DragGroupName");
219
 
220
		//La drop target permet de gérer l'évenement onDrop sur l'élement courant
221
		@SuppressWarnings("unused")
222
		DropTarget tg = new DropTarget(this, dtc)
223
		{
62 jpm 224
			public boolean notifyDrop(DragSource source, EventObject e, DragData data){
3 aperonnet 225
 
226
				// si on reçoit des données provenant d'une grille
227
				if(data instanceof GridDragData)
228
		    	  {
229
					// on la convertit
230
		    		  	GridDragData gdd = (GridDragData)data ;
231
		    		  	// et on vérifie que les données ne viennent pas de l'élément courant
232
		    		  	if(gdd.getGrid().getId().equals("x-view-mini-obs"))
233
		    		  	{
234
		    		  		return false ;
235
		    		  	}
236
		    		  	else
237
		    		  	{
238
		    		  		// on appelle le médiateur
239
		    		  		return iMediateur.lierImagesDD(source, e, data) ;
240
		    		  	}
241
		    	  }
242
				return false ;
243
			}
244
 
245
			public String notifyOver(DragSource source, EventObject e, DragData data){
246
			    return "x-dd-drop-ok";
247
			}
248
		};
249
 
250
	}
251
 
5 aperonnet 252
	/**
253
	 * Méthode héritée de l'interface rafraichissable
254
	 */
3 aperonnet 255
	public void rafraichir(Object nouvelleDonnees,
256
			boolean repandreRaffraichissement) {
257
 
61 jpm 258
		if(nouvelleDonnees instanceof ListeObservation)
259
		{
63 jpm 260
			if(this.getView() != null)
61 jpm 261
			{
63 jpm 262
				ListeObservation data = (ListeObservation)nouvelleDonnees ;
401 aurelien 263
				String[][] listeObs = new String[data.size()][5] ;
63 jpm 264
				int i = 0 ;
61 jpm 265
 
63 jpm 266
				for (Iterator it = data.keySet().iterator(); it.hasNext();)
267
				{
268
 
269
					Observation obs=(Observation) data.get(it.next());
270
 
271
					listeObs[i][0] = obs.getNumeroOrdre();
401 aurelien 272
					listeObs[i][1] = obs.getTransmis();
273
					listeObs[i][2] = obs.getNomSaisi();
274
					listeObs[i][3] = obs.getDate() ;
275
					listeObs[i][4] = obs.getLocalite();
61 jpm 276
 
63 jpm 277
					i++ ;
278
				}
279
 
401 aurelien 280
				store = new SimpleStore(new String[]{"id_obs","transmis","plante","date","lieu"}, listeObs);
63 jpm 281
				store.load();
282
				this.reconfigure(store, colModel) ;
61 jpm 283
			}
63 jpm 284
			else
285
			{
286
				addListener(new ContainerListenerAdapter() {
287
 
288
					public void onShow(Component c)
289
					{
290
						obtenirMiniListeObservations() ;
291
					}
292
 
173 aurelien 293
					public void onAfterLayout(Container c)
294
					{
295
						obtenirMiniListeObservations() ;
296
					}
297
 
63 jpm 298
				}) ;
299
			}
61 jpm 300
 
301
		}
302
 
99 jpm 303
		deMasquerChargement() ;
304
 
3 aperonnet 305
	}
306
 
61 jpm 307
	private void obtenirMiniListeObservations()
308
	{
309
		iMediateur.obtenirMiniListeObservations(this) ;
310
	}
311
 
5 aperonnet 312
	/**
313
	 * Renvoie le faux set de données pour le store
314
	 * @return un tableau à deux colonnes int - String
315
	 */
316
	private Object[][] getObs() {
3 aperonnet 317
	         return new Object[][]{
61 jpm 318
 
3 aperonnet 319
	         } ;
320
	 }
61 jpm 321
 
62 jpm 322
	public Store getStore()
323
	{
324
		return store ;
325
	}
61 jpm 326
 
401 aurelien 327
	public MiniBarrePaginationVue getBarrePagination()
99 jpm 328
	{
329
		return pgBar ;
401 aurelien 330
	}
62 jpm 331
 
99 jpm 332
	private void setModification(String mode)
333
	{
334
		if(mode.equals("true")) {
3 aperonnet 335
 
99 jpm 336
			liaison = true ;
337
			selecteurMode.removeClass("x-selec-consult") ;
338
			selecteurMode.setCls("x-selec-liaison") ;
339
		}
340
		else
341
		{
342
			liaison = false ;
343
			selecteurMode.removeClass("x-selec-liaison") ;
344
			selecteurMode.setCls("x-selec-consult") ;
345
 
346
		}
347
 
348
		masquerChargement() ;
349
		store.removeAll() ;
350
		iMediateur.changerModeLiaison(liaison) ;
351
 
352
	}
353
 
354
	public boolean getMode() {
355
		return liaison ;
356
	}
357
 
358
	/**
359
	 * Recherche l'élement actuellement affiché et affiche son message de chargement
360
	 */
361
	public void masquerChargement()
362
	{
363
			ExtElement masked = Ext.get(getId()) ;
364
 
365
			if (masked!=null) {
366
				masked.mask("Chargement") ;
367
			}
368
	}
369
 
370
	/**
371
	 * Recherche l'élement actuellement affiché et affiche son message de chargement
372
	 */
373
	public void deMasquerChargement()
374
	{
375
			ExtElement masked = Ext.get(getId()) ;
376
 
377
			if (masked!=null) {
378
				masked.unmask() ;
379
			}
380
	}
381
 
104 jpm 382
	public String getIdSelectionnees() {
383
 
384
		Record[] sels = getSelectionModel().getSelections() ;
385
		String id = sels[0].getAsString("id_obs") ;
386
 
387
		return id ;
388
 
389
	}
99 jpm 390
 
104 jpm 391
	public void supprimerLiaison() {
392
 
393
 
394
		Record[] rdObs = getSelectionModel().getSelections() ;
395
 
396
		for(int i = 0 ; i < rdObs.length ; i++) {
397
 
398
			getStore().remove(rdObs[i]) ;
399
			this.getView().refresh() ;
400
 
401
		}
402
 
403
	}
404
 
155 aurelien 405
	public void redimensionner() {
406
		if(getView() != null) {
407
 
408
				this.setWidth("100%");
409
				getView().setForceFit(true);
410
				doLayout();
411
		}
412
		else {
413
			Window.alert("null");
414
		}
415
	}
401 aurelien 416
 
417
	/**
418
	 * Montre le menu de liaison aux coordonnées indiquées
419
	 * @param e
420
	 */
421
	public void montrerContextMenuLiaison(EventObject e) {
422
 
423
		final Menu liObs = new Menu();
424
		final Item lierObservation = new Item("Lier aux images selectionnées");
425
		liObs.addItem(lierObservation);
426
 
427
		liObs.addListener(new MenuListenerAdapter() {
428
 
429
			// gestion du clic sur un item
430
			public void onItemClick(BaseItem item, EventObject ev) {
431
 
432
				// si c'est la suppression
433
				if (item.equals(lierObservation)) {
434
					// on notifie le médiateur
435
 
436
				}
437
 
438
				// enfin, on cache le menu
439
				liObs.hide();
440
 
441
			}
442
 
443
		});
444
 
445
		liObs.showAt(e.getXY());
446
	}
447
 
448
	@Override
449
	public void changerNumeroPage(int pageCourante) {
450
 
451
		pageEnCours = pageCourante ;
452
		masquerChargement();
453
 
454
		// On lance le chargerment des observations
455
		iMediateur.obtenirMiniListeObservations(this);
456
 
457
		pgBar.changerPageCourante(pageCourante);
458
 
459
	}
460
 
461
	@Override
462
	public void changerTaillePage(int nouvelleTaillePage) {
463
		// TODO Auto-generated method stub
464
 
465
	}
3 aperonnet 466
}