Subversion Repositories eFlore/Applications.cel

Rev

Rev 2568 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
247 aurelien 1
package org.tela_botanica.client.vues.observation;
2
 
2553 mathias 3
import org.tela_botanica.client.cel2;
247 aurelien 4
import org.tela_botanica.client.interfaces.Rafraichissable;
989 aurelien 5
import org.tela_botanica.client.modeles.objets.EntiteGeographiqueObservation;
247 aurelien 6
import org.tela_botanica.client.observation.ObservationMediateur;
965 aurelien 7
import org.tela_botanica.client.util.Util;
247 aurelien 8
 
268 aurelien 9
import com.google.gwt.user.client.Timer;
247 aurelien 10
import com.google.gwt.user.client.Window;
11
import com.gwtext.client.core.EventCallback;
12
import com.gwtext.client.core.EventObject;
13
import com.gwtext.client.core.Ext;
14
import com.gwtext.client.core.ExtElement;
15
import com.gwtext.client.widgets.Container;
16
import com.gwtext.client.widgets.Panel;
17
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
18
import com.gwtext.client.widgets.form.Label;
19
import com.gwtext.client.widgets.layout.FitLayout;
20
import com.gwtext.client.widgets.layout.RowLayout;
21
import com.gwtext.client.widgets.layout.RowLayoutData;
1958 aurelien 22
import com.google.maps.gwt.client.GoogleMap;
23
import com.google.maps.gwt.client.GoogleMap.ClickHandler;
24
import com.google.maps.gwt.client.GoogleMap.ZoomChangedHandler;
25
import com.google.maps.gwt.client.InfoWindow;
26
import com.google.maps.gwt.client.InfoWindowOptions;
27
import com.google.maps.gwt.client.LatLng;
28
import com.google.maps.gwt.client.MapOptions;
29
import com.google.maps.gwt.client.MapTypeId;
30
import com.google.maps.gwt.client.Marker;
31
import com.google.maps.gwt.client.MarkerOptions;
32
import com.google.maps.gwt.client.MouseEvent;
247 aurelien 33
 
34
public class CartographieObservationVue extends Panel implements Rafraichissable {
35
 
36
	private String id = "cartographie_observation";
37
	private ObservationMediateur oMediateur = null;
38
 
39
	Panel panneauCarto = null;
1958 aurelien 40
	GoogleMap map = null;
41
	Marker nmk = null;
2553 mathias 42
 
247 aurelien 43
	private boolean carteAjoutee = false;
1958 aurelien 44
	private boolean infoOuverte = false;
2553 mathias 45
 
2568 aurelien 46
	String valeurLocalite = "Bourges"; // j'aurais préféré Bort-les-Orgues
296 aurelien 47
	LatLng centreFrance = null;
2568 aurelien 48
	LatLng pointLocalite = null;
2558 aurelien 49
	String codeLoc = "";
2568 aurelien 50
	String pays = "";
2553 mathias 51
 
681 aurelien 52
	int niveauZoom = 6;
247 aurelien 53
 
54
	Label panneauExplication = new Label(
55
			"Précisez le lieu de votre observation et cliquez sur OK. Les coordonnées sont données en degrés décimaux, comptés positivement vers le Nord pour la latitude, et vers l'Est pour la longitude");
56
 
57
	private InfoWindow info;
2275 mathias 58
	private boolean zoomerSurRetour = false;
247 aurelien 59
 
60
	public CartographieObservationVue(ObservationMediateur om) {
2275 mathias 61
 
247 aurelien 62
		oMediateur = om;
2553 mathias 63
 
681 aurelien 64
		setHeader(false);
247 aurelien 65
		setAutoWidth(true);
66
		setPaddings(10);
67
 
68
		panneauCarto = new Panel();
69
		panneauCarto.setLayout(new FitLayout());
70
 
71
		setLayout(new RowLayout());
2553 mathias 72
 
1958 aurelien 73
		panneauCarto.setAutoHeight(true);
247 aurelien 74
		add(panneauExplication, new RowLayoutData(12));
75
		add(panneauCarto, new RowLayoutData());
2553 mathias 76
 
247 aurelien 77
		addListener(new ContainerListenerAdapter() {
1292 aurelien 78
			@Override
247 aurelien 79
			public void onAfterLayout(Container c) {
1958 aurelien 80
				initialiserCarte(false);
247 aurelien 81
			}
82
		});
83
	}
2553 mathias 84
 
681 aurelien 85
	public void setTailleCarte(int hauteur, int largeur) {
1958 aurelien 86
		setSize(largeur, hauteur);
681 aurelien 87
	}
2553 mathias 88
 
247 aurelien 89
	public void masquerChargement(boolean masquer) {
654 aurelien 90
 
91
		if(panneauCarto.isVisible()) {
92
			if(masquer) {
2568 aurelien 93
				panneauCarto.getEl().mask("Recherche des coordonnées et de la localite, veuillez patienter");
654 aurelien 94
			} else {
95
				panneauCarto.getEl().unmask();
247 aurelien 96
			}
97
		}
98
	}
99
 
2568 aurelien 100
	public void obtenirInfosLocalites(LatLng coord) {
2558 aurelien 101
		// Remise à zéro des infos restantes d'une ancienne requete
2568 aurelien 102
		valeurLocalite = "";
2558 aurelien 103
		codeLoc = "";
2568 aurelien 104
		pays = "";
2558 aurelien 105
 
1958 aurelien 106
		oMediateur.obtenirInformationCoord(this, coord.lat(), coord.lng());
247 aurelien 107
	}
108
 
2568 aurelien 109
	public void mettreAJourInfos(final LatLng pointNouvelleLocalite, int zoom) {
1958 aurelien 110
		GoogleMap mapNulle = null;
111
		if(nmk != null) {
112
			nmk.setMap(mapNulle);
247 aurelien 113
		}
2568 aurelien 114
		pointLocalite = pointNouvelleLocalite;
115
		nmk = fabriquerMarqueur(pointLocalite);
1958 aurelien 116
		nmk.setMap(map);
2558 aurelien 117
		afficherInfoMarker(nmk, construireContenuInfoMarker(nmk));
1959 aurelien 118
		recentrerCarte(nmk.getPosition());
2275 mathias 119
		map.setZoom(zoom);
247 aurelien 120
	}
121
 
2568 aurelien 122
	private void initialiserCarte(boolean localite) {
2275 mathias 123
 
1958 aurelien 124
		panneauCarto.clear();
2275 mathias 125
 
1958 aurelien 126
		centreFrance = LatLng.create(47.0504, 2.2347);
2568 aurelien 127
		pointLocalite = centreFrance;
2275 mathias 128
 
129
		MapOptions options = MapOptions.create();
130
	    options.setCenter(centreFrance);
131
	    options.setZoom(6);
1958 aurelien 132
	    options.setMapTypeId(MapTypeId.HYBRID);
133
	    options.setDraggable(true);
134
	    options.setMapTypeControl(true);
2275 mathias 135
	    options.setScaleControl(true);
136
	    options.setScrollwheel(true);
137
 
138
		map = GoogleMap.create(panneauCarto.getElement(), options );
1958 aurelien 139
 
140
		InfoWindowOptions infopts = InfoWindowOptions.create();
141
		info = InfoWindow.create();
142
		info.setOptions(infopts);
143
		info.addCloseClickListener(new InfoWindow.CloseClickHandler() {
144
			@Override
145
			public void handle() {
146
				infoOuverte = false;
147
			}
148
		});
149
 
2568 aurelien 150
		if(!localite) {
268 aurelien 151
			fabriquerMarqueurIndication();
152
		}
1958 aurelien 153
 
154
		map.addClickListener(new ClickHandler() {
1292 aurelien 155
			@Override
1958 aurelien 156
			public void handle(MouseEvent event) {
2568 aurelien 157
				obtenirInfosLocalites(event.getLatLng());
391 aurelien 158
			}
159
		});
160
 
1958 aurelien 161
		map.addZoomChangedListener(new ZoomChangedHandler() {
1292 aurelien 162
			@Override
1958 aurelien 163
			public void handle() {
164
				niveauZoom = (int)map.getZoom();
264 aurelien 165
			}
166
		});
1958 aurelien 167
 
168
		panneauCarto.doLayout();
169
		panneauCarto.expand();
170
		panneauCarto.setHeight("100%");
171
		panneauCarto.setWidth("100%");
172
		expand();
247 aurelien 173
	}
268 aurelien 174
 
175
	public void fabriquerMarqueurIndication() {
1958 aurelien 176
		GoogleMap mapNulle = null;
177
		if(nmk != null) {
178
			nmk.setMap(mapNulle);
179
		}
2568 aurelien 180
		nmk = fabriquerMarqueur(pointLocalite);
1958 aurelien 181
		nmk.setMap(map);
182
		info.setContent("<div id=\"info_contenu\">"+
2568 aurelien 183
				"Déplacez ce marqueur pour localiser votre observation (localite et coordonnées)<br />"
268 aurelien 184
				+"longitude="
2276 mathias 185
				+ Util.tronquerNombrePourAffichage("" + nmk.getPosition().lng(), 5) + "<br />latitude="
186
				+ Util.tronquerNombrePourAffichage("" + nmk.getPosition().lat(), 5) + "</div>");
1958 aurelien 187
		infoOuverte = true;
188
		info.open(map,nmk);
268 aurelien 189
	}
247 aurelien 190
 
191
	public void AfficherMessageAucuneInfos() {
2558 aurelien 192
		mettreAJourInfos(centreFrance, niveauZoom);
247 aurelien 193
		Window.alert("Aucune information pour le nom donné");
194
	}
195
 
196
	public int getNiveauZoom() {
197
		return niveauZoom;
198
	}
199
 
268 aurelien 200
	private void ajouterListenerBouton(final String idBouton) {
201
 
202
		final ExtElement bouton = Ext.get(idBouton);
203
		if(bouton == null) {
204
			Timer t = new Timer() {
1292 aurelien 205
				@Override
268 aurelien 206
				public void run() {
207
					ajouterListenerBouton(idBouton);
208
				}
209
			};
210
			t.schedule(500);
211
			return;
1958 aurelien 212
		} else {
213
			bouton.addListener("click", new EventCallback() {
214
				@Override
215
				public void execute(EventObject e) {
2568 aurelien 216
					EntiteGeographiqueObservation infosLocalite = new EntiteGeographiqueObservation(codeLoc,valeurLocalite,null,null);
217
					infosLocalite.setPays(pays);
218
					infosLocalite.setLat(pointLocalite.lat()+"");
219
					infosLocalite.setLon(pointLocalite.lng()+"");
220
					oMediateur.rafraichirSaisieLocaliteObservation(infosLocalite);
1958 aurelien 221
				}
222
			});
223
 
224
			bouton.focus();
268 aurelien 225
		}
247 aurelien 226
	}
227
 
1292 aurelien 228
	@Override
2275 mathias 229
	public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
2553 mathias 230
		// rétablissement du curseur, parfois mis sur "attente" par le processus chargeant la carte
231
		Util.curseurParDefaut();
2275 mathias 232
 
247 aurelien 233
		if (nouvelleDonnees instanceof String) {
234
 
235
			if(isVisible()) {
236
				Window.alert((String)nouvelleDonnees);
237
			}
238
		}
239
 
268 aurelien 240
		if (nouvelleDonnees instanceof EntiteGeographiqueObservation) {
247 aurelien 241
 
681 aurelien 242
			oMediateur.afficherFenetreCarto();
268 aurelien 243
			EntiteGeographiqueObservation infos = (EntiteGeographiqueObservation) nouvelleDonnees;
654 aurelien 244
			Double lat = 0.0;
245
			Double lon = 0.0;
246
 
247
			try {
248
				lat = Double.parseDouble(infos.getLat());
249
				lon = Double.parseDouble(infos.getLon());
250
			} catch (NumberFormatException nbe) {
251
 
252
			}
1958 aurelien 253
			LatLng coord = LatLng.create(lat, lon);
2275 mathias 254
			// si on a un point, on zoome fort dès le début
255
			if (zoomerSurRetour) {
256
				niveauZoom = 16;
257
				zoomerSurRetour = false;
2553 mathias 258
			} else if (infos.getZoom() > 0) {
259
				niveauZoom = infos.getZoom();
2275 mathias 260
			}
2270 mathias 261
 
2568 aurelien 262
			String nouvelleValeurLocalite = infos.getZoneGeo();
263
			valeurLocalite = nouvelleValeurLocalite;
2558 aurelien 264
			codeLoc = "";
265
			if(infos.getIdZoneGeo() != null) {
2568 aurelien 266
				// Quoi stocker pour en dehors de la france ?
2558 aurelien 267
				if (infos.getPays().equals("FR")) {
268
					codeLoc = Util.convertirChaineZoneGeoVersDepartement(infos.getIdZoneGeo());
269
				} else {
270
					codeLoc = infos.getPays();
271
				}
2553 mathias 272
			}
2568 aurelien 273
			pays = infos.getPays();
274
			pointLocalite = coord;
247 aurelien 275
 
2558 aurelien 276
			mettreAJourInfos(coord, niveauZoom);
247 aurelien 277
		}
278
 
279
		masquerChargement(false);
280
	}
281
 
2558 aurelien 282
	public Marker fabriquerMarqueur(LatLng pointMarqueur) {
247 aurelien 283
		// ajout de marqueurs déplacables, qui affichent une bulle d'information
1958 aurelien 284
		MarkerOptions options = MarkerOptions.create();
247 aurelien 285
		options.setDraggable(true);
1958 aurelien 286
		options.setPosition(pointMarqueur);
287
		final Marker marker = Marker.create(options);
247 aurelien 288
 
1958 aurelien 289
		marker.addDragEndListener(new Marker.DragEndHandler() {
290
 
1292 aurelien 291
			@Override
1958 aurelien 292
			public void handle(MouseEvent event) {
2558 aurelien 293
				afficherInfoMarker(marker, construireContenuPartielInfoMarker(marker));
2568 aurelien 294
				obtenirInfosLocalites(event.getLatLng());
247 aurelien 295
			}
296
		});
1958 aurelien 297
 
298
		marker.addDragStartListener(new Marker.DragStartHandler() {
299
 
1292 aurelien 300
			@Override
1958 aurelien 301
			public void handle(MouseEvent event) {
302
				info.close();
247 aurelien 303
			}
304
		});
305
 
1958 aurelien 306
		marker.addClickListener(new Marker.ClickHandler() {
307
 
1292 aurelien 308
			@Override
1958 aurelien 309
			public void handle(MouseEvent event) {
310
				if(infoOuverte) {
247 aurelien 311
					info.close();
1958 aurelien 312
					infoOuverte = false;
247 aurelien 313
				} else {
2558 aurelien 314
					afficherInfoMarker(marker, construireContenuPartielInfoMarker(marker));
1958 aurelien 315
					infoOuverte = true;
247 aurelien 316
				}
1958 aurelien 317
			}
247 aurelien 318
		});
319
		return marker;
320
	}
1959 aurelien 321
 
322
	public void recentrerCarte() {
323
		if(nmk != null && nmk.getVisible()) {
324
			recentrerCarte(nmk.getPosition());
325
		}
326
	}
247 aurelien 327
 
1959 aurelien 328
	public void recentrerCarte(LatLng point) {
1958 aurelien 329
		if(this.getWidth() > 12 && this.getHeight() > 24) {
323 aurelien 330
			panneauCarto.setSize((this.getWidth() - 12)+"px" , (this.getHeight() - 12)+"px");
331
		}
1958 aurelien 332
		panneauCarto.doLayout();
333
		panneauCarto.expand();
334
		panneauCarto.setHeight("100%");
335
		panneauCarto.setWidth("100%");
336
		expand();
1959 aurelien 337
		map.setCenter(point);
247 aurelien 338
	}
339
 
340
	public boolean isCarteAjoutee() {
341
		return carteAjoutee;
342
	}
343
 
2558 aurelien 344
	public String construireContenuInfoMarker(Marker marker) {
247 aurelien 345
		final String htmlBoutonOk = "<br /><button id=\"okMap\" class=\"x-btn-text\" type=\"button\">OK</button>";
346
 
276 aurelien 347
		String contenuMarker = "";
348
 
2568 aurelien 349
		if(valeurLocalite == null || valeurLocalite.trim().equals("")) {
1958 aurelien 350
			if(marker.getPosition().lng() == 0 && marker.getPosition().lat() == 0) {
681 aurelien 351
				LatLng point = centreFrance;
1958 aurelien 352
				marker.setPosition(point);
681 aurelien 353
				niveauZoom = 6;
354
			}
2558 aurelien 355
			contenuMarker =
356
			"<div id=\"info_contenu\">"+
357
				"Aucun nom de lieu trouvé à cet emplacement <br />"
358
				+"Déplacez ce marqueur pour localiser votre observation (nom de lieu et coordonnées)<br />"
359
				+"longitude="+Util.tronquerNombrePourAffichage(""+marker.getPosition().lng(), 5)+"<br />"
360
				+"latitude="+Util.tronquerNombrePourAffichage(""+marker.getPosition().lat(), 5)+
361
			"</div>";
276 aurelien 362
		} else {
2568 aurelien 363
			String chaineLocalite = valeurLocalite + ((codeLoc.isEmpty()) ? "" : " ("+codeLoc+")");
2558 aurelien 364
			contenuMarker =
365
			"<div id=\"info_contenu\">"+
2568 aurelien 366
					chaineLocalite+"<br />"
2558 aurelien 367
					+"longitude="+Util.tronquerNombrePourAffichage(""+marker.getPosition().lng(), 5)+"<br />"
368
					+"latitude="+Util.tronquerNombrePourAffichage(""+marker.getPosition().lat(), 5)+
369
			"</div>";
276 aurelien 370
		}
371
 
2558 aurelien 372
		return contenuMarker+ htmlBoutonOk;
373
	}
374
 
375
	public String construireContenuPartielInfoMarker(Marker marker) {
376
		final String htmlBoutonOk = "<br /><button id=\"okMap\" class=\"x-btn-text\" type=\"button\">OK</button>";
377
 
378
		String contenuMarker = "";
268 aurelien 379
 
2558 aurelien 380
		contenuMarker =
381
			"<div id=\"info_contenu\">"+
382
					"<div class=\"recherche_infos_zone_geo\">"+
383
						"<div class=\"recherche_infos_zone_geo_en_cours\">"+
384
							"<img src=\"chargement_carte.gif\" />"+
385
							"<div>"+
386
								"Recherche du nom de lieu en cours... <br />"+
387
								"Cela peut prendre un moment"+
388
							"</div>"+
389
							"<hr class=\"nettoyage\" />"+
390
						"</div>"+
391
						"Si vous ne désirez que les coordonnées, vous pouvez cliquer dès maintenant sur OK"+
392
					"</div>"+
393
					"longitude="+Util.tronquerNombrePourAffichage("" + marker.getPosition().lng(), 5)+"<br />"+
394
					"latitude="+Util.tronquerNombrePourAffichage("" + marker.getPosition().lat(), 5)+
395
			"</div>";
396
 
397
		return contenuMarker+ htmlBoutonOk;
398
	}
399
 
400
	public void afficherInfoMarker(Marker marker, String contenuInfo) {
401
 
402
		info.setContent(contenuInfo);
403
		info.open(map, marker);
404
 
2568 aurelien 405
		pointLocalite = marker.getPosition();
2558 aurelien 406
 
1958 aurelien 407
		info.addDomReadyListenerOnce(new InfoWindow.DomReadyHandler() {
408
			@Override
409
			public void handle() {
410
				ajouterListenerBouton("okMap");
411
			}
412
		});
413
 
1959 aurelien 414
		recentrerCarte(marker.getPosition());
247 aurelien 415
	}
2558 aurelien 416
 
417
	public void afficherCarteEnAttenteAvecMarker(double lat, double lon) {
2568 aurelien 418
		pointLocalite = LatLng.create(lat, lon);
419
		nmk.setPosition(pointLocalite);
2558 aurelien 420
		afficherInfoMarker(nmk, construireContenuPartielInfoMarker(nmk));
421
	}
1958 aurelien 422
 
423
	public double[] getCoordsCentreFrance() {
424
		double[] coords = {47.0504, 2.2347};
425
		return coords;
654 aurelien 426
	}
2275 mathias 427
 
428
	public void setDoitZoomerSurRetour(boolean b) {
429
		zoomerSurRetour  = b;
430
	}
247 aurelien 431
}