Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
199 david 1
package org.tela_botanica.client.vues.observation.indicateurs;
54 david 2
 
3
import org.tela_botanica.client.interfaces.Rafraichissable;
4
import org.tela_botanica.client.observation.ObservationMediateur;
5
 
97 jpm 6
import com.google.gwt.user.client.DOM;
7
import com.google.gwt.user.client.Event;
8
import com.google.gwt.user.client.Window;
54 david 9
import com.google.gwt.user.client.ui.Image;
10
import com.gwtext.client.widgets.Panel;
99 jpm 11
import com.gwtext.client.widgets.ToolTip;
54 david 12
 
13
/**
14
 * Un panneau affichant une image generique provenant d eflore
15
 *
16
 * @author David Delon
17
 *
18
 */
19
public class ImageGeneriqueVue extends Panel implements Rafraichissable {
20
 
21
	/**
22
	 * Le médiateur associé
23
	 */
24
 
25
	private ObservationMediateur observationMediateur = null;
26
 
27
 
28
	/**
29
	 * l'image à afficher
30
	 */
31
	private Image image = new Image();
32
 
97 jpm 33
	private String urlImage = "" ;
348 david 34
	private String urlImageMax = "" ;
54 david 35
 
348 david 36
 
97 jpm 37
	private com.gwtext.client.widgets.Window imgZoom = new com.gwtext.client.widgets.Window("Agrandissement") ;
38
 
99 jpm 39
	private ToolTip tp = new ToolTip("<div class=\"x-tooltip-help\"> Double cliquez pour agrandir l'image </div>") ;
97 jpm 40
 
54 david 41
	/**
42
	 * Constructeur sans argument (privé car ne doit pas être utilisé)
43
	 */
44
 
45
	@SuppressWarnings("unused")
46
	private ImageGeneriqueVue() {
47
		super();
48
	}
49
 
50
	/**
51
	 * Constructeur avec argument
52
	 * @param obs le médiateur à associer
53
	 */
54
 
55
 
56
	public ImageGeneriqueVue(ObservationMediateur obs) {
57
 
58
 
59
		this.observationMediateur = obs;
97 jpm 60
		imgZoom.setCloseAction(com.gwtext.client.widgets.Window.HIDE) ;
61
		image = new Image() {
62
 
1292 aurelien 63
			@Override
97 jpm 64
			public void onBrowserEvent(Event event) {
65
 
66
				// lors du double clic
67
				if (Event.ONDBLCLICK == DOM.eventGetType(event)) {
68
 
69
					// on notifie le médiateur
70
					agrandirImage() ;
71
				}
72
			}
73
 
74
		};
75
 
99 jpm 76
		tp.applyTo(image.getElement()) ;
97 jpm 77
 
99 jpm 78
 
97 jpm 79
		this.setCls("x-image-gen") ;
338 aurelien 80
 
81
		imgZoom.setConstrain(true);
82
		imgZoom.setAutoHeight(true) ;
83
		imgZoom.setAutoWidth(true) ;
130 aurelien 84
 
85
		add(image);
54 david 86
		image.setPixelSize(150, 150);
97 jpm 87
		image.sinkEvents(Event.ONDBLCLICK);
88
 
54 david 89
		// on ajoute les listeners
90
		ajouterListeners();
91
 
92
	}
93
 
94
 
95
	/**
96
	 * Affichage image generique
97
	 *
98
	 */
99
 
1292 aurelien 100
	@Override
54 david 101
	public void rafraichir(Object nouvelleDonnees,boolean repandreRaffraichissement) {
102
 
103
		// si on recoit une String contenant une URL
348 david 104
		if (nouvelleDonnees instanceof String []) {
105
			String [] lecteurDonnees = (String []) nouvelleDonnees;
54 david 106
 
348 david 107
			urlImage=lecteurDonnees[0];
108
			urlImageMax=lecteurDonnees[1];
54 david 109
 
348 david 110
 
140 aurelien 111
			if (urlImage == null || urlImage.equals("null") || urlImage.length()==0) {
112
				image.setUrl("ill_taxon.png") ;
113
				image.setPixelSize(150, 150);
54 david 114
			}
115
			else {
116
				image.setUrl(urlImage);
140 aurelien 117
				verifierEtRetaillerImage();
54 david 118
			}
119
		}
84 jpm 120
 
121
		observationMediateur.deMasquerChargementInfosObservations() ;
54 david 122
 
123
	}
97 jpm 124
 
125
	public void agrandirImage() {
126
 
127
		if(!imgZoom.isVisible())
128
		{
348 david 129
			imgZoom.setHtml("<img height="+Window.getClientHeight()*0.75+"px src=\""+urlImageMax+"\" />") ;
97 jpm 130
			imgZoom.setPagePosition( Window.getClientWidth()/2, Window.getClientHeight()/5) ;
131
			imgZoom.show(this.getElement()) ;
279 aurelien 132
		} else {
133
			imgZoom.hide();
97 jpm 134
		}
54 david 135
 
97 jpm 136
 
137
	}
138
 
54 david 139
 
140
	/**
141
	 * Ajoute les listeners pour la gestions d'évènement
142
	 */
143
	public void ajouterListeners() {
144
 
145
	}
146
 
84 jpm 147
	public void raz() {
148
		image.setUrl("");
149
	}
150
 
130 aurelien 151
	public void verifierEtRetaillerImage() {
152
		// si l'image est nulle
153
		if (image == null) {
154
			// on ne fait rien
155
			return;
156
		}
140 aurelien 157
 
54 david 158
 
130 aurelien 159
		// on prend la taille originale de l'image
160
		int originalX = image.getWidth();
161
		int originalY = image.getHeight();
162
 
163
		// on la transforme en float (la division entre entier donne de curieux
164
		// résultats)
165
		float fOriginalX = (new Float(originalX)).floatValue();
166
		float fOriginalY = (new Float(originalY)).floatValue();
167
 
168
		// et on fait le rapport longueur sur hauteur (pour connaitre le ratio)
169
		float rapportTaille = fOriginalX / fOriginalY;
170
 
171
		// la nouvelle taille est pour le moment égale à l'ancienne
172
		int nouvelleTailleX = originalX;
173
		int nouvelleTailleY = originalY;
174
 
175
		// on prend la taille du conteneur
176
		int tailleConteneurX = getWidth();
177
		int tailleConteneurY = getHeight();
178
 
179
		int maxConteneur = Math.min(tailleConteneurX, tailleConteneurY);
180
		int max = Math.min(maxConteneur, 300);
181
 
182
		// si l'image ne rentre pas telle quelle (longueur ou hauteur trop
183
		// grande)
184
		// si la longueur de l'image est la plus grande des deux
185
 
186
			int maxImage = Math.max(originalX, originalY);
187
 
188
			if(maxImage == originalX) {
189
				// on prend la longueur comme taille de référence, qu'on met à
190
				// la longueur du conteneur
191
				nouvelleTailleX = max;
192
				// et on recalcule la hauteur, par rapport à la nouvelle
193
				// longueur, en gardant le format de 'limage
194
				nouvelleTailleY = (int) Math.floor(nouvelleTailleX * 1
195
						/ rapportTaille);
196
			}
197
			else
198
			{
199
				// si la hauteur est la plus grande, on fait le même genre
200
				// d'opération en prenant la hauteur comme référence
201
				nouvelleTailleY = max;
202
				nouvelleTailleX = (int) Math.floor(nouvelleTailleY
203
						* rapportTaille);
204
			}
205
 
206
		// on modifie enfin la taille de l'image pour qu'elle soit affichée
207
			image.setPixelSize(nouvelleTailleX ,
208
					nouvelleTailleY);
209
 
210
		doLayout();
211
	}
54 david 212
}