Subversion Repositories eFlore/Applications.cel

Rev

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