Subversion Repositories eFlore/Archives.cel-v2

Rev

Rev 28 | Rev 38 | Go to most recent revision | Show entire file | Ignore 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
-
 
104
				if (Event.ONDBLCLICK == DOM.eventGetType(event)) {
33
			public void onBrowserEvent(Event event) {
105
 
-
 
106
					// on notifie le médiateur
-
 
107
					getIMediateur().doubleClicZoomImage();
-
 
108
				}				
-
 
109
			}
-
 
110
		};
-
 
111
		
-
 
112
		
34
				if (Event.ONDBLCLICK == DOM.eventGetType(event)) {
113
		imageConteneur = new Panel() ;
Line -... Line 114...
-
 
114
		imageConteneur.add(image) ;
35
 
115
		
Line 36... Line 116...
36
					getIMediateur().doubleClicZoomImage();
116
		imageConteneur.setId("x-view-zoom-img") ;
Line 37... Line 117...
37
				}
117
		
38
			}
118
		// il n'existe pas de méthode pour ajouter un listener pour le double clic sur une image
Line 39... Line 119...
39
		};
119
		// alors on lui dit manuellement de capter l'évènement double clic
40
 
120
		image.sinkEvents(Event.ONDBLCLICK);
41
		image.sinkEvents(Event.ONDBLCLICK);
121
		
Line -... Line 122...
-
 
122
		// l'image de base est vide
42
		
123
		image.setUrl("vide.jpg");
43
		image.setUrl("vide.jpg");
124
		
Line -... Line 125...
-
 
125
		this.setLayout(new BorderLayout());
-
 
126
		
-
 
127
		prev.setWidth("60px");
-
 
128
		suiv.setWidth("60px");
44
		
129
		
45
		this.setLayout(new BorderLayout());
130
		this.add(prev,new BorderLayoutData(RegionPosition.WEST));
Line -... Line 131...
-
 
131
		this.add(imageConteneur,new BorderLayoutData(RegionPosition.CENTER));
46
		
132
		this.add(suiv,new BorderLayoutData(RegionPosition.EAST));
47
		prev.setWidth("60px");
133
		
48
		suiv.setWidth("60px");
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[])
-
 
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
51
		this.add(image,new BorderLayoutData(RegionPosition.CENTER));
150
			getImage().setUrl(infos[0]);
-
 
151
			
52
		this.add(suiv,new BorderLayoutData(RegionPosition.EAST));
152
			
53
		
153
			if(infos[1] != null && infos[2] != null)
54
		ajouterListenersBoutons();
154
			{
Line -... Line 155...
-
 
155
				int x = Integer.parseInt(infos[1]) ;
-
 
156
				int y = Integer.parseInt(infos[2]) ;
-
 
157
				
55
	}
158
				setTailleImage(x,y) ;
56
 
159
				
57
	
160
				verifierEtRetaillerImage() ;
58
	public void rafraichir(Object nouvelleDonnees, boolean repandreRafraichissement) {
161
			}
59
		
162
		}
60
		if(nouvelleDonnees instanceof String)
163
		else
Line -... Line 164...
-
 
164
		{
-
 
165
			// sinon on met une image vide
-
 
166
			getImage().setUrl("vide.jpeg") ;
61
		{
167
		}
62
			getImage().setUrl((String)nouvelleDonnees);
168
	}
63
		}
169
	
64
		else
170
	/**
65
		{
171
	 * Desactive visuellement le panneau et les boutons
Line -... Line 172...
-
 
172
	 */
-
 
173
	public void desactiverPanneau()
66
			getImage().setUrl("/images/vide.jpeg") ;
174
	{
67
		}
175
		getImage().setUrl("vide.jpeg") ;
68
	}
176
		prev.setEnabled(false) ;
-
 
177
		suiv.setEnabled(false);
69
	
178
	}
Line -... Line 179...
-
 
179
	
70
	public void desactiverPanneau()
180
	/**
71
	{
-
 
-
 
181
	 * Active visuellement le panneau et les boutons
72
		getImage().setUrl("/images/vide.jpeg") ;
182
	 */
73
		prev.setEnabled(false) ;
183
	public void activerPanneau()
Line 74... Line 184...
74
		suiv.setEnabled(false);
184
	{
Line -... Line 185...
-
 
185
		prev.setEnabled(true);
75
	}
186
		suiv.setEnabled(true);
Line -... Line 187...
-
 
187
	}
76
	
188
	
77
	public void activerPanneau()
-
 
78
	{
-
 
-
 
189
	/**
79
		prev.setEnabled(true);
190
	 * Ajoute les listeners pour la gestions d'évènement
80
		suiv.setEnabled(true);
191
	 */
Line 81... Line 192...
81
	}
192
	public void ajouterListeners()
-
 
193
	{
-
 
194
		// gestion du clic sur le bouton précedent
-
 
195
		prev.addClickListener(new ClickListener() {
-
 
196
 
-
 
197
			// en cas de clic
-
 
198
			public void onClick(Widget sender) {
-
 
199
				// on notifie le médiateur
-
 
200
				getIMediateur().clicBoutonZoomImage("prev");
-
 
201
			}
-
 
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	
-
 
211
				getIMediateur().clicBoutonZoomImage("suiv");
-
 
212
			}
-
 
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 ;
-
 
277
			nouvelleTailleY = originalY ;
-
 
278
			
-
 
279
		}
82
	
280
		 
Line -... Line 281...
-
 
281
		// si l'image ne rentre pas telle quelle (longueur ou hauteur trop grande)
-
 
282
		if(originalY > tailleConteneurY || originalX > tailleConteneurX)
-
 
283
		{
83
	
284
			// si la longueur de l'image est la plus grande des deux
84
	public void ajouterListenersBoutons()
285
			if(originalX > originalY)
85
	{
286
			{		
86
		prev.addClickListener(new ClickListener() {
287
				// on prend la longueur comme taille de référence, qu'on met à la longueur du conteneur
Line -... Line 288...
-
 
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) ;
87
 
291
			}
88
			public void onClick(Widget sender) {
292
			else
89
				
293
			{				
90
				getIMediateur().clicBoutonZoomImage("prev");
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
Line -... Line 295...
-
 
295
				nouvelleTailleY = tailleConteneurY ;
-
 
296
				nouvelleTailleX = (int)Math.floor(nouvelleTailleY*rapportTaille) ;
-
 
297
			}		
91
			}
298
		}
92
			
299
		
93
		});
300
		// on modifie enfin la taille de l'image pour qu'elle soit affichée
94
		
301
		getImage().setSize(""+nouvelleTailleX+"px", ""+nouvelleTailleY+"px") ;		
Line -... Line 302...
-
 
302
	}
-
 
303
 
-
 
304
	/**
95
		suiv.addClickListener(new ClickListener() {
305
	 * Accesseur pour le médiateur
96
 
306
	 * @return le médiateur associé à la vue
97
			public void onClick(Widget sender) {
307
	 */
98
				
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
	}
-
 
327
 
-
 
328
	/**
-
 
329
	 * Accesseur pour le bouton suivant
-
 
330
	 * @return le bouton suivant
Line 99... Line 331...
99
				
331
	 */