Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 47 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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