Subversion Repositories eFlore/Applications.cel

Rev

Rev 1572 | Rev 1600 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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