Subversion Repositories eFlore/Applications.cel

Rev

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