Subversion Repositories eFlore/Applications.cel

Rev

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;
        }
}