Subversion Repositories eFlore/Applications.cel

Rev

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