Subversion Repositories eFlore/Applications.cel

Rev

Rev 1607 | 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") ;
82 david 347
				observationMediateur.onClicListeObservation(rowIndex,ordreObservation);
41 jpm 348
 
12 david 349
			}
41 jpm 350
 
12 david 351
			// gestion du clic droit
1292 aurelien 352
			@Override
12 david 353
			public void onRowContextMenu(GridPanel grid, int rowIndex,
354
					EventObject e) {
355
				// on stoppe l'évenement pour empecher le navigateur d'afficher son propre menu
356
				e.stopEvent() ;
357
				// on notifie le médiateur en lui passant l'évenement
54 david 358
				observationMediateur.montrerContextMenu(e);
12 david 359
			}
360
 
361
			// gestion du double clic
1292 aurelien 362
			@Override
12 david 363
			public void onRowDblClick(GridPanel grid, int rowIndex,
364
					EventObject e) {
365
				// on notifie le médiateur en lui passant le numéro de ligne
54 david 366
				observationMediateur.doubleClicListeObservation(rowIndex);
12 david 367
			}
41 jpm 368
 
12 david 369
		});
370
 
133 aurelien 371
		this.addGridListener(new GridListenerAdapter() {
1292 aurelien 372
			@Override
133 aurelien 373
			public void onKeyPress(EventObject e) {
374
				if(e.getKey() == KEY_ENTER) {
375
					Record rd = getSelectionModel().getSelected();
376
					int rowIndex = st.indexOf(rd);
377
					String ordreObservation = rd.getAsString("ordre_observation") ;
378
					observationMediateur.onClicListeObservation(rowIndex, ordreObservation);
379
				}
380
			}
381
		});
382
 
128 aurelien 383
		this.addListener(new PanelListenerAdapter() {
1292 aurelien 384
			@Override
128 aurelien 385
			public void onRender(Component c) {
386
 
387
				ExtElement lienExport = Ext.get("lienExport") ;
388
				lienExport.addListener("click", new EventCallback() {
12 david 389
 
1292 aurelien 390
					@Override
128 aurelien 391
					public void execute(EventObject e) {
392
 
393
						observationMediateur.exporterObservations();
394
					}
395
 
396
				});
12 david 397
			}
128 aurelien 398
		});
275 aurelien 399
 
400
		this.addListener(new PanelListenerAdapter() {
1292 aurelien 401
			@Override
275 aurelien 402
			public void onBodyResize(Panel panel, java.lang.String width, java.lang.String height) {
318 aurelien 403
				doLayout();
275 aurelien 404
			}
405
		});
12 david 406
	}
318 aurelien 407
 
408
	/**
409
	 * Configure le drag 'n drop pour la liste
410
	 */
411
	private void configDragAndDrop()
412
	{
12 david 413
 
337 aurelien 414
		setDdGroup("ObsMotsClesGroup");
415
		setEnableDragDrop(true);
416
		setDragDropText("Glissez les observations sélectionnées sur un projet pour les lier");
318 aurelien 417
		// on fabrique la nouvelle configuration
418
		// les éléments sur lesquels on fait du drag 'n drop doivent tous avoir le même ddGroup
419
		DropTargetConfig dtc = new DropTargetConfig();
420
		dtc.setdDdGroup("ObsMotsClesGroup");
337 aurelien 421
		dtc.setTarget(true);
422
 
423
		DragDropConfig ddc = new DragDropConfig();
318 aurelien 424
 
425
		//La drop target permet de gérer l'évenement onDrop sur l'élement courant
426
		@SuppressWarnings("unused")
427
		DropTarget tg = new DropTarget(this, dtc)
428
		{
1292 aurelien 429
			@Override
318 aurelien 430
			public boolean notifyDrop(DragSource source, EventObject e, DragData data){
431
 
337 aurelien 432
				// si on reçoit des données provenant d'un arbre
433
				// on les convertit
434
				if(data instanceof TreeDragData)  {
435
			    	TreeDragData tdd = (TreeDragData)data ;
436
 
437
			    	TreeNode treeNode = tdd.getTreeNode();
438
			    	String idMc = treeNode.getId();
439
 
440
			    	int index = getView().findRowIndex(e);
351 aurelien 441
			    	if(index < 0) {
442
			    		return true;
443
			    	}
444
 
337 aurelien 445
			    	Record obsRd = getStore().getRecordAt(index);
351 aurelien 446
			    	if(obsRd == null) {
447
			    		return true;
448
			    	}
337 aurelien 449
 
450
			    	String ordreObs = obsRd.getAsString("ordre_observation");
451
 
452
			    	if(ordreObs != null) {
453
			    		observationMediateur.gererDDMotCleSurObs(ordreObs, idMc);
454
			    		return true ;
455
			    	} else {
456
			    		return true;
457
			    	}
458
				}
459
		    	return true;
318 aurelien 460
			}
461
 
1292 aurelien 462
			@Override
318 aurelien 463
			public String notifyOver(DragSource source, EventObject e, DragData data){
337 aurelien 464
 
465
				if(data instanceof TreeDragData)  {
466
			    	TreeDragData tdd = (TreeDragData)data ;
467
 
468
			    	TreeNode treeNode = tdd.getTreeNode();
469
			    	String idMc = treeNode.getId();
470
 
471
			    	int index = getView().findRowIndex(e);
472
			    	if(index < 0) {
473
			    		return "x-dd-drop-nodrop";
474
			    	}
475
 
476
			    	Record obsRd = getStore().getRecordAt(index);
477
 
351 aurelien 478
			    	if(obsRd == null) {
479
			    		return "x-dd-drop-nodrop";
480
			    	}
481
 
337 aurelien 482
			    	String ordreObs = obsRd.getAsString("ordre_observation");
483
 
484
			    	if(ordreObs != null) {
485
			    		return observationMediateur.gererOverDDMotCleSurObs(ordreObs, idMc);
486
			    	}
487
				}
488
 
489
				return "x-dd-drop-nodrop";
318 aurelien 490
			}
491
		};
492
	}
493
 
12 david 494
	/**
495
	 * Méthode héritée de l'interface VueListable
496
	 * Sélectionne les observations  dans la liste suivant les identifiants donnés en paramètres
497
	 */
1292 aurelien 498
	@Override
12 david 499
	public String[] getIdSelectionnees() {
500
 
501
		Record[] selection = this.getSelectionModel().getSelections();
502
		int taille = selection.length;
503
		String id_selection[] = new String[taille];
504
 
505
		for (int i = 0; i < selection.length; i++) {
506
 
507
			id_selection[i] = selection[i].getAsString("ordre_observation");
508
		}
509
 
510
		return id_selection;
511
	}
512
 
513
 
514
 
515
	/**
516
	 * Sélectionne des enregistrements donné
517
	 * @param sel un tableau d'enregistrement à selectionner
518
	 */
519
	public void selectionnerEnregistrements(Record[] sel) {
520
 
521
			getSelectionModel().clearSelections();
522
			getSelectionModel().selectRecords(sel);
523
 
524
	}
525
 
526
	/**
527
	 * Accesseur pour la toolbar de pagination
528
	 * @return la toolbar de pagination
529
	 */
59 david 530
	public BarrePaginationVue getToolBarVue()
12 david 531
	{
532
		return bt ;
533
	}
534
 
535
 
536
	/**
537
	 * Recherche l'élement actuellement affiché et affiche son message de chargement
538
	 */
539
	public void masquerChargement()
540
	{
1489 aurelien 541
		ExtElement masked = Ext.get(getId()) ;
12 david 542
 
1489 aurelien 543
		if (masked!=null) {
544
			masked.mask("Chargement") ;
545
		}
12 david 546
	}
547
 
548
	/**
549
	 * Recherche l'élement actuellement affiché et retire son message de chargement si l'était affiché
550
	 */
551
	public void demasquerChargement()
552
	{
155 aurelien 553
		ExtElement masked = Ext.get(getId()) ;
554
 
555
		if (masked!=null) {
323 aurelien 556
			masked.unmask() ;
155 aurelien 557
		}
12 david 558
	}
559
 
46 david 560
	/**
561
	 * Méthode héritée de l'interface rafraichissable
562
	 * @param nouvelleDonnees les nouvelles données
563
	 * @param repandreRafraichissement le booleen de notification du rafraichissement
564
	 */
1292 aurelien 565
	@Override
46 david 566
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) {
1489 aurelien 567
		// si l'on a reçu une liste d'observation
46 david 568
		if(nouvelleDonnees instanceof ListeObservation)
1489 aurelien 569
		{
46 david 570
				ListeObservation data = (ListeObservation) nouvelleDonnees ;
1600 raphael 571
				Object[][] observationData = new Object[data.size()][13];
46 david 572
				int i = 0 ;
573
 
574
				if(data.size() == 0)
575
				{
576
					pageEncours = 0 ;
577
				}
578
 
54 david 579
				// on la parse et on récupère les informations qui nous interessent
46 david 580
				for (Iterator it = data.keySet().iterator(); it.hasNext();)
581
				{
582
 
1292 aurelien 583
					Observation obs=data.get(it.next());
46 david 584
 
206 aurelien 585
					observationData[i][0] = obs.getTransmis();
1542 aurelien 586
					observationData[i][1] = obs.getCodeCourtReferentielTaxo();
587
					observationData[i][2] = obs.getNomSaisi();
588
					observationData[i][3] = obs.getCertitude();
589
					observationData[i][4] = obs.getNomRetenu();
1600 raphael 590
					observationData[i][5] = obs.getFamille();
591
					observationData[i][6] = obs.getAbondance();
592
					observationData[i][7] = obs.getPhenologie();
593
					observationData[i][8] = Util.formaterLieu(obs, modeleLieu);
594
					observationData[i][9] = formaterAltitude(obs.getAltitude());
595
					observationData[i][10] = obs.getDate();
596
					observationData[i][11] = obs.getNumeroOrdre();
597
					observationData[i][12] = obs.getNumeroNomenclaturalSaisi();
46 david 598
 
599
					i++ ;
600
				}
601
 
1489 aurelien 602
				RecordDef rd = new RecordDef(getDefinitionChamps());
46 david 603
 
604
				final MemoryProxy dataProxy = new MemoryProxy(observationData);
605
				final ArrayReader reader = new ArrayReader(rd);
606
 
607
				final Store observationStore = new Store(dataProxy, reader);
608
 
609
				st = observationStore ;
610
				st.load() ;
1607 aurelien 611
 
46 david 612
				// et on reconfigure et rafraichit la vue
613
				this.reconfigure(st, this.getColumnModel());
614
				demasquerChargement();
82 david 615
			    cacheListeObservation=data;
1489 aurelien 616
				observationMediateur.onRafraichissementListeObservations();
46 david 617
		}
618
 
619
		// Si on reçoit un tableau d'entiers
620
		// c'est un tableau d'un seul entier qui est le nombre d'observation correspondant aux critères
621
		if(nouvelleDonnees instanceof int[])
622
		{
623
			int[] pages = (int[])nouvelleDonnees ;
624
 
625
			// on calcule le nombre de pages nécessaires et on les met à jour dans le modèle
626
			pageMax  = calculerNbPages(pages[0]) ;
627
			nbElements = pages[0] ;
628
 
52 david 629
 
46 david 630
			// et on notifie de le mediateur du changement des valeurs
51 david 631
			changerPageMaxEtCourante(pageMax,pageEncours,taillePage,pages[0]) ;
46 david 632
 
1542 aurelien 633
			if(nbElements > 0) {
634
				masquerChargement();
635
				observationMediateur.obtenirListeObservation(this);
636
			} else {
637
				this.rafraichir(new ListeObservation(0), false);
638
			}
46 david 639
		}
640
 
641
 
655 aurelien 642
		// si l'on a reçu une Observation
46 david 643
		if(nouvelleDonnees instanceof Observation) {
1607 aurelien 644
			// la modification ou suppression d'un élément dans la liste provoque un bug sur l'état du tri
645
			// on l'enregistre donc avant suppression
646
			enregistrerEtatTri();
79 david 647
			Observation obs= (Observation) nouvelleDonnees;
655 aurelien 648
			if (obs.getNumeroOrdre()==null) {
649
 
650
				// Nouvelle observation
651
				// On affiche la dernière page
652
				pageEncours = pageMax ;
653
				masquerChargement();
654
 
655
				observationMediateur.obtenirNombreObservation();
52 david 656
 
79 david 657
			}
658
			else { // Modification d'une observation
727 aurelien 659
 
82 david 660
				masquerChargement();
94 jpm 661
				observationMediateur.obtenirNombreObservation();
79 david 662
			}
107 aurelien 663
		}
74 david 664
 
107 aurelien 665
		// Si on a effectué une suppression
666
		if(nouvelleDonnees instanceof String)
667
		{
1607 aurelien 668
			// la modification ou suppression d'un élément dans la liste provoque un bug sur l'état du tri
669
			// on l'enregistre donc avant suppression
670
			enregistrerEtatTri();
107 aurelien 671
			observationMediateur.obtenirNombreObservation() ;
672
		}
673
 
361 aurelien 674
		if(!getTailleInitialisee()) {
675
			if((int)Math.round(observationMediateur.getPanneauPrincipalObservation().getHeight() * 0.6) != 0) {
676
				doLayout();
677
				setTailleInitialisee();
678
			}
679
		}
1607 aurelien 680
 
681
		// réaffectation du tri courant si nécessaire
682
		if(directionTri != null && champTri != null) {
683
			st.sort(champTri, directionTri);
684
		}
1489 aurelien 685
	}
686
 
1572 aurelien 687
	private String formaterAltitude(String alt) {
688
		String alfFmt = Util.formaterNombre(alt);
689
		if(!alfFmt.isEmpty() && !Util.estZero(alfFmt)) {
690
			alfFmt = alfFmt+" m.";
691
		}
692
		return alfFmt;
693
	}
694
 
1489 aurelien 695
	private FieldDef[] getDefinitionChamps() {
696
		// creation du store qui les contient
697
		FieldDef defEtatObservation = new StringFieldDef("etat_observation");
1542 aurelien 698
		FieldDef defRefTaxObservation = new StringFieldDef("referentiel_taxo_observation");
1489 aurelien 699
		FieldDef defNomSaisiObservation = new StringFieldDef("nomSaisi_observation");
700
		FieldDef defCertitudeObservation = new StringFieldDef("certitude");
701
		FieldDef defNomRetenuObservation = new StringFieldDef("nomRetenu_observation");
1600 raphael 702
		FieldDef defFamilleObservation = new StringFieldDef("famille_observation");
1489 aurelien 703
		FieldDef defAbondanceObservation = new StringFieldDef("abondance");
1542 aurelien 704
		FieldDef defPhenologieObservation = new StringFieldDef("phenologie");
1489 aurelien 705
		FieldDef defLieuObservation = new StringFieldDef("lieu_observation");
1572 aurelien 706
		FieldDef defAltObservation = new StringFieldDef("altitude_observation");
1489 aurelien 707
		FieldDef defDateObservation = new StringFieldDef("date_observation");
708
		FieldDef defOrdreObservation = new IntegerFieldDef("ordre_observation");
361 aurelien 709
 
1489 aurelien 710
		// Non affiches :
711
		FieldDef defNumeroNomenclaturalSaisiObservation = new StringFieldDef("numeroNomenclaturalSaisi_observation");
712
 
1600 raphael 713
		FieldDef[] defTab = {defEtatObservation, defRefTaxObservation,defNomSaisiObservation, defCertitudeObservation, defNomRetenuObservation, defFamilleObservation, defAbondanceObservation,
1572 aurelien 714
				defPhenologieObservation, defLieuObservation, defAltObservation, defDateObservation, defOrdreObservation, defNumeroNomenclaturalSaisiObservation };
1489 aurelien 715
 
716
		return defTab;
46 david 717
	}
51 david 718
 
719
 
720
	// GESTION DE LA PAGINATION
82 david 721
	public ListeObservation getCacheListeObservation() {
722
		return cacheListeObservation;
723
	}
724
 
46 david 725
	/**
726
	 * Calcule le nombre de pages nécessaires pour afficher un nombre d'élements donnés en fonction de la taille de page
727
	 * en cours
728
	 * @param nbElements le nombre d'élements total
729
	 * @return le nombre de pages
730
	 */
731
	public int calculerNbPages(int nbElements)
732
	{
733
		// A cause de la betise de java pour les conversion implicite on fait quelques conversions manuellement
734
		// pour eviter qu'il arrondisse mal la division
1489 aurelien 735
		// nombre de pages = (nombre d'element / taille de la page) arrondi à l'entier superieur
46 david 736
		double nPage = (1.0*nbElements)/(1.0*taillePage) ;
737
		double nPageRound = Math.ceil(nPage) ;
738
		Double nPageInt = new Double(nPageRound) ;
739
 
740
		return nPageInt.intValue() ;
741
	}
742
 
743
	/**
744
	 * Recalcule la page en cours lors du changement du nombre d'élements
745
	 * @param nbElements le nombre d'élements total
746
	 * @return la nouvelle page encours
747
	 */
748
	public int calculerPageCourante(int nbElements)
749
	{
750
		// on calcule le nombre de page
751
		int nouvelNbPages = calculerNbPages(nbElements) ;
752
		// la nouvelle page en cours
753
		double nPageCourante = (1.0*pageEncours)/(1.0*pageMax) * (1.0*nouvelNbPages) ;
754
 
755
		// on arrondit au supérieur
756
		double nPageRound = Math.ceil(nPageCourante) ;
757
		Double nPageInt = new Double(nPageRound) ;
758
 
759
		return Math.abs(nPageInt.intValue()) ;
760
	}
761
 
762
	/**
763
	 * Appelle le modèle pour lui demander les données d'une page à afficher
764
	 * @param pageCourante le numéro de page à affciher
765
	 */
1292 aurelien 766
	@Override
46 david 767
	public void changerNumeroPage(int pageCourante) {
768
		pageEncours = pageCourante ;
54 david 769
		masquerChargement();
1599 aurelien 770
 
771
		enregistrerEtatTri();
46 david 772
		// On lance le chargerment des observations
773
		observationMediateur.obtenirNombreObservation();
1489 aurelien 774
		getToolBarVue().changerPageCourante(pageCourante);
46 david 775
	}
776
 
777
 
778
	/**
779
	 * Appelle le modèle pour qu'il change la taille de page utilisée
780
	 * @param nouvelleTaillePage la nouvelle taille de page
781
	 */
1292 aurelien 782
	@Override
1489 aurelien 783
	public void changerTaillePage(int nouvelleTaillePage) {
46 david 784
 
785
		taillePage = nouvelleTaillePage ;
786
		pageEncours = calculerPageCourante(nbElements) ;
1599 aurelien 787
 
788
		enregistrerEtatTri();
46 david 789
 
54 david 790
		masquerChargement();
791
 
61 jpm 792
		// 	On lance le chargement des observations
46 david 793
		observationMediateur.obtenirNombreObservation();
794
 
795
		// et on met à jour la taille de page dans les barres d'outils
1489 aurelien 796
		getToolBarVue().selectionnerTaillePage(nouvelleTaillePage);
46 david 797
	}
798
 
799
 
51 david 800
	/**
801
	 * Met à jour les barre d'outils avec des nouvelles valeurs
802
	 * @param pageMax le nombre de pages
803
	 * @param pageEncours la page en cours
804
	 * @param taillePage la taille de page
805
	 * @param nbElement le nombre d'élements par page
806
	 */
1489 aurelien 807
	public void changerPageMaxEtCourante(int pageMax, int pageEncours, int taillePage, int nbElement) {
51 david 808
		int[] pages = {pageMax,pageEncours, taillePage, nbElement} ;
809
		getToolBarVue().rafraichir(pages, false) ;
810
	}
46 david 811
 
61 jpm 812
	/**
813
	 * Renvoie la taille de page en cours d'utilisation
814
	 * @return la taille de page
815
	 */
46 david 816
	public int getTaillePage() {
817
 
818
		return taillePage;
819
	}
61 jpm 820
 
821
	/**
822
	 * Renvoie le numéro de la page encours (attention on commence à 0)
823
	 * @return le numéro de la page en cours
824
	 */
46 david 825
	public int getPageEncours() {
826
 
827
		return pageEncours;
828
	}
829
 
1599 aurelien 830
	private void enregistrerEtatTri() {
1601 aurelien 831
		if(triActif) {
832
			this.directionTri = st.getSortState().getDirection();
833
			this.champTri = st.getSortState().getField();
834
		}
1599 aurelien 835
	}
836
 
682 aurelien 837
	public void afficherFiltres(String[][] filtresEnCours) {
94 jpm 838
 
682 aurelien 839
		String texteFiltresEnCours = "";
94 jpm 840
 
682 aurelien 841
		for(int i = 0; i < filtresEnCours.length; i++) {
842
			if(Util.filtreValide(filtresEnCours[i])) {
843
 
844
				if(!texteFiltresEnCours.equals("")) {
845
					texteFiltresEnCours += " - ";
846
				}
847
 
848
				texteFiltresEnCours += "<span class=\"affichage_filtre\">"+
849
											transformerNomFiltre(filtresEnCours[i][0])+": "+transformerValeurFiltre(filtresEnCours[i][0], filtresEnCours[i][1])+
965 aurelien 850
									   " <input value=\"X\" type=\"button\" rel=\""+filtresEnCours[i][0]+"\" id=\"bouton_raz_filtres_obs_"+filtresEnCours[i][0]+"\" />"+
682 aurelien 851
										"</span>";
852
			}
853
		}
655 aurelien 854
 
682 aurelien 855
		if(!texteFiltresEnCours.equals("")) {
856
			texteFiltresEnCours = "- <span class=\"indicateur_filtres\"> Filtres - "+texteFiltresEnCours+"</span>";
857
		}
655 aurelien 858
 
682 aurelien 859
		this.setTitle("Observations"+texteFiltresEnCours) ;
655 aurelien 860
 
682 aurelien 861
		for(int i = 0; i < filtresEnCours.length; i++) {
94 jpm 862
 
682 aurelien 863
			if(Util.filtreValide(filtresEnCours[i])) {
965 aurelien 864
				if(Ext.get("bouton_raz_filtres_obs_"+filtresEnCours[i][0]) != null) {
682 aurelien 865
 
965 aurelien 866
					Ext.get("bouton_raz_filtres_obs_"+filtresEnCours[i][0]).addListener("click", new EventCallback() {
682 aurelien 867
 
1292 aurelien 868
						@Override
682 aurelien 869
						public void execute(EventObject e) {
870
							e.stopEvent();
871
							observationMediateur.viderFiltre(e.getTarget().getAttribute("rel"));
872
						}
873
 
874
					});
875
				}
876
			}
94 jpm 877
		}
682 aurelien 878
	}
879
 
880
	private String transformerNomFiltre(String nomFiltre) {
881
 
965 aurelien 882
		if(nomFiltre.equals("departement")) {
682 aurelien 883
			nomFiltre = "departement";
94 jpm 884
		}
885
 
965 aurelien 886
		if(nomFiltre.equals("commune")) {
682 aurelien 887
			nomFiltre = "commune";
250 aurelien 888
		}
889
 
682 aurelien 890
		if(nomFiltre.equals("nom_taxon")) {
891
			nomFiltre = "recherche";
892
		}
655 aurelien 893
 
965 aurelien 894
		if(nomFiltre.equals("id_mots_cles")) {
682 aurelien 895
			nomFiltre = "projets";
655 aurelien 896
		}
897
 
682 aurelien 898
		return nomFiltre;
899
 
94 jpm 900
	}
682 aurelien 901
 
902
	private String transformerValeurFiltre(String nomFiltre, String valeurFiltre) {
903
 
904
		String valeurFiltreTransformee = valeurFiltre;
905
 
965 aurelien 906
		if(nomFiltre.equals("id_mots_cles")) {
682 aurelien 907
 
908
			String[] tabMotsCles = valeurFiltre.split(";");
909
			String[] tabMotsClesTexte = observationMediateur.obtenirTexteMotsCles(tabMotsCles);
910
 
911
			if(tabMotsClesTexte.length > 1) {
912
				valeurFiltreTransformee = Util.implode(",", tabMotsClesTexte);
913
			} else {
914
				valeurFiltreTransformee = tabMotsClesTexte[0];
915
			}
916
		}
917
 
918
		if(nomFiltre.equals("mois")) {
919
			valeurFiltreTransformee = Util.renvoyerMois(Integer.parseInt(valeurFiltre));
920
		}
921
 
922
		valeurFiltreTransformee = valeurFiltreTransformee.replaceAll("000null", "inconnue");
1332 aurelien 923
		valeurFiltreTransformee = valeurFiltreTransformee.replaceAll("null", "inconnue");
924
		valeurFiltreTransformee = valeurFiltreTransformee.replaceAll("NULL", "inconnue");
46 david 925
 
682 aurelien 926
		return valeurFiltreTransformee;
927
 
928
	}
929
 
1489 aurelien 930
	public void raz() {
931
		RecordDef rd = new RecordDef(getDefinitionChamps());
104 jpm 932
		st = new Store(rd);
933
		// on associe le store
1489 aurelien 934
		this.setStore(st);
104 jpm 935
	}
133 aurelien 936
 
937
	public boolean verifierFormatDate(String date) {
938
 
939
		String regex = "[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}" ;
940
		if(date.matches(regex) && !date.equals("0000-00-00")) {
941
			return true ;
942
		}
943
		else {
944
			return false;
945
		}
946
	}
206 aurelien 947
 
250 aurelien 948
	public boolean getTailleInitialisee() {
949
		return tailleInitialisee ;
950
	}
951
 
952
	public void setTailleInitialisee() {
953
		tailleInitialisee = true;
954
	}
12 david 955
}