Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
2 aperonnet 1
package org.tela_botanica.client.observation;
2
 
12 david 3
 
86 jpm 4
 
82 david 5
// TODO : systematiser les onQuelquechose, appelle depuis les vues
6
 
2 aperonnet 7
import org.tela_botanica.client.CarnetEnLigneMediateur;
12 david 8
import org.tela_botanica.client.interfaces.Rafraichissable;
9
import org.tela_botanica.client.modeles.ListeObservation;
2 aperonnet 10
import org.tela_botanica.client.modeles.Observation;
66 david 11
import org.tela_botanica.client.vues.ArbreEntiteGeographiqueObservationFiltreVue;
12 david 12
import org.tela_botanica.client.vues.FormulaireSaisieObservationVue;
54 david 13
import org.tela_botanica.client.vues.ImageGeneriqueVue;
14
import org.tela_botanica.client.vues.InformationRepartitionVue;
12 david 15
import org.tela_botanica.client.vues.ListeObservationVue;
54 david 16
import org.tela_botanica.client.vues.PanneauFiltresObservationVues;
53 david 17
 
18
import com.google.gwt.core.client.GWT;
77 jpm 19
import com.google.gwt.user.client.Window;
41 jpm 20
import com.gwtext.client.core.EventObject;
86 jpm 21
import com.gwtext.client.core.Ext;
22
import com.gwtext.client.core.ExtElement;
53 david 23
import com.gwtext.client.core.RegionPosition;
86 jpm 24
import com.gwtext.client.widgets.Component;
12 david 25
import com.gwtext.client.widgets.Panel;
86 jpm 26
import com.gwtext.client.widgets.event.ContainerListener;
27
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
53 david 28
import com.gwtext.client.widgets.layout.BorderLayout;
29
import com.gwtext.client.widgets.layout.BorderLayoutData;
30
import com.gwtext.client.widgets.layout.RowLayout;
80 jpm 31
import com.gwtext.client.widgets.layout.RowLayoutData;
2 aperonnet 32
 
48 david 33
 
12 david 34
/**
35
 * Mediateur gérant les interactions entre vues et les echanges de données
36
 * C'est un singleton.
37
 * @author aurelien
38
 *
39
 */
47 david 40
public class ObservationMediateur {
12 david 41
 
42
	/**
43
	 * booleen qui verifie l'unicite de l'instance (donc static)
44
	 */
31 jpm 45
	private static boolean estInstancie = false ;
46
 
47
	/**
48
	 * pointeur sur le médiateur (pour le pattern singleton)
49
	 */
50
	private static ObservationMediateur thisMediateur = null ;
12 david 51
 
52
	/** Mediateur general de l'application carnet en ligne
53
	 *
54
	 *
55
	 */
56
 
57
	private CarnetEnLigneMediateur carnetEnLigneMediateur = null ;
58
 
59
 
60
	/**
61
	 * modele de données
62
	 */
63
	private ObservationModele observationModele = null ;
64
 
65
 
66
	/**
67
	 * panneau principal des Observation (onglet "observation")
68
	 */
69
	private final Panel panneauPrincipalObservation = new Panel("Observation");
70
 
71
 
72
	/**
73
	 * liste détaillée des Observations
74
	 */
75
	private ListeObservationVue listeObservation = null ;
76
 
77
	/**
78
	 * Saisie des Observations
79
	 */
80
 
81
	private FormulaireSaisieObservationVue formulaireSaisieObservationVue=null;
82
 
48 david 83
 
84
 
12 david 85
	/**
86
	 * booleen explicitant s'il y a une selection en cours
87
	 */
88
	private boolean selection = false ;
47 david 89
 
12 david 90
 
91
 
92
	/**
93
	 * La liste des observations affichées en cours (verifier utilité)
94
	 */
95
 
96
	private ListeObservation cacheObservation = new ListeObservation(0) ;
97
	/**
98
 
99
 
53 david 100
	/**
101
	 * panneau conteneur pour le panneau  des informations lies à l'observation
102
	 */
12 david 103
 
53 david 104
  	private Panel details = new Panel("Détails");
105
 
106
 
107
 
12 david 108
	/**
53 david 109
	 * panneau conteneur pour le panneau des filtres
110
	 */
111
 
54 david 112
  	private PanneauFiltresObservationVues filtres = null;
53 david 113
 
114
 
54 david 115
 
116
  	/**
117
  	 * panneau d'information de repartition sur le nom selectionné
118
  	 *
119
  	 */
120
 
121
  	private InformationRepartitionVue informationRepartitionVue=null;
122
 
123
 
124
  	/**
125
  	 * panneau d'affichage d'une image generique associe au nom selectionne
126
  	 *
127
  	 */
128
 
129
  	private ImageGeneriqueVue imageGeneriqueVue=null;
130
 
131
 
53 david 132
	/**
12 david 133
	 * constructeur privé (on accède a la classe par la méthode getInstance
134
	 */
135
 
136
 
137
	private ObservationMediateur(CarnetEnLigneMediateur carnetEnLigneMediateur )
138
	{
139
		this.carnetEnLigneMediateur=carnetEnLigneMediateur;
140
 
53 david 141
 
12 david 142
		// on crée un modèle
143
		observationModele = ObservationModele.Instance(this);
144
 
145
 
48 david 146
 
12 david 147
		listeObservation = new ListeObservationVue(this);
53 david 148
		listeObservation.setTitle("Observations");
12 david 149
 
53 david 150
		// quelques variables de position pour les borderlayouts
151
		final BorderLayoutData regionNord = new BorderLayoutData(
152
				RegionPosition.NORTH);
153
 
154
		final BorderLayoutData regionCentre = new BorderLayoutData(
155
				RegionPosition.CENTER);
156
 
157
 
158
		final BorderLayoutData regionEst = new BorderLayoutData(
159
				RegionPosition.EAST);
160
 
161
 
162
		if (GWT.isScript()) {  // FIXME : ne fonctionne pas en mode hosted
163
			regionEst.setSplit(true);
164
		}
165
 
166
		final BorderLayoutData regionOuest = new BorderLayoutData(
167
				RegionPosition.WEST);
12 david 168
 
53 david 169
		if (GWT.isScript()) {  // FIXME : ne fonctionne pas en mode hosted
170
			regionOuest.setSplit(true);
171
		}
172
 
173
		panneauPrincipalObservation.setLayout(new BorderLayout()) ;
174
 
175
 
12 david 176
		// Le formulaire de saisie / modification d'observation
177
 
178
		formulaireSaisieObservationVue = new FormulaireSaisieObservationVue(this);
53 david 179
		formulaireSaisieObservationVue.setTitle("Saisie");
180
		formulaireSaisieObservationVue.setTitleCollapse(true);
181
	 	formulaireSaisieObservationVue.setCollapsible(true) ;
182
 
2 aperonnet 183
 
53 david 184
		Panel centre = new Panel();
55 jpm 185
		centre.setLayout(new RowLayout()) ;
80 jpm 186
 
187
		centre.setHeight(panneauPrincipalObservation.getHeight()) ;
12 david 188
 
80 jpm 189
		centre.add(formulaireSaisieObservationVue, new RowLayoutData("30%")) ;
190
		centre.add(listeObservation, new RowLayoutData("70%"));
2 aperonnet 191
 
53 david 192
		// on initialise le volet qui contient les details
193
		details.setWidth("15%");
194
		details.setTitleCollapse(true);
195
		details.setCollapsible(true);
54 david 196
		details.setLayout(new RowLayout());
53 david 197
 
54 david 198
 
199
 
200
		// Information de repartition
201
		informationRepartitionVue=new InformationRepartitionVue(this);
202
		// TODO : calcul de la hauteur automatique par le panel ?
203
		informationRepartitionVue.setHeight(160);
204
		details.add(informationRepartitionVue);
205
 
206
 
207
		// Image generique
208
		imageGeneriqueVue=new ImageGeneriqueVue(this);
209
		// TODO : calcul de la hauteur automatique par le panel ?
210
 
211
		imageGeneriqueVue.setHeight(160);
212
		details.add(imageGeneriqueVue);
213
 
214
 
215
		// on crée le panneau des filtres
216
		filtres = new PanneauFiltresObservationVues(this);
217
 
218
		// on initialise le volet qui contient les filtres
60 jpm 219
		filtres.setWidth("15%");
53 david 220
		filtres.setTitleCollapse(true);
221
		filtres.setCollapsible(true);
54 david 222
 
53 david 223
		panneauPrincipalObservation.add(details,regionEst);
224
		panneauPrincipalObservation.add(filtres,regionOuest);
225
		panneauPrincipalObservation.add(centre,regionCentre);
226
 
12 david 227
	}
2 aperonnet 228
 
7 aperonnet 229
 
12 david 230
	/**
231
	 * Retourne une instance de manière unique
232
	 * @return l'instance unique du médiateur
233
	 */
234
	public static ObservationMediateur Instance(CarnetEnLigneMediateur carnetEnLigneMediateur)
235
	{
31 jpm 236
			if(!estInstancie || thisMediateur == null)
12 david 237
			{
238
				estInstancie = true ;
31 jpm 239
				thisMediateur = new ObservationMediateur(carnetEnLigneMediateur) ;
12 david 240
			}
31 jpm 241
 
82 david 242
 
31 jpm 243
			return thisMediateur ;
12 david 244
	}
82 david 245
 
12 david 246
 
247
 
82 david 248
	// ACTIONS  a entreprendre lors d'un evenement particulier
12 david 249
 
82 david 250
 
12 david 251
	/**
82 david 252
	 * Lors du raffraichissement de la liste d'observation
253
	 */
254
 
255
 
256
	public void onRafraichissementListeObservations() {
257
 
258
		cacheObservation = listeObservation.getCacheListeObservation() ;
259
		if(cacheObservation.size() == 0)
260
		{
261
			formulaireSaisieObservationVue.viderChampsObservation() ;
262
		}
263
		carnetEnLigneMediateur.donneesRafraichies(cacheObservation) ;
264
 
265
 
266
	}
267
 
268
	/**
269
	 *
270
	 * TODO : fonction plus generique, appelle sur un clic ou une selection de ligne, a appeller : SelectionnerObservation
271
	 * est appelé lors d'un clic de souris sur un enregistrement de la liste le
272
	 * médiateur gère alors les conséquences
273
	 *
274
	 * @param rowIndex
275
	 *            le numéro de ligne selectionné
276
	 */
277
 
278
	public void onClicListeObservation(int rowIndex, String ordreObservation) {
279
 
280
 
281
		Observation obs = cacheObservation.get(ordreObservation) ;
282
 
86 jpm 283
		masquerChargementInfosObservations() ;
284
 
82 david 285
		// Affichage de la carte de repartition correspondante
286
		String numeroNomenclaturalSaisiObservation = obs.getNumeroNomenclaturalSaisi() ;
287
 
288
		observationModele.obtenirImageInformationRepartition(informationRepartitionVue,numeroNomenclaturalSaisiObservation) ;
289
 
290
		// affichage des détails dans le formulaire d'observation
291
		formulaireSaisieObservationVue.rafraichir(obs, false) ;
292
 
293
		// Affichage de l'image correspondante
294
 
295
		observationModele.obtenirImageGenerique(imageGeneriqueVue,numeroNomenclaturalSaisiObservation) ;
296
 
297
 
298
	}
299
 
300
 
87 jpm 301
 
82 david 302
 
303
 
304
 
305
	// ACCES au Modèle
306
 
307
 
308
	// C du CRUD
309
 
310
 
311
 
312
	/**
313
	 * TODO : afficher un message du type "observation ajouté".
314
	 * Lance la creation d'une observation
315
	 * @param obs : l'observation saisie
316
	 */
317
 
318
 
319
 
320
	public void ajouterObservation(Observation obs) {
321
 
322
 
323
	  // On raffraichi la liste d'observation
324
	  observationModele.ajouterObservation(listeObservation, obs) ;
91 jpm 325
	  filtres.getArbreEntiteGeographiqueObservationFiltreVue().rafraichir(obs,true) ;
82 david 326
 
327
	}
328
 
329
 
330
 
331
	// R du CRUD
332
 
333
	/**
54 david 334
	 * Demande au modele le nombre d'Observation à afficher
335
	 * TODO : grouper cette demande avec la demande d'affichage de liste ?
12 david 336
	 */
2 aperonnet 337
 
12 david 338
	public void obtenirNombreObservation() {
339
 
340
 
54 david 341
		  observationModele.obtenirNombreObservation(listeObservation) ;
12 david 342
 
2 aperonnet 343
	}
54 david 344
 
12 david 345
 
82 david 346
 
347
	public void obtenirListeObservation() {
348
		obtenirListeObservation(listeObservation);
349
	}
350
 
2 aperonnet 351
	/**
82 david 352
	 * Demande au modele le detail  des Observations à afficher
54 david 353
	 * TODO : grouper cette demande avec la demande d'affichage de liste ?
2 aperonnet 354
	 */
7 aperonnet 355
 
12 david 356
 
61 jpm 357
	public void obtenirListeObservation(Rafraichissable r) {
358
 
77 jpm 359
		listeObservation.masquerChargement() ;
360
		formulaireSaisieObservationVue.viderChampsObservation() ;
61 jpm 361
		observationModele.obtenirListeObservation(r,listeObservation.getTaillePage(),listeObservation.getPageEncours()) ;
362
	}
363
 
86 jpm 364
	public void obtenirCacheObservation(Rafraichissable r) {
365
 
366
		r.rafraichir(cacheObservation, false) ;
367
	}
368
 
82 david 369
 
2 aperonnet 370
	/**
82 david 371
	 * Envoie au modèle une demande pour obtenir l'arbre des localites
372
	 *
373
	 * @param r
374
	 *            le raffraichissable qui a demandé la mise à jour
2 aperonnet 375
	 */
82 david 376
	public void obtenirListeEntiteGeographique() {
12 david 377
 
91 jpm 378
		observationModele.obtenirListeEntiteGeographique(filtres.getArbreEntiteGeographiqueObservationFiltreVue());
12 david 379
 
380
	}
82 david 381
 
382
 
383
	// U du CRUD
384
 
385
 
2 aperonnet 386
 
54 david 387
 
82 david 388
	public void modifierObservation(Observation obs) {
389
 
12 david 390
 
82 david 391
	  // On raffraichi la liste d'observation
392
	  observationModele.modifierObservation(listeObservation, obs) ;
91 jpm 393
	  filtres.getArbreEntiteGeographiqueObservationFiltreVue().rafraichir(obs,true) ;
82 david 394
 
395
	}
12 david 396
 
82 david 397
 
398
 
399
	// D du CRUD
400
 
401
 
54 david 402
	/**
82 david 403
	 * TODO : afficher un message du type "observation modifie".
404
	 * Lance la modification d'une observation
405
	 * @param obs : l'observation a modifier
54 david 406
	 */
407
 
82 david 408
 
409
 
410
	public void supprimerObservation(Rafraichissable r, String numeroOrdre) {
411
 
412
		if(listeObservation.getSelectionModel().getCount() > 0)
413
		{
414
			if(Window.confirm("Êtes vous sur de vouloir supprimer cette observation ?")) {
415
			observationModele.supprimerObservation(r,numeroOrdre) ;
416
			}
417
		}
418
 
2 aperonnet 419
	}
12 david 420
 
82 david 421
 
422
 
423
 
2 aperonnet 424
 
82 david 425
	// Assistants de saisie
426
 
2 aperonnet 427
	/**
13 david 428
	 *
429
	 * Lance un appel de recherche d'une liste de commune correspondant aux criteres de selectionne
430
	 * @param r : la vue demandeuse de donnee
431
	 * @param critere : les criteres de selection
432
	 */
12 david 433
 
13 david 434
	public void obtenirListeReferentielCommune(Rafraichissable r, String critere) {
12 david 435
 
13 david 436
		observationModele.obtenirListeReferentielCommune(r,critere) ;
2 aperonnet 437
 
12 david 438
 
2 aperonnet 439
	}
20 david 440
 
82 david 441
 
442
 
20 david 443
	/**
444
	 *
445
	 * Lance un appel de recherche d'une liste de nom scientifique correspondant aux criteres de selectionne
446
	 * @param r : la vue demandeuse de donnee
447
	 * @param critere : les criteres de selection
448
	 */
449
 
450
	public void obtenirListeReferentielNom(Rafraichissable r, String critere) {
451
 
452
		observationModele.obtenirListeReferentielNom(r,critere) ;
2 aperonnet 453
 
20 david 454
 
455
	}
82 david 456
 
457
	// Etat du syteme
458
 
20 david 459
	/**
82 david 460
	 * C'est dans cette fonction que doivent être renvoyé les valeurs des filtres
461
	 * sous forme de tableau [nom, valeur]
462
	 * @return Les noms et valeurs des filtres
20 david 463
	 */
82 david 464
	public String[][] renvoyerFiltres()
465
	{
91 jpm 466
			String[] filtresEntitesGeo = filtres.getArbreEntiteGeographiqueObservationFiltreVue().renvoyerValeursAFiltrer() ;
467
			String chaineNomsFiltresGeo = filtresEntitesGeo[0] ;
468
			String chaineValFiltresGeo = filtresEntitesGeo[1] ;
87 jpm 469
 
91 jpm 470
			String[] filtresDate = filtres.getArbreDateObservationFiltreVue().renvoyerValeursAFiltrer() ;
471
			String chaineNomsFiltresDate = filtresDate[0] ;
472
			String chaineValFiltresDate = filtresDate[1] ;
473
 
474
			String chaineNomsFiltres = chaineNomsFiltresGeo+","+chaineNomsFiltresDate ;
475
			String chaineValFiltres = chaineValFiltresGeo+","+chaineValFiltresDate ;
476
 
87 jpm 477
			String[] nomsFiltres = chaineNomsFiltres.split(",") ;
478
			String[] valsFiltres = chaineValFiltres.split(",") ;
91 jpm 479
 
480
			String [][] valeursFiltres = new String[nomsFiltres.length][2] ;
481
 
482
 
87 jpm 483
			if(nomsFiltres.length > 0)
484
			{
485
 
89 jpm 486
				for(int i = 0 ; i < nomsFiltres.length ; i++)
87 jpm 487
				{
488
					valeursFiltres[i][0] = nomsFiltres[i] ;
489
					if(valsFiltres[i].equals("Inconnue"))
490
					{
491
						valeursFiltres[i][1] = "000null" ;
492
					}
493
					else
494
					{
495
						valeursFiltres[i][1] = valsFiltres[i] ;
496
					}
497
				}
498
 
499
				return valeursFiltres ;
500
			}
501
			else
502
			{
503
				return valeursFiltres ;
504
			}
20 david 505
	}
82 david 506
 
41 jpm 507
 
54 david 508
	/**
82 david 509
	 * Retourne l'identifiant de l'utilisateur connecte
510
	 * @return : identifiant de l'utilisateur connecte
74 david 511
	 */
82 david 512
	public String getIdentifiant() {
74 david 513
 
82 david 514
		return carnetEnLigneMediateur.getUtilisateur().getIdentifiant();
74 david 515
 
77 jpm 516
	}
82 david 517
 
518
 
74 david 519
	/**
54 david 520
	 *
82 david 521
	 * @return
54 david 522
	 *
523
	 */
524
 
82 david 525
	public Panel getPanneauPrincipalObservation() {
526
		return panneauPrincipalObservation;
527
	}
54 david 528
 
529
 
41 jpm 530
	public void montrerContextMenu(EventObject e) {
531
 
532
 
533
 
534
	}
535
 
536
	public void doubleClicListeObservation(int rowIndex) {
537
 
538
 
539
	}
540
 
54 david 541
 
82 david 542
 
543
	// Getters
544
 
54 david 545
	public PanneauFiltresObservationVues getPanneauFiltres() {
546
 
547
		return filtres;
548
 
549
	}
86 jpm 550
 
551
	public void masquerChargementInfosObservations()
552
	{
553
		ExtElement masked = Ext.get(details.getId());
54 david 554
 
86 jpm 555
		if (masked != null && !masked.isMasked()) {
556
			informationRepartitionVue.raz() ;
557
			imageGeneriqueVue.raz() ;
558
			masked.mask("Chargement", true);
559
		}
560
	}
82 david 561
 
86 jpm 562
	public void deMasquerChargementInfosObservations()
563
	{
564
		ExtElement masked = Ext.get(details.getId());
63 jpm 565
 
86 jpm 566
		if (masked != null && masked.isMasked()) {
567
			masked.unmask() ;
568
		}
569
	}
91 jpm 570
 
571
 
572
	public void obtenirDatesObservation() {
573
 
574
		observationModele.obtenirDatesObservation(filtres.getArbreDateObservationFiltreVue()) ;
575
 
576
	}
12 david 577
 
2 aperonnet 578
}