Subversion Repositories eFlore/Applications.cel

Rev

Rev 1542 | Details | Compare with Previous | Last modification | View Log | RSS feed

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