Subversion Repositories eFlore/Archives.cel-v2

Rev

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