Subversion Repositories eFlore/Applications.cel

Rev

Rev 638 | 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
 
638 aurelien 5
import org.tela_botanica.client.Util;
3 aperonnet 6
import org.tela_botanica.client.image.ImageMediateur;
401 aurelien 7
import org.tela_botanica.client.interfaces.ListePaginable;
3 aperonnet 8
import org.tela_botanica.client.interfaces.Rafraichissable;
61 jpm 9
import org.tela_botanica.client.modeles.ListeObservation;
10
import org.tela_botanica.client.modeles.Observation;
401 aurelien 11
import org.tela_botanica.client.vues.MiniBarrePaginationVue;
3 aperonnet 12
 
61 jpm 13
import com.google.gwt.user.client.Window;
99 jpm 14
import com.gwtext.client.data.Record;
3 aperonnet 15
import com.gwtext.client.data.SimpleStore;
16
import com.gwtext.client.data.Store;
17
import com.gwtext.client.dd.DragSource;
18
import com.gwtext.client.dd.DropTarget;
19
import com.gwtext.client.dd.DropTargetConfig;
20
import com.gwtext.client.widgets.Component;
155 aurelien 21
import com.gwtext.client.widgets.Container;
99 jpm 22
import com.gwtext.client.widgets.Toolbar;
3 aperonnet 23
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
99 jpm 24
import com.gwtext.client.widgets.form.ComboBox;
25
import com.gwtext.client.widgets.form.event.ComboBoxListenerAdapter;
401 aurelien 26
import com.gwtext.client.widgets.grid.CellMetadata;
3 aperonnet 27
import com.gwtext.client.widgets.grid.ColumnConfig;
28
import com.gwtext.client.widgets.grid.ColumnModel;
29
import com.gwtext.client.widgets.grid.GridDragData;
30
import com.gwtext.client.widgets.grid.GridPanel;
401 aurelien 31
import com.gwtext.client.widgets.grid.Renderer;
62 jpm 32
import com.gwtext.client.widgets.grid.event.GridListenerAdapter;
401 aurelien 33
import com.gwtext.client.widgets.grid.event.GridRowListenerAdapter;
34
import com.gwtext.client.widgets.menu.BaseItem;
35
import com.gwtext.client.widgets.menu.Item;
36
import com.gwtext.client.widgets.menu.Menu;
37
import com.gwtext.client.widgets.menu.event.MenuListenerAdapter;
3 aperonnet 38
import com.gwtext.client.core.EventObject;
99 jpm 39
import com.gwtext.client.core.Ext;
40
import com.gwtext.client.core.ExtElement;
3 aperonnet 41
import com.gwtext.client.dd.DragData;
42
 
5 aperonnet 43
/**
63 jpm 44
 * liste d'observation pour l'association d'images aux observations
5 aperonnet 45
 * @author aurelien
46
 *
47
 */
401 aurelien 48
public class MiniListeObservationVue extends GridPanel implements Rafraichissable, ListePaginable {
3 aperonnet 49
 
5 aperonnet 50
	/**
51
	 * Le médiateur associé à la vue
52
	 */
3 aperonnet 53
	private ImageMediateur iMediateur = null ;
54
 
5 aperonnet 55
	/**
56
	 * Booléen d'instanciation
57
	 */
3 aperonnet 58
	private boolean estInstancie = false ;
59
 
5 aperonnet 60
	/**
61
	 * Le modèle de colonnes
62
	 */
63
	private ColumnModel colModel = null ;
64
 
61 jpm 65
	private SimpleStore store = null ;
66
 
408 aurelien 67
	private MiniBarrePaginationVue pgBar = new MiniBarrePaginationVue(this) ;
99 jpm 68
 
69
	private Toolbar bt = new Toolbar() ;
70
 
5 aperonnet 71
	/**
99 jpm 72
	 * Combobox permettant de selectionner le mode
73
	 * modification ou bien création
74
	 */
75
	private ComboBox selecteurMode = new ComboBox();
76
 
77
	Store storeMode = null ;
78
 
79
	private boolean liaison;
80
 
401 aurelien 81
	int pageEnCours = 0;
82
 
408 aurelien 83
	int nbElements = 0;
84
 
85
	int taillePage = 50;
86
 
638 aurelien 87
	private String modeleLieu = "IDLOCCOMMUNE, LIEUDIT, STATION";
88
 
99 jpm 89
	/**
408 aurelien 90
	 * Nombre de pages totales
91
	 */
92
	private int pageMax = 1 ;
93
 
94
	/**
5 aperonnet 95
	 * Constructeur avec arguments
96
	 * @param im le médiateur à associer à la vue
97
	 */
3 aperonnet 98
	public MiniListeObservationVue(ImageMediateur im)
99
	{
100
		iMediateur = im ;
101
 
102
		this.setId("x-view-mini-obs") ;
5 aperonnet 103
 
408 aurelien 104
		// on construit le modèle de colonnes
105
 
106
		// Le store suivant est ensuite remplacé par le store contenant les données obtenus depuis le serveur (cf rafraichir)
107
 
108
		Renderer colRend = new Renderer() {
109
 
110
			public String render(Object value, CellMetadata cellMetadata,
111
					Record record, int rowIndex, int colNum, Store store) {
112
 
113
				if(value == null || value.equals("null") || value.equals("000null") || value.equals("0000-00-00 00:00:00")) {
114
 
115
					return "" ;
116
				}
117
				else
118
				{
119
 
120
				}
121
 
122
				return value.toString() ;
123
			}
124
 
125
		} ;
126
 
127
		Renderer dateRend = new Renderer() {
128
 
129
			public String render(Object value, CellMetadata cellMetadata,
130
					Record record, int rowIndex, int colNum, Store store) {
131
 
132
				if(value == null || value.equals("null") || value.equals("000null") || value.equals("0000-00-00 00:00:00")) {
133
 
134
					return "" ;
135
				}
136
				else
137
				{
138
					String dateEntiere = value.toString() ;
139
					String[] dateEtHeure = dateEntiere.split(" ", 2);
140
					if(verifierFormatDate(dateEtHeure[0])) {
141
						String[] dateFormateeTab = dateEtHeure[0].split("-",3);
142
						return dateFormateeTab[2]+"/"+dateFormateeTab[1]+"/"+dateFormateeTab[0] ;
143
					}
144
				}
145
 
146
				return value.toString() ;
147
			}
148
 
149
		} ;
150
 
5 aperonnet 151
		// on crée un store simple contenant un petit set de données et deux colonnes
638 aurelien 152
		store = new SimpleStore(new String[]{"transmis","plante","date","lieu","id_obs"}, getObs());
401 aurelien 153
		ColumnConfig[] columns = {
154
		new ColumnConfig("", "transmis", 30, true, new Renderer() {
155
 
156
			public String render(Object value, CellMetadata cellMetadata,
157
					Record record, int rowIndex, int colNum, Store store) {
158
				if(value.equals("1"))
159
				{
160
					return "<img src=\"tela.png\"/></img>" ;
161
				}
162
				else
163
				{
164
					return "" ;
165
				}
166
			}
167
 
638 aurelien 168
		}),
408 aurelien 169
		new ColumnConfig("Taxon", "plante", 145, true, colRend),
170
		new ColumnConfig("Date", "date", 68, true, dateRend),
638 aurelien 171
		new ColumnConfig("Lieu", "lieu", 145, true, colRend),
172
		new ColumnConfig("Numero", "id_obs", 50, true, colRend), } ;
3 aperonnet 173
 
5 aperonnet 174
        ColumnModel columnModel = new ColumnModel(columns);
175
 
176
        colModel = columnModel ;
155 aurelien 177
 
5 aperonnet 178
 
179
        setTitle("Observations");
180
        // on associe le modèle de colonnes
181
        setColumnModel(columnModel);
62 jpm 182
        setAutoScroll(true) ;
183
        setHeight("100%") ;
184
		setAutoWidth(true) ;
5 aperonnet 185
        // on autorise le drag 'n drop pour un certain groupe
3 aperonnet 186
 		this.setEnableDragDrop(true);
187
 		this.setDdGroup("DragGroupName");
5 aperonnet 188
        store.load();
189
		setStore(store) ;
190
 
401 aurelien 191
		setBottomToolbar(pgBar) ;
99 jpm 192
 
193
		Object[][] mode = {{"toutes les observations",false} , {"observations liées", true} };
194
		storeMode = new SimpleStore(new String[] { "nom_mode", "mode" },
195
				mode);
196
		storeMode.load();
197
		selecteurMode.setStore(storeMode);
198
		selecteurMode.setDisplayField("nom_mode") ;
199
		selecteurMode.setLabel("mode ") ;
200
		selecteurMode.setForceSelection(true) ;
201
		selecteurMode.setValue("toutes les observations") ;
202
		selecteurMode.setEditable(false) ;
100 jpm 203
		selecteurMode.setCls("x-selec-consult") ;
99 jpm 204
 
205
		bt = new Toolbar() ;
206
		bt.addField(selecteurMode) ;
207
 
155 aurelien 208
		//this.setAutoExpandColumn("plante");
209
 
99 jpm 210
		setTopToolbar(bt) ;
211
 
212
		selecteurMode.addListener(new ComboBoxListenerAdapter() {
213
 
214
			public void onSelect(ComboBox comboBox, Record record, int index) {
215
 
216
				// et on met la valeur à jour dans la combobox
217
				comboBox.setValue(record.getAsString("nom_mode"));
218
				setModification(record.getAsString("mode")) ;
219
			}
220
 
221
		});
222
 
62 jpm 223
		setAutoScroll(true) ;
5 aperonnet 224
		// on configure le drag 'n drop
225
		configDragAndDrop() ;
61 jpm 226
 
62 jpm 227
		this.addGridListener(new GridListenerAdapter() {
228
 
229
			public void onContextMenu(EventObject e) {
230
 
401 aurelien 231
				// si pas de selection, on selection au moins la ligne sur laquelle on a fait le clic
232
				if(getSelectionModel().getSelections().length <= 0) {
233
					int index = getView().findRowIndex(e);
234
			  		Record rddrop = getStore().getRecordAt(index) ;
235
					getSelectionModel().selectRecords(rddrop);
236
				}
237
 
62 jpm 238
				e.stopEvent() ;
104 jpm 239
				MenuLiaisonVue mlv = new MenuLiaisonVue(iMediateur,liaison) ;
62 jpm 240
				mlv.showAt(e.getXY()) ;
241
 
242
			}
243
 
401 aurelien 244
		}) ;
408 aurelien 245
 
246
		obtenirNombreMiniListeObservations();
3 aperonnet 247
	}
248
 
5 aperonnet 249
	/**
250
	 * Configure le drag 'n drop pour la liste
251
	 */
252
	private void configDragAndDrop()
3 aperonnet 253
	{
254
		// on choisit le texte qui sera affiché lors d'un drag 'n drop
255
		setDragDropText("Faites glisser la selection d'observations sur une image pour les lier") ;
256
 
257
		//On active le drag 'n drop
258
		this.setEnableDragDrop(true);
259
 
260
		// on fabrique la nouvelle configuration
261
		// les éléments sur lesquels on fait du drag 'n drop doivent tous avoir le même ddGroup
262
		this.setDdGroup("DragGroupName");
263
		DropTargetConfig dtc = new DropTargetConfig();
264
		dtc.setdDdGroup("DragGroupName");
265
 
266
		//La drop target permet de gérer l'évenement onDrop sur l'élement courant
267
		@SuppressWarnings("unused")
268
		DropTarget tg = new DropTarget(this, dtc)
269
		{
62 jpm 270
			public boolean notifyDrop(DragSource source, EventObject e, DragData data){
3 aperonnet 271
 
272
				// si on reçoit des données provenant d'une grille
273
				if(data instanceof GridDragData)
274
		    	  {
275
					// on la convertit
276
		    		  	GridDragData gdd = (GridDragData)data ;
277
		    		  	// et on vérifie que les données ne viennent pas de l'élément courant
278
		    		  	if(gdd.getGrid().getId().equals("x-view-mini-obs"))
279
		    		  	{
280
		    		  		return false ;
281
		    		  	}
282
		    		  	else
283
		    		  	{
284
		    		  		// on appelle le médiateur
285
		    		  		return iMediateur.lierImagesDD(source, e, data) ;
286
		    		  	}
287
		    	  }
288
				return false ;
289
			}
290
 
291
			public String notifyOver(DragSource source, EventObject e, DragData data){
292
			    return "x-dd-drop-ok";
293
			}
294
		};
295
 
296
	}
297
 
5 aperonnet 298
	/**
299
	 * Méthode héritée de l'interface rafraichissable
300
	 */
3 aperonnet 301
	public void rafraichir(Object nouvelleDonnees,
302
			boolean repandreRaffraichissement) {
303
 
61 jpm 304
		if(nouvelleDonnees instanceof ListeObservation)
305
		{
63 jpm 306
			if(this.getView() != null)
61 jpm 307
			{
63 jpm 308
				ListeObservation data = (ListeObservation)nouvelleDonnees ;
408 aurelien 309
 
310
				//Window.alert(data.size()+"");
311
 
401 aurelien 312
				String[][] listeObs = new String[data.size()][5] ;
63 jpm 313
				int i = 0 ;
61 jpm 314
 
63 jpm 315
				for (Iterator it = data.keySet().iterator(); it.hasNext();)
316
				{
317
 
318
					Observation obs=(Observation) data.get(it.next());
319
 
638 aurelien 320
					listeObs[i][0] = obs.getTransmis();
321
					listeObs[i][1] = obs.getNomSaisi();
322
					listeObs[i][2] = obs.getDate() ;
323
					listeObs[i][3] = Util.formaterLieu(obs, modeleLieu);
324
					listeObs[i][4] = obs.getNumeroOrdre();
61 jpm 325
 
63 jpm 326
					i++ ;
327
				}
328
 
638 aurelien 329
				store = new SimpleStore(new String[]{"transmis","plante","date","lieu","id_obs"}, listeObs);
63 jpm 330
				store.load();
331
				this.reconfigure(store, colModel) ;
61 jpm 332
			}
63 jpm 333
			else
334
			{
335
				addListener(new ContainerListenerAdapter() {
336
 
337
					public void onShow(Component c)
338
					{
408 aurelien 339
						obtenirNombreMiniListeObservations() ;
63 jpm 340
					}
341
 
173 aurelien 342
					public void onAfterLayout(Container c)
343
					{
408 aurelien 344
						obtenirNombreMiniListeObservations() ;
173 aurelien 345
					}
346
 
63 jpm 347
				}) ;
348
			}
61 jpm 349
 
350
		}
351
 
408 aurelien 352
		// Si on reçoit un tableau d'entiers
353
		// c'est un tableau d'un seul entier qui est le nombre d'observation correspondant aux critères
354
		if(nouvelleDonnees instanceof int[])
355
		{
356
			int[] pages = (int[])nouvelleDonnees ;
357
 
358
			// on calcule le nombre de pages nécessaires et on les met à jour dans le modèle
359
			pageMax  = calculerNbPages(pages[0]) ;
360
			nbElements = pages[0];
361
 
362
			// et on notifie de le mediateur du changement des valeurs
363
			changerPageMaxEtCourante(pageMax,pageEnCours,taillePage,nbElements) ;
364
 
365
			masquerChargement();
366
			obtenirMiniListeObservations();
367
		}
368
 
369
		redimensionner();
370
 
99 jpm 371
		deMasquerChargement() ;
372
 
3 aperonnet 373
	}
374
 
61 jpm 375
	private void obtenirMiniListeObservations()
376
	{
408 aurelien 377
		iMediateur.obtenirMiniListeObservations(this, taillePage, pageEnCours) ;
61 jpm 378
	}
379
 
408 aurelien 380
	private void obtenirNombreMiniListeObservations()
381
	{
382
		iMediateur.obtenirNombreMiniListeObservations(this) ;
383
	}
384
 
5 aperonnet 385
	/**
386
	 * Renvoie le faux set de données pour le store
387
	 * @return un tableau à deux colonnes int - String
388
	 */
389
	private Object[][] getObs() {
3 aperonnet 390
	         return new Object[][]{
61 jpm 391
 
3 aperonnet 392
	         } ;
393
	 }
61 jpm 394
 
62 jpm 395
	public Store getStore()
396
	{
397
		return store ;
398
	}
61 jpm 399
 
401 aurelien 400
	public MiniBarrePaginationVue getBarrePagination()
99 jpm 401
	{
402
		return pgBar ;
401 aurelien 403
	}
62 jpm 404
 
99 jpm 405
	private void setModification(String mode)
406
	{
407
		if(mode.equals("true")) {
3 aperonnet 408
 
99 jpm 409
			liaison = true ;
410
			selecteurMode.removeClass("x-selec-consult") ;
411
			selecteurMode.setCls("x-selec-liaison") ;
408 aurelien 412
			getBarrePagination().disable();
413
			doLayout();
99 jpm 414
		}
415
		else
416
		{
417
			liaison = false ;
418
			selecteurMode.removeClass("x-selec-liaison") ;
419
			selecteurMode.setCls("x-selec-consult") ;
408 aurelien 420
			getBarrePagination().enable();
421
			doLayout();
99 jpm 422
		}
423
 
424
		store.removeAll() ;
425
		iMediateur.changerModeLiaison(liaison) ;
426
 
427
	}
428
 
429
	public boolean getMode() {
430
		return liaison ;
431
	}
432
 
433
	/**
434
	 * Recherche l'élement actuellement affiché et affiche son message de chargement
435
	 */
436
	public void masquerChargement()
437
	{
438
			ExtElement masked = Ext.get(getId()) ;
439
 
440
			if (masked!=null) {
441
				masked.mask("Chargement") ;
442
			}
443
	}
444
 
445
	/**
446
	 * Recherche l'élement actuellement affiché et affiche son message de chargement
447
	 */
448
	public void deMasquerChargement()
449
	{
450
			ExtElement masked = Ext.get(getId()) ;
451
 
452
			if (masked!=null) {
453
				masked.unmask() ;
454
			}
455
	}
456
 
104 jpm 457
	public String getIdSelectionnees() {
458
 
459
		Record[] sels = getSelectionModel().getSelections() ;
460
 
408 aurelien 461
		String id = "";
462
 
463
		for(int i = 0; i < sels.length; i++) {
464
			id += ","+sels[i].getAsString("id_obs") ;
465
		}
466
 
467
		id = id.replaceFirst(",", "");
468
 
104 jpm 469
		return id ;
470
 
471
	}
99 jpm 472
 
104 jpm 473
	public void supprimerLiaison() {
474
 
475
 
476
		Record[] rdObs = getSelectionModel().getSelections() ;
477
 
478
		for(int i = 0 ; i < rdObs.length ; i++) {
479
 
480
			getStore().remove(rdObs[i]) ;
481
			this.getView().refresh() ;
482
 
483
		}
484
 
485
	}
486
 
155 aurelien 487
	public void redimensionner() {
488
		if(getView() != null) {
408 aurelien 489
 
490
			int taille = 400;
491
 
492
			if(Window.getClientHeight() > 800 ) {
493
				taille = Window.getClientHeight() - 350;
494
			}
495
			setHeight(taille);
496
			getView().setForceFit(true);
497
			doLayout();
155 aurelien 498
		}
499
		else {
408 aurelien 500
 
155 aurelien 501
		}
502
	}
401 aurelien 503
 
504
	/**
505
	 * Montre le menu de liaison aux coordonnées indiquées
506
	 * @param e
507
	 */
508
	public void montrerContextMenuLiaison(EventObject e) {
509
 
510
		final Menu liObs = new Menu();
511
		final Item lierObservation = new Item("Lier aux images selectionnées");
512
		liObs.addItem(lierObservation);
513
 
514
		liObs.addListener(new MenuListenerAdapter() {
515
 
516
			// gestion du clic sur un item
517
			public void onItemClick(BaseItem item, EventObject ev) {
518
 
519
				// si c'est la suppression
520
				if (item.equals(lierObservation)) {
521
					// on notifie le médiateur
522
 
523
				}
524
 
525
				// enfin, on cache le menu
526
				liObs.hide();
527
 
528
			}
529
 
530
		});
531
 
532
		liObs.showAt(e.getXY());
533
	}
534
 
535
	public void changerNumeroPage(int pageCourante) {
536
 
537
		pageEnCours = pageCourante ;
538
		masquerChargement();
539
 
540
		// On lance le chargerment des observations
408 aurelien 541
		iMediateur.obtenirNombreMiniListeObservations(this);
401 aurelien 542
 
408 aurelien 543
	}
544
 
545
	/**
546
	 * Appelle le modèle pour qu'il change la taille de page utilisée
547
	 * @param nouvelleTaillePage la nouvelle taille de page
548
	 */
549
 
550
	public void changerTaillePage(int nouvelleTaillePage)
551
	{
552
 
553
		taillePage = nouvelleTaillePage ;
554
		pageEnCours = calculerPageCourante(nbElements) ;
555
 
556
		masquerChargement();
557
 
558
		// On lance le chargerment des observations
559
		iMediateur.obtenirNombreMiniListeObservations(this);
401 aurelien 560
 
408 aurelien 561
 
562
		// et on met à jour la taille de page dans les barres d'outils
563
		pgBar.selectionnerTaillePage(nouvelleTaillePage);
564
 
565
 
401 aurelien 566
	}
408 aurelien 567
 
568
	/**
569
	 * Met à jour les barre d'outils avec des nouvelles valeurs
570
	 * @param pageMax le nombre de pages
571
	 * @param pageEncours la page en cours
572
	 * @param taillePage la taille de page
573
	 * @param nbElement le nombre d'élements par page
574
	 */
575
	public void changerPageMaxEtCourante(int pageMax, int pageEncours, int taillePage, int nbElement)
576
	{
577
 
578
		int[] pages = {pageMax,pageEncours, taillePage, nbElement} ;
579
		pgBar.rafraichir(pages, false) ;
580
 
581
	}
582
 
583
	/**
584
	 * Calcule le nombre de pages nécessaires pour afficher un nombre d'élements donnés en fonction de la taille de page
585
	 * en cours
586
	 * @param nbElements le nombre d'élements total
587
	 * @return le nombre de pages
588
	 */
589
	public int calculerNbPages(int nbElements)
590
	{
591
		// A cause de la betise de java pour les conversion implicite on fait quelques conversions manuellement
592
		// pour eviter qu'il arrondisse mal la division
593
		// nombre de pages = (nombre d'element / taille de la page) arrondie à l'entier superieur
594
 
595
		double nPage = (1.0*nbElements)/(1.0*taillePage) ;
596
		double nPageRound = Math.ceil(nPage) ;
597
		Double nPageInt = new Double(nPageRound) ;
598
 
599
		// on convertit en entier
600
		return nPageInt.intValue() ;
601
	}
401 aurelien 602
 
408 aurelien 603
 
604
	/**
605
	 * Recalcule la page en cours lors du changement du nombre d'élements
606
	 * @param nbElements le nombre d'élements total
607
	 * @return la nouvelle page encours
608
	 */
609
	public int calculerPageCourante(int nbElements)
610
	{
611
		// on calcule le nombre de page
612
		int nouvelNbPages = calculerNbPages(nbElements) ;
613
		// la nouvelle page en cours
614
		double nPageCourante = (1.0*pageEnCours)/(1.0*pageMax) * (1.0*nouvelNbPages) ;
401 aurelien 615
 
408 aurelien 616
		// on arrondit au supérieur
617
		double nPageRound = Math.ceil(nPageCourante) ;
618
		Double nPageInt = new Double(nPageRound) ;
619
 
620
		// on convertit en entier
621
		return Math.abs(nPageInt.intValue()) ;
401 aurelien 622
	}
408 aurelien 623
 
624
	public boolean verifierFormatDate(String date) {
625
 
626
		String regex = "[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}" ;
627
		if(date.matches(regex) && !date.equals("0000-00-00")) {
628
			return true ;
629
		}
630
		else {
631
			return false;
632
		}
633
	}
3 aperonnet 634
}