Subversion Repositories eFlore/Applications.cel

Rev

Rev 408 | 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
		store.removeAll() ;
422
		iMediateur.changerModeLiaison(liaison) ;
423
 
424
	}
425
 
426
	public boolean getMode() {
427
		return liaison ;
428
	}
429
 
430
	/**
431
	 * Recherche l'élement actuellement affiché et affiche son message de chargement
432
	 */
433
	public void masquerChargement()
434
	{
435
			ExtElement masked = Ext.get(getId()) ;
436
 
437
			if (masked!=null) {
438
				masked.mask("Chargement") ;
439
			}
440
	}
441
 
442
	/**
443
	 * Recherche l'élement actuellement affiché et affiche son message de chargement
444
	 */
445
	public void deMasquerChargement()
446
	{
447
			ExtElement masked = Ext.get(getId()) ;
448
 
449
			if (masked!=null) {
450
				masked.unmask() ;
451
			}
452
	}
453
 
104 jpm 454
	public String getIdSelectionnees() {
455
 
456
		Record[] sels = getSelectionModel().getSelections() ;
457
 
408 aurelien 458
		String id = "";
459
 
460
		for(int i = 0; i < sels.length; i++) {
461
			id += ","+sels[i].getAsString("id_obs") ;
462
		}
463
 
464
		id = id.replaceFirst(",", "");
465
 
104 jpm 466
		return id ;
467
 
468
	}
99 jpm 469
 
104 jpm 470
	public void supprimerLiaison() {
471
 
472
 
473
		Record[] rdObs = getSelectionModel().getSelections() ;
474
 
475
		for(int i = 0 ; i < rdObs.length ; i++) {
476
 
477
			getStore().remove(rdObs[i]) ;
478
			this.getView().refresh() ;
479
 
480
		}
481
 
482
	}
483
 
155 aurelien 484
	public void redimensionner() {
485
		if(getView() != null) {
408 aurelien 486
 
487
			int taille = 400;
488
 
489
			if(Window.getClientHeight() > 800 ) {
490
				taille = Window.getClientHeight() - 350;
491
			}
492
			setHeight(taille);
493
			getView().setForceFit(true);
494
			doLayout();
155 aurelien 495
		}
496
		else {
408 aurelien 497
 
155 aurelien 498
		}
499
	}
401 aurelien 500
 
501
	/**
502
	 * Montre le menu de liaison aux coordonnées indiquées
503
	 * @param e
504
	 */
505
	public void montrerContextMenuLiaison(EventObject e) {
506
 
507
		final Menu liObs = new Menu();
508
		final Item lierObservation = new Item("Lier aux images selectionnées");
509
		liObs.addItem(lierObservation);
510
 
511
		liObs.addListener(new MenuListenerAdapter() {
512
 
513
			// gestion du clic sur un item
514
			public void onItemClick(BaseItem item, EventObject ev) {
515
 
516
				// si c'est la suppression
517
				if (item.equals(lierObservation)) {
518
					// on notifie le médiateur
519
 
520
				}
521
 
522
				// enfin, on cache le menu
523
				liObs.hide();
524
 
525
			}
526
 
527
		});
528
 
529
		liObs.showAt(e.getXY());
530
	}
531
 
532
	public void changerNumeroPage(int pageCourante) {
533
 
534
		pageEnCours = pageCourante ;
535
		masquerChargement();
536
 
537
		// On lance le chargerment des observations
408 aurelien 538
		iMediateur.obtenirNombreMiniListeObservations(this);
401 aurelien 539
 
408 aurelien 540
	}
541
 
542
	/**
543
	 * Appelle le modèle pour qu'il change la taille de page utilisée
544
	 * @param nouvelleTaillePage la nouvelle taille de page
545
	 */
546
 
547
	public void changerTaillePage(int nouvelleTaillePage)
548
	{
549
 
550
		taillePage = nouvelleTaillePage ;
551
		pageEnCours = calculerPageCourante(nbElements) ;
552
 
553
		masquerChargement();
554
 
555
		// On lance le chargerment des observations
556
		iMediateur.obtenirNombreMiniListeObservations(this);
401 aurelien 557
 
408 aurelien 558
 
559
		// et on met à jour la taille de page dans les barres d'outils
560
		pgBar.selectionnerTaillePage(nouvelleTaillePage);
561
 
562
 
401 aurelien 563
	}
408 aurelien 564
 
565
	/**
566
	 * Met à jour les barre d'outils avec des nouvelles valeurs
567
	 * @param pageMax le nombre de pages
568
	 * @param pageEncours la page en cours
569
	 * @param taillePage la taille de page
570
	 * @param nbElement le nombre d'élements par page
571
	 */
572
	public void changerPageMaxEtCourante(int pageMax, int pageEncours, int taillePage, int nbElement)
573
	{
574
 
575
		int[] pages = {pageMax,pageEncours, taillePage, nbElement} ;
576
		pgBar.rafraichir(pages, false) ;
577
 
578
	}
579
 
580
	/**
581
	 * Calcule le nombre de pages nécessaires pour afficher un nombre d'élements donnés en fonction de la taille de page
582
	 * en cours
583
	 * @param nbElements le nombre d'élements total
584
	 * @return le nombre de pages
585
	 */
586
	public int calculerNbPages(int nbElements)
587
	{
588
		// A cause de la betise de java pour les conversion implicite on fait quelques conversions manuellement
589
		// pour eviter qu'il arrondisse mal la division
590
		// nombre de pages = (nombre d'element / taille de la page) arrondie à l'entier superieur
591
 
592
		double nPage = (1.0*nbElements)/(1.0*taillePage) ;
593
		double nPageRound = Math.ceil(nPage) ;
594
		Double nPageInt = new Double(nPageRound) ;
595
 
596
		// on convertit en entier
597
		return nPageInt.intValue() ;
598
	}
401 aurelien 599
 
408 aurelien 600
 
601
	/**
602
	 * Recalcule la page en cours lors du changement du nombre d'élements
603
	 * @param nbElements le nombre d'élements total
604
	 * @return la nouvelle page encours
605
	 */
606
	public int calculerPageCourante(int nbElements)
607
	{
608
		// on calcule le nombre de page
609
		int nouvelNbPages = calculerNbPages(nbElements) ;
610
		// la nouvelle page en cours
611
		double nPageCourante = (1.0*pageEnCours)/(1.0*pageMax) * (1.0*nouvelNbPages) ;
401 aurelien 612
 
408 aurelien 613
		// on arrondit au supérieur
614
		double nPageRound = Math.ceil(nPageCourante) ;
615
		Double nPageInt = new Double(nPageRound) ;
616
 
617
		// on convertit en entier
618
		return Math.abs(nPageInt.intValue()) ;
401 aurelien 619
	}
408 aurelien 620
 
621
	public boolean verifierFormatDate(String date) {
622
 
623
		String regex = "[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}" ;
624
		if(date.matches(regex) && !date.equals("0000-00-00")) {
625
			return true ;
626
		}
627
		else {
628
			return false;
629
		}
630
	}
3 aperonnet 631
}