Subversion Repositories eFlore/Applications.cel

Rev

Rev 1958 | Go to most recent revision | 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
 
3
import org.tela_botanica.client.interfaces.Rafraichissable;
989 aurelien 4
import org.tela_botanica.client.modeles.objets.EntiteGeographiqueObservation;
247 aurelien 5
import org.tela_botanica.client.observation.ObservationMediateur;
965 aurelien 6
import org.tela_botanica.client.util.Util;
247 aurelien 7
 
268 aurelien 8
import com.google.gwt.user.client.Timer;
247 aurelien 9
import com.google.gwt.user.client.Window;
10
import com.gwtext.client.core.EventCallback;
11
import com.gwtext.client.core.EventObject;
12
import com.gwtext.client.core.Ext;
13
import com.gwtext.client.core.ExtElement;
14
import com.gwtext.client.widgets.Container;
15
import com.gwtext.client.widgets.Panel;
16
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
17
import com.gwtext.client.widgets.form.Label;
18
import com.gwtext.client.widgets.layout.FitLayout;
19
import com.gwtext.client.widgets.layout.RowLayout;
20
import com.gwtext.client.widgets.layout.RowLayoutData;
1958 aurelien 21
import com.google.maps.gwt.client.GoogleMap;
22
import com.google.maps.gwt.client.GoogleMap.ClickHandler;
23
import com.google.maps.gwt.client.GoogleMap.ZoomChangedHandler;
24
import com.google.maps.gwt.client.InfoWindow;
25
import com.google.maps.gwt.client.InfoWindowOptions;
26
import com.google.maps.gwt.client.LatLng;
27
import com.google.maps.gwt.client.MapOptions;
28
import com.google.maps.gwt.client.MapTypeId;
29
import com.google.maps.gwt.client.Marker;
30
import com.google.maps.gwt.client.MarkerOptions;
31
import com.google.maps.gwt.client.MouseEvent;
247 aurelien 32
 
33
public class CartographieObservationVue extends Panel implements Rafraichissable {
34
 
35
	private String id = "cartographie_observation";
36
 
37
	private ObservationMediateur oMediateur = null;
38
 
39
	Panel panneauCarto = null;
1958 aurelien 40
	GoogleMap map = null;
41
	Marker nmk = null;
247 aurelien 42
 
43
	private boolean carteAjoutee = false;
1958 aurelien 44
	private boolean infoOuverte = false;
247 aurelien 45
 
46
	String valeurCommune = "Bourges";
296 aurelien 47
	LatLng centreFrance = null;
299 aurelien 48
	LatLng pointCommune = null;
247 aurelien 49
	String codeCommune = "";
50
 
681 aurelien 51
	int niveauZoom = 6;
247 aurelien 52
 
53
	Label panneauExplication = new Label(
54
			"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");
55
 
56
	private InfoWindow info;
57
 
58
	public CartographieObservationVue(ObservationMediateur om) {
407 aurelien 59
 
247 aurelien 60
		oMediateur = om;
61
 
681 aurelien 62
		setHeader(false);
247 aurelien 63
		setAutoWidth(true);
64
		setPaddings(10);
65
 
66
		panneauCarto = new Panel();
67
		panneauCarto.setLayout(new FitLayout());
68
 
69
		setLayout(new RowLayout());
70
 
1958 aurelien 71
		panneauCarto.setAutoHeight(true);
247 aurelien 72
		add(panneauExplication, new RowLayoutData(12));
73
		add(panneauCarto, new RowLayoutData());
1958 aurelien 74
 
247 aurelien 75
		addListener(new ContainerListenerAdapter() {
430 aurelien 76
 
1292 aurelien 77
			@Override
247 aurelien 78
			public void onAfterLayout(Container c) {
1958 aurelien 79
				initialiserCarte(false);
247 aurelien 80
			}
81
		});
82
	}
83
 
681 aurelien 84
	public void setTailleCarte(int hauteur, int largeur) {
1958 aurelien 85
		setSize(largeur, hauteur);
681 aurelien 86
	}
87
 
247 aurelien 88
	public void masquerChargement(boolean masquer) {
654 aurelien 89
 
90
		if(panneauCarto.isVisible()) {
91
			if(masquer) {
92
				panneauCarto.getEl().mask("Recherche des coordonnées et de la commune, veuillez patienter");
93
			} else {
94
				panneauCarto.getEl().unmask();
247 aurelien 95
			}
96
		}
97
	}
98
 
99
	public void obtenirInfosCommunes(LatLng coord) {
1958 aurelien 100
		oMediateur.obtenirInformationCoord(this, coord.lat(), coord.lng());
247 aurelien 101
	}
102
 
103
	public void mettreAJourInfos(final LatLng pointNouvelleCommune, String infosComplementaires, int zoom) {
1958 aurelien 104
		GoogleMap mapNulle = null;
105
		if(nmk != null) {
106
			nmk.setMap(mapNulle);
247 aurelien 107
		}
108
		pointCommune = pointNouvelleCommune;
1958 aurelien 109
		nmk = fabriquerMarqueur(pointCommune, infosComplementaires);
110
		nmk.setMap(map);
247 aurelien 111
		afficherInfoMarker(nmk);
1959 aurelien 112
		recentrerCarte(nmk.getPosition());
247 aurelien 113
	}
114
 
1958 aurelien 115
	private void initialiserCarte(boolean commune) {
296 aurelien 116
 
1958 aurelien 117
		panneauCarto.clear();
118
 
119
		centreFrance = LatLng.create(47.0504, 2.2347);
299 aurelien 120
		pointCommune = centreFrance;
121
 
1958 aurelien 122
		MapOptions options  = MapOptions.create();
123
	    options.setCenter(centreFrance);
124
	    options.setZoom(6) ;
125
	    options.setMapTypeId(MapTypeId.HYBRID);
126
	    options.setDraggable(true);
127
	    options.setMapTypeControl(true);
128
	    options.setScaleControl(true) ;
129
	    options.setScrollwheel(true) ;
130
 
131
		map = GoogleMap.create(panneauCarto.getElement(), options ) ;
132
 
133
		InfoWindowOptions infopts = InfoWindowOptions.create();
134
		info = InfoWindow.create();
135
		info.setOptions(infopts);
136
		info.addCloseClickListener(new InfoWindow.CloseClickHandler() {
137
			@Override
138
			public void handle() {
139
				infoOuverte = false;
140
			}
141
		});
142
 
268 aurelien 143
		if(!commune) {
144
			fabriquerMarqueurIndication();
145
		}
1958 aurelien 146
 
147
		map.addClickListener(new ClickHandler() {
1292 aurelien 148
			@Override
1958 aurelien 149
			public void handle(MouseEvent event) {
391 aurelien 150
				obtenirInfosCommunes(event.getLatLng());
151
			}
152
		});
153
 
1958 aurelien 154
		map.addZoomChangedListener(new ZoomChangedHandler() {
1292 aurelien 155
			@Override
1958 aurelien 156
			public void handle() {
157
				niveauZoom = (int)map.getZoom();
264 aurelien 158
			}
159
		});
1958 aurelien 160
 
161
		panneauCarto.doLayout();
162
		panneauCarto.expand();
163
		panneauCarto.setHeight("100%");
164
		panneauCarto.setWidth("100%");
165
		expand();
247 aurelien 166
	}
268 aurelien 167
 
168
	public void fabriquerMarqueurIndication() {
1958 aurelien 169
		GoogleMap mapNulle = null;
170
		if(nmk != null) {
171
			nmk.setMap(mapNulle);
172
		}
173
		nmk = fabriquerMarqueur(pointCommune,"");
174
		nmk.setMap(map);
175
		info.setContent("<div id=\"info_contenu\">"+
268 aurelien 176
				"Déplacez ce marqueur pour localiser votre observation (commune et coordonnées)<br />"
177
				+"longitude="
1958 aurelien 178
				+ nmk.getPosition().lng() + "<br />latitude="
179
				+ nmk.getPosition().lat() + "</div>");
180
		infoOuverte = true;
181
		info.open(map,nmk);
268 aurelien 182
	}
247 aurelien 183
 
184
	public void AfficherMessageAucuneInfos() {
185
		mettreAJourInfos(centreFrance,"", niveauZoom);
186
		Window.alert("Aucune information pour le nom donné");
187
	}
188
 
189
	public int getNiveauZoom() {
190
		return niveauZoom;
191
	}
192
 
268 aurelien 193
	private void ajouterListenerBouton(final String idBouton) {
194
 
195
		final ExtElement bouton = Ext.get(idBouton);
196
		if(bouton == null) {
197
			Timer t = new Timer() {
1292 aurelien 198
				@Override
268 aurelien 199
				public void run() {
200
					ajouterListenerBouton(idBouton);
201
				}
202
			};
203
			t.schedule(500);
204
			return;
1958 aurelien 205
		} else {
206
			bouton.addListener("click", new EventCallback() {
207
				@Override
208
				public void execute(EventObject e) {
209
					EntiteGeographiqueObservation infosCommune = new EntiteGeographiqueObservation(codeCommune,valeurCommune,null,null);
210
					infosCommune.setLat(pointCommune.lat()+"");
211
					infosCommune.setLon(pointCommune.lng()+"");
212
					oMediateur.rafraichirSaisieCommuneObservation(infosCommune);
213
				}
214
			});
215
 
216
			bouton.focus();
268 aurelien 217
		}
247 aurelien 218
	}
219
 
1292 aurelien 220
	@Override
247 aurelien 221
	public void rafraichir(Object nouvelleDonnees,
222
			boolean repandreRaffraichissement) {
223
		if (nouvelleDonnees instanceof String) {
224
 
225
			if(isVisible()) {
226
				Window.alert((String)nouvelleDonnees);
227
			}
228
		}
229
 
268 aurelien 230
		if (nouvelleDonnees instanceof EntiteGeographiqueObservation) {
247 aurelien 231
 
681 aurelien 232
			oMediateur.afficherFenetreCarto();
654 aurelien 233
 
268 aurelien 234
			EntiteGeographiqueObservation infos = (EntiteGeographiqueObservation) nouvelleDonnees;
247 aurelien 235
 
654 aurelien 236
			Double lat = 0.0;
237
			Double lon = 0.0;
238
 
239
			try {
240
				lat = Double.parseDouble(infos.getLat());
241
				lon = Double.parseDouble(infos.getLon());
242
			} catch (NumberFormatException nbe) {
243
 
244
			}
245
 
1958 aurelien 246
			LatLng coord = LatLng.create(lat, lon);
654 aurelien 247
 
965 aurelien 248
			valeurCommune = infos.getZoneGeo();
249
			codeCommune = Util.convertirChaineZoneGeoVersDepartement(infos.getIdZoneGeo());
268 aurelien 250
			pointCommune = coord;
247 aurelien 251
 
252
			mettreAJourInfos(coord, "", niveauZoom);
253
		}
254
 
255
		masquerChargement(false);
256
	}
257
 
258
	public Marker fabriquerMarqueur(LatLng pointMarqueur, final String texte) {
259
		// ajout de marqueurs déplacables, qui affichent une bulle d'information
1958 aurelien 260
		MarkerOptions options = MarkerOptions.create();
247 aurelien 261
		options.setDraggable(true);
1958 aurelien 262
		options.setPosition(pointMarqueur);
263
		final Marker marker = Marker.create(options);
247 aurelien 264
 
1958 aurelien 265
		marker.addDragEndListener(new Marker.DragEndHandler() {
266
 
1292 aurelien 267
			@Override
1958 aurelien 268
			public void handle(MouseEvent event) {
269
				obtenirInfosCommunes(event.getLatLng());
247 aurelien 270
			}
271
		});
1958 aurelien 272
 
273
		marker.addDragStartListener(new Marker.DragStartHandler() {
274
 
1292 aurelien 275
			@Override
1958 aurelien 276
			public void handle(MouseEvent event) {
277
				info.close();
247 aurelien 278
			}
279
		});
280
 
1958 aurelien 281
		marker.addClickListener(new Marker.ClickHandler() {
282
 
1292 aurelien 283
			@Override
1958 aurelien 284
			public void handle(MouseEvent event) {
285
				if(infoOuverte) {
247 aurelien 286
					info.close();
1958 aurelien 287
					infoOuverte = false;
247 aurelien 288
				} else {
289
					afficherInfoMarker(marker);
1958 aurelien 290
					infoOuverte = true;
247 aurelien 291
				}
1958 aurelien 292
			}
247 aurelien 293
		});
294
		return marker;
295
	}
1959 aurelien 296
 
297
	public void recentrerCarte() {
298
		if(nmk != null && nmk.getVisible()) {
299
			recentrerCarte(nmk.getPosition());
300
		}
301
	}
247 aurelien 302
 
1959 aurelien 303
	public void recentrerCarte(LatLng point) {
1958 aurelien 304
		if(this.getWidth() > 12 && this.getHeight() > 24) {
323 aurelien 305
			panneauCarto.setSize((this.getWidth() - 12)+"px" , (this.getHeight() - 12)+"px");
306
		}
1958 aurelien 307
		panneauCarto.doLayout();
308
		panneauCarto.expand();
309
		panneauCarto.setHeight("100%");
310
		panneauCarto.setWidth("100%");
311
		expand();
1959 aurelien 312
		map.setCenter(point);
247 aurelien 313
	}
314
 
315
	public boolean isCarteAjoutee() {
316
		return carteAjoutee;
317
	}
318
 
1958 aurelien 319
	public void afficherInfoMarker(Marker marker) {
247 aurelien 320
		final String htmlBoutonOk = "<br /><button id=\"okMap\" class=\"x-btn-text\" type=\"button\">OK</button>";
321
 
276 aurelien 322
		String contenuMarker = "";
323
 
324
		if(valeurCommune == null || valeurCommune.trim().equals("")) {
1958 aurelien 325
			if(marker.getPosition().lng() == 0 && marker.getPosition().lat() == 0) {
681 aurelien 326
				LatLng point = centreFrance;
1958 aurelien 327
				marker.setPosition(point);
681 aurelien 328
				niveauZoom = 6;
329
			}
276 aurelien 330
			contenuMarker = "<div id=\"info_contenu\">"+
331
			"Aucune commune française trouvée à cet emplacement <br />"
332
			+"Déplacez ce marqueur pour localiser votre observation (commune et coordonnées)<br />"
333
			+"longitude="
1958 aurelien 334
			+ marker.getPosition().lng() + "<br />latitude="
335
			+ marker.getPosition().lat() + "</div>";
276 aurelien 336
		} else {
337
			contenuMarker = ""
338
			+valeurCommune+" ("+codeCommune+")<br />"
339
			+"longitude="
1958 aurelien 340
			+ marker.getPosition().lng() + "<br />latitude="
341
			+ marker.getPosition().lat() ;
276 aurelien 342
		}
343
 
1958 aurelien 344
		info.setContent(contenuMarker+ htmlBoutonOk);
345
		info.open(map, marker);
268 aurelien 346
 
1958 aurelien 347
		info.addDomReadyListenerOnce(new InfoWindow.DomReadyHandler() {
348
			@Override
349
			public void handle() {
350
				ajouterListenerBouton("okMap");
351
			}
352
		});
353
 
1959 aurelien 354
		recentrerCarte(marker.getPosition());
247 aurelien 355
	}
1958 aurelien 356
 
357
	public double[] getCoordsCentreFrance() {
358
		double[] coords = {47.0504, 2.2347};
359
		return coords;
654 aurelien 360
	}
247 aurelien 361
}