Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 47 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4 aperonnet 1
package org.tela_botanica.client.vues;
2
 
3
 
4
import org.tela_botanica.client.image.ImageMediateur;
5
import org.tela_botanica.client.interfaces.Rafraichissable;
6
 
5 aperonnet 7
import com.google.gwt.user.client.DOM;
8
import com.google.gwt.user.client.Event;
9
import com.google.gwt.user.client.ui.ClickListener;
4 aperonnet 10
import com.google.gwt.user.client.ui.Image;
5 aperonnet 11
import com.google.gwt.user.client.ui.Widget;
4 aperonnet 12
import com.gwtext.client.core.RegionPosition;
36 aperonnet 13
import com.gwtext.client.widgets.Component;
14
import com.gwtext.client.widgets.Container;
4 aperonnet 15
import com.gwtext.client.widgets.Panel;
36 aperonnet 16
import com.gwtext.client.widgets.event.PanelListenerAdapter;
4 aperonnet 17
import com.gwtext.client.widgets.layout.BorderLayout;
18
import com.gwtext.client.widgets.layout.BorderLayoutData;
19
 
36 aperonnet 20
/**
21
 * Panneau d'affichage d'une image avec des boutons précdents et suivant
22
 * @author aurelien
23
 *
24
 */
4 aperonnet 25
public class ZoomImageVue extends Panel implements Rafraichissable {
26
 
36 aperonnet 27
	/**
28
	 * Le médiateur associé à la vue
29
	 */
4 aperonnet 30
	private ImageMediateur iMediateur = null ;
36 aperonnet 31
 
32
	/**
33
	 * Panneau conteneur pour l'image
34
	 */
35
	private Panel imageConteneur = null ;
36
	/**
37
	 * l'image à afficher
38
	 */
39
	private Image image = new Image("vide.jpg") ;
40
	/**
41
	 * Bouton précédent
42
	 */
4 aperonnet 43
	private final com.google.gwt.user.client.ui.Button prev = new com.google.gwt.user.client.ui.Button("<");
36 aperonnet 44
	/**
45
	 * Bouton suivant
46
	 */
4 aperonnet 47
	private final com.google.gwt.user.client.ui.Button suiv = new com.google.gwt.user.client.ui.Button(">");
48
 
36 aperonnet 49
	/**
50
	 * Taille originale Y de l'image
51
	 */
52
	private int imageHeight = 0 ;
53
 
54
	/**
55
	 * Taille originale X de l'image
56
	 */
57
	private int imageWidth = 0 ;
58
 
59
	/**
60
	 * Booleen d'initalisation général
61
	 */
62
	private boolean initialise = false ;
63
 
64
	/**
65
	 * Booleen d'initalisation du conteneur d'image
66
	 */
67
	private boolean conteneurInitialise = false ;
68
 
69
	/**
70
	 * Constructeur sans argument (privé car ne doit être utilisé)
71
	 */
72
	private ZoomImageVue()
73
	{
74
		super() ;
75
	}
76
 
77
	/**
78
	 * Constructeur avec argument
79
	 * @param im le médiateur à associer à la vue
80
	 */
4 aperonnet 81
	public ZoomImageVue(ImageMediateur im)
82
	{
83
		super("Zoom");
36 aperonnet 84
		// on associe le médiateur
85
		iMediateur = im ;
4 aperonnet 86
 
36 aperonnet 87
		// on crée un image qui gère le double clic
5 aperonnet 88
		image = new Image() {
47 aperonnet 89
 
5 aperonnet 90
			public void onBrowserEvent(Event event) {
36 aperonnet 91
				// lors du double clic
5 aperonnet 92
				if (Event.ONDBLCLICK == DOM.eventGetType(event)) {
93
 
36 aperonnet 94
					// on notifie le médiateur
12 aperonnet 95
					getIMediateur().doubleClicZoomImage();
36 aperonnet 96
				}
5 aperonnet 97
			}
98
		};
36 aperonnet 99
 
100
 
101
		imageConteneur = new Panel() ;
102
		imageConteneur.add(image) ;
103
 
104
		imageConteneur.setId("x-view-zoom-img") ;
105
 
106
		// il n'existe pas de méthode pour ajouter un listener pour le double clic sur une image
107
		// alors on lui dit manuellement de capter l'évènement double clic
5 aperonnet 108
		image.sinkEvents(Event.ONDBLCLICK);
4 aperonnet 109
 
36 aperonnet 110
		// l'image de base est vide
22 aperonnet 111
		image.setUrl("vide.jpg");
5 aperonnet 112
 
4 aperonnet 113
		this.setLayout(new BorderLayout());
114
 
28 aperonnet 115
		prev.setWidth("60px");
116
		suiv.setWidth("60px");
4 aperonnet 117
 
118
		this.add(prev,new BorderLayoutData(RegionPosition.WEST));
36 aperonnet 119
		this.add(imageConteneur,new BorderLayoutData(RegionPosition.CENTER));
4 aperonnet 120
		this.add(suiv,new BorderLayoutData(RegionPosition.EAST));
5 aperonnet 121
 
47 aperonnet 122
		imageConteneur.setMaskDisabled(true) ;
123
 
36 aperonnet 124
		// on ajoute les listeners
125
		ajouterListeners();
4 aperonnet 126
	}
127
 
36 aperonnet 128
	/**
129
	 * Méthode héritée de l'interface rafraichissable
130
	 * @param nouvelleDonnees les nouvelles données
131
	 * @param repandreRafraichissement le booleen qui dit si on doit répnadre l'évènement
132
	 */
16 aperonnet 133
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) {
4 aperonnet 134
 
36 aperonnet 135
		// si on reçoit une string
136
		if(nouvelleDonnees instanceof String[])
5 aperonnet 137
		{
36 aperonnet 138
			String[] infos = (String[])nouvelleDonnees ;
139
			// c'est l'url de l'image qu'on associe à la vue
140
			getImage().setUrl(infos[0]);
141
 
142
 
143
			if(infos[1] != null && infos[2] != null)
144
			{
145
				int x = Integer.parseInt(infos[1]) ;
146
				int y = Integer.parseInt(infos[2]) ;
147
 
148
				setTailleImage(x,y) ;
149
 
150
				verifierEtRetaillerImage() ;
151
			}
5 aperonnet 152
		}
22 aperonnet 153
		else
154
		{
36 aperonnet 155
			// sinon on met une image vide
156
			getImage().setUrl("vide.jpeg") ;
22 aperonnet 157
		}
4 aperonnet 158
	}
5 aperonnet 159
 
36 aperonnet 160
	/**
161
	 * Desactive visuellement le panneau et les boutons
162
	 */
22 aperonnet 163
	public void desactiverPanneau()
164
	{
36 aperonnet 165
		getImage().setUrl("vide.jpeg") ;
22 aperonnet 166
		prev.setEnabled(false) ;
167
		suiv.setEnabled(false);
168
	}
169
 
36 aperonnet 170
	/**
171
	 * Active visuellement le panneau et les boutons
172
	 */
22 aperonnet 173
	public void activerPanneau()
174
	{
175
		prev.setEnabled(true);
176
		suiv.setEnabled(true);
177
	}
178
 
36 aperonnet 179
	/**
180
	 * Ajoute les listeners pour la gestions d'évènement
181
	 */
182
	public void ajouterListeners()
5 aperonnet 183
	{
36 aperonnet 184
		// gestion du clic sur le bouton précedent
5 aperonnet 185
		prev.addClickListener(new ClickListener() {
4 aperonnet 186
 
36 aperonnet 187
			// en cas de clic
5 aperonnet 188
			public void onClick(Widget sender) {
36 aperonnet 189
				// on notifie le médiateur
12 aperonnet 190
				getIMediateur().clicBoutonZoomImage("prev");
5 aperonnet 191
			}
192
 
193
		});
194
 
36 aperonnet 195
		// gestion du clic sur le bouton suivant
5 aperonnet 196
		suiv.addClickListener(new ClickListener() {
197
 
36 aperonnet 198
			// en cas de clic
5 aperonnet 199
			public void onClick(Widget sender) {
36 aperonnet 200
				// on notifie le médiateur
12 aperonnet 201
				getIMediateur().clicBoutonZoomImage("suiv");
5 aperonnet 202
			}
203
 
204
		});
36 aperonnet 205
 
206
		// gestion du redimensionnement
207
		this.addListener(new PanelListenerAdapter() {
208
 
209
			// lors d'un redimensionnement de l'application
47 aperonnet 210
 
36 aperonnet 211
			public void onBodyResize(Panel panel,java.lang.String width,java.lang.String height)
212
			{
213
				// on vérifie et on retaille l'image
214
				verifierEtRetaillerImage() ;
215
			}
216
		}) ;
217
 
218
		// gestion du redimensionnement lors de l'affichage du conteneur
219
		imageConteneur.addListener(new PanelListenerAdapter() {
220
 
221
			// avant de finir d'afficher
47 aperonnet 222
 
36 aperonnet 223
			public void onAfterLayout(Container self)
224
			{
225
				// on redimensionne
226
				verifierEtRetaillerImage() ;
227
			}
228
		}) ;
5 aperonnet 229
	}
36 aperonnet 230
 
231
	/**
232
	 * Verifie si l'image est plus grande que le conteneur et la retaille le cas echeant
233
	 */
234
	public void verifierEtRetaillerImage()
235
	{
236
		// si l'image est nulle
237
		if(image == null)
238
		{
239
			// on ne fait rien
240
			return ;
241
		}
242
 
243
		// on prend la taille originale de l'image
244
		int originalX = getTailleImage()[0] ;
245
		int originalY = getTailleImage()[1]	;
246
 
247
		// on la transforme en float (la division entre entier donne de curieux résultats)
248
		float fOriginalX = (new Float(originalX)).floatValue() ;
249
		float fOriginalY = (new Float(originalY)).floatValue() ;
250
 
251
		// et on fait le rapport longueur sur hauteur (pour connaitre le ratio)
252
		float rapportTaille = fOriginalX/fOriginalY ;
253
 
254
		// la nouvelle taille est pour le moment égale à l'ancienne
255
		int nouvelleTailleX = originalX ;
256
		int nouvelleTailleY = originalY ;
257
 
258
		// on prend la taille du conteneur
259
		int tailleConteneurX = imageConteneur.getWidth() ;
260
		int tailleConteneurY = imageConteneur.getHeight() ;
261
 
262
		// si celle-ci est égale à 0 (conteneur mal initialisé)
38 aperonnet 263
		/*if(imageConteneur.getHeight() == 0 && tailleConteneurX == 0)
36 aperonnet 264
		{
265
			// on essaie de la calculer en fonction de la taille du parent et des frères
266
			tailleConteneurY = this.getHeight() ;
267
			tailleConteneurX = this.getWidth() - prev.getOffsetWidth() * 2 ;
268
 
38 aperonnet 269
		}*/
36 aperonnet 270
 
271
		// si l'image ne rentre pas telle quelle (longueur ou hauteur trop grande)
272
		if(originalY > tailleConteneurY || originalX > tailleConteneurX)
273
		{
274
			// si la longueur de l'image est la plus grande des deux
275
			if(originalX > originalY)
276
			{
277
				// on prend la longueur comme taille de référence, qu'on met à la longueur du conteneur
278
				nouvelleTailleX = tailleConteneurX ;
279
				// et on recalcule la hauteur, par rapport à la nouvelle longueur, en gardant le format de 'limage
280
				nouvelleTailleY = (int)Math.floor(nouvelleTailleX*1/rapportTaille) ;
281
			}
282
			else
283
			{
284
				// si la hauteur est la plus grande, on fait le même genre d'opération en prenant la hauteur comme référence
285
				nouvelleTailleY = tailleConteneurY ;
286
				nouvelleTailleX = (int)Math.floor(nouvelleTailleY*rapportTaille) ;
287
			}
288
		}
289
 
290
		// on modifie enfin la taille de l'image pour qu'elle soit affichée
291
		getImage().setSize(""+nouvelleTailleX+"px", ""+nouvelleTailleY+"px") ;
292
	}
5 aperonnet 293
 
36 aperonnet 294
	/**
295
	 * Accesseur pour le médiateur
296
	 * @return le médiateur associé à la vue
297
	 */
5 aperonnet 298
	public ImageMediateur getIMediateur() {
299
		return iMediateur;
300
	}
301
 
36 aperonnet 302
	/**
303
	 * Accesseur au conteneur de l'image
304
	 * @return le conteneur de l'image
305
	 */
5 aperonnet 306
	public Image getImage() {
307
		return image;
308
	}
309
 
36 aperonnet 310
	/**
311
	 * Accesseur pour le bouton précédent
312
	 * @return le bouton précédent
313
	 */
5 aperonnet 314
	public com.google.gwt.user.client.ui.Button getPrev() {
315
		return prev;
316
	}
317
 
36 aperonnet 318
	/**
319
	 * Accesseur pour le bouton suivant
320
	 * @return le bouton suivant
321
	 */
5 aperonnet 322
	public com.google.gwt.user.client.ui.Button getSuiv() {
323
		return suiv;
324
	}
36 aperonnet 325
 
326
	/**
327
	 * Setter pour la taille de l'image
328
	 * @param X la largeur en pixels
329
	 * @param Y la hauteur en pixels
330
	 */
331
	public void setTailleImage(int x, int y)
332
	{
333
		imageHeight = y ;
334
		imageWidth = x ;
335
	}
336
 
337
	/**
338
	 * renvoie la taille originale de l'image
339
	 * @return un tableau de deux entiers contenant la largeur puis la hauteur
340
	 */
341
	public int[] getTailleImage()
342
	{
343
		int[] taille = {imageHeight,imageWidth} ;
344
 
345
		return taille ;
346
	}
5 aperonnet 347
 
47 aperonnet 348
	public Panel getImageConteneur() {
349
 
350
		return imageConteneur ;
351
 
352
	}
353
 
4 aperonnet 354
}