Subversion Repositories eFlore/Applications.cel

Rev

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