Subversion Repositories eFlore/Applications.cel

Rev

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