Rev 2757 | Blame | Compare with Previous | 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 la repartition d'une plante
*
* @author David Delon
*
*/
public class InformationRepartitionVue extends Panel implements Rafraichissable {
/**
* l'image à afficher
*/
private Image image = new Image();
private String urlImage = "" ;
private HTML htmlVide = new HTML();
private ToolTip tp = new ToolTip("<div class=\"x-tooltip-help\"> " + Msg.get("double-clic-agrandir") + " </div>") ;
com.gwtext.client.widgets.Window imgZoom = new com.gwtext.client.widgets.Window(Msg.get("agrandissement")) ;
/**
* Constructeur sans argument (privé car ne doit pas être utilisé)
*/
@SuppressWarnings("unused")
private InformationRepartitionVue() {
super();
}
/**
* Constructeur avec argument
* @param obs le médiateur à associer
*/
public InformationRepartitionVue(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()) ;
image.sinkEvents(Event.ONDBLCLICK);
imgZoom.setConstrain(true);
imgZoom.setAutoHeight(true) ;
imgZoom.setAutoWidth(true) ;
this.setCls("x-image-info-rep") ;
add(image);
add(htmlVide);
image.setPixelSize(150, 150);
afficherImageSinonAfficherMessage(false);
// on ajoute les listeners
ajouterListeners();
}
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-carte-taxon")+"</div>";
htmlVide.setHeight("150px");
htmlVide.setHTML(htmlDivVide);
htmlVide.setVisible(true);
}
/**
* Affichage carte de repartition
*
*/
@Override
public void rafraichir(Object nouvelleDonnees,boolean repandreRaffraichissement) {
// si on recoit une String contenant une URL
if (nouvelleDonnees instanceof String) {
urlImage=(String) nouvelleDonnees;
if (urlImage == null || urlImage.equals("null") || urlImage.length()==0) {
afficherImageSinonAfficherMessage(false);
}
else {
afficherImageSinonAfficherMessage(true);
image.setUrl(urlImage);
verifierEtRetaillerImage();
}
}
}
public void agrandirImage() {
if(!imgZoom.isVisible())
{
String urlAgrandie = urlImage.replace("min", "max");
imgZoom.setHtml("<img height="+Window.getClientHeight()*0.75+"px src=\""+urlAgrandie+"\" />") ;
imgZoom.setPagePosition( Window.getClientWidth()/2, Window.getClientHeight()/5) ;
imgZoom.show(this.getElement()) ;
} else {
imgZoom.hide();
}
}
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();
}
/**
* Ajoute les listeners pour la gestions d'évènement
*/
public void ajouterListeners() {
}
public void raz() {
image.setUrl("");
}
}