Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 28 | Rev 38 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 28 Rev 36
Line 3... Line 3...
3
 
3
 
4
import org.tela_botanica.client.image.ImageMediateur;
4
import org.tela_botanica.client.image.ImageMediateur;
Line -... Line 5...
-
 
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;
-
 
11
import com.google.gwt.user.client.Window;
-
 
12
import com.google.gwt.user.client.ui.ClickListener;
-
 
13
import com.google.gwt.user.client.ui.Image;
10
import com.google.gwt.user.client.Window;
14
import com.google.gwt.user.client.ui.LoadListener;
11
import com.google.gwt.user.client.ui.ClickListener;
15
import com.google.gwt.user.client.ui.MouseWheelListener;
-
 
16
import com.google.gwt.user.client.ui.MouseWheelVelocity;
12
import com.google.gwt.user.client.ui.Image;
17
import com.google.gwt.user.client.ui.Widget;
-
 
18
import com.gwtext.client.core.RegionPosition;
-
 
19
import com.gwtext.client.widgets.BoxComponent;
13
import com.google.gwt.user.client.ui.Widget;
20
import com.gwtext.client.widgets.Button;
-
 
21
import com.gwtext.client.widgets.Component;
-
 
22
import com.gwtext.client.widgets.Container;
-
 
23
import com.gwtext.client.widgets.Panel;
14
import com.gwtext.client.core.RegionPosition;
24
import com.gwtext.client.widgets.event.ContainerListenerAdapter;
15
import com.gwtext.client.widgets.Button;
25
import com.gwtext.client.widgets.event.PanelListener;
-
 
26
import com.gwtext.client.widgets.event.PanelListenerAdapter;
-
 
27
import com.gwtext.client.widgets.layout.BorderLayout;
Line -... Line 28...
-
 
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
16
import com.gwtext.client.widgets.Panel;
34
 * TODO: assurer le redimensionnement automatique de l'image et la centrer
Line -... Line 35...
-
 
35
 * @author aurelien
-
 
36
 *
-
 
37
 */
17
import com.gwtext.client.widgets.layout.BorderLayout;
38
public class ZoomImageVue extends Panel implements Rafraichissable {
-
 
39
	
-
 
40
	/**
-
 
41
	 * Le médiateur associé à la vue
-
 
42
	 */
18
import com.gwtext.client.widgets.layout.BorderLayoutData;
43
	private ImageMediateur iMediateur = null ;
-
 
44
	
-
 
45
	/**
-
 
46
	 * Panneau conteneur pour l'image
-
 
47
	 */
-
 
48
	private Panel imageConteneur = null ;
-
 
49
	/**
-
 
50
	 * l'image à afficher
19
 
51
	 */
-
 
52
	private Image image = new Image("vide.jpg") ;
-
 
53
	/**
-
 
54
	 * Bouton précédent
20
public class ZoomImageVue extends Panel implements Rafraichissable {
55
	 */
Line -... Line 56...
-
 
56
	private final com.google.gwt.user.client.ui.Button prev = new com.google.gwt.user.client.ui.Button("<");
-
 
57
	/**
-
 
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() ;
21
	
88
	}
22
	private ImageMediateur iMediateur = null ;
89
	
23
	private Image image = null ;
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 
-
 
93
	 */
-
 
94
	public ZoomImageVue(ImageMediateur im)
26
	
95
	{
27
	public ZoomImageVue(ImageMediateur im)
96
		super("Zoom");
-
 
97
		// on associe le médiateur
28
	{
98
		iMediateur = im ;
Line -... Line 99...
-
 
99
		
29
		super("Zoom");
100
		// on crée un image qui gère le double clic
30
		
101
		image = new Image() {
31
		iMediateur = im ;
102
			public void onBrowserEvent(Event event) {
32
		image = new Image() {
103
				// lors du double clic
Line -... Line 104...
-
 
104
				if (Event.ONDBLCLICK == DOM.eventGetType(event)) {
-
 
105
 
-
 
106
					// on notifie le médiateur
-
 
107
					getIMediateur().doubleClicZoomImage();
-
 
108
				}				
-
 
109
			}
-
 
110
		};
-
 
111
		
33
			public void onBrowserEvent(Event event) {
112
		
Line -... Line 113...
-
 
113
		imageConteneur = new Panel() ;
34
				if (Event.ONDBLCLICK == DOM.eventGetType(event)) {
114
		imageConteneur.add(image) ;
Line 35... Line 115...
35
 
115
		
Line 36... Line 116...
36
					getIMediateur().doubleClicZoomImage();
116
		imageConteneur.setId("x-view-zoom-img") ;
37
				}
117
		
Line 38... Line 118...
38
			}
118
		// il n'existe pas de méthode pour ajouter un listener pour le double clic sur une image
39
		};
119
		// alors on lui dit manuellement de capter l'évènement double clic
40
 
120
		image.sinkEvents(Event.ONDBLCLICK);
Line -... Line 121...
-
 
121
		
41
		image.sinkEvents(Event.ONDBLCLICK);
122
		// l'image de base est vide
42
		
123
		image.setUrl("vide.jpg");
Line -... Line 124...
-
 
124
		
-
 
125
		this.setLayout(new BorderLayout());
-
 
126
		
-
 
127
		prev.setWidth("60px");
43
		image.setUrl("vide.jpg");
128
		suiv.setWidth("60px");
44
		
129
		
Line -... Line 130...
-
 
130
		this.add(prev,new BorderLayoutData(RegionPosition.WEST));
45
		this.setLayout(new BorderLayout());
131
		this.add(imageConteneur,new BorderLayoutData(RegionPosition.CENTER));
46
		
132
		this.add(suiv,new BorderLayoutData(RegionPosition.EAST));
47
		prev.setWidth("60px");
133
		
-
 
134
		// on ajoute les listeners
-
 
135
		ajouterListeners();
-
 
136
	}
-
 
137
 
-
 
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
	 */
-
 
143
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) {
-
 
144
		
-
 
145
		// si on reçoit une string
-
 
146
		if(nouvelleDonnees instanceof String[])
48
		suiv.setWidth("60px");
147
		{
49
		
148
			String[] infos = (String[])nouvelleDonnees ;
50
		this.add(prev,new BorderLayoutData(RegionPosition.WEST));
149
			// c'est l'url de l'image qu'on associe à la vue
-
 
150
			getImage().setUrl(infos[0]);
51
		this.add(image,new BorderLayoutData(RegionPosition.CENTER));
151
			
52
		this.add(suiv,new BorderLayoutData(RegionPosition.EAST));
152
			
53
		
153
			if(infos[1] != null && infos[2] != null)
Line -... Line 154...
-
 
154
			{
-
 
155
				int x = Integer.parseInt(infos[1]) ;
-
 
156
				int y = Integer.parseInt(infos[2]) ;
54
		ajouterListenersBoutons();
157
				
55
	}
158
				setTailleImage(x,y) ;
56
 
159
				
57
	
160
				verifierEtRetaillerImage() ;
58
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) {
161
			}
59
		
162
		}
Line -... Line 163...
-
 
163
		else
-
 
164
		{
-
 
165
			// sinon on met une image vide
60
		if(nouvelleDonnees instanceof String)
166
			getImage().setUrl("vide.jpeg") ;
61
		{
167
		}
62
			getImage().setUrl((String)nouvelleDonnees);
168
	}
63
		}
169
	
64
		else
170
	/**
Line -... Line 171...
-
 
171
	 * Desactive visuellement le panneau et les boutons
-
 
172
	 */
65
		{
173
	public void desactiverPanneau()
66
			getImage().setUrl("/images/vide.jpeg") ;
174
	{
67
		}
175
		getImage().setUrl("vide.jpeg") ;
-
 
176
		prev.setEnabled(false) ;
68
	}
177
		suiv.setEnabled(false);
Line -... Line 178...
-
 
178
	}
69
	
179
	
70
	public void desactiverPanneau()
-
 
-
 
180
	/**
71
	{
181
	 * Active visuellement le panneau et les boutons
72
		getImage().setUrl("/images/vide.jpeg") ;
182
	 */
Line 73... Line 183...
73
		prev.setEnabled(false) ;
183
	public void activerPanneau()
Line -... Line 184...
-
 
184
	{
74
		suiv.setEnabled(false);
185
		prev.setEnabled(true);
Line -... Line 186...
-
 
186
		suiv.setEnabled(true);
75
	}
187
	}
-
 
188
	
-
 
189
	/**
-
 
190
	 * Ajoute les listeners pour la gestions d'évènement
-
 
191
	 */
-
 
192
	public void ajouterListeners()
Line -... Line 193...
-
 
193
	{
-
 
194
		// gestion du clic sur le bouton précedent
Line -... Line 195...
-
 
195
		prev.addClickListener(new ClickListener() {
-
 
196
 
-
 
197
			// en cas de clic
-
 
198
			public void onClick(Widget sender) {
76
	
199
				// on notifie le médiateur
77
	public void activerPanneau()
200
				getIMediateur().clicBoutonZoomImage("prev");
-
 
201
			}
Line -... Line 202...
-
 
202
			
-
 
203
		});
-
 
204
		
-
 
205
		// gestion du clic sur le bouton suivant
-
 
206
		suiv.addClickListener(new ClickListener() {
-
 
207
 
-
 
208
			// en cas de clic
-
 
209
			public void onClick(Widget sender) {
-
 
210
				// on notifie le médiateur	
78
	{
211
				getIMediateur().clicBoutonZoomImage("suiv");
79
		prev.setEnabled(true);
212
			}
Line -... Line 213...
-
 
213
			
-
 
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 ;
Line -... Line 277...
-
 
277
			nouvelleTailleY = originalY ;
-
 
278
			
-
 
279
		}
-
 
280
		 
80
		suiv.setEnabled(true);
281
		// si l'image ne rentre pas telle quelle (longueur ou hauteur trop grande)
81
	}
282
		if(originalY > tailleConteneurY || originalX > tailleConteneurX)
82
	
283
		{
Line -... Line 284...
-
 
284
			// si la longueur de l'image est la plus grande des deux
-
 
285
			if(originalX > originalY)
-
 
286
			{		
83
	
287
				// on prend la longueur comme taille de référence, qu'on met à la longueur du conteneur
84
	public void ajouterListenersBoutons()
288
				nouvelleTailleX = tailleConteneurX ;
85
	{
289
				// et on recalcule la hauteur, par rapport à la nouvelle longueur, en gardant le format de 'limage
86
		prev.addClickListener(new ClickListener() {
290
				nouvelleTailleY = (int)Math.floor(nouvelleTailleX*1/rapportTaille) ;
Line -... Line 291...
-
 
291
			}
-
 
292
			else
-
 
293
			{				
87
 
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
88
			public void onClick(Widget sender) {
295
				nouvelleTailleY = tailleConteneurY ;
89
				
296
				nouvelleTailleX = (int)Math.floor(nouvelleTailleY*rapportTaille) ;
90
				getIMediateur().clicBoutonZoomImage("prev");
297
			}		
Line -... Line 298...
-
 
298
		}
-
 
299
		
-
 
300
		// on modifie enfin la taille de l'image pour qu'elle soit affichée
91
			}
301
		getImage().setSize(""+nouvelleTailleX+"px", ""+nouvelleTailleY+"px") ;		
92
			
302
	}
93
		});
303
 
94
		
304
	/**
Line -... Line 305...
-
 
305
	 * Accesseur pour le médiateur
-
 
306
	 * @return le médiateur associé à la vue
-
 
307
	 */
-
 
308
	public ImageMediateur getIMediateur() {
-
 
309
		return iMediateur;
-
 
310
	}
-
 
311
 
-
 
312
	/**
-
 
313
	 * Accesseur au conteneur de l'image
-
 
314
	 * @return le conteneur de l'image
-
 
315
	 */
-
 
316
	public Image getImage() {
-
 
317
		return image;
-
 
318
	}
-
 
319
 
-
 
320
	/**
-
 
321
	 * Accesseur pour le bouton précédent
-
 
322
	 * @return le bouton précédent
-
 
323
	 */
-
 
324
	public com.google.gwt.user.client.ui.Button getPrev() {
-
 
325
		return prev;
-
 
326
	}
95
		suiv.addClickListener(new ClickListener() {
327