Subversion Repositories eFlore/Applications.cel

Rev

Rev 323 | 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.EntiteGeographiqueObservation;
import org.tela_botanica.client.observation.ObservationMediateur;

import com.google.gwt.maps.client.InfoWindow;
import com.google.gwt.maps.client.InfoWindowContent;
import com.google.gwt.maps.client.MapType;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.control.LargeMapControl;
import com.google.gwt.maps.client.event.InfoWindowRestoreEndHandler;
import com.google.gwt.maps.client.event.MapZoomEndHandler;
import com.google.gwt.maps.client.event.MarkerClickHandler;
import com.google.gwt.maps.client.event.MarkerDragEndHandler;
import com.google.gwt.maps.client.event.MarkerDragStartHandler;
import com.google.gwt.maps.client.event.MarkerDragEndHandler.MarkerDragEndEvent;
import com.google.gwt.maps.client.event.MarkerDragStartHandler.MarkerDragStartEvent;
import com.google.gwt.maps.client.geom.LatLng;
import com.google.gwt.maps.client.overlay.Marker;
import com.google.gwt.maps.client.overlay.MarkerOptions;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTML;
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.core.RegionPosition;
import com.gwtext.client.widgets.Component;
import com.gwtext.client.widgets.Container;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.event.ContainerListener;
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
import com.gwtext.client.widgets.form.Label;
import com.gwtext.client.widgets.layout.BorderLayout;
import com.gwtext.client.widgets.layout.BorderLayoutData;
import com.gwtext.client.widgets.layout.FitLayout;
import com.gwtext.client.widgets.layout.RowLayout;
import com.gwtext.client.widgets.layout.RowLayoutData;
import com.gwtext.client.widgets.map.LatLonPoint;

public class CartographieObservationVue extends Panel implements Rafraichissable {

        private String id = "cartographie_observation";
        
        private ObservationMediateur oMediateur = null;
        
        Panel panneauCarto = null;
        private MapWidget map;
        
        private boolean carteAjoutee = false;
        private boolean requeteEnCours = false;
        
        String valeurCommune = "Bourges";
        LatLng centreFrance = null;
        LatLng pointCommune = null;
        String codeCommune = "";
        
        int niveauZoom = 13;

        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 listenerInitialise = false;

        public CartographieObservationVue(ObservationMediateur om) {
                oMediateur = om;
                
                setTitle("Carto");
                setAutoWidth(true);
                setPaddings(10);

                panneauCarto = new Panel();
                panneauCarto.setLayout(new FitLayout());

                setLayout(new RowLayout());
                

                add(panneauExplication, new RowLayoutData(12));
                add(panneauCarto, new RowLayoutData());
                
                addListener(new ContainerListenerAdapter() {
                        public void onAfterLayout(Container c) {
                                
                                if(!carteAjoutee) {
                                        initialiserCarte(false);
                                }
                                recentrerCarte();
                        }
                });
                
                panneauCarto.setAutoHeight(true);
        }
        
        public void masquerChargement(boolean masquer) {
                if (masquer) {
                        ExtElement masked = Ext.get(id);

                        if (masked != null) {
                                masked.mask("Chargement");
                        }
                } else {
                        ExtElement masked = Ext.get(id);

                        if (masked != null) {
                                masked.unmask();
                        }
                }
        }
        
        public void obtenirInfosCommunes(LatLng coord) {
                oMediateur.obtenirInformationCoord(this, coord);
        }

        public void mettreAJourInfos(final LatLng pointNouvelleCommune, String infosComplementaires, int zoom) {

                if (!carteAjoutee) {
                        initialiserCarte(true);
                }

                pointCommune = pointNouvelleCommune;
                map.clearOverlays();
                Marker nmk = fabriquerMarqueur(pointCommune, infosComplementaires);
                map.addOverlay(nmk);
                afficherInfoMarker(nmk);
                recentrerCarte();
        }

        public void initialiserCarte(boolean commune) {
                
                centreFrance = LatLng.newInstance(47.0504, 2.2347);
                pointCommune = centreFrance;
                
                map = new MapWidget(pointCommune, niveauZoom);
                panneauCarto.add(map);
                panneauCarto.doLayout();
                info = map.getInfoWindow();
                if(!commune) {
                        fabriquerMarqueurIndication();
                }
                map.checkResizeAndCenter();
                map.setUIToDefault();
                map.addControl(new LargeMapControl());
                map.setCurrentMapType(MapType.getHybridMap());
                carteAjoutee = true;
                panneauCarto.doLayout();
                
                map.addMapZoomEndHandler(new MapZoomEndHandler() {

                        public void onZoomEnd(MapZoomEndEvent event) {
                                niveauZoom = event.getNewZoomLevel();
                        }
                        
                });
        }
        
        public void fabriquerMarqueurIndication() {
                Marker marker = fabriquerMarqueur(pointCommune,"");
                map.addOverlay(marker);         
                info.open(marker, new InfoWindowContent("<div id=\"info_contenu\">"+
                                "Déplacez ce marqueur pour localiser votre observation (commune et coordonnées)<br />"
                                +"longitude="
                                + marker.getLatLng().getLongitude() + "<br />latitude="
                                + marker.getLatLng().getLatitude() + "</div>"));
                map.setZoomLevel(3);
        }

        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() {
                                public void run() {
                                        ajouterListenerBouton(idBouton);
                                }
                                
                        };
                        t.schedule(500);
                        return;
                }
                
                bouton.addListener("click", new EventCallback() {
                        public void execute(EventObject e) {
                                EntiteGeographiqueObservation infosCommune = new EntiteGeographiqueObservation(codeCommune,valeurCommune,null,null);
                                infosCommune.setLat(pointCommune.getLatitude()+"");
                                infosCommune.setLon(pointCommune.getLongitude()+"");
                                oMediateur.rafraichirSaisieCommuneObservation(infosCommune);
                        }
                });     
                
                bouton.focus();
        }

        public void rafraichir(Object nouvelleDonnees,
                        boolean repandreRaffraichissement) {
                if (nouvelleDonnees instanceof String) {
                        
                        if(isVisible()) {
                                Window.alert((String)nouvelleDonnees);
                        }
                }

                if (nouvelleDonnees instanceof EntiteGeographiqueObservation) {
                        
                        EntiteGeographiqueObservation infos = (EntiteGeographiqueObservation) nouvelleDonnees;
                        LatLng coord = LatLng.newInstance(Double.parseDouble(infos.getLat()),
                                        Double.parseDouble(infos.getLon()));
                        
                        valeurCommune = infos.getCommune();
                        codeCommune = infos.getIdLocalite();
                        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.newInstance();
                options.setDraggable(true);
                final Marker marker = new Marker(pointMarqueur, options);
                
                marker.addMarkerDragEndHandler(new MarkerDragEndHandler() {
                        public void onDragEnd(MarkerDragEndEvent event) {
                                obtenirInfosCommunes(marker.getLatLng());
                        }

                });

                marker.addMarkerDragStartHandler(new MarkerDragStartHandler() {
                        public void onDragStart(MarkerDragStartEvent event) {
                                info.setVisible(false);
                        }
                });
                
                marker.addMarkerClickHandler(new MarkerClickHandler() {

                        public void onClick(MarkerClickEvent event) {
                                if(info.isVisible()) {
                                        info.close();
                                } else {
                                        afficherInfoMarker(marker);
                                }
                        }       
                });
                
                return marker;
        }

        public void recentrerCarte() {
                
                if(this.getWidth() > 12 && this.getHeight() > 24) {
                        map.setSize((this.getWidth() - 12)+"px" , (this.getHeight() - 24)+"px");
                        panneauCarto.setSize((this.getWidth() - 12)+"px" , (this.getHeight() - 12)+"px");
                }
                map.setCenter(pointCommune, niveauZoom);
                map.checkResizeAndCenter();
        }

        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("")) {
                        contenuMarker = "<div id=\"info_contenu\">"+
                        "Aucune commune française trouvée à cet emplacement <br />"
                        +"Déplacez ce marqueur pour localiser votre observation (commune et coordonnées)<br />"
                        +"longitude="
                        + marker.getLatLng().getLongitude() + "<br />latitude="
                        + marker.getLatLng().getLatitude() + "</div>";
                } else {
                        contenuMarker = ""
                        +valeurCommune+" ("+codeCommune+")<br />"
                        +"longitude="
                        + marker.getLatLng().getLongitude() + "<br />latitude="
                        + marker.getLatLng().getLatitude() ;
                }
                
                info.open(marker, new InfoWindowContent(""
                                + contenuMarker
                                + htmlBoutonOk));
                
                recentrerCarte();
                ajouterListenerBouton("okMap");
        }

}