Subversion Repositories eFlore/Archives.cel-v2

Rev

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

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