Subversion Repositories eFlore/Applications.cel

Rev

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