Subversion Repositories eFlore/Applications.cel

Rev

Rev 264 | 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;
4
import org.tela_botanica.client.modeles.EntiteGeographiqueObservation;
5
import org.tela_botanica.client.observation.ObservationMediateur;
6
 
7
import com.google.gwt.maps.client.InfoWindow;
8
import com.google.gwt.maps.client.InfoWindowContent;
9
import com.google.gwt.maps.client.MapType;
10
import com.google.gwt.maps.client.MapWidget;
11
import com.google.gwt.maps.client.control.LargeMapControl;
268 aurelien 12
import com.google.gwt.maps.client.event.InfoWindowRestoreEndHandler;
264 aurelien 13
import com.google.gwt.maps.client.event.MapZoomEndHandler;
247 aurelien 14
import com.google.gwt.maps.client.event.MarkerClickHandler;
15
import com.google.gwt.maps.client.event.MarkerDragEndHandler;
16
import com.google.gwt.maps.client.event.MarkerDragStartHandler;
17
import com.google.gwt.maps.client.event.MarkerDragEndHandler.MarkerDragEndEvent;
18
import com.google.gwt.maps.client.event.MarkerDragStartHandler.MarkerDragStartEvent;
19
import com.google.gwt.maps.client.geom.LatLng;
20
import com.google.gwt.maps.client.overlay.Marker;
21
import com.google.gwt.maps.client.overlay.MarkerOptions;
268 aurelien 22
import com.google.gwt.user.client.Timer;
247 aurelien 23
import com.google.gwt.user.client.Window;
24
import com.google.gwt.user.client.ui.HTML;
25
import com.gwtext.client.core.EventCallback;
26
import com.gwtext.client.core.EventObject;
27
import com.gwtext.client.core.Ext;
28
import com.gwtext.client.core.ExtElement;
29
import com.gwtext.client.core.RegionPosition;
30
import com.gwtext.client.widgets.Component;
31
import com.gwtext.client.widgets.Container;
32
import com.gwtext.client.widgets.Panel;
33
import com.gwtext.client.widgets.event.ContainerListener;
34
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
35
import com.gwtext.client.widgets.form.Label;
36
import com.gwtext.client.widgets.layout.BorderLayout;
37
import com.gwtext.client.widgets.layout.BorderLayoutData;
38
import com.gwtext.client.widgets.layout.FitLayout;
39
import com.gwtext.client.widgets.layout.RowLayout;
40
import com.gwtext.client.widgets.layout.RowLayoutData;
41
import com.gwtext.client.widgets.map.LatLonPoint;
42
 
43
public class CartographieObservationVue extends Panel implements Rafraichissable {
44
 
45
	private String id = "cartographie_observation";
46
 
47
	private ObservationMediateur oMediateur = null;
48
 
49
	Panel panneauCarto = null;
50
	private MapWidget map;
51
 
52
	private boolean carteAjoutee = false;
53
	private boolean requeteEnCours = false;
54
 
55
	String valeurCommune = "Bourges";
56
	LatLng centreFrance = LatLng.newInstance(47.0504, 2.2347);
57
	LatLng pointCommune = centreFrance;
58
	String codeCommune = "";
59
 
264 aurelien 60
	int niveauZoom = 13;
247 aurelien 61
 
62
	Label panneauExplication = new Label(
63
			"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");
64
 
65
	private InfoWindow info;
66
 
268 aurelien 67
	private boolean listenerInitialise = false;
68
 
247 aurelien 69
	public CartographieObservationVue(ObservationMediateur om) {
70
		oMediateur = om;
71
 
72
		setTitle("Carto");
73
		setAutoWidth(true);
74
		setPaddings(10);
75
 
76
		panneauCarto = new Panel();
77
		panneauCarto.setLayout(new FitLayout());
78
 
79
		setLayout(new RowLayout());
80
 
81
		//initialiserCarte();
82
 
83
		add(panneauExplication, new RowLayoutData(12));
84
		add(panneauCarto, new RowLayoutData());
85
 
86
		addListener(new ContainerListenerAdapter() {
87
			public void onAfterLayout(Container c) {
88
 
89
				if(!carteAjoutee) {
268 aurelien 90
					initialiserCarte(false);
247 aurelien 91
				}
92
				recentrerCarte();
93
			}
94
		});
95
 
96
		panneauCarto.setAutoHeight(true);
97
	}
98
 
99
	public void masquerChargement(boolean masquer) {
100
		if (masquer) {
101
			ExtElement masked = Ext.get(id);
102
 
103
			if (masked != null) {
104
				masked.mask("Chargement");
105
			}
106
		} else {
107
			ExtElement masked = Ext.get(id);
108
 
109
			if (masked != null) {
110
				masked.unmask();
111
			}
112
		}
113
	}
114
 
115
	public void obtenirInfosCommunes(LatLng coord) {
116
		oMediateur.obtenirInformationCoord(this, coord);
117
	}
118
 
119
	public void mettreAJourInfos(final LatLng pointNouvelleCommune, String infosComplementaires, int zoom) {
120
 
121
		if (!carteAjoutee) {
268 aurelien 122
			initialiserCarte(true);
247 aurelien 123
		}
124
 
125
		pointCommune = pointNouvelleCommune;
126
		map.clearOverlays();
127
		Marker nmk = fabriquerMarqueur(pointCommune, infosComplementaires);
128
		map.addOverlay(nmk);
129
		afficherInfoMarker(nmk);
130
		recentrerCarte();
131
	}
132
 
268 aurelien 133
	public void initialiserCarte(boolean commune) {
247 aurelien 134
 
135
		map = new MapWidget(pointCommune, niveauZoom);
136
		panneauCarto.add(map);
137
		panneauCarto.doLayout();
138
		info = map.getInfoWindow();
268 aurelien 139
		if(!commune) {
140
			fabriquerMarqueurIndication();
141
		}
247 aurelien 142
		map.checkResizeAndCenter();
143
		map.setUIToDefault();
144
		map.addControl(new LargeMapControl());
145
		map.setCurrentMapType(MapType.getHybridMap());
146
		carteAjoutee = true;
147
		panneauCarto.doLayout();
264 aurelien 148
 
149
		map.addMapZoomEndHandler(new MapZoomEndHandler() {
150
 
151
			public void onZoomEnd(MapZoomEndEvent event) {
152
				niveauZoom = event.getNewZoomLevel();
153
			}
154
 
155
		});
247 aurelien 156
	}
268 aurelien 157
 
158
	public void fabriquerMarqueurIndication() {
159
		Marker marker = fabriquerMarqueur(pointCommune,"");
160
		map.addOverlay(marker);
161
		info.open(marker, new InfoWindowContent("<div id=\"info_contenu\">"+
162
				"Déplacez ce marqueur pour localiser votre observation (commune et coordonnées)<br />"
163
				+"longitude="
164
				+ marker.getLatLng().getLongitude() + "<br />latitude="
165
				+ marker.getLatLng().getLatitude() + "</div>"));
166
		map.setZoomLevel(3);
167
	}
247 aurelien 168
 
169
	public void AfficherMessageAucuneInfos() {
170
		mettreAJourInfos(centreFrance,"", niveauZoom);
171
		Window.alert("Aucune information pour le nom donné");
172
	}
173
 
174
	public int getNiveauZoom() {
175
		return niveauZoom;
176
	}
177
 
268 aurelien 178
	private void ajouterListenerBouton(final String idBouton) {
179
 
180
		final ExtElement bouton = Ext.get(idBouton);
181
 
182
		if(bouton == null) {
183
			Timer t = new Timer() {
184
				public void run() {
185
					ajouterListenerBouton(idBouton);
186
				}
187
 
188
			};
189
			t.schedule(500);
190
			return;
191
		}
192
 
247 aurelien 193
		bouton.addListener("click", new EventCallback() {
194
			public void execute(EventObject e) {
264 aurelien 195
				EntiteGeographiqueObservation infosCommune = new EntiteGeographiqueObservation(codeCommune,valeurCommune,null,null);
247 aurelien 196
				infosCommune.setLat(pointCommune.getLatitude()+"");
197
				infosCommune.setLon(pointCommune.getLongitude()+"");
198
				oMediateur.rafraichirSaisieCommuneObservation(infosCommune);
199
			}
268 aurelien 200
		});
201
 
202
		bouton.focus();
247 aurelien 203
	}
204
 
205
	public void rafraichir(Object nouvelleDonnees,
206
			boolean repandreRaffraichissement) {
207
		if (nouvelleDonnees instanceof String) {
208
 
209
			if(isVisible()) {
210
				Window.alert((String)nouvelleDonnees);
211
			}
212
		}
213
 
268 aurelien 214
		if (nouvelleDonnees instanceof EntiteGeographiqueObservation) {
247 aurelien 215
 
268 aurelien 216
			EntiteGeographiqueObservation infos = (EntiteGeographiqueObservation) nouvelleDonnees;
217
			LatLng coord = LatLng.newInstance(Double.parseDouble(infos.getLat()),
218
					Double.parseDouble(infos.getLon()));
247 aurelien 219
 
268 aurelien 220
			valeurCommune = infos.getCommune();
221
			codeCommune = infos.getIdLocalite();
222
			pointCommune = coord;
247 aurelien 223
 
224
			mettreAJourInfos(coord, "", niveauZoom);
225
		}
226
 
227
		masquerChargement(false);
228
	}
229
 
230
	public Marker fabriquerMarqueur(LatLng pointMarqueur, final String texte) {
231
		// ajout de marqueurs déplacables, qui affichent une bulle d'information
232
		MarkerOptions options = MarkerOptions.newInstance();
233
		options.setDraggable(true);
234
		final Marker marker = new Marker(pointMarqueur, options);
235
 
236
		marker.addMarkerDragEndHandler(new MarkerDragEndHandler() {
237
			public void onDragEnd(MarkerDragEndEvent event) {
264 aurelien 238
				obtenirInfosCommunes(marker.getLatLng());
247 aurelien 239
			}
240
 
241
		});
242
 
243
		marker.addMarkerDragStartHandler(new MarkerDragStartHandler() {
244
			public void onDragStart(MarkerDragStartEvent event) {
245
				info.setVisible(false);
246
			}
247
		});
248
 
249
		marker.addMarkerClickHandler(new MarkerClickHandler() {
250
 
251
			public void onClick(MarkerClickEvent event) {
252
				if(info.isVisible()) {
253
					info.close();
254
				} else {
255
					afficherInfoMarker(marker);
256
				}
257
			}
258
		});
259
 
260
		return marker;
261
	}
262
 
263
	public void recentrerCarte() {
264
		map.setSize((this.getWidth() - 12)+"px" , (this.getHeight() - 24)+"px");
265
		panneauCarto.setSize((this.getWidth() - 12)+"px" , (this.getHeight() - 12)+"px");
266
		map.setCenter(pointCommune, niveauZoom);
267
		map.checkResizeAndCenter();
268
	}
269
 
270
	public boolean isCarteAjoutee() {
271
		return carteAjoutee;
272
	}
273
 
274
	public void afficherInfoMarker(Marker marker) {
268 aurelien 275
 
247 aurelien 276
		final String htmlBoutonOk = "<br /><button id=\"okMap\" class=\"x-btn-text\" type=\"button\">OK</button>";
277
 
278
		info.open(marker, new InfoWindowContent(""
279
				+valeurCommune+" ("+codeCommune+")<br />"
280
				+"longitude="
281
				+ marker.getLatLng().getLongitude() + "<br />latitude="
282
				+ marker.getLatLng().getLatitude() + htmlBoutonOk));
268 aurelien 283
 
284
		recentrerCarte();
247 aurelien 285
		ajouterListenerBouton("okMap");
286
	}
287
 
288
}