Subversion Repositories eFlore/Applications.cel

Rev

Rev 261 | 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
 
156 aurelien 7
 
2 aperonnet 8
import org.tela_botanica.client.CarnetEnLigneMediateur;
12 david 9
import org.tela_botanica.client.interfaces.Rafraichissable;
251 aurelien 10
import org.tela_botanica.client.modeles.EntiteGeographiqueObservation;
12 david 11
import org.tela_botanica.client.modeles.ListeObservation;
2 aperonnet 12
import org.tela_botanica.client.modeles.Observation;
251 aurelien 13
import org.tela_botanica.client.vues.observation.CartographieObservationVue;
195 david 14
import org.tela_botanica.client.vues.observation.FormulaireSaisieObservationVue;
15
import org.tela_botanica.client.vues.observation.ListeObservationVue;
16
import org.tela_botanica.client.vues.observation.MenuObservationVue;
17
import org.tela_botanica.client.vues.observation.PanneauFiltresObservationVues;
196 david 18
import org.tela_botanica.client.vues.observation.filtres.ArbreMotsClesObservationVue;
19
import org.tela_botanica.client.vues.observation.indicateurs.ImageGeneriqueVue;
20
import org.tela_botanica.client.vues.observation.indicateurs.InformationRepartitionVue;
21
import org.tela_botanica.client.vues.observation.indicateurs.MiniZoomImageVue;
22
import org.tela_botanica.client.vues.observation.indicateurs.NuageMotsClesVue;
115 aurelien 23
 
53 david 24
import com.google.gwt.core.client.GWT;
251 aurelien 25
import com.google.gwt.core.client.JavaScriptObject;
26
import com.google.gwt.maps.client.geom.LatLng;
202 david 27
import com.google.gwt.user.client.DOM;
28
import com.google.gwt.user.client.Event;
140 aurelien 29
import com.google.gwt.user.client.History;
77 jpm 30
import com.google.gwt.user.client.Window;
41 jpm 31
import com.gwtext.client.core.EventObject;
86 jpm 32
import com.gwtext.client.core.Ext;
33
import com.gwtext.client.core.ExtElement;
53 david 34
import com.gwtext.client.core.RegionPosition;
217 aurelien 35
import com.gwtext.client.data.Record;
156 aurelien 36
import com.gwtext.client.data.Tree;
251 aurelien 37
import com.gwtext.client.widgets.BoxComponent;
86 jpm 38
import com.gwtext.client.widgets.Component;
251 aurelien 39
import com.gwtext.client.widgets.Container;
12 david 40
import com.gwtext.client.widgets.Panel;
156 aurelien 41
import com.gwtext.client.widgets.TabPanel;
251 aurelien 42
import com.gwtext.client.widgets.event.ContainerListener;
86 jpm 43
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
202 david 44
import com.gwtext.client.widgets.event.PanelListener;
45
import com.gwtext.client.widgets.event.PanelListenerAdapter;
251 aurelien 46
import com.gwtext.client.widgets.event.TabPanelListenerAdapter;
53 david 47
import com.gwtext.client.widgets.layout.BorderLayout;
48
import com.gwtext.client.widgets.layout.BorderLayoutData;
156 aurelien 49
import com.gwtext.client.widgets.layout.FitLayout;
53 david 50
import com.gwtext.client.widgets.layout.RowLayout;
80 jpm 51
import com.gwtext.client.widgets.layout.RowLayoutData;
251 aurelien 52
import com.gwtext.client.widgets.map.LatLonPoint;
156 aurelien 53
import com.gwtext.client.widgets.menu.BaseItem;
54
import com.gwtext.client.widgets.menu.Item;
55
import com.gwtext.client.widgets.menu.Menu;
56
import com.gwtext.client.widgets.menu.event.MenuListenerAdapter;
57
import com.gwtext.client.widgets.tree.TreeEditor;
58
import com.gwtext.client.widgets.tree.TreeNode;
2 aperonnet 59
 
48 david 60
 
12 david 61
/**
62
 * Mediateur gérant les interactions entre vues et les echanges de données
63
 * C'est un singleton.
64
 * @author aurelien
65
 *
66
 */
47 david 67
public class ObservationMediateur {
12 david 68
 
69
	/**
70
	 * booleen qui verifie l'unicite de l'instance (donc static)
71
	 */
31 jpm 72
	private static boolean estInstancie = false ;
73
 
74
	/**
75
	 * pointeur sur le médiateur (pour le pattern singleton)
76
	 */
77
	private static ObservationMediateur thisMediateur = null ;
12 david 78
 
79
	/** Mediateur general de l'application carnet en ligne
80
	 *
81
	 *
82
	 */
83
 
84
	private CarnetEnLigneMediateur carnetEnLigneMediateur = null ;
85
 
86
 
87
	/**
88
	 * modele de données
89
	 */
90
	private ObservationModele observationModele = null ;
91
 
92
 
93
	/**
94
	 * panneau principal des Observation (onglet "observation")
95
	 */
209 aurelien 96
	private final Panel panneauPrincipalObservation = new Panel("Observations");
12 david 97
 
98
 
99
	/**
100
	 * liste détaillée des Observations
101
	 */
102
	private ListeObservationVue listeObservation = null ;
103
 
104
	/**
105
	 * Saisie des Observations
106
	 */
107
 
108
	private FormulaireSaisieObservationVue formulaireSaisieObservationVue=null;
109
 
251 aurelien 110
	/**
111
	 * Cartographie
112
	 */
113
	private CartographieObservationVue cartoObservationVue = null;
48 david 114
 
251 aurelien 115
 
48 david 116
 
12 david 117
	/**
118
	 * booleen explicitant s'il y a une selection en cours
119
	 */
156 aurelien 120
	private boolean selection = false ;
12 david 121
	/**
53 david 122
	 * panneau conteneur pour le panneau  des informations lies à l'observation
123
	 */
12 david 124
 
53 david 125
  	private Panel details = new Panel("Détails");
126
 
156 aurelien 127
  	private Panel panelMotsCles = new Panel("Mots Clés");
128
 
195 david 129
  	private ArbreMotsClesObservationVue arbreMotsClesVue = null ;
156 aurelien 130
 
131
  	private TabPanel detailsEtMotsCles = new TabPanel();
53 david 132
 
133
 
12 david 134
	/**
53 david 135
	 * panneau conteneur pour le panneau des filtres
136
	 */
137
 
54 david 138
  	private PanneauFiltresObservationVues filtres = null;
53 david 139
 
140
 
54 david 141
 
142
  	/**
143
  	 * panneau d'information de repartition sur le nom selectionné
144
  	 *
145
  	 */
146
 
147
  	private InformationRepartitionVue informationRepartitionVue=null;
148
 
149
 
150
  	/**
151
  	 * panneau d'affichage d'une image generique associe au nom selectionne
152
  	 *
153
  	 */
154
 
155
  	private ImageGeneriqueVue imageGeneriqueVue=null;
156
 
94 jpm 157
  	private MiniZoomImageVue mvz = null ;
54 david 158
 
115 aurelien 159
  	private NuageMotsClesVue nuaMC = null;
94 jpm 160
 
125 aurelien 161
  	private Panel conteneurFormulaire = null ;
115 aurelien 162
 
140 aurelien 163
  	private boolean importerObservations = false ;
251 aurelien 164
 
165
	private TabPanel ongletsSaisieCarto;
166
 
167
	private Panel centre;
140 aurelien 168
 
53 david 169
	/**
12 david 170
	 * constructeur privé (on accède a la classe par la méthode getInstance
171
	 */
172
 
173
 
174
	private ObservationMediateur(CarnetEnLigneMediateur carnetEnLigneMediateur )
175
	{
176
		this.carnetEnLigneMediateur=carnetEnLigneMediateur;
251 aurelien 177
 
12 david 178
		// on crée un modèle
179
		observationModele = ObservationModele.Instance(this);
180
 
48 david 181
 
12 david 182
		listeObservation = new ListeObservationVue(this);
53 david 183
		listeObservation.setTitle("Observations");
12 david 184
 
53 david 185
		// quelques variables de position pour les borderlayouts
186
		final BorderLayoutData regionNord = new BorderLayoutData(
187
				RegionPosition.NORTH);
188
 
189
		final BorderLayoutData regionCentre = new BorderLayoutData(
190
				RegionPosition.CENTER);
191
 
192
 
193
		final BorderLayoutData regionEst = new BorderLayoutData(
194
				RegionPosition.EAST);
195
 
196
 
197
		if (GWT.isScript()) {  // FIXME : ne fonctionne pas en mode hosted
198
			regionEst.setSplit(true);
199
		}
200
 
201
		final BorderLayoutData regionOuest = new BorderLayoutData(
202
				RegionPosition.WEST);
12 david 203
 
53 david 204
		if (GWT.isScript()) {  // FIXME : ne fonctionne pas en mode hosted
205
			regionOuest.setSplit(true);
206
		}
207
 
208
		panneauPrincipalObservation.setLayout(new BorderLayout()) ;
209
 
115 aurelien 210
		// on ajoute un panneau supplémentaire pour contenir le formulaire, pour éviter un bug de taille
211
		// des panneaux
125 aurelien 212
		conteneurFormulaire = new Panel();
251 aurelien 213
		cartoObservationVue = new CartographieObservationVue(this);
214
		cartoObservationVue.setLayout(new FitLayout());
53 david 215
 
12 david 216
		// Le formulaire de saisie / modification d'observation
217
		formulaireSaisieObservationVue = new FormulaireSaisieObservationVue(this);
115 aurelien 218
		formulaireSaisieObservationVue.setHeader(false);
219
		conteneurFormulaire.setTitle("Saisie");
220
		conteneurFormulaire.setTitleCollapse(true);
221
		conteneurFormulaire.setCollapsible(true) ;
202 david 222
		conteneurFormulaire.setAutoScroll(true) ;
223
		// Redimensionnement global sur collapse/expand
251 aurelien 224
 
225
 
226
		ongletsSaisieCarto = new TabPanel();
227
 
202 david 228
		conteneurFormulaire.addListener(
229
		new PanelListenerAdapter() {
251 aurelien 230
			public void onCollapse(Panel panel)  {
231
				ObservationMediateur.fireResize();
232
			}
233
		    public void onExpand(Panel panel) {
234
		    	ObservationMediateur.fireResize();
235
		    }
236
		});
237
 
238
		ongletsSaisieCarto.addListener(new TabPanelListenerAdapter() {
239
 
240
			public void onActivate(Panel panel) {
241
 
242
				if (panel.equals(conteneurFormulaire)) {
243
					if (!cartoObservationVue.isCarteAjoutee()) {
267 aurelien 244
						if(formulaireSaisieObservationVue.communeInitialisee()) {
245
							String nomCommune = formulaireSaisieObservationVue.getCommune();
246
							String codePostal = formulaireSaisieObservationVue.getDepartement();
247
							obtenirInformationCommune(nomCommune, codePostal);
248
						}
249
						cartoObservationVue.initialiserCarte(formulaireSaisieObservationVue.communeInitialisee());
202 david 250
					}
251 aurelien 251
				} else {
252
						cartoObservationVue.recentrerCarte();
253
				}
254
			}
255
 
256
			public boolean doBeforeTabChange(TabPanel source, Panel newPanel,
257
					Panel oldPanel) {
258
				if (newPanel.equals(cartoObservationVue)) {
259
					if (!cartoObservationVue.isCarteAjoutee()) {
267 aurelien 260
						cartoObservationVue.initialiserCarte(formulaireSaisieObservationVue.communeInitialisee());
251 aurelien 261
					}
262
				}
263
				return true;
264
			}
202 david 265
		});
53 david 266
 
251 aurelien 267
		centre = new Panel();
268
		centre.setLayout(new BorderLayout());
202 david 269
		centre.setAutoScroll(true);
270
		centre.setBorder(false);
201 david 271
 
251 aurelien 272
		centre.addListener(
273
			new PanelListenerAdapter() {
274
				public void onCollapse(Panel panel)  {
275
					ObservationMediateur.fireResize();
276
				}
277
			    public void onExpand(Panel panel) {
278
			    	ObservationMediateur.fireResize();
279
			    }
280
 
281
				public void onResize(BoxComponent component, int adjWidth,
282
						int adjHeight, int rawWidth, int rawHeight) {
283
			    	ObservationMediateur.fireResize();
284
				}
285
 
286
				public void onAfterLayout(Container self) {
287
					if(!listeObservation.getTailleInitialisee()) {
288
						if((int)Math.round(centre.getHeight() * 0.6) != 0) {
289
							listeObservation.setHeight((int)Math.round(centre.getHeight() * 0.6));
290
							listeObservation.setTailleInitialisee();
291
						}
292
					}
293
				}
294
		});
295
 
115 aurelien 296
		formulaireSaisieObservationVue.setBorder(false);
297
		conteneurFormulaire.add(formulaireSaisieObservationVue);
12 david 298
 
251 aurelien 299
		ongletsSaisieCarto.add(conteneurFormulaire);
300
		ongletsSaisieCarto.add(cartoObservationVue);
156 aurelien 301
 
251 aurelien 302
		BorderLayoutData listeLayoutData = new BorderLayoutData(RegionPosition.SOUTH);
303
		listeLayoutData.setSplit(true);
304
 
305
		BorderLayoutData formLayoutData = new BorderLayoutData(RegionPosition.CENTER);
306
		listeLayoutData.setSplit(true);
307
 
308
		centre.add(listeObservation, listeLayoutData);
309
		centre.add(ongletsSaisieCarto, formLayoutData);
310
 
177 david 311
		Panel conteneurDetailsMotsCles = new Panel("Détails");
202 david 312
 
313
		// Redimensionnement global sur collapse/expand
314
		conteneurDetailsMotsCles.addListener(
315
		new PanelListenerAdapter() {
251 aurelien 316
			public void onCollapse(Panel panel)  {
317
				ObservationMediateur.fireResize();
318
			}
319
		    public void onExpand(Panel panel) {
320
		    	ObservationMediateur.fireResize();
321
		    }
202 david 322
		});
251 aurelien 323
 
53 david 324
		// on initialise le volet qui contient les details
177 david 325
		conteneurDetailsMotsCles.setWidth("10%");
326
		conteneurDetailsMotsCles.setTitleCollapse(true);
327
		conteneurDetailsMotsCles.setCollapsible(true);
156 aurelien 328
 
177 david 329
		conteneurDetailsMotsCles.add(detailsEtMotsCles);
156 aurelien 330
 
177 david 331
		conteneurDetailsMotsCles.setLayout(new FitLayout());
156 aurelien 332
 
201 david 333
 
156 aurelien 334
		details.setAutoScroll(true);
54 david 335
		details.setLayout(new RowLayout());
156 aurelien 336
		details.setWidth("100%");
53 david 337
 
195 david 338
		arbreMotsClesVue = new ArbreMotsClesObservationVue(this) ;
156 aurelien 339
		panelMotsCles.add(arbreMotsClesVue);
340
 
54 david 341
		// Information de repartition
342
		informationRepartitionVue=new InformationRepartitionVue(this);
136 aurelien 343
		details.add(informationRepartitionVue, new RowLayoutData("33%"));
54 david 344
 
345
 
346
		// Image generique
347
		imageGeneriqueVue=new ImageGeneriqueVue(this);
136 aurelien 348
		details.add(imageGeneriqueVue, new RowLayoutData("33%"));
54 david 349
 
94 jpm 350
		mvz = new MiniZoomImageVue(this) ;
54 david 351
 
136 aurelien 352
		details.add(mvz, new RowLayoutData("34%")) ;
94 jpm 353
 
54 david 354
		// on crée le panneau des filtres
355
		filtres = new PanneauFiltresObservationVues(this);
356
 
357
		// on initialise le volet qui contient les filtres
136 aurelien 358
		filtres.setWidth("10%");
53 david 359
		filtres.setTitleCollapse(true);
360
		filtres.setCollapsible(true);
54 david 361
 
202 david 362
 
363
		filtres.addListener(
251 aurelien 364
			new PanelListenerAdapter() {
365
				public void onCollapse(Panel panel)  {
366
					ObservationMediateur.fireResize();
367
				}
368
			    public void onExpand(Panel panel) {
369
			    	ObservationMediateur.fireResize();
370
			    }
202 david 371
		});
372
 
373
 
156 aurelien 374
		detailsEtMotsCles.add(details);
375
		//detailsEtMotsCles.add(panelMotsCles);
376
 
377
		panelMotsCles.hide();
378
 
177 david 379
		panneauPrincipalObservation.add(conteneurDetailsMotsCles,regionEst);
202 david 380
 
53 david 381
		panneauPrincipalObservation.add(filtres,regionOuest);
382
		panneauPrincipalObservation.add(centre,regionCentre);
383
 
12 david 384
	}
2 aperonnet 385
 
202 david 386
	public static native void fireResize() /*-{
387
		 $wnd.Ext.EventManager.fireResize();
388
	}-*/;
389
 
390
 
12 david 391
	/**
392
	 * Retourne une instance de manière unique
393
	 * @return l'instance unique du médiateur
394
	 */
395
	public static ObservationMediateur Instance(CarnetEnLigneMediateur carnetEnLigneMediateur)
396
	{
31 jpm 397
			if(!estInstancie || thisMediateur == null)
12 david 398
			{
399
				estInstancie = true ;
31 jpm 400
				thisMediateur = new ObservationMediateur(carnetEnLigneMediateur) ;
12 david 401
			}
31 jpm 402
 
403
			return thisMediateur ;
12 david 404
	}
140 aurelien 405
 
406
 
407
	public void connecterUtilisateur() {
408
 
409
		if(importerObservations) {
410
 
411
			observationModele.importerObservations();
412
		}
413
 
414
		if(panneauPrincipalObservation == null || !panneauPrincipalObservation.isCreated())
415
		{
416
			panneauPrincipalObservation.addListener(new ContainerListenerAdapter()
417
			{
418
				public void onRender(Component c)
419
				{
420
					panneauPrincipalObservation.purgeListeners() ;
261 aurelien 421
					initialiserArbres();
422
					filtres.getRechercheLibreVue().raz();
140 aurelien 423
					obtenirNombreObservation();
424
					analyserHistorique();
425
				}
426
			}) ;
427
		}
428
		else
429
		{
261 aurelien 430
			initialiserArbres();
431
			filtres.getRechercheLibreVue().raz();
140 aurelien 432
			obtenirNombreObservation();
433
			analyserHistorique();
434
		}
435
	}
436
 
437
	private void initialiserArbres() {
438
		getPanneauFiltres().getArbreDateObservationFiltreVue().initialiser();
261 aurelien 439
		getPanneauFiltres().getArbreEntiteGeographiqueObservationFiltreVue().initialiser();
140 aurelien 440
	}
82 david 441
 
12 david 442
 
443
 
82 david 444
	// ACTIONS  a entreprendre lors d'un evenement particulier
12 david 445
 
82 david 446
 
12 david 447
	/**
82 david 448
	 * Lors du raffraichissement de la liste d'observation
449
	 */
450
 
451
 
452
	public void onRafraichissementListeObservations() {
453
 
173 aurelien 454
		carnetEnLigneMediateur.donneesObsVersImages(listeObservation.getCacheListeObservation());
156 aurelien 455
		observationModele.rafraichirCacheObservation(listeObservation.getCacheListeObservation());
82 david 456
	}
457
 
458
	/**
459
	 *
460
	 * TODO : fonction plus generique, appelle sur un clic ou une selection de ligne, a appeller : SelectionnerObservation
461
	 * est appelé lors d'un clic de souris sur un enregistrement de la liste le
462
	 * médiateur gère alors les conséquences
463
	 *
464
	 * @param rowIndex
465
	 *            le numéro de ligne selectionné
466
	 */
467
 
468
	public void onClicListeObservation(int rowIndex, String ordreObservation) {
469
 
156 aurelien 470
		Observation obs = obtenirCacheObservation().get(ordreObservation) ;
82 david 471
 
105 aurelien 472
		if(GWT.isScript()) {
473
			masquerChargementInfosObservations() ;
474
		}
86 jpm 475
 
82 david 476
		// Affichage de la carte de repartition correspondante
477
		String numeroNomenclaturalSaisiObservation = obs.getNumeroNomenclaturalSaisi() ;
478
 
479
		observationModele.obtenirImageInformationRepartition(informationRepartitionVue,numeroNomenclaturalSaisiObservation) ;
105 aurelien 480
 
217 aurelien 481
		if(formulaireSaisieObservationVue.getModification()) {
482
			String[] ids = listeObservation.getIdSelectionnees();
483
			if(ids.length > 1) {
484
				formulaireSaisieObservationVue.setMasseModification(true);
485
				ListeObservation listeObs = new ListeObservation();
486
				for(int i=0; i < ids.length;i++) {
487
					Observation obsAjout = observationModele.getCacheObservation().get(ids[i]);
488
					listeObs.ajouterObservation(obsAjout);
489
				}
490
				formulaireSaisieObservationVue.rafraichir(listeObs, false);
491
			} else {
492
				formulaireSaisieObservationVue.setMasseModification(false);
493
				// affichage des détails dans le formulaire d'observation
494
				formulaireSaisieObservationVue.rafraichir(obs, false) ;
495
			}
496
		} else {
497
			formulaireSaisieObservationVue.rafraichir(obs, false) ;
498
		}
82 david 499
		// Affichage de l'image correspondante
500
 
501
		observationModele.obtenirImageGenerique(imageGeneriqueVue,numeroNomenclaturalSaisiObservation) ;
94 jpm 502
 
503
		observationModele.obtenirLiaisonImage(mvz, ordreObservation) ;
156 aurelien 504
 
505
		observationModele.obtenirMotsClesId(arbreMotsClesVue, ordreObservation);
251 aurelien 506
 
507
		observationModele.obtenirInformationCommune(cartoObservationVue, obs.getLocalite(), obs.getIdentifiantLocalite());
156 aurelien 508
		//arbreMotsClesVue.cocherMotsCles(motsClesIds);
82 david 509
 
510
 
511
	}
512
 
128 aurelien 513
	public void obtenirImageInformationExternes(String numeroNomenclaturalSaisiObservation) {
514
		if(GWT.isScript()) {
515
			masquerChargementInfosObservations() ;
516
		}
517
		observationModele.obtenirImageInformationRepartition(informationRepartitionVue,numeroNomenclaturalSaisiObservation) ;
518
		observationModele.obtenirImageGenerique(imageGeneriqueVue,numeroNomenclaturalSaisiObservation) ;
519
	}
82 david 520
 
217 aurelien 521
	public int getTaillePage() {
522
		return listeObservation.getTaillePage();
523
	}
128 aurelien 524
 
217 aurelien 525
	public int getPageEnCours() {
526
		return listeObservation.getPageEncours();
527
	}
528
 
529
 
82 david 530
	// ACCES au Modèle
531
 
532
 
533
	// C du CRUD
534
 
535
 
536
 
537
	/**
538
	 * TODO : afficher un message du type "observation ajouté".
539
	 * Lance la creation d'une observation
540
	 * @param obs : l'observation saisie
104 jpm 541
	 */
82 david 542
	public void ajouterObservation(Observation obs) {
104 jpm 543
 
82 david 544
	  // On raffraichi la liste d'observation
545
	  observationModele.ajouterObservation(listeObservation, obs) ;
91 jpm 546
	  filtres.getArbreEntiteGeographiqueObservationFiltreVue().rafraichir(obs,true) ;
94 jpm 547
	  filtres.getArbreDateObservationFiltreVue().rafraichir(obs,true) ;
82 david 548
 
549
	}
550
 
551
 
552
 
553
	// R du CRUD
554
 
555
	/**
54 david 556
	 * Demande au modele le nombre d'Observation à afficher
557
	 * TODO : grouper cette demande avec la demande d'affichage de liste ?
12 david 558
	 */
2 aperonnet 559
 
12 david 560
	public void obtenirNombreObservation() {
561
 
125 aurelien 562
		listeObservation.masquerChargement() ;
104 jpm 563
		mvz.raz() ;
564
		imageGeneriqueVue.raz() ;
565
		informationRepartitionVue.raz() ;
566
		observationModele.obtenirNombreObservation(listeObservation) ;
12 david 567
 
2 aperonnet 568
	}
54 david 569
 
12 david 570
 
82 david 571
 
572
	public void obtenirListeObservation() {
573
		obtenirListeObservation(listeObservation);
574
	}
575
 
2 aperonnet 576
	/**
82 david 577
	 * Demande au modele le detail  des Observations à afficher
54 david 578
	 * TODO : grouper cette demande avec la demande d'affichage de liste ?
2 aperonnet 579
	 */
7 aperonnet 580
 
12 david 581
 
61 jpm 582
	public void obtenirListeObservation(Rafraichissable r) {
583
 
77 jpm 584
		listeObservation.masquerChargement() ;
125 aurelien 585
 
61 jpm 586
		observationModele.obtenirListeObservation(r,listeObservation.getTaillePage(),listeObservation.getPageEncours()) ;
587
	}
588
 
86 jpm 589
	public void obtenirCacheObservation(Rafraichissable r) {
590
 
156 aurelien 591
		r.rafraichir(observationModele.getCacheObservation(), false) ;
86 jpm 592
	}
593
 
82 david 594
 
2 aperonnet 595
	/**
82 david 596
	 * Envoie au modèle une demande pour obtenir l'arbre des localites
597
	 *
598
	 * @param r
599
	 *            le raffraichissable qui a demandé la mise à jour
2 aperonnet 600
	 */
82 david 601
	public void obtenirListeEntiteGeographique() {
12 david 602
 
91 jpm 603
		observationModele.obtenirListeEntiteGeographique(filtres.getArbreEntiteGeographiqueObservationFiltreVue());
12 david 604
 
605
	}
82 david 606
 
607
 
608
	// U du CRUD
609
	public void modifierObservation(Observation obs) {
610
 
12 david 611
 
217 aurelien 612
	  // On rafraichit la liste d'observation
82 david 613
	  observationModele.modifierObservation(listeObservation, obs) ;
91 jpm 614
	  filtres.getArbreEntiteGeographiqueObservationFiltreVue().rafraichir(obs,true) ;
217 aurelien 615
	  filtres.getArbreDateObservationFiltreVue().rafraichir(obs,true) ;
82 david 616
 
617
	}
12 david 618
 
217 aurelien 619
	public void modifierObservationEnMasse(Observation obs) {
620
		// On rafraichit la liste d'observation
220 aurelien 621
		listeObservation.masquerChargement();
217 aurelien 622
		observationModele.modifierObservationEnMasse(listeObservation, obs) ;
623
	}
82 david 624
 
625
	// D du CRUD
626
 
627
 
94 jpm 628
 
54 david 629
	/**
82 david 630
	 * TODO : afficher un message du type "observation modifie".
631
	 * Lance la modification d'une observation
632
	 * @param obs : l'observation a modifier
54 david 633
	 */
634
 
82 david 635
 
636
 
637
	public void supprimerObservation(Rafraichissable r, String numeroOrdre) {
638
 
639
		if(listeObservation.getSelectionModel().getCount() > 0)
640
		{
641
			if(Window.confirm("Êtes vous sur de vouloir supprimer cette observation ?")) {
642
			observationModele.supprimerObservation(r,numeroOrdre) ;
643
			}
644
		}
645
 
2 aperonnet 646
	}
12 david 647
 
82 david 648
	// Assistants de saisie
2 aperonnet 649
	/**
13 david 650
	 *
651
	 * Lance un appel de recherche d'une liste de commune correspondant aux criteres de selectionne
652
	 * @param r : la vue demandeuse de donnee
653
	 * @param critere : les criteres de selection
654
	 */
12 david 655
 
13 david 656
	public void obtenirListeReferentielCommune(Rafraichissable r, String critere) {
12 david 657
 
13 david 658
		observationModele.obtenirListeReferentielCommune(r,critere) ;
2 aperonnet 659
 
12 david 660
 
2 aperonnet 661
	}
20 david 662
 
82 david 663
 
664
 
20 david 665
	/**
666
	 *
667
	 * Lance un appel de recherche d'une liste de nom scientifique correspondant aux criteres de selectionne
668
	 * @param r : la vue demandeuse de donnee
669
	 * @param critere : les criteres de selection
670
	 */
671
 
672
	public void obtenirListeReferentielNom(Rafraichissable r, String critere) {
2 aperonnet 673
 
94 jpm 674
		observationModele.obtenirListeReferentielNom(r,critere) ;
20 david 675
	}
82 david 676
 
677
	// Etat du syteme
678
 
20 david 679
	/**
82 david 680
	 * C'est dans cette fonction que doivent être renvoyé les valeurs des filtres
681
	 * sous forme de tableau [nom, valeur]
682
	 * @return Les noms et valeurs des filtres
20 david 683
	 */
82 david 684
	public String[][] renvoyerFiltres()
115 aurelien 685
	{
261 aurelien 686
			int longueur = 0;
115 aurelien 687
 
91 jpm 688
			String[] filtresEntitesGeo = filtres.getArbreEntiteGeographiqueObservationFiltreVue().renvoyerValeursAFiltrer() ;
689
			String chaineNomsFiltresGeo = filtresEntitesGeo[0] ;
690
			String chaineValFiltresGeo = filtresEntitesGeo[1] ;
87 jpm 691
 
91 jpm 692
			String[] filtresDate = filtres.getArbreDateObservationFiltreVue().renvoyerValeursAFiltrer() ;
693
			String chaineNomsFiltresDate = filtresDate[0] ;
694
			String chaineValFiltresDate = filtresDate[1] ;
695
 
261 aurelien 696
			String[] filtresTaxon = filtres.getRechercheLibreVue().renvoyerValeursAFiltrer();
91 jpm 697
 
251 aurelien 698
			String chaineNomsFiltres = chaineNomsFiltresGeo+","+chaineNomsFiltresDate+","+filtresTaxon[0] ;
699
			String chaineValFiltres = chaineValFiltresGeo+","+chaineValFiltresDate+","+filtresTaxon[1] ;
700
 
87 jpm 701
			String[] nomsFiltres = chaineNomsFiltres.split(",") ;
702
			String[] valsFiltres = chaineValFiltres.split(",") ;
91 jpm 703
 
115 aurelien 704
			longueur += nomsFiltres.length;
94 jpm 705
 
115 aurelien 706
			String [][] valeursFiltres = new String[longueur][2] ;
707
 
251 aurelien 708
			listeObservation.afficherFiltres(chaineValFiltresGeo, chaineValFiltresDate, filtresTaxon[1]) ;
91 jpm 709
 
115 aurelien 710
			int i = 0;
91 jpm 711
 
87 jpm 712
			if(nomsFiltres.length > 0)
713
			{
115 aurelien 714
				for(i = 0 ; i < nomsFiltres.length ; i++)
87 jpm 715
				{
716
					valeursFiltres[i][0] = nomsFiltres[i] ;
717
					if(valsFiltres[i].equals("Inconnue"))
718
					{
719
						valeursFiltres[i][1] = "000null" ;
720
					}
721
					else
722
					{
723
						valeursFiltres[i][1] = valsFiltres[i] ;
724
					}
725
				}
726
			}
115 aurelien 727
 
728
			return valeursFiltres ;
20 david 729
	}
82 david 730
 
41 jpm 731
 
54 david 732
	/**
82 david 733
	 * Retourne l'identifiant de l'utilisateur connecte
734
	 * @return : identifiant de l'utilisateur connecte
74 david 735
	 */
82 david 736
	public String getIdentifiant() {
74 david 737
 
140 aurelien 738
		return carnetEnLigneMediateur.getUtilisateur().getIdentite();
74 david 739
 
77 jpm 740
	}
82 david 741
 
742
 
74 david 743
	/**
54 david 744
	 *
82 david 745
	 * @return
54 david 746
	 *
747
	 */
748
 
82 david 749
	public Panel getPanneauPrincipalObservation() {
750
		return panneauPrincipalObservation;
751
	}
54 david 752
 
753
 
41 jpm 754
	public void montrerContextMenu(EventObject e) {
755
 
107 aurelien 756
		MenuObservationVue mvo = new MenuObservationVue(this) ;
757
		mvo.showAt(e.getXY()) ;
41 jpm 758
 
759
	}
760
 
761
	public void doubleClicListeObservation(int rowIndex) {
762
 
763
 
764
	}
82 david 765
 
766
	// Getters
767
 
54 david 768
	public PanneauFiltresObservationVues getPanneauFiltres() {
769
 
770
		return filtres;
771
 
772
	}
86 jpm 773
 
774
	public void masquerChargementInfosObservations()
775
	{
156 aurelien 776
		ExtElement masked = Ext.get(detailsEtMotsCles.getId());
54 david 777
 
156 aurelien 778
		if (details.isVisible() && masked != null && !masked.isMasked()) {
86 jpm 779
			informationRepartitionVue.raz() ;
780
			imageGeneriqueVue.raz() ;
781
			masked.mask("Chargement", true);
782
		}
251 aurelien 783
 
784
		cartoObservationVue.masquerChargement(true);
86 jpm 785
	}
82 david 786
 
86 jpm 787
	public void deMasquerChargementInfosObservations()
788
	{
156 aurelien 789
		ExtElement masked = Ext.get(detailsEtMotsCles.getId());
63 jpm 790
 
156 aurelien 791
		if (details.isVisible() && masked != null && masked.isMasked()) {
86 jpm 792
			masked.unmask() ;
793
		}
794
	}
91 jpm 795
 
796
 
797
	public void obtenirDatesObservation() {
798
 
799
		observationModele.obtenirDatesObservation(filtres.getArbreDateObservationFiltreVue()) ;
800
	}
101 jpm 801
 
802
 
803
	public void exporterObservations() {
804
 
128 aurelien 805
			observationModele.exporterObservations() ;
101 jpm 806
	}
104 jpm 807
 
808
 
809
	public void deconnecterUtilisateur() {
810
 
140 aurelien 811
		if(panneauPrincipalObservation == null || panneauPrincipalObservation.isCreated() || !panneauPrincipalObservation.isVisible())
812
		{
813
			panneauPrincipalObservation.addListener(new ContainerListenerAdapter()
814
			{
815
				public void onShow(Component component)
816
				{
817
					deconnecterUtilisateur();
818
					panneauPrincipalObservation.purgeListeners();
819
				}
820
			});
821
		}
822
		else
823
		{
824
			listeObservation.raz() ;
825
			formulaireSaisieObservationVue.raz() ;
261 aurelien 826
			razFiltres();
140 aurelien 827
			informationRepartitionVue.raz() ;
828
			imageGeneriqueVue.raz() ;
829
			mvz.raz() ;
830
		}
104 jpm 831
	}
832
 
833
 
834
	public void supprimerLiaisonObsImage() {
835
 
836
		String idObs = listeObservation.getIdSelectionnees()[0] ;
837
		String idImg = mvz.getIdImage() ;
838
 
839
		if(Window.confirm("Supprimer le lien entre l'image "+idImg+" et l'observations "+idObs+" ?"))
840
		{
841
			mvz.supprimerLiaisonImage() ;
842
			observationModele.supprimerLiaisonImages(idImg,idObs) ;
843
		}
844
 
845
	}
107 aurelien 846
 
847
	public void supprimerObservations() {
848
 
128 aurelien 849
		if(listeObservation.getIdSelectionnees().length > 0) {
850
			if(Window.confirm("Êtes vous sur de vouloir supprimer les observations sélectionnées ?")) {
851
					String[] numObs = listeObservation.getIdSelectionnees();
852
					String numObsapl = "" ;
853
					for(int i = 0 ; i < numObs.length ; i++) {
854
						numObsapl += numObs[i]+"," ;
855
					}
856
 
857
					observationModele.supprimerListeObservation(listeObservation,numObsapl) ;
107 aurelien 858
			}
128 aurelien 859
		}
860
		else
861
		{
862
			Window.alert("Aucune observation sélectionnée");
863
		}
107 aurelien 864
	}
108 aurelien 865
 
866
 
145 aurelien 867
	public void transmettreObservations(boolean publier) {
108 aurelien 868
 
140 aurelien 869
		if(carnetEnLigneMediateur.getUtilisateur().isIdentifie()) {
870
			if(listeObservation.getIdSelectionnees().length > 0) {
145 aurelien 871
 
872
				String action = "" ;
873
 
874
				if(publier) {
875
					action = "rendre publiques" ;
876
				}
877
				else {
878
					action = "rendre privées" ;
879
				}
880
 
881
				if(Window.confirm("Êtes vous sur de vouloir "+action+" les observations sélectionnées ?")) {
140 aurelien 882
					String[] numObs = listeObservation.getIdSelectionnees();
883
					String numObsApl = "" ;
884
					for(int i = 0 ; i < numObs.length ; i++) {
885
						numObsApl += numObs[i] ;
886
						if(i != numObs.length - 1) {
887
							numObsApl +="," ;
888
						}
128 aurelien 889
					}
140 aurelien 890
 
145 aurelien 891
					observationModele.transmettreListeObservation(listeObservation,numObsApl, publier) ;
108 aurelien 892
				}
893
			}
140 aurelien 894
			else
895
			{
896
				Window.alert("Aucune observation sélectionnée");
897
			}
108 aurelien 898
		}
128 aurelien 899
		else
900
		{
145 aurelien 901
			if(publier) {
902
				if(Window.confirm("La publication des observations nécessite d'être identifié, voulez-vous vous identifier ? (toutes vos observations saisies seront conservées)")) {
903
					importerObservations = true ;
904
					carnetEnLigneMediateur.afficherDialogueConnexion();
905
				}
140 aurelien 906
			}
128 aurelien 907
		}
108 aurelien 908
 
909
	}
140 aurelien 910
 
911
	public void analyserHistorique() {
912
 
913
		if (History.getToken().length()>0) {
115 aurelien 914
 
140 aurelien 915
	        final String anum=History.getToken();
916
	        observationModele.analyserHistorique(formulaireSaisieObservationVue,anum);
917
		}
918
	}
115 aurelien 919
 
140 aurelien 920
 
156 aurelien 921
	public void montrerContextMenuArbre(final TreeNode n, EventObject e,
922
			TreeEditor te) {
923
			Menu mn = new Menu();
924
			final com.gwtext.client.widgets.menu.Item ajoutN = new Item(
925
					"Ajouter mot cle");
926
			final com.gwtext.client.widgets.menu.Item suppN = new Item(
927
					"Supprimer mot cle");
928
 
929
			mn.addItem(ajoutN);
930
			mn.addItem(suppN);
931
 
932
			mn.addListener(new MenuListenerAdapter() {
933
 
934
				public void onItemClick(BaseItem item, EventObject e) {
935
					if (item.equals(suppN)) {
936
						arbreMotsClesVue
937
								.supprimerNoeud(n);
938
					}
939
					if (item.equals(ajoutN)) {
940
						arbreMotsClesVue.ajouterNoeud(
941
								n);
942
					}
943
				}
944
			});
945
 
946
			mn.showAt(e.getXY());
115 aurelien 947
 
948
	}
949
 
950
 
156 aurelien 951
	/**
952
	 * Appelle le modèle pour mettre à jour la paire mot-clé / identifiant du
953
	 * mot clé
954
	 *
955
	 * @param text
956
	 *            le texte du mot clé
957
	 * @param id
958
	 *            l'identifiant du mot clé
959
	 */
960
	public void mettreAjourMotsClesId(String text, String id) {
961
 
962
		observationModele.mettreAjourMotsClesId(text, id);
963
 
115 aurelien 964
	}
965
 
156 aurelien 966
	/**
967
	 * Récupère les identifiants des images selectionnés et appelle le modèle
968
	 * pour qu'il mette à jour les associations mots clés/images
969
	 *
970
	 * @param motsClesEnCours
971
	 *            les mots clés à associer aux images selectionnés séparés par
972
	 *            une ','
973
	 * @param arbreMC
974
	 *            l'arbre des mots clés à mettre à jour
975
	 */
976
	public void mettreAjourMotsCles(String motsClesEnCours, Tree arbreMC) {
115 aurelien 977
 
156 aurelien 978
		String[] ids = listeObservation.getIdSelectionnees();
979
		observationModele.mettreAjourMotsCles(ids, motsClesEnCours, arbreMC);
980
 
115 aurelien 981
	}
982
 
156 aurelien 983
	/**
984
	 * Appelle le médiateur pour qu'il ajoute un mot clé dans l'arbre des mots
985
	 * clés
986
	 *
987
	 * @param n
988
	 *            le noeud à ajouter à l'arbre
989
	 * @param arbreMC
990
	 *            le nouvel arbre de mots clés à mettre à jour
991
	 */
992
	public void ajouterMotCleDansArbre(TreeNode n, Tree arbreMC) {
993
		observationModele.ajouterMotCleDansArbre(n, arbreMC);
994
		getPanneauFiltres().getArbreMotsClesFiltreVue().rafraichir(n, false);
115 aurelien 995
 
156 aurelien 996
	}
997
 
998
	/**
999
	 * Appelle le médiateur pour qu'il supprime un mot clé et son sous arbre
1000
	 * dans l'arbre des mots clés
1001
	 *
1002
	 * @param n
1003
	 *            le noeud à supprimer
1004
	 * @param arbreMC
1005
	 *            le nouvel arbre de mots clés à mettre à jour
1006
	 */
1007
	public void supprimerMotCleDansArbre(TreeNode n, Tree arbreMC) {
1008
 
1009
		observationModele.supprimerMotCleDansArbre(n, arbreMC);
1010
		getPanneauFiltres().getArbreMotsClesFiltreVue().rafraichir(n.getId(), false);
1011
 
1012
	}
1013
 
1014
	/**
1015
	 * Appelle le médiateur pour qu'il modifie un mot clé dans l'arbre des mots
1016
	 * clés
1017
	 *
1018
	 * @param n
1019
	 *            le noeud à modifier
1020
	 * @param arbreMC
1021
	 *            le nouvel arbre de mots clés à mettre à jour
1022
	 */
1023
	public void modifierMotCleDansArbre(TreeNode n, Tree arbreMC) {
1024
 
1025
		observationModele.modifierMotCleDansArbre(n, arbreMC);
1026
		getPanneauFiltres().getArbreMotsClesFiltreVue().rafraichir(n, false);
1027
 
1028
	}
1029
 
1030
	/**
1031
	 * Appelle le médiateur pour qu'il déplace un mot clé et son sous arbre dans
1032
	 * l'arbre des mots clés
1033
	 *
1034
	 * @param n
1035
	 *            le noeud à déplacer
1036
	 * @param arbreMC
1037
	 *            le nouvel arbre de mots clés à mettre à jour
1038
	 */
1039
	public void deplacerMotCleDansArbre(TreeNode n, Tree arbreMC) {
1040
 
1041
		observationModele.deplacerMotCleDansArbre(n, arbreMC);
1042
		getPanneauFiltres().getArbreMotsClesFiltreVue().rafraichir(n, false);
1043
	}
1044
 
1045
 
1046
	public void rafraichirArbreMotsCles(Tree arbreMotsCles) {
115 aurelien 1047
 
156 aurelien 1048
		arbreMotsClesVue.rafraichir(arbreMotsCles, false);
1049
		getPanneauFiltres().getArbreMotsClesFiltreVue().rafraichir(arbreMotsCles, false);
115 aurelien 1050
 
1051
	}
1052
 
1053
 
156 aurelien 1054
	public void obtenirArbreMotsCles(Rafraichissable r) {
115 aurelien 1055
 
156 aurelien 1056
		observationModele.obtenirArbreMotsCles(r);
1057
	}
12 david 1058
 
156 aurelien 1059
	public ListeObservation obtenirCacheObservation() {
1060
		return observationModele.getCacheObservation();
1061
	}
1062
 
1063
	public void donneesExterieures(Object nouvelleDonnees) {
1064
		if(nouvelleDonnees instanceof Tree) {
1065
 
1066
			Tree arbreMotsCles = (Tree)nouvelleDonnees ;
1067
			observationModele.rafraichirArbreMotsCles(nouvelleDonnees);
1068
			rafraichirArbreMotsCles(arbreMotsCles);
1069
		}
1070
	}
1071
 
1072
	public void transmettreDonnees(Object o) {
1073
		carnetEnLigneMediateur.donneesObsVersImages(o);
1074
	}
217 aurelien 1075
 
1076
	public void onModeModification() {
1077
 
1078
		String[] ids = listeObservation.getIdSelectionnees();
1079
		Observation obs = listeObservation.getCacheListeObservation().get(ids[ids.length]);
1080
		if(ids.length > 1) {
1081
			formulaireSaisieObservationVue.setMasseModification(true);
1082
			ListeObservation listeObs = new ListeObservation();
1083
			for(int i=0; i < ids.length;i++) {
1084
				Observation obsAjout = observationModele.getCacheObservation().get(ids[i]);
1085
				listeObs.ajouterObservation(obsAjout);
1086
			}
1087
			formulaireSaisieObservationVue.rafraichir(listeObs, false);
1088
		} else {
1089
			formulaireSaisieObservationVue.setMasseModification(false);
1090
			// affichage des détails dans le formulaire d'observation
1091
			formulaireSaisieObservationVue.rafraichir(obs, false) ;
1092
		}
251 aurelien 1093
 
1094
		conteneurFormulaire.setTitle("Modification");
217 aurelien 1095
	}
251 aurelien 1096
 
1097
	public void onModeCreation() {
1098
		conteneurFormulaire.setTitle("Création");
1099
	}
1100
 
1101
	public void obtenirInformationCoord(Rafraichissable r, LatLng coord) {
1102
		observationModele.obtenirInformationCoord(r,coord);
1103
	}
1104
 
1105
	public void obtenirInformationCommune(Rafraichissable r, String nomCommune, String codePostal) {
1106
		observationModele.obtenirInformationCommune(r,nomCommune, codePostal);
1107
	}
1108
 
1109
	public void obtenirInformationCoord(LatLng coord) {
1110
		observationModele.obtenirInformationCoord(cartoObservationVue,coord);
1111
		if(!cartoObservationVue.isVisible()){
1112
			cartoObservationVue.masquerChargement(true);
1113
			ongletsSaisieCarto.activate(1);
1114
		}
1115
	}
1116
 
1117
	public void obtenirInformationCommune(String nomCommune,
1118
			String codePostal) {
1119
		observationModele.obtenirInformationCommune(cartoObservationVue,nomCommune, codePostal);
1120
		if(!cartoObservationVue.isVisible()){
1121
			cartoObservationVue.masquerChargement(true);
1122
			ongletsSaisieCarto.activate(1);
267 aurelien 1123
			cartoObservationVue.recentrerCarte();
251 aurelien 1124
		}
1125
	}
1126
 
1127
	public void rafraichirSaisieCommuneObservation(EntiteGeographiqueObservation infosCommune) {
1128
		formulaireSaisieObservationVue.rafraichir(infosCommune, false);
1129
		ongletsSaisieCarto.activate(0);
1130
	}
261 aurelien 1131
 
1132
 
1133
	private void razFiltres() {
1134
 
1135
		filtres.getArbreDateObservationFiltreVue().raz() ;
1136
		filtres.getArbreEntiteGeographiqueObservationFiltreVue().raz() ;
1137
		filtres.getArbreMotsClesFiltreVue().raz();
1138
		filtres.getRechercheLibreVue().raz();
1139
	}
2 aperonnet 1140
}