Subversion Repositories eFlore/Applications.cel

Rev

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