Rev 2627 | 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-Orgues
LatLng 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() {
@Override
public 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(Msg.get("recherche-coordonnees-localite"));
} else {
panneauCarto.getEl().unmask();
}
}
}
public void obtenirInfosLocalites(LatLng coord) {
// Remise à zéro des infos restantes d'une ancienne requete
valeurLocalite = "";
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() {
@Override
public void handle() {
infoOuverte = false;
}
});
if(!localite) {
fabriquerMarqueurIndication();
}
map.addClickListener(new ClickHandler() {
@Override
public void handle(MouseEvent event) {
obtenirInfosLocalites(event.getLatLng());
}
});
map.addZoomChangedListener(new ZoomChangedHandler() {
@Override
public 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\">"+
Msg.get("deplacez-marqueur-pour-localiser") + "<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(Msg.get("aucune-information"));
}
public int getNiveauZoom() {
return niveauZoom;
}
private void ajouterListenerBouton(final String idBouton) {
final ExtElement bouton = Ext.get(idBouton);
if(bouton == null) {
Timer t = new Timer() {
@Override
public void run() {
ajouterListenerBouton(idBouton);
}
};
t.schedule(500);
return;
} else {
bouton.addListener("click", new EventCallback() {
@Override
public 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();
}
}
@Override
public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
// rétablissement du curseur, parfois mis sur "attente" par le processus chargeant la carte
Util.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ébut
if (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'information
MarkerOptions options = MarkerOptions.create();
options.setDraggable(true);
options.setPosition(pointMarqueur);
final Marker marker = Marker.create(options);
marker.addDragEndListener(new Marker.DragEndHandler() {
@Override
public void handle(MouseEvent event) {
afficherInfoMarker(marker, construireContenuPartielInfoMarker(marker));
obtenirInfosLocalites(event.getLatLng());
}
});
marker.addDragStartListener(new Marker.DragStartHandler() {
@Override
public void handle(MouseEvent event) {
info.close();
}
});
marker.addClickListener(new Marker.ClickHandler() {
@Override
public 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\">"+
Msg.get("aucun-lieu-trouve") + " <br/>"
+Msg.get("deplacez-marqueur-pour-localiser") + " <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>"+
Msg.get("recherche-nom-lieu") + "<br />"+
Msg.get("prendre-un-moment") +
"</div>"+
"<hr class=\"nettoyage\" />"+
"</div>"+
Msg.get("que-les-coordonnees") +
"</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() {
@Override
public 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;
}
}