Subversion Repositories eFlore/Applications.cel

Rev

Rev 1601 | 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.observation;
12 david 2
 
3
 
46 david 4
import java.util.Iterator;
5
 
989 aurelien 6
import org.tela_botanica.client.modeles.objets.ListeObservation;
7
import org.tela_botanica.client.modeles.objets.Observation;
1489 aurelien 8
import org.tela_botanica.client.modeles.objets.Ontologies;
12 david 9
import org.tela_botanica.client.observation.ObservationMediateur;
727 aurelien 10
import org.tela_botanica.client.util.Util;
195 david 11
import org.tela_botanica.client.vues.BarrePaginationVue;
59 david 12
import org.tela_botanica.client.interfaces.ListePaginable;
12 david 13
import org.tela_botanica.client.interfaces.Rafraichissable;
14
import org.tela_botanica.client.interfaces.VueListable;
133 aurelien 15
 
1599 aurelien 16
import com.google.gwt.user.client.Window;
128 aurelien 17
import com.gwtext.client.core.EventCallback;
41 jpm 18
import com.gwtext.client.core.EventObject;
12 david 19
import com.gwtext.client.core.Ext;
20
import com.gwtext.client.core.ExtElement;
1599 aurelien 21
import com.gwtext.client.core.SortDir;
46 david 22
import com.gwtext.client.data.ArrayReader;
12 david 23
import com.gwtext.client.data.FieldDef;
238 aurelien 24
import com.gwtext.client.data.IntegerFieldDef;
46 david 25
import com.gwtext.client.data.MemoryProxy;
12 david 26
import com.gwtext.client.data.Record;
27
import com.gwtext.client.data.RecordDef;
1599 aurelien 28
import com.gwtext.client.data.SortState;
12 david 29
import com.gwtext.client.data.Store;
30
import com.gwtext.client.data.StringFieldDef;
318 aurelien 31
import com.gwtext.client.dd.DragData;
337 aurelien 32
import com.gwtext.client.dd.DragDropConfig;
318 aurelien 33
import com.gwtext.client.dd.DragSource;
34
import com.gwtext.client.dd.DropTarget;
35
import com.gwtext.client.dd.DropTargetConfig;
128 aurelien 36
import com.gwtext.client.widgets.Button;
12 david 37
import com.gwtext.client.widgets.Component;
275 aurelien 38
import com.gwtext.client.widgets.Panel;
101 jpm 39
import com.gwtext.client.widgets.Tool;
128 aurelien 40
import com.gwtext.client.widgets.Toolbar;
41
import com.gwtext.client.widgets.ToolbarButton;
42
import com.gwtext.client.widgets.ToolbarTextItem;
43
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
44
import com.gwtext.client.widgets.event.PanelListenerAdapter;
41 jpm 45
import com.gwtext.client.widgets.grid.CellMetadata;
12 david 46
import com.gwtext.client.widgets.grid.ColumnConfig;
47
import com.gwtext.client.widgets.grid.ColumnModel;
48
import com.gwtext.client.widgets.grid.GridPanel;
41 jpm 49
import com.gwtext.client.widgets.grid.Renderer;
1601 aurelien 50
import com.gwtext.client.widgets.grid.event.GridHeaderListenerAdapter;
133 aurelien 51
import com.gwtext.client.widgets.grid.event.GridListenerAdapter;
41 jpm 52
import com.gwtext.client.widgets.grid.event.GridRowListenerAdapter;
337 aurelien 53
import com.gwtext.client.widgets.tree.TreeDragData;
54
import com.gwtext.client.widgets.tree.TreeNode;
12 david 55
 
56
/**
57
 * Liste d'observation composée de ligne d'observation
58
 * l'interface rafraichissable et l'interface vueListable
59
 *
60
 * @author David Delon 2008
61
 */
62
public class ListeObservationVue extends GridPanel implements Rafraichissable,
59 david 63
		VueListable, ListePaginable {
12 david 64
 
65
	/**
66
	 * Le médiateur associé à la vue
67
	 */
68
	private ObservationMediateur	observationMediateur		= null;
69
 
70
	/**
71
	 * Config de colonne
72
	 */
73
	private ColumnConfig	etatObservation;
1542 aurelien 74
	private ColumnConfig	referentielTaxoObservation;
12 david 75
	private ColumnConfig	nomSaisiObservation;
76
	private ColumnConfig	nomRetenuObservation;
1600 raphael 77
	private ColumnConfig	familleObservation;
12 david 78
	private ColumnConfig	lieuObservation;
1572 aurelien 79
	private ColumnConfig	altitudeObservation;
12 david 80
	private ColumnConfig	dateObservation;
81
	private ColumnConfig	ordreObservation;
1542 aurelien 82
	private ColumnConfig 	abondanceObservation;
83
	private ColumnConfig 	certitudeObservation;
12 david 84
	private ColumnModel		modeleColonnes;
85
 
86
	/**
87
	 * Store qui contient les données à afficher
88
	 */
89
	private Store			st				= null;
90
	/**
91
	 * Barre de pagination
92
	 */
59 david 93
	private BarrePaginationVue bt = null ;
12 david 94
	/**
46 david 95
	 * Numéro de page en cours
96
	 */
97
	private int pageEncours = 0 ;
98
	/**
99
	 * Nombre de pages totales
100
	 */
101
	private int pageMax = 1 ;
102
	/**
103
	 * Taille de page (par défaut 20)
104
	 */
105
	private int taillePage = 20 ;
106
	/**
107
	 * Nombre d'éléments total correspondant à la requete
108
	 */
109
	private int nbElements = 0 ;
110
 
82 david 111
	private ListeObservation cacheListeObservation = null;
46 david 112
 
101 jpm 113
	private Tool exporterObservations = null ;
114
 
133 aurelien 115
	private final int KEY_ENTER = 13;
116
 
206 aurelien 117
	private String modeleLieu = "IDLOCCOMMUNE, LIEUDIT, STATION";
250 aurelien 118
 
119
 
120
	private boolean tailleInitialisee = false ;
1542 aurelien 121
 
122
	private ColumnConfig phenologieObservation;
1599 aurelien 123
 
124
	private SortDir directionTri;
125
 
126
	private String champTri;
206 aurelien 127
 
1601 aurelien 128
	private boolean triActif;
129
 
46 david 130
	/**
12 david 131
	 * Constructeur sans arguments (privé car ne doit pas être utilisé)
132
	 */
59 david 133
	@SuppressWarnings("unused")
12 david 134
	private ListeObservationVue()
135
	{
136
		super() ;
137
	}
138
 
139
	/**
140
	 * Constructeur avec argument
141
	 * @param im le médiateur à associer
142
	 */
143
	public ListeObservationVue(ObservationMediateur obs) {
144
 
145
		this.observationMediateur = obs;
146
 
318 aurelien 147
		setId("x-list-obs");
148
 
1542 aurelien 149
		setHeader(true);
12 david 150
		// on place la barre de pagination
59 david 151
		bt = new BarrePaginationVue(this);
152
		bt.setLabelElement("Observations");
153
		bt.setTaillePageParDefaut(20);
1488 aurelien 154
		bt.setIntervallesPages(new String[] {"1000","400","200","100","50","20","10"}) ;
94 jpm 155
 
128 aurelien 156
		Toolbar barreActions = new Toolbar();
146 aurelien 157
		ToolbarButton publier = new ToolbarButton("Rendre publiques");
158
		publier.addListener(new ButtonListenerAdapter() {
1292 aurelien 159
			@Override
128 aurelien 160
			public void onClick(Button b, EventObject e) {
146 aurelien 161
				observationMediateur.transmettreObservations(true);
128 aurelien 162
			}
163
		});
146 aurelien 164
 
165
		ToolbarButton privatiser = new ToolbarButton("Rendre privées");
166
		privatiser.addListener(new ButtonListenerAdapter() {
1292 aurelien 167
			@Override
146 aurelien 168
			public void onClick(Button b, EventObject e) {
169
				observationMediateur.transmettreObservations(false);
170
			}
171
		});
172
 
128 aurelien 173
		ToolbarButton supprimer = new ToolbarButton("Supprimer");
174
		supprimer.addListener(new ButtonListenerAdapter() {
1292 aurelien 175
			@Override
128 aurelien 176
			public void onClick(Button b, EventObject e) {
177
				observationMediateur.supprimerObservations();
178
			}
179
		});
180
 
437 aurelien 181
		ToolbarButton importer = new ToolbarButton("Importer");
182
		importer.addListener(new ButtonListenerAdapter() {
1292 aurelien 183
			@Override
437 aurelien 184
			public void onClick(Button b, EventObject e) {
185
				observationMediateur.afficherFormulaireImportObservation();
186
			}
187
		});
188
 
128 aurelien 189
		ToolbarTextItem exporter = new ToolbarTextItem("<a href=\"#\" id=\"lienExport\"> Exporter </a>");
190
 
146 aurelien 191
		barreActions.addButton(publier);
192
		barreActions.addButton(privatiser);
128 aurelien 193
		barreActions.addSpacer();
194
		barreActions.addButton(supprimer);
195
		barreActions.addSpacer();
437 aurelien 196
		barreActions.addButton(importer);
197
		barreActions.addSpacer();
128 aurelien 198
		barreActions.addItem(exporter);
199
 
140 aurelien 200
		this.setTopToolbar(barreActions) ;
201
		this.setBottomToolbar(bt);
128 aurelien 202
 
129 aurelien 203
		this.setCollapsible(true);
204
		this.setTitleCollapse(true);
101 jpm 205
 
94 jpm 206
		this.setTitle("Observations") ;
1489 aurelien 207
 
208
		modeleColonnes = new ColumnModel(getConfigColonnes());
209
 
210
		this.setColumnModel(modeleColonnes);
211
 
212
		this.setAutoScroll(true);
213
		this.setEnableColumnResize(true);
214
 
215
		// creation du store
216
		RecordDef rd = new RecordDef(getDefinitionChamps());
217
		st = new Store(rd);
1601 aurelien 218
 
1489 aurelien 219
		// on associe le store
220
 
221
		this.setStore(st);
222
		this.getView().setAutoFill(true);
223
		this.getView().setForceFit(true) ;
224
 
225
		// on crée un masque de chargement qui s'affichera lors des mises à jour
226
		this.setLoadMask("Chargement");
227
 
228
		// on ajoute les listeners
229
		ajouterListeners();
230
 
231
		configDragAndDrop();
12 david 232
 
1489 aurelien 233
	}
234
 
235
	private ColumnConfig[] getConfigColonnes() {
12 david 236
		// on construit le modèle de colonnes
237
		// Le store suivant est ensuite remplacé par le store contenant les données obtenus depuis le serveur (cf rafraichir)
41 jpm 238
		Renderer colRend = new Renderer() {
239
 
1292 aurelien 240
			@Override
41 jpm 241
			public String render(Object value, CellMetadata cellMetadata,
242
					Record record, int rowIndex, int colNum, Store store) {
243
 
1542 aurelien 244
				String valeur = "";
245
				if(value != null && !value.equals("null") && !value.equals("000null") && !value.equals("0000-00-00 00:00:00")) {
246
					valeur = value.toString() ;
41 jpm 247
				}
1542 aurelien 248
				return valeur;
41 jpm 249
			}
250
		} ;
12 david 251
 
133 aurelien 252
		Renderer dateRend = new Renderer() {
253
 
1292 aurelien 254
			@Override
133 aurelien 255
			public String render(Object value, CellMetadata cellMetadata,
256
					Record record, int rowIndex, int colNum, Store store) {
257
 
258
				if(value == null || value.equals("null") || value.equals("000null") || value.equals("0000-00-00 00:00:00")) {
259
 
260
					return "" ;
261
				}
262
				else
263
				{
264
					String dateEntiere = value.toString() ;
265
					String[] dateEtHeure = dateEntiere.split(" ", 2);
266
					if(verifierFormatDate(dateEtHeure[0])) {
267
						String[] dateFormateeTab = dateEtHeure[0].split("-",3);
268
						return dateFormateeTab[2]+"/"+dateFormateeTab[1]+"/"+dateFormateeTab[0] ;
269
					}
270
				}
271
 
272
				return value.toString() ;
273
			}
274
 
275
		} ;
276
 
128 aurelien 277
		etatObservation = new ColumnConfig("Transmis", "etat_observation", 20, true, new Renderer() {
41 jpm 278
 
1292 aurelien 279
			@Override
41 jpm 280
			public String render(Object value, CellMetadata cellMetadata,
281
					Record record, int rowIndex, int colNum, Store store) {
282
				if(value.equals("1"))
283
				{
128 aurelien 284
					return "<img src=\"tela.png\"/></img>" ;
41 jpm 285
				}
286
				else
287
				{
288
					return "" ;
289
				}
290
			}
291
 
292
		});
1572 aurelien 293
 
1542 aurelien 294
		referentielTaxoObservation = new ColumnConfig("Référentiel", "referentiel_taxo_observation", 15, true, colRend);
295
		nomSaisiObservation = new ColumnConfig("Nom saisi", "nomSaisi_observation", 130, true, colRend);
296
		nomRetenuObservation = new ColumnConfig("Nom retenu", "nomRetenu_observation", 130, true, colRend);
1600 raphael 297
		familleObservation = new ColumnConfig("Famille", "famille_observation", 50, true, colRend);
1542 aurelien 298
		lieuObservation = new ColumnConfig("Lieu", "lieu_observation", 130, true, colRend);
1572 aurelien 299
		altitudeObservation = new ColumnConfig("Alt", "altitude_observation", 10, true, colRend);
1488 aurelien 300
		dateObservation = new ColumnConfig("Date", "date_observation", 70, true, dateRend);
301
		abondanceObservation = new ColumnConfig("Abondance", "abondance", 50, true, colRend);
1489 aurelien 302
		certitudeObservation = new ColumnConfig("Identification", "certitude", 50, true, new Renderer() {
303
			@Override
304
			public String render(Object value, CellMetadata cellMetadata,
305
					Record record, int rowIndex, int colNum, Store store) {
306
				return Ontologies.getCorrespondanceCertitude(record.getAsString("certitude"));
307
			}
42 jpm 308
 
1489 aurelien 309
		});
1542 aurelien 310
		phenologieObservation = new ColumnConfig("Phénologie", "phenologie", 40, true, colRend);
311
		ordreObservation = new ColumnConfig("Ordre", "ordre_observation", 70, true, colRend);
1572 aurelien 312
		ColumnConfig[] cm = {etatObservation, referentielTaxoObservation,
1600 raphael 313
							 nomSaisiObservation, certitudeObservation,
314
							 nomRetenuObservation, familleObservation,
315
							 abondanceObservation, phenologieObservation,
316
							 lieuObservation, altitudeObservation,
317
							 dateObservation, ordreObservation};
12 david 318
 
1489 aurelien 319
		return cm;
12 david 320
	}
321
 
322
 
323
	/**
324
	 * Ajoute les listeners pour la gestion des évènements
325
	 */
326
	private void ajouterListeners() {
41 jpm 327
 
1601 aurelien 328
		this.addGridHeaderListener(new GridHeaderListenerAdapter() {
329
			@Override
330
			public void onHeaderClick(GridPanel grid, int colIndex, EventObject e) {
331
				triActif = true;
332
			}
333
		});
334
 
41 jpm 335
		this.addGridRowListener(new GridRowListenerAdapter() {
12 david 336
 
337
			// gestion du clic sur une ligne
1292 aurelien 338
			@Override
41 jpm 339
			public void onRowClick(GridPanel grid, int rowIndex,
340
					EventObject e) {
216 aurelien 341
				// on notifie le médiateur et on lui passe le numéro de ligne
301 david 342
 
343
 
344
				Record rd = st.getAt(rowIndex);
345
 
71 jpm 346
				String ordreObservation = rd.getAsString("ordre_observation") ;
301 david 347
 
82 david 348
				observationMediateur.onClicListeObservation(rowIndex,ordreObservation);
41 jpm 349
 
12 david 350
			}
41 jpm 351
 
12 david 352
			// gestion du clic droit
1292 aurelien 353
			@Override
12 david 354
			public void onRowContextMenu(GridPanel grid, int rowIndex,
355
					EventObject e) {
356
				// on stoppe l'évenement pour empecher le navigateur d'afficher son propre menu
357
				e.stopEvent() ;
358
				// on notifie le médiateur en lui passant l'évenement
54 david 359
				observationMediateur.montrerContextMenu(e);
12 david 360
			}
361
 
362
			// gestion du double clic
1292 aurelien 363
			@Override
12 david 364
			public void onRowDblClick(GridPanel grid, int rowIndex,
365
					EventObject e) {
366
				// on notifie le médiateur en lui passant le numéro de ligne
54 david 367
				observationMediateur.doubleClicListeObservation(rowIndex);
12 david 368
			}
41 jpm 369
 
12 david 370
		});
371
 
133 aurelien 372
		this.addGridListener(new GridListenerAdapter() {
1292 aurelien 373
			@Override
133 aurelien 374
			public void onKeyPress(EventObject e) {
375
				if(e.getKey() == KEY_ENTER) {
376
					Record rd = getSelectionModel().getSelected();
377
					int rowIndex = st.indexOf(rd);
378
					String ordreObservation = rd.getAsString("ordre_observation") ;
379
					observationMediateur.onClicListeObservation(rowIndex, ordreObservation);
380
				}
381
			}
382
		});
383
 
128 aurelien 384
		this.addListener(new PanelListenerAdapter() {
1292 aurelien 385
			@Override
128 aurelien 386
			public void onRender(Component c) {
387
 
388
				ExtElement lienExport = Ext.get("lienExport") ;
389
				lienExport.addListener("click", new EventCallback() {
12 david 390
 
1292 aurelien 391
					@Override
128 aurelien 392
					public void execute(EventObject e) {
393
 
394
						observationMediateur.exporterObservations();
395
					}
396
 
397
				});
12 david 398
			}
128 aurelien 399
		});
275 aurelien 400
 
401
		this.addListener(new PanelListenerAdapter() {
1292 aurelien 402
			@Override
275 aurelien 403
			public void onBodyResize(Panel panel, java.lang.String width, java.lang.String height) {
318 aurelien 404
				doLayout();
275 aurelien 405
			}
406
		});
12 david 407
	}
318 aurelien 408
 
409
	/**
410
	 * Configure le drag 'n drop pour la liste
411
	 */
412
	private void configDragAndDrop()
413
	{
12 david 414
 
337 aurelien 415
		setDdGroup("ObsMotsClesGroup");
416
		setEnableDragDrop(true);
417
		setDragDropText("Glissez les observations sélectionnées sur un projet pour les lier");
318 aurelien 418
		// on fabrique la nouvelle configuration
419
		// les éléments sur lesquels on fait du drag 'n drop doivent tous avoir le même ddGroup
420
		DropTargetConfig dtc = new DropTargetConfig();
421
		dtc.setdDdGroup("ObsMotsClesGroup");
337 aurelien 422
		dtc.setTarget(true);
423
 
424
		DragDropConfig ddc = new DragDropConfig();
318 aurelien 425
 
426
		//La drop target permet de gérer l'évenement onDrop sur l'élement courant
427
		@SuppressWarnings("unused")
428
		DropTarget tg = new DropTarget(this, dtc)
429
		{
1292 aurelien 430
			@Override
318 aurelien 431
			public boolean notifyDrop(DragSource source, EventObject e, DragData data){
432
 
337 aurelien 433
				// si on reçoit des données provenant d'un arbre
434
				// on les convertit
435
				if(data instanceof TreeDragData)  {
436
			    	TreeDragData tdd = (TreeDragData)data ;
437
 
438
			    	TreeNode treeNode = tdd.getTreeNode();
439
			    	String idMc = treeNode.getId();
440
 
441
			    	int index = getView().findRowIndex(e);
351 aurelien 442
			    	if(index < 0) {
443
			    		return true;
444
			    	}
445
 
337 aurelien 446
			    	Record obsRd = getStore().getRecordAt(index);
351 aurelien 447
			    	if(obsRd == null) {
448
			    		return true;
449
			    	}
337 aurelien 450
 
451
			    	String ordreObs = obsRd.getAsString("ordre_observation");
452
 
453
			    	if(ordreObs != null) {
454
			    		observationMediateur.gererDDMotCleSurObs(ordreObs, idMc);
455
			    		return true ;
456
			    	} else {
457
			    		return true;
458
			    	}
459
				}
460
		    	return true;
318 aurelien 461
			}
462
 
1292 aurelien 463
			@Override
318 aurelien 464
			public String notifyOver(DragSource source, EventObject e, DragData data){
337 aurelien 465
 
466
				if(data instanceof TreeDragData)  {
467
			    	TreeDragData tdd = (TreeDragData)data ;
468
 
469
			    	TreeNode treeNode = tdd.getTreeNode();
470
			    	String idMc = treeNode.getId();
471
 
472
			    	int index = getView().findRowIndex(e);
473
			    	if(index < 0) {
474
			    		return "x-dd-drop-nodrop";
475
			    	}
476
 
477
			    	Record obsRd = getStore().getRecordAt(index);
478
 
351 aurelien 479
			    	if(obsRd == null) {
480
			    		return "x-dd-drop-nodrop";
481
			    	}
482
 
337 aurelien 483
			    	String ordreObs = obsRd.getAsString("ordre_observation");
484
 
485
			    	if(ordreObs != null) {
486
			    		return observationMediateur.gererOverDDMotCleSurObs(ordreObs, idMc);
487
			    	}
488
				}
489
 
490
				return "x-dd-drop-nodrop";
318 aurelien 491
			}
492
		};
493
	}
494
 
12 david 495
	/**
496
	 * Méthode héritée de l'interface VueListable
497
	 * Sélectionne les observations  dans la liste suivant les identifiants donnés en paramètres
498
	 */
1292 aurelien 499
	@Override
12 david 500
	public String[] getIdSelectionnees() {
501
 
502
		Record[] selection = this.getSelectionModel().getSelections();
503
		int taille = selection.length;
504
		String id_selection[] = new String[taille];
505
 
506
		for (int i = 0; i < selection.length; i++) {
507
 
508
			id_selection[i] = selection[i].getAsString("ordre_observation");
509
		}
510
 
511
		return id_selection;
512
	}
513
 
514
 
515
 
516
	/**
517
	 * Sélectionne des enregistrements donné
518
	 * @param sel un tableau d'enregistrement à selectionner
519
	 */
520
	public void selectionnerEnregistrements(Record[] sel) {
521
 
522
			getSelectionModel().clearSelections();
523
			getSelectionModel().selectRecords(sel);
524
 
525
	}
526
 
527
	/**
528
	 * Accesseur pour la toolbar de pagination
529
	 * @return la toolbar de pagination
530
	 */
59 david 531
	public BarrePaginationVue getToolBarVue()
12 david 532
	{
533
		return bt ;
534
	}
535
 
536
 
537
	/**
538
	 * Recherche l'élement actuellement affiché et affiche son message de chargement
539
	 */
540
	public void masquerChargement()
541
	{
1489 aurelien 542
		ExtElement masked = Ext.get(getId()) ;
12 david 543
 
1489 aurelien 544
		if (masked!=null) {
545
			masked.mask("Chargement") ;
546
		}
12 david 547
	}
548
 
549
	/**
550
	 * Recherche l'élement actuellement affiché et retire son message de chargement si l'était affiché
551
	 */
552
	public void demasquerChargement()
553
	{
155 aurelien 554
		ExtElement masked = Ext.get(getId()) ;
555
 
556
		if (masked!=null) {
323 aurelien 557
			masked.unmask() ;
155 aurelien 558
		}
12 david 559
	}
560
 
46 david 561
	/**
562
	 * Méthode héritée de l'interface rafraichissable
563
	 * @param nouvelleDonnees les nouvelles données
564
	 * @param repandreRafraichissement le booleen de notification du rafraichissement
565
	 */
1292 aurelien 566
	@Override
46 david 567
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) {
1489 aurelien 568
		// si l'on a reçu une liste d'observation
46 david 569
		if(nouvelleDonnees instanceof ListeObservation)
1489 aurelien 570
		{
46 david 571
				ListeObservation data = (ListeObservation) nouvelleDonnees ;
1600 raphael 572
				Object[][] observationData = new Object[data.size()][13];
46 david 573
				int i = 0 ;
574
 
575
				if(data.size() == 0)
576
				{
577
					pageEncours = 0 ;
578
				}
579
 
54 david 580
				// on la parse et on récupère les informations qui nous interessent
46 david 581
				for (Iterator it = data.keySet().iterator(); it.hasNext();)
582
				{
583
 
1292 aurelien 584
					Observation obs=data.get(it.next());
46 david 585
 
206 aurelien 586
					observationData[i][0] = obs.getTransmis();
1542 aurelien 587
					observationData[i][1] = obs.getCodeCourtReferentielTaxo();
588
					observationData[i][2] = obs.getNomSaisi();
589
					observationData[i][3] = obs.getCertitude();
590
					observationData[i][4] = obs.getNomRetenu();
1600 raphael 591
					observationData[i][5] = obs.getFamille();
592
					observationData[i][6] = obs.getAbondance();
593
					observationData[i][7] = obs.getPhenologie();
594
					observationData[i][8] = Util.formaterLieu(obs, modeleLieu);
595
					observationData[i][9] = formaterAltitude(obs.getAltitude());
596
					observationData[i][10] = obs.getDate();
597
					observationData[i][11] = obs.getNumeroOrdre();
598
					observationData[i][12] = obs.getNumeroNomenclaturalSaisi();
46 david 599
 
600
					i++ ;
601
				}
602
 
1489 aurelien 603
				RecordDef rd = new RecordDef(getDefinitionChamps());
46 david 604
 
605
				final MemoryProxy dataProxy = new MemoryProxy(observationData);
606
				final ArrayReader reader = new ArrayReader(rd);
607
 
608
				final Store observationStore = new Store(dataProxy, reader);
609
 
610
				st = observationStore ;
611
				st.load() ;
1607 aurelien 612
 
46 david 613
				// et on reconfigure et rafraichit la vue
614
				this.reconfigure(st, this.getColumnModel());
615
				demasquerChargement();
82 david 616
			    cacheListeObservation=data;
1489 aurelien 617
				observationMediateur.onRafraichissementListeObservations();
46 david 618
		}
619
 
620
		// Si on reçoit un tableau d'entiers
621
		// c'est un tableau d'un seul entier qui est le nombre d'observation correspondant aux critères
622
		if(nouvelleDonnees instanceof int[])
623
		{
624
			int[] pages = (int[])nouvelleDonnees ;
625
 
626
			// on calcule le nombre de pages nécessaires et on les met à jour dans le modèle
627
			pageMax  = calculerNbPages(pages[0]) ;
628
			nbElements = pages[0] ;
629
 
52 david 630
 
46 david 631
			// et on notifie de le mediateur du changement des valeurs
51 david 632
			changerPageMaxEtCourante(pageMax,pageEncours,taillePage,pages[0]) ;
46 david 633
 
1542 aurelien 634
			if(nbElements > 0) {
635
				masquerChargement();
636
				observationMediateur.obtenirListeObservation(this);
637
			} else {
638
				this.rafraichir(new ListeObservation(0), false);
639
			}
46 david 640
		}
641
 
642
 
655 aurelien 643
		// si l'on a reçu une Observation
46 david 644
		if(nouvelleDonnees instanceof Observation) {
1607 aurelien 645
			// la modification ou suppression d'un élément dans la liste provoque un bug sur l'état du tri
646
			// on l'enregistre donc avant suppression
647
			enregistrerEtatTri();
79 david 648
			Observation obs= (Observation) nouvelleDonnees;
655 aurelien 649
			if (obs.getNumeroOrdre()==null) {
650
 
651
				// Nouvelle observation
652
				// On affiche la dernière page
653
				pageEncours = pageMax ;
654
				masquerChargement();
655
 
656
				observationMediateur.obtenirNombreObservation();
52 david 657
 
79 david 658
			}
659
			else { // Modification d'une observation
727 aurelien 660
 
82 david 661
				masquerChargement();
94 jpm 662
				observationMediateur.obtenirNombreObservation();
79 david 663
			}
107 aurelien 664
		}
74 david 665
 
107 aurelien 666
		// Si on a effectué une suppression
667
		if(nouvelleDonnees instanceof String)
668
		{
1607 aurelien 669
			// la modification ou suppression d'un élément dans la liste provoque un bug sur l'état du tri
670
			// on l'enregistre donc avant suppression
671
			enregistrerEtatTri();
107 aurelien 672
			observationMediateur.obtenirNombreObservation() ;
673
		}
674
 
361 aurelien 675
		if(!getTailleInitialisee()) {
676
			if((int)Math.round(observationMediateur.getPanneauPrincipalObservation().getHeight() * 0.6) != 0) {
677
				doLayout();
678
				setTailleInitialisee();
679
			}
680
		}
1607 aurelien 681
 
682
		// réaffectation du tri courant si nécessaire
683
		if(directionTri != null && champTri != null) {
684
			st.sort(champTri, directionTri);
685
		}
1489 aurelien 686
	}
687
 
1572 aurelien 688
	private String formaterAltitude(String alt) {
689
		String alfFmt = Util.formaterNombre(alt);
690
		if(!alfFmt.isEmpty() && !Util.estZero(alfFmt)) {
691
			alfFmt = alfFmt+" m.";
692
		}
693
		return alfFmt;
694
	}
695
 
1489 aurelien 696
	private FieldDef[] getDefinitionChamps() {
697
		// creation du store qui les contient
698
		FieldDef defEtatObservation = new StringFieldDef("etat_observation");
1542 aurelien 699
		FieldDef defRefTaxObservation = new StringFieldDef("referentiel_taxo_observation");
1489 aurelien 700
		FieldDef defNomSaisiObservation = new StringFieldDef("nomSaisi_observation");
701
		FieldDef defCertitudeObservation = new StringFieldDef("certitude");
702
		FieldDef defNomRetenuObservation = new StringFieldDef("nomRetenu_observation");
1600 raphael 703
		FieldDef defFamilleObservation = new StringFieldDef("famille_observation");
1489 aurelien 704
		FieldDef defAbondanceObservation = new StringFieldDef("abondance");
1542 aurelien 705
		FieldDef defPhenologieObservation = new StringFieldDef("phenologie");
1489 aurelien 706
		FieldDef defLieuObservation = new StringFieldDef("lieu_observation");
1572 aurelien 707
		FieldDef defAltObservation = new StringFieldDef("altitude_observation");
1489 aurelien 708
		FieldDef defDateObservation = new StringFieldDef("date_observation");
709
		FieldDef defOrdreObservation = new IntegerFieldDef("ordre_observation");
361 aurelien 710
 
1489 aurelien 711
		// Non affiches :
712
		FieldDef defNumeroNomenclaturalSaisiObservation = new StringFieldDef("numeroNomenclaturalSaisi_observation");
713
 
1600 raphael 714
		FieldDef[] defTab = {defEtatObservation, defRefTaxObservation,defNomSaisiObservation, defCertitudeObservation, defNomRetenuObservation, defFamilleObservation, defAbondanceObservation,
1572 aurelien 715
				defPhenologieObservation, defLieuObservation, defAltObservation, defDateObservation, defOrdreObservation, defNumeroNomenclaturalSaisiObservation };
1489 aurelien 716
 
717
		return defTab;
46 david 718
	}
51 david 719
 
720
 
721
	// GESTION DE LA PAGINATION
82 david 722
	public ListeObservation getCacheListeObservation() {
723
		return cacheListeObservation;
724
	}
725
 
46 david 726
	/**
727
	 * Calcule le nombre de pages nécessaires pour afficher un nombre d'élements donnés en fonction de la taille de page
728
	 * en cours
729
	 * @param nbElements le nombre d'élements total
730
	 * @return le nombre de pages
731
	 */
732
	public int calculerNbPages(int nbElements)
733
	{
734
		// A cause de la betise de java pour les conversion implicite on fait quelques conversions manuellement
735
		// pour eviter qu'il arrondisse mal la division
1489 aurelien 736
		// nombre de pages = (nombre d'element / taille de la page) arrondi à l'entier superieur
46 david 737
		double nPage = (1.0*nbElements)/(1.0*taillePage) ;
738
		double nPageRound = Math.ceil(nPage) ;
739
		Double nPageInt = new Double(nPageRound) ;
740
 
741
		return nPageInt.intValue() ;
742
	}
743
 
744
	/**
745
	 * Recalcule la page en cours lors du changement du nombre d'élements
746
	 * @param nbElements le nombre d'élements total
747
	 * @return la nouvelle page encours
748
	 */
749
	public int calculerPageCourante(int nbElements)
750
	{
751
		// on calcule le nombre de page
752
		int nouvelNbPages = calculerNbPages(nbElements) ;
753
		// la nouvelle page en cours
754
		double nPageCourante = (1.0*pageEncours)/(1.0*pageMax) * (1.0*nouvelNbPages) ;
755
 
756
		// on arrondit au supérieur
757
		double nPageRound = Math.ceil(nPageCourante) ;
758
		Double nPageInt = new Double(nPageRound) ;
759
 
760
		return Math.abs(nPageInt.intValue()) ;
761
	}
762
 
763
	/**
764
	 * Appelle le modèle pour lui demander les données d'une page à afficher
765
	 * @param pageCourante le numéro de page à affciher
766
	 */
1292 aurelien 767
	@Override
46 david 768
	public void changerNumeroPage(int pageCourante) {
769
		pageEncours = pageCourante ;
54 david 770
		masquerChargement();
1599 aurelien 771
 
772
		enregistrerEtatTri();
46 david 773
		// On lance le chargerment des observations
774
		observationMediateur.obtenirNombreObservation();
1489 aurelien 775
		getToolBarVue().changerPageCourante(pageCourante);
46 david 776
	}
777
 
778
 
779
	/**
780
	 * Appelle le modèle pour qu'il change la taille de page utilisée
781
	 * @param nouvelleTaillePage la nouvelle taille de page
782
	 */
1292 aurelien 783
	@Override
1489 aurelien 784
	public void changerTaillePage(int nouvelleTaillePage) {
46 david 785
 
786
		taillePage = nouvelleTaillePage ;
787
		pageEncours = calculerPageCourante(nbElements) ;
1599 aurelien 788
 
789
		enregistrerEtatTri();
46 david 790
 
54 david 791
		masquerChargement();
792
 
61 jpm 793
		// 	On lance le chargement des observations
46 david 794
		observationMediateur.obtenirNombreObservation();
795
 
796
		// et on met à jour la taille de page dans les barres d'outils
1489 aurelien 797
		getToolBarVue().selectionnerTaillePage(nouvelleTaillePage);
46 david 798
	}
799
 
800
 
51 david 801
	/**
802
	 * Met à jour les barre d'outils avec des nouvelles valeurs
803
	 * @param pageMax le nombre de pages
804
	 * @param pageEncours la page en cours
805
	 * @param taillePage la taille de page
806
	 * @param nbElement le nombre d'élements par page
807
	 */
1489 aurelien 808
	public void changerPageMaxEtCourante(int pageMax, int pageEncours, int taillePage, int nbElement) {
51 david 809
		int[] pages = {pageMax,pageEncours, taillePage, nbElement} ;
810
		getToolBarVue().rafraichir(pages, false) ;
811
	}
46 david 812
 
61 jpm 813
	/**
814
	 * Renvoie la taille de page en cours d'utilisation
815
	 * @return la taille de page
816
	 */
46 david 817
	public int getTaillePage() {
818
 
819
		return taillePage;
820
	}
61 jpm 821
 
822
	/**
823
	 * Renvoie le numéro de la page encours (attention on commence à 0)
824
	 * @return le numéro de la page en cours
825
	 */
46 david 826
	public int getPageEncours() {
827
 
828
		return pageEncours;
829
	}
830
 
1599 aurelien 831
	private void enregistrerEtatTri() {
1601 aurelien 832
		if(triActif) {
833
			this.directionTri = st.getSortState().getDirection();
834
			this.champTri = st.getSortState().getField();
835
		}
1599 aurelien 836
	}
837
 
682 aurelien 838
	public void afficherFiltres(String[][] filtresEnCours) {
94 jpm 839
 
682 aurelien 840
		String texteFiltresEnCours = "";
94 jpm 841
 
682 aurelien 842
		for(int i = 0; i < filtresEnCours.length; i++) {
843
			if(Util.filtreValide(filtresEnCours[i])) {
844
 
845
				if(!texteFiltresEnCours.equals("")) {
846
					texteFiltresEnCours += " - ";
847
				}
848
 
849
				texteFiltresEnCours += "<span class=\"affichage_filtre\">"+
850
											transformerNomFiltre(filtresEnCours[i][0])+": "+transformerValeurFiltre(filtresEnCours[i][0], filtresEnCours[i][1])+
965 aurelien 851
									   " <input value=\"X\" type=\"button\" rel=\""+filtresEnCours[i][0]+"\" id=\"bouton_raz_filtres_obs_"+filtresEnCours[i][0]+"\" />"+
682 aurelien 852
										"</span>";
853
			}
854
		}
655 aurelien 855
 
682 aurelien 856
		if(!texteFiltresEnCours.equals("")) {
857
			texteFiltresEnCours = "- <span class=\"indicateur_filtres\"> Filtres - "+texteFiltresEnCours+"</span>";
858
		}
655 aurelien 859
 
682 aurelien 860
		this.setTitle("Observations"+texteFiltresEnCours) ;
655 aurelien 861
 
682 aurelien 862
		for(int i = 0; i < filtresEnCours.length; i++) {
94 jpm 863
 
682 aurelien 864
			if(Util.filtreValide(filtresEnCours[i])) {
965 aurelien 865
				if(Ext.get("bouton_raz_filtres_obs_"+filtresEnCours[i][0]) != null) {
682 aurelien 866
 
965 aurelien 867
					Ext.get("bouton_raz_filtres_obs_"+filtresEnCours[i][0]).addListener("click", new EventCallback() {
682 aurelien 868
 
1292 aurelien 869
						@Override
682 aurelien 870
						public void execute(EventObject e) {
871
							e.stopEvent();
872
							observationMediateur.viderFiltre(e.getTarget().getAttribute("rel"));
873
						}
874
 
875
					});
876
				}
877
			}
94 jpm 878
		}
682 aurelien 879
	}
880
 
881
	private String transformerNomFiltre(String nomFiltre) {
882
 
965 aurelien 883
		if(nomFiltre.equals("departement")) {
682 aurelien 884
			nomFiltre = "departement";
94 jpm 885
		}
886
 
965 aurelien 887
		if(nomFiltre.equals("commune")) {
682 aurelien 888
			nomFiltre = "commune";
250 aurelien 889
		}
890
 
682 aurelien 891
		if(nomFiltre.equals("nom_taxon")) {
892
			nomFiltre = "recherche";
893
		}
655 aurelien 894
 
965 aurelien 895
		if(nomFiltre.equals("id_mots_cles")) {
682 aurelien 896
			nomFiltre = "projets";
655 aurelien 897
		}
898
 
682 aurelien 899
		return nomFiltre;
900
 
94 jpm 901
	}
682 aurelien 902
 
903
	private String transformerValeurFiltre(String nomFiltre, String valeurFiltre) {
904
 
905
		String valeurFiltreTransformee = valeurFiltre;
906
 
965 aurelien 907
		if(nomFiltre.equals("id_mots_cles")) {
682 aurelien 908
 
909
			String[] tabMotsCles = valeurFiltre.split(";");
910
			String[] tabMotsClesTexte = observationMediateur.obtenirTexteMotsCles(tabMotsCles);
911
 
912
			if(tabMotsClesTexte.length > 1) {
913
				valeurFiltreTransformee = Util.implode(",", tabMotsClesTexte);
914
			} else {
915
				valeurFiltreTransformee = tabMotsClesTexte[0];
916
			}
917
		}
918
 
919
		if(nomFiltre.equals("mois")) {
920
			valeurFiltreTransformee = Util.renvoyerMois(Integer.parseInt(valeurFiltre));
921
		}
922
 
923
		valeurFiltreTransformee = valeurFiltreTransformee.replaceAll("000null", "inconnue");
1332 aurelien 924
		valeurFiltreTransformee = valeurFiltreTransformee.replaceAll("null", "inconnue");
925
		valeurFiltreTransformee = valeurFiltreTransformee.replaceAll("NULL", "inconnue");
46 david 926
 
682 aurelien 927
		return valeurFiltreTransformee;
928
 
929
	}
930
 
1489 aurelien 931
	public void raz() {
932
		RecordDef rd = new RecordDef(getDefinitionChamps());
104 jpm 933
		st = new Store(rd);
934
		// on associe le store
1489 aurelien 935
		this.setStore(st);
104 jpm 936
	}
133 aurelien 937
 
938
	public boolean verifierFormatDate(String date) {
939
 
940
		String regex = "[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}" ;
941
		if(date.matches(regex) && !date.equals("0000-00-00")) {
942
			return true ;
943
		}
944
		else {
945
			return false;
946
		}
947
	}
206 aurelien 948
 
250 aurelien 949
	public boolean getTailleInitialisee() {
950
		return tailleInitialisee ;
951
	}
952
 
953
	public void setTailleInitialisee() {
954
		tailleInitialisee = true;
955
	}
12 david 956
}