Subversion Repositories eFlore/Applications.cel

Rev

Rev 2627 | Blame | Last modification | View Log | RSS feed

package org.tela_botanica.client.vues.observation.indicateurs;

import org.tela_botanica.client.i18n.Msg;
import org.tela_botanica.client.interfaces.Rafraichissable;
import org.tela_botanica.client.observation.ObservationMediateur;

import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Image;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.ToolTip;

/**
 * Un panneau affichant une image generique provenant d eflore
 * 
 * @author David Delon
 * 
 */
public class ImageGeneriqueVue extends Panel implements Rafraichissable {

        /**
         * Le médiateur associé
         */
        
        private ObservationMediateur observationMediateur = null;
        
        
        /**
         * l'image à afficher
         */
        private Image image = new Image();
        
        private String urlImage = "" ;
        private String urlImageMax = "" ;
        
        private HTML htmlVide = new HTML();
        
        
        private com.gwtext.client.widgets.Window imgZoom = new com.gwtext.client.widgets.Window(Msg.get("agrandissement")) ;
        
        private ToolTip tp = new ToolTip("<div class=\"x-tooltip-help\"> " + Msg.get("double-clic-agrandir") + " </div>") ;
        
        /**
         * Constructeur sans argument (privé car ne doit pas être utilisé)
         */
        
        @SuppressWarnings("unused")
        private ImageGeneriqueVue() {
                super();
        }

        /**
         * Constructeur avec argument
         * @param obs le médiateur à associer
         */
        
        
        public ImageGeneriqueVue(ObservationMediateur obs) {
                
                        
                this.observationMediateur = obs;
                imgZoom.setCloseAction(com.gwtext.client.widgets.Window.HIDE) ;
                image = new Image() {

                        @Override
                        public void onBrowserEvent(Event event) {

                                // lors du double clic
                                if (Event.ONDBLCLICK == DOM.eventGetType(event)) {

                                        // on notifie le médiateur
                                        agrandirImage() ;
                                }
                        }
                        
                };
                
                tp.applyTo(image.getElement()) ;
                
                
                this.setCls("x-image-gen") ;
                
                imgZoom.setConstrain(true);
                imgZoom.setAutoHeight(true) ;
                imgZoom.setAutoWidth(true) ;
                
                htmlVide.setHeight("0px");
                htmlVide.setVisible(false);

                add(image);
                add(htmlVide);
                image.setPixelSize(150, 150);
                image.sinkEvents(Event.ONDBLCLICK);
                
                afficherImageSinonAfficherMessage(false);
                // on ajoute les listeners
                ajouterListeners();
        }


        /**
         * Affichage image generique
         * 
         */
        
        @Override
        public void rafraichir(Object nouvelleDonnees,boolean repandreRaffraichissement) {

                // si on recoit une String contenant une URL
                if (nouvelleDonnees instanceof String []) {
                        String [] lecteurDonnees = (String []) nouvelleDonnees;
                        
                        urlImage=lecteurDonnees[0];
                        urlImageMax=lecteurDonnees[1];
                        
                        if (urlImage == null || urlImage.equals("null") || urlImage.length()==0 || urlImage.equals("")) {
                                afficherHtmlVide();
                                image.setVisible(false);
                        }
                        else {
                                afficherImageSinonAfficherMessage(true);
                                image.setUrl(urlImage);
                                image.setPixelSize(150, 150);
                                verifierEtRetaillerImage();
                        }
                } else {
                        afficherImageSinonAfficherMessage(false);
                }
                
                observationMediateur.deMasquerChargementInfosObservations() ;
                                
        }
        
        private void afficherImageSinonAfficherMessage(boolean afficherImage) {
                if(afficherImage) {
                        htmlVide.setVisible(false);
                } else {
                        afficherHtmlVide();
                }
                image.setVisible(afficherImage);
        }
        
        private void afficherHtmlVide() {  
                String htmlDivVide = "<div class=\"aucune_image_pour\"> "+Msg.get("aucune-image-taxon")+"</div>";
                htmlVide.setHeight("150px");
                htmlVide.setHTML(htmlDivVide);
                htmlVide.setVisible(true);
        }
        
        public void agrandirImage() {
                
                if(!imgZoom.isVisible())
                {
                        imgZoom.setHtml("<img height="+Window.getClientHeight()*0.75+"px src=\""+urlImageMax+"\" />") ;
                        imgZoom.setPagePosition( Window.getClientWidth()/2, Window.getClientHeight()/5) ;
                        imgZoom.show(this.getElement()) ;
                } else {
                        imgZoom.hide();
                }       
        }

        
        /**
         * Ajoute les listeners pour la gestions d'évènement
         */
        public void ajouterListeners() {
                
        }
        
        public void raz() {
                image.setUrl("");
        }
        
        public void verifierEtRetaillerImage() {
                // si l'image est nulle
                if (image == null) {
                        // on ne fait rien
                        return;
                }
                

                // on prend la taille originale de l'image
                int originalX = image.getWidth();
                int originalY = image.getHeight();

                // on la transforme en float (la division entre entier donne de curieux
                // résultats)
                float fOriginalX = (new Float(originalX)).floatValue();
                float fOriginalY = (new Float(originalY)).floatValue();

                // et on fait le rapport longueur sur hauteur (pour connaitre le ratio)
                float rapportTaille = fOriginalX / fOriginalY;

                // la nouvelle taille est pour le moment égale à l'ancienne
                int nouvelleTailleX = originalX;
                int nouvelleTailleY = originalY;

                // on prend la taille du conteneur
                int tailleConteneurX = getWidth();
                int tailleConteneurY = getHeight();
                
                int maxConteneur = Math.min(tailleConteneurX, tailleConteneurY);
                int max = Math.min(maxConteneur, 300);
                
                // si l'image ne rentre pas telle quelle (longueur ou hauteur trop
                // grande)      
                // si la longueur de l'image est la plus grande des deux
                        
                        int maxImage = Math.max(originalX, originalY);
                        
                        if(maxImage == originalX) {
                                // on prend la longueur comme taille de référence, qu'on met à
                                // la longueur du conteneur
                                nouvelleTailleX = max;
                                // et on recalcule la hauteur, par rapport à la nouvelle
                                // longueur, en gardant le format de 'limage
                                nouvelleTailleY = (int) Math.floor(nouvelleTailleX * 1
                                                / rapportTaille);
                        } 
                        else
                        {       
                                // si la hauteur est la plus grande, on fait le même genre
                                // d'opération en prenant la hauteur comme référence
                                nouvelleTailleY = max;
                                nouvelleTailleX = (int) Math.floor(nouvelleTailleY
                                                * rapportTaille);
                        }

                // on modifie enfin la taille de l'image pour qu'elle soit affichée
                        image.setPixelSize(nouvelleTailleX ,
                                        nouvelleTailleY);
                
                doLayout();
        }
}