Subversion Repositories eFlore/Applications.cel

Rev

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

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