New file |
0,0 → 1,204 |
package org.tela_botanica.client.vues; |
|
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.Image; |
import com.gwtext.client.core.Ext; |
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 { |
|
/** |
* Le médiateur associé |
*/ |
|
private ObservationMediateur observationMediateur = null; |
|
|
/** |
* l'image à afficher |
*/ |
private Image image = new Image(); |
|
private String urlImage = "" ; |
|
private ToolTip tp = new ToolTip("<div class=\"x-tooltip-help\"> Double cliquez pour agrandir l'image </div>") ; |
|
com.gwtext.client.widgets.Window imgZoom = new com.gwtext.client.widgets.Window("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) { |
|
|
this.observationMediateur = obs; |
|
imgZoom.setCloseAction(com.gwtext.client.widgets.Window.HIDE) ; |
image = new Image() { |
|
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); |
|
this.setCls("x-image-info-rep") ; |
add(image); |
image.setPixelSize(150, 150); |
|
// on ajoute les listeners |
ajouterListeners(); |
|
} |
|
|
/** |
* Affichage carte de repartition |
* |
*/ |
|
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) { |
image.setUrl("ill_choro.png") ; |
image.setPixelSize(150, 150); |
} |
else { |
image.setUrl(urlImage); |
verifierEtRetaillerImage(); |
} |
} |
|
} |
|
public void agrandirImage() { |
|
if(!imgZoom.isVisible()) |
{ |
String urlAgrandie = urlImage.replace("min", "max") ; |
|
imgZoom.setHtml("<img src=\""+urlAgrandie+"\" />") ; |
imgZoom.setPagePosition( Window.getClientWidth()/2, Window.getClientHeight()/5) ; |
imgZoom.setAutoHeight(true) ; |
imgZoom.setAutoWidth(true) ; |
imgZoom.show(this.getElement()) ; |
} |
|
} |
|
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(""); |
} |
|
} |