Rev 2275 | Rev 2553 | 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.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 valeurCommune = "Bourges"; // j'aurais préféré Bort-les-Orgues
LatLng centreFrance = null;
LatLng pointCommune = null;
String codeCommune = "";
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() {
@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("Recherche des coordonnées et de la commune, veuillez patienter");
} else {
panneauCarto.getEl().unmask();
}
}
}
public void obtenirInfosCommunes(LatLng coord) {
oMediateur.obtenirInformationCoord(this, coord.lat(), coord.lng());
}
public void mettreAJourInfos(final LatLng pointNouvelleCommune, String infosComplementaires, int zoom) {
GoogleMap mapNulle = null;
if(nmk != null) {
nmk.setMap(mapNulle);
}
pointCommune = pointNouvelleCommune;
nmk = fabriquerMarqueur(pointCommune, infosComplementaires);
nmk.setMap(map);
afficherInfoMarker(nmk);
recentrerCarte(nmk.getPosition());
map.setZoom(zoom);
}
private void initialiserCarte(boolean commune) {
panneauCarto.clear();
centreFrance = LatLng.create(47.0504, 2.2347);
pointCommune = 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(!commune) {
fabriquerMarqueurIndication();
}
map.addClickListener(new ClickHandler() {
@Override
public void handle(MouseEvent event) {
obtenirInfosCommunes(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(pointCommune,"");
nmk.setMap(map);
info.setContent("<div id=\"info_contenu\">"+
"Déplacez ce marqueur pour localiser votre observation (commune 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() {
@Override
public void run() {
ajouterListenerBouton(idBouton);
}
};
t.schedule(500);
return;
} else {
bouton.addListener("click", new EventCallback() {
@Override
public void execute(EventObject e) {
EntiteGeographiqueObservation infosCommune = new EntiteGeographiqueObservation(codeCommune,valeurCommune,null,null);
infosCommune.setLat(pointCommune.lat()+"");
infosCommune.setLon(pointCommune.lng()+"");
oMediateur.rafraichirSaisieCommuneObservation(infosCommune);
}
});
bouton.focus();
}
}
@Override
public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
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;
}
String nouvelleValeurCommune = infos.getZoneGeo();
valeurCommune = nouvelleValeurCommune;
codeCommune = Util.convertirChaineZoneGeoVersDepartement(infos.getIdZoneGeo());
pointCommune = coord;
mettreAJourInfos(coord, "", niveauZoom);
}
masquerChargement(false);
}
public Marker fabriquerMarqueur(LatLng pointMarqueur, final String texte) {
// 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) {
obtenirInfosCommunes(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);
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 void afficherInfoMarker(Marker marker) {
final String htmlBoutonOk = "<br /><button id=\"okMap\" class=\"x-btn-text\" type=\"button\">OK</button>";
String contenuMarker = "";
if(valeurCommune == null || valeurCommune.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 {
contenuMarker = ""
+valeurCommune+" ("+codeCommune+")<br />"
+"longitude="
+ Util.tronquerNombrePourAffichage("" + marker.getPosition().lng(), 5) + "<br />latitude="
+ Util.tronquerNombrePourAffichage("" + marker.getPosition().lat(), 5) ;
}
info.setContent(contenuMarker+ htmlBoutonOk);
info.open(map, marker);
info.addDomReadyListenerOnce(new InfoWindow.DomReadyHandler() {
@Override
public void handle() {
ajouterListenerBouton("okMap");
}
});
recentrerCarte(marker.getPosition());
}
public double[] getCoordsCentreFrance() {
double[] coords = {47.0504, 2.2347};
return coords;
}
public void setDoitZoomerSurRetour(boolean b) {
zoomerSurRetour = b;
}
}