Rev 2568 | Blame | Last modification | View Log | RSS feed
package org.tela_botanica.client.vues.observation;import org.tela_botanica.client.i18n.Msg;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(Msg.get("explication-panneau-carto"));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;}}