Subversion Repositories eFlore/Applications.cel

Rev

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