Subversion Repositories eFlore/Applications.cel

Rev

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