Rev 2558 | Rev 2627 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
package org.tela_botanica.client.vues.observation;import org.tela_botanica.client.cel2;import org.tela_botanica.client.interfaces.Rafraichissable;import org.tela_botanica.client.modeles.objets.EntiteGeographiqueObservation;import org.tela_botanica.client.observation.ObservationMediateur;import org.tela_botanica.client.util.Util;import com.google.gwt.user.client.Timer;import com.google.gwt.user.client.Window;import com.gwtext.client.core.EventCallback;import com.gwtext.client.core.EventObject;import com.gwtext.client.core.Ext;import com.gwtext.client.core.ExtElement;import com.gwtext.client.widgets.Container;import com.gwtext.client.widgets.Panel;import com.gwtext.client.widgets.event.ContainerListenerAdapter;import com.gwtext.client.widgets.form.Label;import com.gwtext.client.widgets.layout.FitLayout;import com.gwtext.client.widgets.layout.RowLayout;import com.gwtext.client.widgets.layout.RowLayoutData;import com.google.maps.gwt.client.GoogleMap;import com.google.maps.gwt.client.GoogleMap.ClickHandler;import com.google.maps.gwt.client.GoogleMap.ZoomChangedHandler;import com.google.maps.gwt.client.InfoWindow;import com.google.maps.gwt.client.InfoWindowOptions;import com.google.maps.gwt.client.LatLng;import com.google.maps.gwt.client.MapOptions;import com.google.maps.gwt.client.MapTypeId;import com.google.maps.gwt.client.Marker;import com.google.maps.gwt.client.MarkerOptions;import com.google.maps.gwt.client.MouseEvent;public class CartographieObservationVue extends Panel implements Rafraichissable {private String id = "cartographie_observation";private ObservationMediateur oMediateur = null;Panel panneauCarto = null;GoogleMap map = null;Marker nmk = null;private boolean carteAjoutee = false;private boolean infoOuverte = false;String valeurLocalite = "Bourges"; // j'aurais préféré Bort-les-OrguesLatLng centreFrance = null;LatLng pointLocalite = null;String codeLoc = "";String pays = "";int niveauZoom = 6;Label panneauExplication = new Label("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");private InfoWindow info;private boolean zoomerSurRetour = false;public CartographieObservationVue(ObservationMediateur om) {oMediateur = om;setHeader(false);setAutoWidth(true);setPaddings(10);panneauCarto = new Panel();panneauCarto.setLayout(new FitLayout());setLayout(new RowLayout());panneauCarto.setAutoHeight(true);add(panneauExplication, new RowLayoutData(12));add(panneauCarto, new RowLayoutData());addListener(new ContainerListenerAdapter() {@Overridepublic void onAfterLayout(Container c) {initialiserCarte(false);}});}public void setTailleCarte(int hauteur, int largeur) {setSize(largeur, hauteur);}public void masquerChargement(boolean masquer) {if(panneauCarto.isVisible()) {if(masquer) {panneauCarto.getEl().mask("Recherche des coordonnées et de la localite, veuillez patienter");} else {panneauCarto.getEl().unmask();}}}public void obtenirInfosLocalites(LatLng coord) {// Remise à zéro des infos restantes d'une ancienne requetevaleurLocalite = "";codeLoc = "";pays = "";oMediateur.obtenirInformationCoord(this, coord.lat(), coord.lng());}public void mettreAJourInfos(final LatLng pointNouvelleLocalite, int zoom) {GoogleMap mapNulle = null;if(nmk != null) {nmk.setMap(mapNulle);}pointLocalite = pointNouvelleLocalite;nmk = fabriquerMarqueur(pointLocalite);nmk.setMap(map);afficherInfoMarker(nmk, construireContenuInfoMarker(nmk));recentrerCarte(nmk.getPosition());map.setZoom(zoom);}private void initialiserCarte(boolean localite) {panneauCarto.clear();centreFrance = LatLng.create(47.0504, 2.2347);pointLocalite = centreFrance;MapOptions options = MapOptions.create();options.setCenter(centreFrance);options.setZoom(6);options.setMapTypeId(MapTypeId.HYBRID);options.setDraggable(true);options.setMapTypeControl(true);options.setScaleControl(true);options.setScrollwheel(true);map = GoogleMap.create(panneauCarto.getElement(), options );InfoWindowOptions infopts = InfoWindowOptions.create();info = InfoWindow.create();info.setOptions(infopts);info.addCloseClickListener(new InfoWindow.CloseClickHandler() {@Overridepublic void handle() {infoOuverte = false;}});if(!localite) {fabriquerMarqueurIndication();}map.addClickListener(new ClickHandler() {@Overridepublic void handle(MouseEvent event) {obtenirInfosLocalites(event.getLatLng());}});map.addZoomChangedListener(new ZoomChangedHandler() {@Overridepublic void handle() {niveauZoom = (int)map.getZoom();}});panneauCarto.doLayout();panneauCarto.expand();panneauCarto.setHeight("100%");panneauCarto.setWidth("100%");expand();}public void fabriquerMarqueurIndication() {GoogleMap mapNulle = null;if(nmk != null) {nmk.setMap(mapNulle);}nmk = fabriquerMarqueur(pointLocalite);nmk.setMap(map);info.setContent("<div id=\"info_contenu\">"+"Déplacez ce marqueur pour localiser votre observation (localite et coordonnées)<br />"+"longitude="+ Util.tronquerNombrePourAffichage("" + nmk.getPosition().lng(), 5) + "<br />latitude="+ Util.tronquerNombrePourAffichage("" + nmk.getPosition().lat(), 5) + "</div>");infoOuverte = true;info.open(map,nmk);}public void AfficherMessageAucuneInfos() {mettreAJourInfos(centreFrance, niveauZoom);Window.alert("Aucune information pour le nom donné");}public int getNiveauZoom() {return niveauZoom;}private void ajouterListenerBouton(final String idBouton) {final ExtElement bouton = Ext.get(idBouton);if(bouton == null) {Timer t = new Timer() {@Overridepublic void run() {ajouterListenerBouton(idBouton);}};t.schedule(500);return;} else {bouton.addListener("click", new EventCallback() {@Overridepublic void execute(EventObject e) {EntiteGeographiqueObservation infosLocalite = new EntiteGeographiqueObservation(codeLoc,valeurLocalite,null,null);infosLocalite.setPays(pays);infosLocalite.setLat(pointLocalite.lat()+"");infosLocalite.setLon(pointLocalite.lng()+"");oMediateur.rafraichirSaisieLocaliteObservation(infosLocalite);}});bouton.focus();}}@Overridepublic void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {// rétablissement du curseur, parfois mis sur "attente" par le processus chargeant la carteUtil.curseurParDefaut();if (nouvelleDonnees instanceof String) {if(isVisible()) {Window.alert((String)nouvelleDonnees);}}if (nouvelleDonnees instanceof EntiteGeographiqueObservation) {oMediateur.afficherFenetreCarto();EntiteGeographiqueObservation infos = (EntiteGeographiqueObservation) nouvelleDonnees;Double lat = 0.0;Double lon = 0.0;try {lat = Double.parseDouble(infos.getLat());lon = Double.parseDouble(infos.getLon());} catch (NumberFormatException nbe) {}LatLng coord = LatLng.create(lat, lon);// si on a un point, on zoome fort dès le débutif (zoomerSurRetour) {niveauZoom = 16;zoomerSurRetour = false;} else if (infos.getZoom() > 0) {niveauZoom = infos.getZoom();}String nouvelleValeurLocalite = infos.getZoneGeo();valeurLocalite = nouvelleValeurLocalite;codeLoc = "";if(infos.getIdZoneGeo() != null) {// Quoi stocker pour en dehors de la france ?if (infos.getPays().equals("FR")) {codeLoc = Util.convertirChaineZoneGeoVersDepartement(infos.getIdZoneGeo());} else {codeLoc = infos.getPays();}}pays = infos.getPays();pointLocalite = coord;mettreAJourInfos(coord, niveauZoom);}masquerChargement(false);}public Marker fabriquerMarqueur(LatLng pointMarqueur) {// ajout de marqueurs déplacables, qui affichent une bulle d'informationMarkerOptions options = MarkerOptions.create();options.setDraggable(true);options.setPosition(pointMarqueur);final Marker marker = Marker.create(options);marker.addDragEndListener(new Marker.DragEndHandler() {@Overridepublic void handle(MouseEvent event) {afficherInfoMarker(marker, construireContenuPartielInfoMarker(marker));obtenirInfosLocalites(event.getLatLng());}});marker.addDragStartListener(new Marker.DragStartHandler() {@Overridepublic void handle(MouseEvent event) {info.close();}});marker.addClickListener(new Marker.ClickHandler() {@Overridepublic void handle(MouseEvent event) {if(infoOuverte) {info.close();infoOuverte = false;} else {afficherInfoMarker(marker, construireContenuPartielInfoMarker(marker));infoOuverte = true;}}});return marker;}public void recentrerCarte() {if(nmk != null && nmk.getVisible()) {recentrerCarte(nmk.getPosition());}}public void recentrerCarte(LatLng point) {if(this.getWidth() > 12 && this.getHeight() > 24) {panneauCarto.setSize((this.getWidth() - 12)+"px" , (this.getHeight() - 12)+"px");}panneauCarto.doLayout();panneauCarto.expand();panneauCarto.setHeight("100%");panneauCarto.setWidth("100%");expand();map.setCenter(point);}public boolean isCarteAjoutee() {return carteAjoutee;}public String construireContenuInfoMarker(Marker marker) {final String htmlBoutonOk = "<br /><button id=\"okMap\" class=\"x-btn-text\" type=\"button\">OK</button>";String contenuMarker = "";if(valeurLocalite == null || valeurLocalite.trim().equals("")) {if(marker.getPosition().lng() == 0 && marker.getPosition().lat() == 0) {LatLng point = centreFrance;marker.setPosition(point);niveauZoom = 6;}contenuMarker ="<div id=\"info_contenu\">"+"Aucun nom de lieu trouvé à cet emplacement <br />"+"Déplacez ce marqueur pour localiser votre observation (nom de lieu et coordonnées)<br />"+"longitude="+Util.tronquerNombrePourAffichage(""+marker.getPosition().lng(), 5)+"<br />"+"latitude="+Util.tronquerNombrePourAffichage(""+marker.getPosition().lat(), 5)+"</div>";} else {String chaineLocalite = valeurLocalite + ((codeLoc.isEmpty()) ? "" : " ("+codeLoc+")");contenuMarker ="<div id=\"info_contenu\">"+chaineLocalite+"<br />"+"longitude="+Util.tronquerNombrePourAffichage(""+marker.getPosition().lng(), 5)+"<br />"+"latitude="+Util.tronquerNombrePourAffichage(""+marker.getPosition().lat(), 5)+"</div>";}return contenuMarker+ htmlBoutonOk;}public String construireContenuPartielInfoMarker(Marker marker) {final String htmlBoutonOk = "<br /><button id=\"okMap\" class=\"x-btn-text\" type=\"button\">OK</button>";String contenuMarker = "";contenuMarker ="<div id=\"info_contenu\">"+"<div class=\"recherche_infos_zone_geo\">"+"<div class=\"recherche_infos_zone_geo_en_cours\">"+"<img src=\"chargement_carte.gif\" />"+"<div>"+"Recherche du nom de lieu en cours... <br />"+"Cela peut prendre un moment"+"</div>"+"<hr class=\"nettoyage\" />"+"</div>"+"Si vous ne désirez que les coordonnées, vous pouvez cliquer dès maintenant sur OK"+"</div>"+"longitude="+Util.tronquerNombrePourAffichage("" + marker.getPosition().lng(), 5)+"<br />"+"latitude="+Util.tronquerNombrePourAffichage("" + marker.getPosition().lat(), 5)+"</div>";return contenuMarker+ htmlBoutonOk;}public void afficherInfoMarker(Marker marker, String contenuInfo) {info.setContent(contenuInfo);info.open(map, marker);pointLocalite = marker.getPosition();info.addDomReadyListenerOnce(new InfoWindow.DomReadyHandler() {@Overridepublic void handle() {ajouterListenerBouton("okMap");}});recentrerCarte(marker.getPosition());}public void afficherCarteEnAttenteAvecMarker(double lat, double lon) {pointLocalite = LatLng.create(lat, lon);nmk.setPosition(pointLocalite);afficherInfoMarker(nmk, construireContenuPartielInfoMarker(nmk));}public double[] getCoordsCentreFrance() {double[] coords = {47.0504, 2.2347};return coords;}public void setDoitZoomerSurRetour(boolean b) {zoomerSurRetour = b;}}