Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 aperonnet 1
package org.tela_botanica.client.observation;
2
 
12 david 3
 
4
import java.util.Iterator;
2 aperonnet 5
import org.tela_botanica.client.CarnetEnLigneMediateur;
12 david 6
import org.tela_botanica.client.interfaces.FournisseurListe;
7
import org.tela_botanica.client.interfaces.Rafraichissable;
8
import org.tela_botanica.client.modeles.ListeObservation;
2 aperonnet 9
import org.tela_botanica.client.modeles.Observation;
12 david 10
import org.tela_botanica.client.vues.FormulaireSaisieObservationVue;
11
import org.tela_botanica.client.vues.ListeObservationVue;
2 aperonnet 12
 
41 jpm 13
import com.gwtext.client.core.EventObject;
12 david 14
import com.gwtext.client.data.ArrayReader;
15
import com.gwtext.client.data.FieldDef;
16
import com.gwtext.client.data.MemoryProxy;
17
import com.gwtext.client.data.RecordDef;
18
import com.gwtext.client.data.Store;
19
import com.gwtext.client.data.StringFieldDef;
20
import com.gwtext.client.widgets.Panel;
21
import com.gwtext.client.widgets.TabPanel;
2 aperonnet 22
 
12 david 23
/**
24
 * Mediateur gérant les interactions entre vues et les echanges de données
25
 * C'est un singleton.
26
 * @author aurelien
27
 *
28
 */
29
public class ObservationMediateur implements Rafraichissable {
30
 
31
	/**
32
	 * booleen qui verifie l'unicite de l'instance (donc static)
33
	 */
31 jpm 34
	private static boolean estInstancie = false ;
35
 
36
	/**
37
	 * pointeur sur le médiateur (pour le pattern singleton)
38
	 */
39
	private static ObservationMediateur thisMediateur = null ;
12 david 40
 
41
	/** Mediateur general de l'application carnet en ligne
42
	 *
43
	 *
44
	 */
45
 
46
	private CarnetEnLigneMediateur carnetEnLigneMediateur = null ;
47
 
48
 
49
	/**
50
	 * modele de données
51
	 */
52
	private ObservationModele observationModele = null ;
53
 
54
 
55
	/**
56
	 * panneau principal des Observation (onglet "observation")
57
	 */
58
	private final Panel panneauPrincipalObservation = new Panel("Observation");
59
 
60
	/**
61
	 * panneau a onglet pour la liste
62
	 */
63
	private TabPanel ongletsObservation = null ;
64
 
65
	/**
66
	 * conteneur du panneau a onglets
67
	 */
68
	private Panel panneauMenuEtOngletsObservation = null ;
69
 
70
	/**
71
	 * liste détaillée des Observations
72
	 */
73
	private ListeObservationVue listeObservation = null ;
74
 
75
	/**
76
	 * Saisie des Observations
77
	 */
78
 
79
	private FormulaireSaisieObservationVue formulaireSaisieObservationVue=null;
80
	/**
81
	 * l'indice du dernier onglet sélectionné
82
	 */
83
	private int dernierIndexOnglet = 0 ;
84
 
85
	/**
86
	 * booleen explicitant s'il y a une selection en cours
87
	 */
88
	private boolean selection = false ;
89
 
90
	/**
91
	 * Numéro de page en cours
92
	 */
93
	private int pageEncours = 0 ;
94
	/**
95
	 * Nombre de pages totales
96
	 */
97
	private int pageMax = 1 ;
98
	/**
99
	 * Taille de page (par défaut 20)
100
	 */
101
	private int taillePage = 20 ;
102
	/**
103
	 * Nombre d'éléments total correspondant à la requete
104
	 */
105
	private int nbElements = 0 ;
106
 
107
 
108
	/**
109
	 * Le store contenant les données à afficher, que le modèle transmet au médiateur quand il le demande
110
	 */
111
	private Store st = null ;
112
 
113
 
114
 
115
 
116
	/**
117
	 * La liste des observations affichées en cours (verifier utilité)
118
	 */
119
 
120
	private ListeObservation cacheObservation = new ListeObservation(0) ;
121
	/**
122
 
123
 
124
 
125
	/**
126
	 * constructeur privé (on accède a la classe par la méthode getInstance
127
	 */
128
 
129
 
130
	private ObservationMediateur(CarnetEnLigneMediateur carnetEnLigneMediateur )
131
	{
132
		this.carnetEnLigneMediateur=carnetEnLigneMediateur;
133
 
134
		// on crée un modèle
135
		observationModele = ObservationModele.Instance(this);
136
 
137
 
138
		// on gère la mise en page du panneau principal
139
		//panneauPrincipalObservation.setLayout(new BorderLayout());
140
 
141
		// on crée le panneau qui contient les differentes onglets ainsi que le menu supérieur
142
	//	panneauMenuEtOngletsObservation = new Panel("gg") ;
143
	//	panneauMenuEtOngletsObservation.setLayout(new BorderLayout()) ;
144
 
145
		// le panneau à onglet qui contient la vue
146
		//ongletsObservation = new TabPanel();
147
 
148
 
149
		// la liste des observations
150
 
151
		//Panel panneauListeObservation = new Panel("Liste");
152
 
153
		listeObservation = new ListeObservationVue(this);
154
 
155
 
156
		// Le formulaire de saisie / modification d'observation
157
 
158
		formulaireSaisieObservationVue = new FormulaireSaisieObservationVue(this);
2 aperonnet 159
 
12 david 160
 
161
		//panneauListeObservation.setLayout(new FitLayout());
162
		//panneauListeObservation.setSize(600,600);
163
		//panneauListeObservation.add(listeObservation);
164
 
165
 
166
		// on ajoute les panneaux au panneau à onglets
167
		//ongletsObservation.add(panneauListeObservation);
168
 
169
 
170
		// les onglets au centre
171
//		panneauMenuEtOngletsObservation.add(ongletsObservation,regionCentre);
172
 
173
		// on ajoute le panneau qui contient le menu et les onglets d'images au centre
174
		//panneauPrincipalObservation.add(panneauMenuEtOngletsObservation,regionCentre);
175
 
176
		panneauPrincipalObservation.add(formulaireSaisieObservationVue);
177
 
178
		panneauPrincipalObservation.add(listeObservation);
179
 
180
 
181
 
2 aperonnet 182
 
12 david 183
	}
2 aperonnet 184
 
7 aperonnet 185
 
12 david 186
	/**
187
	 * Retourne une instance de manière unique
188
	 * @return l'instance unique du médiateur
189
	 */
190
	public static ObservationMediateur Instance(CarnetEnLigneMediateur carnetEnLigneMediateur)
191
	{
31 jpm 192
			if(!estInstancie || thisMediateur == null)
12 david 193
			{
194
				estInstancie = true ;
31 jpm 195
				thisMediateur = new ObservationMediateur(carnetEnLigneMediateur) ;
12 david 196
			}
31 jpm 197
 
198
			return thisMediateur ;
12 david 199
	}
200
 
201
 
202
 
203
	/**
204
	 * envoie au modèle une demande de mise a jour
205
	 */
2 aperonnet 206
 
7 aperonnet 207
 
12 david 208
	public void obtenirNombreObservation() {
209
 
210
 
211
			listeObservation.masquerChargement();
212
		    observationModele.obtenirNombreObservation(this) ;
213
 
2 aperonnet 214
	}
12 david 215
 
2 aperonnet 216
	/**
12 david 217
	 * envoie au modèle une demande de mise a jour
2 aperonnet 218
	 */
7 aperonnet 219
 
220
 
12 david 221
	public void obtenirListeObservation() {
222
 
7 aperonnet 223
 
12 david 224
			observationModele.obtenirListeObservation(this, taillePage, pageEncours) ;
225
 
31 jpm 226
	}
12 david 227
 
2 aperonnet 228
	/**
12 david 229
	 * C'est dans cette fonction que doivent être renvoyé les valeurs des filtres
230
	 * sous forme de tableau [nom, valeur]
231
	 * @return Les noms et valeurs des filtres
2 aperonnet 232
	 */
12 david 233
	public String[][] renvoyerFiltres()
234
	{
41 jpm 235
		String[][] valeursFiltres = { {"",""} } ;
12 david 236
 
237
 
238
		return valeursFiltres ;
239
	}
2 aperonnet 240
 
7 aperonnet 241
 
12 david 242
	public String getIdentifiant() {
243
 
244
		return carnetEnLigneMediateur.getUtilisateur().getIdentifiant();
245
 
246
	}
2 aperonnet 247
 
248
 
12 david 249
	public Panel getPanneauPrincipalObservation() {
250
		return panneauPrincipalObservation;
2 aperonnet 251
	}
12 david 252
 
253
 
254
 
13 david 255
	// FIXME TODO : plutot dans la listevu non ?
2 aperonnet 256
 
12 david 257
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) {
258
 
259
 
260
 
261
//		 si l'on a reçu une liste d'observation
262
		if(nouvelleDonnees instanceof ListeObservation)
263
		{
264
 
265
				ListeObservation data = (ListeObservation) nouvelleDonnees ;
266
				Object[][] observationData = new Object[data.size()][8];
267
				int i = 0 ;
268
 
269
				if(data.size() == 0)
270
				{
271
					pageEncours = 0 ;
272
				}
273
 
274
				// on la parse et on récupère les informations quiç nous interessent
275
				for (Iterator it = data.keySet().iterator(); it.hasNext();)
276
				{
277
 
278
					Observation obs=(Observation) data.get(it.next());
279
 
280
					observationData[i][0]= obs.getTransmis();
281
					observationData[i][1]= obs.getNomSaisi();
282
					observationData[i][2]= obs.getNomRetenu();
283
					observationData[i][3]= obs.getLieudit();
284
					observationData[i][4]= obs.getDate();
31 jpm 285
					observationData[i][5]= obs.getNumeroOrdre();
12 david 286
 
287
					i++ ;
288
				}
289
 
290
				// creation du store qui les contient
291
 
292
				FieldDef defEtatObservation = new StringFieldDef("etat_observation");
293
				FieldDef defNomSaisiObservation = new StringFieldDef("nomSaisi_observation");
294
				FieldDef defNomRetenuObservation = new StringFieldDef("nomRetenu_observation");
295
				FieldDef defLieuObservation = new StringFieldDef("lieu_observation");
296
				FieldDef defDateObservation = new StringFieldDef("date_observation");
297
				FieldDef defOrdreObservation = new StringFieldDef("ordre_observation");
298
 
299
				// on associe le store
7 aperonnet 300
 
12 david 301
				FieldDef[] defTab = { defEtatObservation, defNomSaisiObservation, defNomRetenuObservation,
302
						defLieuObservation, defDateObservation, defOrdreObservation };
303
 
304
				RecordDef rd = new RecordDef(defTab);
305
 
306
				final MemoryProxy dataProxy = new MemoryProxy(observationData);
307
				final ArrayReader reader = new ArrayReader(rd);
308
 
309
				final Store observationStore = new Store(dataProxy, reader);
310
 
311
 
312
				st = observationStore ;
313
				st.load() ;
314
 
315
				// par défaut le store est trié sur l'ordre d'observations
316
				st.sort("ordre_observation") ;
317
 
318
 
319
				// si on doit répandre les données, on notifie le médiateur qui les distribuera à son tour
320
				if(repandreRafraichissement)
321
				{
322
					listeObservation.rafraichir(st, false) ;
323
				}
324
 
7 aperonnet 325
		}
12 david 326
 
327
 
328
		// Si on reçoit un tableau d'entiers
329
		// c'est un tableau d'un seul entier qui est le nombre d'observation correspondant aux critères
330
		if(nouvelleDonnees instanceof int[])
331
		{
332
			int[] pages = (int[])nouvelleDonnees ;
333
 
334
			// on calcule le nombre de pages nécessaires et on les met à jour dans le modèle
335
			pageMax  = calculerNbPages(pages[0]) ;
336
			nbElements = pages[0] ;
337
 
338
			// et on notifie de le mediateur du changement des valeurs
339
			changerPageMaxEtCourante(pageMax,pageEncours,taillePage,pages[0]) ;
340
 
341
			obtenirListeObservation();
342
		}
2 aperonnet 343
	}
12 david 344
 
345
 
2 aperonnet 346
	/**
12 david 347
	 * Met à jour les barre d'outils avec des nouvelles valeurs
348
	 * @param pageMax le nombre de pages
349
	 * @param pageEncours la page en cours
350
	 * @param taillePage la taille de page
351
	 * @param nbElement le nombre d'élements par page
2 aperonnet 352
	 */
12 david 353
	public void changerPageMaxEtCourante(int pageMax, int pageEncours, int taillePage, int nbElement)
354
	{
355
 
356
		int[] pages = {pageMax,pageEncours, taillePage, nbElement} ;
357
		listeObservation.getToolBarVue().rafraichir(pages, false) ;
358
 
2 aperonnet 359
	}
12 david 360
 
361
 
362
 
2 aperonnet 363
	/**
12 david 364
	 * Calcule le nombre de pages nécessaires pour afficher un nombre d'élements donnés en fonction de la taille de page
365
	 * en cours
366
	 * @param nbElements le nombre d'élements total
367
	 * @return le nombre de pages
2 aperonnet 368
	 */
12 david 369
	public int calculerNbPages(int nbElements)
370
	{
371
		// A cause de la betise de java pour les conversion implicite on fait quelques conversions manuellement
372
		// pour eviter qu'il arrondisse mal la division
373
		// nombre de pages = (nombre d'element / taille de la page) arrondie à l'entier superieur
374
 
375
		double nPage = (1.0*nbElements)/(1.0*taillePage) ;
376
		double nPageRound = Math.ceil(nPage) ;
377
		Double nPageInt = new Double(nPageRound) ;
378
 
379
		// on convertit en entier
380
		return nPageInt.intValue() ;
2 aperonnet 381
	}
382
 
12 david 383
 
2 aperonnet 384
	/**
12 david 385
	 * Recalcule la page en cours lors du changement du nombre d'élements
386
	 * @param nbElements le nombre d'élements total
387
	 * @return la nouvelle page encours
2 aperonnet 388
	 */
12 david 389
	public int calculerPageCourante(int nbElements)
390
	{
391
		// on calcule le nombre de page
392
		int nouvelNbPages = calculerNbPages(nbElements) ;
393
		// la nouvelle page en cours
394
		double nPageCourante = (1.0*pageEncours)/(1.0*pageMax) * (1.0*nouvelNbPages) ;
395
 
396
		// on arrondit au supérieur
397
		double nPageRound = Math.ceil(nPageCourante) ;
398
		Double nPageInt = new Double(nPageRound) ;
399
 
400
		// on convertit en entier
401
		return Math.abs(nPageInt.intValue()) ;
2 aperonnet 402
	}
12 david 403
 
2 aperonnet 404
 
405
	/**
12 david 406
	 * Appelle le modèle pour lui demander les données d'une page à afficher
407
	 * @param pageCourante le numéro de page à affciher
2 aperonnet 408
	 */
12 david 409
	public void changerNumeroPage(int pageCourante) {
410
 
411
 
412
 
413
		pageEncours = pageCourante ;
414
 
415
		// On lance le chargerment des observations
416
		obtenirNombreObservation();
417
 
418
		listeObservation.getToolBarVue().changerPageCourante(pageCourante);
419
 
420
	}
421
 
422
 
423
	/**
424
	 * Appelle le modèle pour qu'il change la taille de page utilisée
425
	 * @param nouvelleTaillePage la nouvelle taille de page
426
	 */
427
 
428
	public void changerTaillePage(int nouvelleTaillePage)
429
	{
430
 
431
		taillePage = nouvelleTaillePage ;
432
		pageEncours = calculerPageCourante(nbElements) ;
2 aperonnet 433
 
12 david 434
		// 	On lance le chargerment des observations
435
		obtenirNombreObservation();
436
 
437
 
438
		// et on met à jour la taille de page dans les barres d'outils
439
		listeObservation.getToolBarVue().selectionnerTaillePage(nouvelleTaillePage);
440
 
441
 
2 aperonnet 442
	}
443
 
444
 
13 david 445
	/**
446
	 *
447
	 * Lance un appel de recherche d'une liste de commune correspondant aux criteres de selectionne
448
	 * @param r : la vue demandeuse de donnee
449
	 * @param critere : les criteres de selection
450
	 */
12 david 451
 
13 david 452
	public void obtenirListeReferentielCommune(Rafraichissable r, String critere) {
12 david 453
 
13 david 454
		observationModele.obtenirListeReferentielCommune(r,critere) ;
2 aperonnet 455
 
12 david 456
 
2 aperonnet 457
	}
20 david 458
 
459
	/**
460
	 *
461
	 * Lance un appel de recherche d'une liste de nom scientifique correspondant aux criteres de selectionne
462
	 * @param r : la vue demandeuse de donnee
463
	 * @param critere : les criteres de selection
464
	 */
465
 
466
	public void obtenirListeReferentielNom(Rafraichissable r, String critere) {
467
 
468
		observationModele.obtenirListeReferentielNom(r,critere) ;
2 aperonnet 469
 
20 david 470
 
471
	}
2 aperonnet 472
 
12 david 473
 
20 david 474
	/**
475
	 *
476
	 * Lance la creation d'une observation
477
	 * @param r : la vue demandeuse de donnee
478
	 * @param critere : les criteres de selection
479
	 */
480
 
39 david 481
	public void ajouterObservation(Rafraichissable r, Observation obs) {
20 david 482
 
39 david 483
		observationModele.ajouterObservation(r, obs) ;
20 david 484
 
485
	}
41 jpm 486
 
487
	public void clicListeObservation(int rowIndex) {
488
 
489
	}
2 aperonnet 490
 
41 jpm 491
 
492
	public void montrerContextMenu(EventObject e) {
493
 
494
 
495
 
496
	}
497
 
498
	public void doubleClicListeObservation(int rowIndex) {
499
 
500
 
501
	}
502
 
12 david 503
 
504
 
20 david 505
 
506
 
507
 
2 aperonnet 508
}