Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 28 | Rev 38 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 28 Rev 36
1
package org.tela_botanica.client.vues;
1
package org.tela_botanica.client.vues;
2
 
2
 
3
 
3
 
4
import org.tela_botanica.client.image.ImageMediateur;
4
import org.tela_botanica.client.image.ImageMediateur;
5
import org.tela_botanica.client.interfaces.Rafraichissable;
5
import org.tela_botanica.client.interfaces.Rafraichissable;
6
 
6
 
-
 
7
 
7
 
8
import com.google.gwt.core.client.JavaScriptObject;
8
import com.google.gwt.user.client.DOM;
9
import com.google.gwt.user.client.DOM;
9
import com.google.gwt.user.client.Event;
10
import com.google.gwt.user.client.Event;
10
import com.google.gwt.user.client.Window;
11
import com.google.gwt.user.client.Window;
11
import com.google.gwt.user.client.ui.ClickListener;
12
import com.google.gwt.user.client.ui.ClickListener;
12
import com.google.gwt.user.client.ui.Image;
13
import com.google.gwt.user.client.ui.Image;
-
 
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;
13
import com.google.gwt.user.client.ui.Widget;
17
import com.google.gwt.user.client.ui.Widget;
14
import com.gwtext.client.core.RegionPosition;
18
import com.gwtext.client.core.RegionPosition;
-
 
19
import com.gwtext.client.widgets.BoxComponent;
15
import com.gwtext.client.widgets.Button;
20
import com.gwtext.client.widgets.Button;
-
 
21
import com.gwtext.client.widgets.Component;
-
 
22
import com.gwtext.client.widgets.Container;
16
import com.gwtext.client.widgets.Panel;
23
import com.gwtext.client.widgets.Panel;
-
 
24
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
-
 
25
import com.gwtext.client.widgets.event.PanelListener;
-
 
26
import com.gwtext.client.widgets.event.PanelListenerAdapter;
17
import com.gwtext.client.widgets.layout.BorderLayout;
27
import com.gwtext.client.widgets.layout.BorderLayout;
18
import com.gwtext.client.widgets.layout.BorderLayoutData;
28
import com.gwtext.client.widgets.layout.BorderLayoutData;
-
 
29
import com.gwtext.client.widgets.layout.FitLayout;
-
 
30
import com.gwtext.client.widgets.layout.VerticalLayout;
-
 
31
 
-
 
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
 *
19
 
37
 */
-
 
38
public class ZoomImageVue extends Panel implements Rafraichissable {
-
 
39
	
-
 
40
	/**
20
public class ZoomImageVue extends Panel implements Rafraichissable {
41
	 * Le médiateur associé à la vue
-
 
42
	 */
-
 
43
	private ImageMediateur iMediateur = null ;
-
 
44
	
-
 
45
	/**
21
	
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
	/**
22
	private ImageMediateur iMediateur = null ;
54
	 * Bouton précédent
-
 
55
	 */
-
 
56
	private final com.google.gwt.user.client.ui.Button prev = new com.google.gwt.user.client.ui.Button("<");
-
 
57
	/**
23
	private Image image = null ;
58
	 * Bouton suivant
-
 
59
	 */
-
 
60
	private final com.google.gwt.user.client.ui.Button suiv = new com.google.gwt.user.client.ui.Button(">");
-
 
61
	
-
 
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
	/**
24
	private final com.google.gwt.user.client.ui.Button prev = new com.google.gwt.user.client.ui.Button("<");
91
	 * Constructeur avec argument
25
	private final com.google.gwt.user.client.ui.Button suiv = new com.google.gwt.user.client.ui.Button(">");
92
	 * @param im le médiateur à associer à la vue 
26
	
93
	 */
27
	public ZoomImageVue(ImageMediateur im)
94
	public ZoomImageVue(ImageMediateur im)
28
	{
95
	{
29
		super("Zoom");
96
		super("Zoom");
30
		
-
 
-
 
97
		// on associe le médiateur
31
		iMediateur = im ;
98
		iMediateur = im ;
-
 
99
		
-
 
100
		// on crée un image qui gère le double clic
32
		image = new Image() {
101
		image = new Image() {
33
			public void onBrowserEvent(Event event) {
102
			public void onBrowserEvent(Event event) {
-
 
103
				// lors du double clic
34
				if (Event.ONDBLCLICK == DOM.eventGetType(event)) {
104
				if (Event.ONDBLCLICK == DOM.eventGetType(event)) {
-
 
105
 
35
 
106
					// on notifie le médiateur
36
					getIMediateur().doubleClicZoomImage();
107
					getIMediateur().doubleClicZoomImage();
37
				}
108
				}				
38
			}
109
			}
-
 
110
		};
39
		};
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
40
 
119
		// alors on lui dit manuellement de capter l'évènement double clic
-
 
120
		image.sinkEvents(Event.ONDBLCLICK);
41
		image.sinkEvents(Event.ONDBLCLICK);
121
		
42
		
122
		// l'image de base est vide
43
		image.setUrl("vide.jpg");
123
		image.setUrl("vide.jpg");
44
		
124
		
45
		this.setLayout(new BorderLayout());
125
		this.setLayout(new BorderLayout());
46
		
126
		
47
		prev.setWidth("60px");
127
		prev.setWidth("60px");
48
		suiv.setWidth("60px");
128
		suiv.setWidth("60px");
49
		
129
		
50
		this.add(prev,new BorderLayoutData(RegionPosition.WEST));
130
		this.add(prev,new BorderLayoutData(RegionPosition.WEST));
51
		this.add(image,new BorderLayoutData(RegionPosition.CENTER));
131
		this.add(imageConteneur,new BorderLayoutData(RegionPosition.CENTER));
52
		this.add(suiv,new BorderLayoutData(RegionPosition.EAST));
132
		this.add(suiv,new BorderLayoutData(RegionPosition.EAST));
-
 
133
		
53
		
134
		// on ajoute les listeners
54
		ajouterListenersBoutons();
135
		ajouterListeners();
-
 
136
	}
-
 
137
 
-
 
138
	/**
-
 
139
	 * Méthode héritée de l'interface rafraichissable
55
	}
140
	 * @param nouvelleDonnees les nouvelles données
56
 
141
	 * @param repandreRafraichissement le booleen qui dit si on doit répnadre l'évènement
-
 
142
	 */
57
	
143
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) {
58
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) {
144
		
59
		
145
		// si on reçoit une string
-
 
146
		if(nouvelleDonnees instanceof String[])
-
 
147
		{
-
 
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) ;
60
		if(nouvelleDonnees instanceof String)
159
				
61
		{
160
				verifierEtRetaillerImage() ;
62
			getImage().setUrl((String)nouvelleDonnees);
161
			}
63
		}
162
		}
64
		else
163
		else
65
		{
164
		{
-
 
165
			// sinon on met une image vide
66
			getImage().setUrl("/images/vide.jpeg") ;
166
			getImage().setUrl("vide.jpeg") ;
67
		}
167
		}
68
	}
168
	}
-
 
169
	
-
 
170
	/**
-
 
171
	 * Desactive visuellement le panneau et les boutons
69
	
172
	 */
70
	public void desactiverPanneau()
173
	public void desactiverPanneau()
71
	{
174
	{
72
		getImage().setUrl("/images/vide.jpeg") ;
175
		getImage().setUrl("vide.jpeg") ;
73
		prev.setEnabled(false) ;
176
		prev.setEnabled(false) ;
74
		suiv.setEnabled(false);
177
		suiv.setEnabled(false);
75
	}
178
	}
-
 
179
	
-
 
180
	/**
-
 
181
	 * Active visuellement le panneau et les boutons
76
	
182
	 */
77
	public void activerPanneau()
183
	public void activerPanneau()
78
	{
184
	{
79
		prev.setEnabled(true);
185
		prev.setEnabled(true);
80
		suiv.setEnabled(true);
186
		suiv.setEnabled(true);
81
	}
187
	}
-
 
188
	
-
 
189
	/**
82
	
190
	 * Ajoute les listeners pour la gestions d'évènement
83
	
191
	 */
84
	public void ajouterListenersBoutons()
192
	public void ajouterListeners()
-
 
193
	{
85
	{
194
		// gestion du clic sur le bouton précedent
-
 
195
		prev.addClickListener(new ClickListener() {
86
		prev.addClickListener(new ClickListener() {
196
 
87
 
-
 
-
 
197
			// en cas de clic
88
			public void onClick(Widget sender) {
198
			public void onClick(Widget sender) {
89
				
199
				// on notifie le médiateur
90
				getIMediateur().clicBoutonZoomImage("prev");
200
				getIMediateur().clicBoutonZoomImage("prev");
91
			}
201
			}
92
			
202
			
93
		});
203
		});
-
 
204
		
94
		
205
		// gestion du clic sur le bouton suivant
-
 
206
		suiv.addClickListener(new ClickListener() {
95
		suiv.addClickListener(new ClickListener() {
207
 
96
 
-
 
97
			public void onClick(Widget sender) {
-
 
-
 
208
			// en cas de clic
98
				
209
			public void onClick(Widget sender) {
99
				
210
				// on notifie le médiateur	
100
				getIMediateur().clicBoutonZoomImage("suiv");
211
				getIMediateur().clicBoutonZoomImage("suiv");
101
			}
212
			}
102
			
213
			
103
		});
214
		});
-
 
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
		}) ;	
-
 
237
	}
-
 
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") ;		
104
	}
302
	}
-
 
303
 
-
 
304
	/**
-
 
305
	 * Accesseur pour le médiateur
105
 
306
	 * @return le médiateur associé à la vue
106
 
307
	 */
107
	public ImageMediateur getIMediateur() {
308
	public ImageMediateur getIMediateur() {
108
		return iMediateur;
309
		return iMediateur;
109
	}
310
	}
-
 
311
 
-
 
312
	/**
-
 
313
	 * Accesseur au conteneur de l'image
110
 
314
	 * @return le conteneur de l'image
111
 
315
	 */
112
	public Image getImage() {
316
	public Image getImage() {
113
		return image;
317
		return image;
114
	}
318
	}
-
 
319
 
-
 
320
	/**
-
 
321
	 * Accesseur pour le bouton précédent
115
 
322
	 * @return le bouton précédent
116
 
323
	 */
117
	public com.google.gwt.user.client.ui.Button getPrev() {
324
	public com.google.gwt.user.client.ui.Button getPrev() {
118
		return prev;
325
		return prev;
119
	}
326
	}
-
 
327
 
-
 
328
	/**
-
 
329
	 * Accesseur pour le bouton suivant
120
 
330
	 * @return le bouton suivant
121
 
331
	 */
122
	public com.google.gwt.user.client.ui.Button getSuiv() {
332
	public com.google.gwt.user.client.ui.Button getSuiv() {
123
		return suiv;
333
		return suiv;
124
	}
334
	}
-
 
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
	}
125
 
357
 
126
}
358
}