Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 407 → Rev 408

/trunk/src/org/tela_botanica/client/vues/image/ZoomImageVue.java
4,7 → 4,14
import org.tela_botanica.client.image.ImageMediateur;
import org.tela_botanica.client.interfaces.Rafraichissable;
 
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.LoadEvent;
import com.google.gwt.event.dom.client.LoadHandler;
import com.google.gwt.event.dom.client.MouseWheelEvent;
import com.google.gwt.event.dom.client.MouseWheelHandler;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
96,6 → 103,8
* Booleen d'initalisation général
*/
private boolean initialise = false;
private Panel infosTaxon = new Panel();
 
/**
* Booleen d'initalisation du conteneur d'image
103,17 → 112,7
private boolean conteneurInitialise = false;
private ToolTip tp = new ToolTip("<div class=\"x-tooltip-help\"> Double cliquez pour revenir à la vue précédente, utilisez la roulette ou les boutons fléchés pour faire défiler les images </div>") ;
 
/**
* true pour animer les transitions des animations
*/
private boolean animerTransition = false;
/**
* duree des animation
*/
private float dureeAnimation = (float) 0.15 ;
/**.
* boolean de gestion du double clic
*/
122,23 → 121,7
private ToolbarButton modeZoom = null;
private ToolbarTextItem valeurZoom = new ToolbarTextItem("x 1");
private int sourisX = 0;
private int sourisY = 0;
private int sourisXFin = 0;
private int sourisYFin = 0;
private float niveauZoom = 1;
private float pasZoom = new Float(0.1);
 
private int maxZoom = 10;
private float minZoom = new Float(0.5);
 
protected boolean scroll = false;
/**
197,9 → 180,15
//setTopToolbar(tb);
infosTaxon = new Panel();
infosTaxon.setHeader(false);
//infosTaxon.setBorder(false);
infosTaxon.setHeight("30px");
this.add(prev, new BorderLayoutData(RegionPosition.WEST));
this.add(imageConteneur, new BorderLayoutData(RegionPosition.CENTER));
this.add(suiv, new BorderLayoutData(RegionPosition.EAST));
this.add(infosTaxon, new BorderLayoutData(RegionPosition.SOUTH));
 
imageConteneur.setMaskDisabled(true);
this.setBorder(false);
232,7 → 221,9
// si on reçoit une string
if (nouvelleDonnees instanceof String[] && initialise
&& conteneurInitialise) {
String[] infos = (String[]) nouvelleDonnees;
// c'est l'url de l'image qu'on associe à la vue
if (infos[0] != null && infos[1] != null && infos[2] != null && infos[3] != null) {
getImage().setUrl(infos[0]);
242,8 → 233,16
setTailleImage(x, y);
setIdImage(infos[3]) ;
String infosTaxon = "" ;
if(infos.length == 5 && infos[4] != null) {
infosTaxon = infos[4];
}
setInfosTaxon(infosTaxon);
 
//verifierEtRetaillerImage();
verifierEtRetaillerImage();
}
} else {
// sinon on met une image vide
286,62 → 285,10
* Ajoute les listeners pour la gestions d'évènement
*/
public void ajouterListeners() {
modeZoom.addListener(new ButtonListenerAdapter() {
 
public void onClick(Button button, EventObject e) {
// TODO Auto-generated method stub
if(modeZoom.isPressed()) {
modeZoom.toggle(false);
} else {
modeZoom.toggle(true);
}
}
public void onToggle(Button button, boolean pressed) {
if(pressed) {
scroll = true;
image.addStyleName("img-curseur-depl");
} else {
scroll = false;
image.removeStyleName("img-curseur-depl");
niveauZoom = 1;
verifierEtRetaillerImage();
Ext.get(image.getElement()).center(imageConteneur.getElement());
}
}
});
image.addLoadListener(new LoadListener() {
 
public void onError(Widget sender) {
// TODO Auto-generated method stub
}
 
public void onLoad(Widget sender) {
/*int max = Math.min(imageConteneur.getHeight(), imageConteneur.getWidth());
int[] tailleImage = calculerDimensions(getTailleImage(), max, max);
ExtElement imgElement = Ext.get(image.getElement());
if(animerTransition) {
AnimationConfig a = new AnimationConfig() ;
a.setDuration((float) dureeAnimation);
imgElement.setHeight(tailleImage[1], a);
imgElement.setWidth(tailleImage[0], a);
} else {
imgElement.setHeight(tailleImage[1], false);
imgElement.setWidth(tailleImage[0], false);
}*/
verifierEtRetaillerImage();
Ext.get(image.getElement()).center(imageConteneur.getElement());
demasquerChargement();
}
image.addClickHandler(new ClickHandler() {
});
image.addClickListener(new ClickListener() {
 
public void onClick(Widget sender) {
public void onClick(ClickEvent event) {
if(!scroll) {
if(enClic) {
getIMediateur().doubleClicZoomImage();
357,101 → 304,48
}
}
}
});
image.addMouseWheelListener(new MouseWheelListener() {
image.addLoadHandler(new LoadHandler() {
public void onLoad(LoadEvent event) {
 
public void onMouseWheel(Widget sender, MouseWheelVelocity velocity) {
if(velocity.getDeltaY() > 0) {
if(scroll) {
zoomOut();
} else {
suiv.click();
}
} else {
if(scroll) {
zoomIn();
} else {
prev.click();
}
}
verifierEtRetaillerImage();
Ext.get(image.getElement()).center(imageConteneur.getElement());
demasquerChargement();
}
});
image.addMouseListener(new MouseListener() {
 
public void onMouseDown(Widget sender, int x, int y) {
if(scroll) {
Event.getCurrentEvent().preventDefault();
scroll = true;
sourisX = x;
sourisY = y;
image.addStyleName("img-curseur-depl");
}
}
 
public void onMouseEnter(Widget sender) {
// TODO Auto-generated method stub
image.addMouseWheelHandler(new MouseWheelHandler() {
public void onMouseWheel(MouseWheelEvent event) {
if(event.isNorth()) {
masquerChargement();
getIMediateur().clicBoutonZoomImage("suiv");
} else {
masquerChargement();
getIMediateur().clicBoutonZoomImage("prev");
}
}
 
public void onMouseLeave(Widget sender) {
// TODO Auto-generated method stub
}
 
public void onMouseMove(Widget sender, int x, int y) {
sourisXFin = x;
sourisYFin = y;
Event.getCurrentEvent().preventDefault();
}
 
public void onMouseUp(Widget sender, int x, int y) {
if(scroll) {
Event.getCurrentEvent().preventDefault();
if(sourisX - sourisXFin > 0) {
Ext.get(image.getElement()).move(Direction.LEFT, sourisX - sourisXFin, false);
}
if(sourisXFin - sourisX > 0) {
Ext.get(image.getElement()).move(Direction.RIGHT, sourisXFin - sourisX, false);
}
if(sourisY - sourisYFin > 0) {
Ext.get(image.getElement()).move(Direction.UP, sourisY - sourisYFin, false);
}
if(sourisYFin - sourisY > 0) {
Ext.get(image.getElement()).move(Direction.DOWN, sourisYFin - sourisY, false);
}
}
}
});
// gestion du clic sur le bouton précedent
prev.addClickListener(new ClickListener() {
prev.addClickHandler(new ClickHandler() {
 
// en cas de clic
public void onClick(Widget sender) {
public void onClick(ClickEvent event) {
// on notifie le médiateur
masquerChargement();
getIMediateur().clicBoutonZoomImage("prev");
}
 
});
 
// gestion du clic sur le bouton suivant
suiv.addClickListener(new ClickListener() {
suiv.addClickHandler(new ClickHandler() {
 
// en cas de clic
public void onClick(Widget sender) {
public void onClick(ClickEvent event) {
// on notifie le médiateur
masquerChargement();
getIMediateur().clicBoutonZoomImage("suiv");
488,94 → 382,34
* 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 ;
* }
*/
/*
// 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
int max = Math.min(imageConteneur.getHeight(), imageConteneur.getWidth());
int[] tailleImage = new int[2];
ExtElement imgElement = Ext.get(image.getElement());
if(max == imageConteneur.getHeight()) {
//tailleImage[0] = getTailleImage()[0];
//tailleImage[1] = max;
imgElement.setHeight(max, false);
if(Ext.isIE()) {
image.setHeight(calculerDimensions(getTailleImage(),max,max)[1]+"px");
image.setWidth(calculerDimensions(getTailleImage(),max,max)[0]+"px");
} else {
//tailleImage[1] = getTailleImage()[0];
//tailleImage[0] = max;
imgElement.setWidth(max, false);
if(max == imageConteneur.getHeight()) {
tailleImage[0] = getTailleImage()[0];
tailleImage[1] = max;
image.setHeight(max+"px");
} else {
tailleImage[1] = getTailleImage()[0];
tailleImage[0] = max;
image.setWidth(max+"px");
}
}
//int[] tailleImage = calculerDimensions(getTailleImage(), max, max);
//imgElement.
/*if(animerTransition) {
AnimationConfig a = new AnimationConfig() ;
a.setDuration((float) dureeAnimation);
imgElement.setHeight(tailleImage[1], a);
imgElement.setWidth(tailleImage[0], a);
} else {
imgElement.setHeight(tailleImage[1], false);
imgElement.setWidth(tailleImage[0], false);
}*/
String strZoom = ""+niveauZoom+"";
strZoom = strZoom.substring(0,3);
valeurZoom.setText("x "+strZoom);
}
public int[] calculerDimensions(int[] tailleXY, double tailleMax, double tailleConteneur) {
595,7 → 429,7
XYresize[0] = tailleOr*rapport ;
}
int[] res = {(int)Math.round(XYresize[0]*niveauZoom),(int) Math.round(XYresize[1]*niveauZoom)} ;
int[] res = {(int)Math.round(XYresize[0]),(int) Math.round(XYresize[1])} ;
return res;
}
696,6 → 530,16
{
idImage = id ;
}
public void setInfosTaxon(String nomTaxon) {
if(nomTaxon != null && !nomTaxon.equals("")) {
nomTaxon = getNomsObservationsFormatees(nomTaxon);
}
infosTaxon.setHtml("<div id='infos_taxon'><span class='texte_info_taxon'>"+nomTaxon+"</span></div>");
infosTaxon.doLayout();
}
 
/**
* renvoie la taille originale de l'image
708,6 → 552,14
return taille;
}
public boolean estPortrait() {
return imageHeight > imageWidth;
}
public boolean estPaysage() {
return !estPortrait();
}
/**
* Accesseur pour le conteneur de l'image
* @return le conteur de l'image
718,73 → 570,58
 
}
private void zoomOut() {
if(niveauZoom >= minZoom) {
niveauZoom -= pasZoom;
if(niveauZoom <= minZoom) {
niveauZoom = minZoom;
private String getNomsObservationsFormatees(String nomObs) {
String htmlInfobulle = "";
String[][] obs = getObservationsAssociees(nomObs);
for(int i = 0; i < obs.length; i++) {
if(obs[i].length == 3 && obs[i][1] != null && !obs[i][1].equals("")) {
htmlInfobulle += ", "+obs[i][1];
}
verifierEtRetaillerImage();
gererDecalage(false);
}
htmlInfobulle = htmlInfobulle.replaceFirst(", ", "");
return htmlInfobulle;
}
 
private void zoomIn() {
if(niveauZoom < maxZoom ) {
niveauZoom += pasZoom;
if(niveauZoom >= maxZoom) {
niveauZoom = maxZoom;
}
verifierEtRetaillerImage();
gererDecalage(true);
private String[][] getObservationsAssociees(String nomObs) {
if(nomObs.trim().equals("")) {
return new String[0][0];
}
String[] obsTab = nomObs.split(";;");
String[][] obsAnalysees = new String[obsTab.length][3];
for(int i = 0; i < obsTab.length; i++) {
obsAnalysees[i] = obsTab[i].split("#");
}
return obsAnalysees;
}
private void gererDecalage(boolean in) {
private boolean[] estAssocieeTransmise(String nomObs) {
float nZoom = niveauZoom;
String[][] obs = getObservationsAssociees(nomObs);
boolean[] associeesTranmises = {false, false};
if(niveauZoom < 1) {
nZoom = 1/niveauZoom;
if(obs.length > 0) {
associeesTranmises[0] = true;
}
if(!in) {
int diffX = imageConteneur.getWidth()/2 - sourisX;
int diffY = imageConteneur.getHeight()/2 - sourisY;
for(int i = 0; i < obs.length; i++) {
if(diffX > 0) {
Ext.get(image.getElement()).move(Direction.RIGHT, (int)((diffX/maxZoom)/nZoom), false);
if(obs[i].length == 3 && obs[i][2] != null && obs[i][2].equals("1")) {
associeesTranmises[1] = true;
}
if(-diffX > 0) {
Ext.get(image.getElement()).move(Direction.LEFT, (int)(-(diffX/maxZoom)/nZoom), false);
}
if(diffY > 0) {
Ext.get(image.getElement()).move(Direction.DOWN, (int)((diffY/maxZoom)/nZoom), false);
}
if(-diffY > 0) {
Ext.get(image.getElement()).move(Direction.UP, (int)(-(diffY/maxZoom)/nZoom), false);
}
} else {
int diffX = imageConteneur.getWidth()/2;
int diffY = imageConteneur.getHeight()/2;
if(diffX > 0) {
Ext.get(image.getElement()).move(Direction.LEFT, (int)((diffX/maxZoom)/nZoom), false);
}
if(-diffX > 0) {
Ext.get(image.getElement()).move(Direction.RIGHT, (int)((-diffX/maxZoom)/nZoom), false);
}
if(diffY > 0) {
Ext.get(image.getElement()).move(Direction.UP, (int)((diffY/maxZoom)/nZoom), false);
}
if(-diffY > 0) {
Ext.get(image.getElement()).move(Direction.DOWN, (int)(-(diffY/maxZoom)/nZoom), false);
}
}
return associeesTranmises;
}
}