Subversion Repositories eFlore/Archives.cel-v2

Compare Revisions

Ignore whitespace Rev 35 → Rev 36

/trunk/src/org/tela_botanica/client/vues/ZoomImageVue.java
5,41 → 5,121
import org.tela_botanica.client.interfaces.Rafraichissable;
 
 
import com.google.gwt.core.client.JavaScriptObject;
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.ClickListener;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.LoadListener;
import com.google.gwt.user.client.ui.MouseWheelListener;
import com.google.gwt.user.client.ui.MouseWheelVelocity;
import com.google.gwt.user.client.ui.Widget;
import com.gwtext.client.core.RegionPosition;
import com.gwtext.client.widgets.BoxComponent;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.Component;
import com.gwtext.client.widgets.Container;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
import com.gwtext.client.widgets.event.PanelListener;
import com.gwtext.client.widgets.event.PanelListenerAdapter;
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.VerticalLayout;
 
/**
* Panneau d'affichage d'une image avec des boutons précdents et suivant
* TODO: assurer le redimensionnement automatique de l'image et la centrer
* @author aurelien
*
*/
public class ZoomImageVue extends Panel implements Rafraichissable {
/**
* Le médiateur associé à la vue
*/
private ImageMediateur iMediateur = null ;
private Image image = null ;
/**
* Panneau conteneur pour l'image
*/
private Panel imageConteneur = null ;
/**
* l'image à afficher
*/
private Image image = new Image("vide.jpg") ;
/**
* Bouton précédent
*/
private final com.google.gwt.user.client.ui.Button prev = new com.google.gwt.user.client.ui.Button("<");
/**
* Bouton suivant
*/
private final com.google.gwt.user.client.ui.Button suiv = new com.google.gwt.user.client.ui.Button(">");
/**
* Taille originale Y de l'image
*/
private int imageHeight = 0 ;
/**
* Taille originale X de l'image
*/
private int imageWidth = 0 ;
/**
* Booleen d'initalisation général
*/
private boolean initialise = false ;
/**
* Booleen d'initalisation du conteneur d'image
*/
private boolean conteneurInitialise = false ;
/**
* Constructeur sans argument (privé car ne doit être utilisé)
*/
private ZoomImageVue()
{
super() ;
}
/**
* Constructeur avec argument
* @param im le médiateur à associer à la vue
*/
public ZoomImageVue(ImageMediateur im)
{
super("Zoom");
// on associe le médiateur
iMediateur = im ;
iMediateur = im ;
// on crée un image qui gère le double clic
image = new Image() {
public void onBrowserEvent(Event event) {
// lors du double clic
if (Event.ONDBLCLICK == DOM.eventGetType(event)) {
 
// on notifie le médiateur
getIMediateur().doubleClicZoomImage();
}
}
}
};
 
imageConteneur = new Panel() ;
imageConteneur.add(image) ;
imageConteneur.setId("x-view-zoom-img") ;
// il n'existe pas de méthode pour ajouter un listener pour le double clic sur une image
// alors on lui dit manuellement de capter l'évènement double clic
image.sinkEvents(Event.ONDBLCLICK);
// l'image de base est vide
image.setUrl("vide.jpg");
this.setLayout(new BorderLayout());
48,32 → 128,58
suiv.setWidth("60px");
this.add(prev,new BorderLayoutData(RegionPosition.WEST));
this.add(image,new BorderLayoutData(RegionPosition.CENTER));
this.add(imageConteneur,new BorderLayoutData(RegionPosition.CENTER));
this.add(suiv,new BorderLayoutData(RegionPosition.EAST));
ajouterListenersBoutons();
// on ajoute les listeners
ajouterListeners();
}
 
/**
* Méthode héritée de l'interface rafraichissable
* @param nouvelleDonnees les nouvelles données
* @param repandreRafraichissement le booleen qui dit si on doit répnadre l'évènement
*/
public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) {
if(nouvelleDonnees instanceof String)
// si on reçoit une string
if(nouvelleDonnees instanceof String[])
{
getImage().setUrl((String)nouvelleDonnees);
String[] infos = (String[])nouvelleDonnees ;
// c'est l'url de l'image qu'on associe à la vue
getImage().setUrl(infos[0]);
if(infos[1] != null && infos[2] != null)
{
int x = Integer.parseInt(infos[1]) ;
int y = Integer.parseInt(infos[2]) ;
setTailleImage(x,y) ;
verifierEtRetaillerImage() ;
}
}
else
{
getImage().setUrl("/images/vide.jpeg") ;
// sinon on met une image vide
getImage().setUrl("vide.jpeg") ;
}
}
/**
* Desactive visuellement le panneau et les boutons
*/
public void desactiverPanneau()
{
getImage().setUrl("/images/vide.jpeg") ;
getImage().setUrl("vide.jpeg") ;
prev.setEnabled(false) ;
suiv.setEnabled(false);
}
/**
* Active visuellement le panneau et les boutons
*/
public void activerPanneau()
{
prev.setEnabled(true);
80,47 → 186,173
suiv.setEnabled(true);
}
public void ajouterListenersBoutons()
/**
* Ajoute les listeners pour la gestions d'évènement
*/
public void ajouterListeners()
{
// gestion du clic sur le bouton précedent
prev.addClickListener(new ClickListener() {
 
// en cas de clic
public void onClick(Widget sender) {
// on notifie le médiateur
getIMediateur().clicBoutonZoomImage("prev");
}
});
// gestion du clic sur le bouton suivant
suiv.addClickListener(new ClickListener() {
 
// en cas de clic
public void onClick(Widget sender) {
// on notifie le médiateur
getIMediateur().clicBoutonZoomImage("suiv");
}
});
// gestion du redimensionnement
this.addListener(new PanelListenerAdapter() {
// lors d'un redimensionnement de l'application
public void onBodyResize(Panel panel,java.lang.String width,java.lang.String height)
{
// on vérifie et on retaille l'image
verifierEtRetaillerImage() ;
}
}) ;
// gestion du redimensionnement lors de l'affichage du conteneur
imageConteneur.addListener(new PanelListenerAdapter() {
// avant de finir d'afficher
public void onAfterLayout(Container self)
{
// on redimensionne
verifierEtRetaillerImage() ;
}
}) ;
}
/**
* Verifie si l'image est plus grande que le conteneur et la retaille le cas echeant
*/
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 = getTailleImage()[0] ;
int originalY = getTailleImage()[1] ;
// 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 = imageConteneur.getWidth() ;
int tailleConteneurY = imageConteneur.getHeight() ;
// si celle-ci est égale à 0 (conteneur mal initialisé)
if(imageConteneur.getHeight() == 0 && tailleConteneurX == 0)
{
// on essaie de la calculer en fonction de la taille du parent et des frères
tailleConteneurY = this.getHeight() ;
tailleConteneurX = this.getWidth() - prev.getOffsetWidth() * 2 ;
nouvelleTailleX = originalX ;
nouvelleTailleY = originalY ;
}
// si l'image ne rentre pas telle quelle (longueur ou hauteur trop grande)
if(originalY > tailleConteneurY || originalX > tailleConteneurX)
{
// si la longueur de l'image est la plus grande des deux
if(originalX > originalY)
{
// on prend la longueur comme taille de référence, qu'on met à la longueur du conteneur
nouvelleTailleX = tailleConteneurX ;
// 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 = tailleConteneurY ;
nouvelleTailleX = (int)Math.floor(nouvelleTailleY*rapportTaille) ;
}
}
// on modifie enfin la taille de l'image pour qu'elle soit affichée
getImage().setSize(""+nouvelleTailleX+"px", ""+nouvelleTailleY+"px") ;
}
 
 
/**
* Accesseur pour le médiateur
* @return le médiateur associé à la vue
*/
public ImageMediateur getIMediateur() {
return iMediateur;
}
 
 
/**
* Accesseur au conteneur de l'image
* @return le conteneur de l'image
*/
public Image getImage() {
return image;
}
 
 
/**
* Accesseur pour le bouton précédent
* @return le bouton précédent
*/
public com.google.gwt.user.client.ui.Button getPrev() {
return prev;
}
 
 
/**
* Accesseur pour le bouton suivant
* @return le bouton suivant
*/
public com.google.gwt.user.client.ui.Button getSuiv() {
return suiv;
}
/**
* Setter pour la taille de l'image
* @param X la largeur en pixels
* @param Y la hauteur en pixels
*/
public void setTailleImage(int x, int y)
{
imageHeight = y ;
imageWidth = x ;
}
/**
* renvoie la taille originale de l'image
* @return un tableau de deux entiers contenant la largeur puis la hauteur
*/
public int[] getTailleImage()
{
int[] taille = {imageHeight,imageWidth} ;
return taille ;
}
 
}