Subversion Repositories eFlore/Applications.cel

Rev

Rev 40 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 aperonnet 1
package org.tela_botanica.client.vues;
2
 
3
import org.tela_botanica.client.image.ImageMediateur;
4
import org.tela_botanica.client.interfaces.Rafraichissable;
5
 
6
import com.google.gwt.user.client.DOM;
7
import com.google.gwt.user.client.Event;
8
import com.google.gwt.user.client.ui.ClickListener;
9
import com.google.gwt.user.client.ui.Image;
10
import com.google.gwt.user.client.ui.Widget;
5 aperonnet 11
import com.gwtext.client.core.EventObject;
2 aperonnet 12
import com.gwtext.client.core.RegionPosition;
5 aperonnet 13
import com.gwtext.client.dd.DragData;
14
import com.gwtext.client.dd.DragSource;
15
import com.gwtext.client.dd.DropTarget;
16
import com.gwtext.client.dd.DropTargetConfig;
2 aperonnet 17
import com.gwtext.client.widgets.Container;
18
import com.gwtext.client.widgets.Panel;
99 jpm 19
import com.gwtext.client.widgets.ToolTip;
2 aperonnet 20
import com.gwtext.client.widgets.event.PanelListenerAdapter;
5 aperonnet 21
import com.gwtext.client.widgets.grid.GridDragData;
2 aperonnet 22
import com.gwtext.client.widgets.layout.BorderLayout;
23
import com.gwtext.client.widgets.layout.BorderLayoutData;
24
 
25
/**
26
 * Panneau d'affichage d'une image avec des boutons précdents et suivant
5 aperonnet 27
 *
2 aperonnet 28
 * @author aurelien
5 aperonnet 29
 *
2 aperonnet 30
 */
31
public class ZoomImageVue extends Panel implements Rafraichissable {
5 aperonnet 32
 
2 aperonnet 33
	/**
34
	 * Le médiateur associé à la vue
35
	 */
5 aperonnet 36
	private ImageMediateur iMediateur = null;
37
 
2 aperonnet 38
	/**
39
	 * Panneau conteneur pour l'image
40
	 */
5 aperonnet 41
	private Panel imageConteneur = null;
2 aperonnet 42
	/**
43
	 * l'image à afficher
44
	 */
5 aperonnet 45
	private Image image = new Image("vide.jpg");
2 aperonnet 46
	/**
47
	 * Bouton précédent
48
	 */
49
	private final com.google.gwt.user.client.ui.Button prev = new com.google.gwt.user.client.ui.Button();
50
	/**
51
	 * Bouton suivant
52
	 */
53
	private final com.google.gwt.user.client.ui.Button suiv = new com.google.gwt.user.client.ui.Button();
5 aperonnet 54
 
2 aperonnet 55
	/**
56
	 * Taille originale Y de l'image
57
	 */
5 aperonnet 58
	private int imageHeight = 0;
59
 
2 aperonnet 60
	/**
61
	 * Taille originale X de l'image
62
	 */
5 aperonnet 63
	private int imageWidth = 0;
2 aperonnet 64
 
65
	/**
5 aperonnet 66
	 * Identifiant de l'image
67
	 */
68
	private String idImage = "0" ;
69
 
70
	/**
2 aperonnet 71
	 * Booleen d'initalisation général
72
	 */
5 aperonnet 73
	private boolean initialise = false;
74
 
2 aperonnet 75
	/**
76
	 * Booleen d'initalisation du conteneur d'image
77
	 */
5 aperonnet 78
	private boolean conteneurInitialise = false;
99 jpm 79
 
80
	private ToolTip tp = new ToolTip("<div class=\"x-tooltip-help\"> Double cliquez pour revenir à la vue précédente, utilisez la roulette ou les boutons fléchés pour faire défiler les images </div>") ;
5 aperonnet 81
 
2 aperonnet 82
	/**
83
	 * Constructeur sans argument (privé car ne doit être utilisé)
84
	 */
85
	@SuppressWarnings("unused")
5 aperonnet 86
	private ZoomImageVue() {
87
		super();
2 aperonnet 88
	}
5 aperonnet 89
 
2 aperonnet 90
	/**
91
	 * Constructeur avec argument
5 aperonnet 92
	 *
93
	 * @param im
94
	 *            le médiateur à associer à la vue
2 aperonnet 95
	 */
5 aperonnet 96
	public ZoomImageVue(ImageMediateur im) {
2 aperonnet 97
		super("Zoom");
5 aperonnet 98
		setId("x-view-zoom-panel");
2 aperonnet 99
		// on associe le médiateur
5 aperonnet 100
		iMediateur = im;
2 aperonnet 101
 
5 aperonnet 102
		prev.setStylePrimaryName("x-view-zoom-button-p");
103
		suiv.setStylePrimaryName("x-view-zoom-button-s");
104
 
2 aperonnet 105
		// on crée une image qui gère le double clic et la roulette de la souris
106
		image = new Image() {
5 aperonnet 107
 
2 aperonnet 108
			public void onBrowserEvent(Event event) {
5 aperonnet 109
 
2 aperonnet 110
				// lors du double clic
111
				if (Event.ONDBLCLICK == DOM.eventGetType(event)) {
112
 
113
					// on notifie le médiateur
114
					getIMediateur().doubleClicZoomImage();
115
				}
5 aperonnet 116
 
2 aperonnet 117
				// lors d'un déplacement de la roulette
118
				if (Event.ONMOUSEWHEEL == DOM.eventGetType(event)) {
119
 
120
					// on simule un clic sur le bouton précédent
5 aperonnet 121
					if (event.getMouseWheelVelocityY() >= 1) {
122
						prev.click();
2 aperonnet 123
					}
5 aperonnet 124
 
2 aperonnet 125
					// ou suivant
5 aperonnet 126
					if (event.getMouseWheelVelocityY() <= -1) {
127
						suiv.click();
2 aperonnet 128
					}
129
				}
130
			}
5 aperonnet 131
 
2 aperonnet 132
		};
5 aperonnet 133
 
134
		this.setHeader(false);
135
 
136
		imageConteneur = new Panel() ;
2 aperonnet 137
		imageConteneur.setBorder(false);
5 aperonnet 138
 
139
		imageConteneur.add(image);
140
		imageConteneur.setId("x-view-zoom-img");
141
 
142
		// il n'existe pas de méthode pour ajouter un listener pour le double
143
		// clic sur une image
2 aperonnet 144
		// alors on lui dit manuellement de capter l'évènement double clic
145
		image.sinkEvents(Event.ONDBLCLICK);
5 aperonnet 146
		image.sinkEvents(Event.ONMOUSEWHEEL);
147
 
2 aperonnet 148
		// l'image de base est vide
149
		image.setUrl("vide.jpg");
5 aperonnet 150
 
2 aperonnet 151
		this.setLayout(new BorderLayout());
5 aperonnet 152
 
2 aperonnet 153
		prev.setWidth("60px");
154
		suiv.setWidth("60px");
5 aperonnet 155
 
156
		this.add(prev, new BorderLayoutData(RegionPosition.WEST));
157
		this.add(imageConteneur, new BorderLayoutData(RegionPosition.CENTER));
158
		this.add(suiv, new BorderLayoutData(RegionPosition.EAST));
159
 
160
		imageConteneur.setMaskDisabled(true);
2 aperonnet 161
		this.setBorder(false);
5 aperonnet 162
 
163
		conteneurInitialise = true;
164
		initialise = true;
2 aperonnet 165
 
5 aperonnet 166
		configDragAndDrop() ;
167
 
2 aperonnet 168
		// on ajoute les listeners
169
		ajouterListeners();
99 jpm 170
 
171
		tp.applyTo(image.getElement()) ;
2 aperonnet 172
 
173
	}
174
 
175
	/**
176
	 * Méthode héritée de l'interface rafraichissable
5 aperonnet 177
	 *
178
	 * @param nouvelleDonnees
179
	 *            les nouvelles données
180
	 * @param repandreRafraichissement
181
	 *            le booleen qui dit si on doit répnadre l'évènement
2 aperonnet 182
	 */
5 aperonnet 183
	public void rafraichir(Object nouvelleDonnees,
184
			boolean repandreRafraichissement) {
185
 
2 aperonnet 186
		// si on reçoit une string
5 aperonnet 187
		if (nouvelleDonnees instanceof String[] && initialise
188
				&& conteneurInitialise) {
189
			String[] infos = (String[]) nouvelleDonnees;
2 aperonnet 190
			// c'est l'url de l'image qu'on associe à la vue
5 aperonnet 191
			if (infos[0] != null && infos[1] != null && infos[2] != null && infos[3] != null) {
192
				getImage().setUrl(infos[0]);
193
				int x = Integer.parseInt(infos[1]);
194
				int y = Integer.parseInt(infos[2]);
195
 
196
				setTailleImage(x, y);
2 aperonnet 197
 
5 aperonnet 198
				setIdImage(infos[3]) ;
199
 
200
				verifierEtRetaillerImage();
2 aperonnet 201
			}
5 aperonnet 202
		} else {
2 aperonnet 203
			// sinon on met une image vide
40 david 204
			getImage().setUrl("vide.jpg");
2 aperonnet 205
		}
206
	}
5 aperonnet 207
 
2 aperonnet 208
	/**
209
	 * Desactive visuellement le panneau et les boutons
210
	 */
5 aperonnet 211
	public void desactiverPanneau() {
212
		getImage().setUrl("vide.jpeg");
213
		prev.setEnabled(false);
2 aperonnet 214
		suiv.setEnabled(false);
215
	}
5 aperonnet 216
 
2 aperonnet 217
	/**
218
	 * Active visuellement le panneau et les boutons
219
	 */
5 aperonnet 220
	public void activerPanneau() {
2 aperonnet 221
		prev.setEnabled(true);
222
		suiv.setEnabled(true);
223
	}
5 aperonnet 224
 
2 aperonnet 225
	/**
226
	 * Ajoute les listeners pour la gestions d'évènement
227
	 */
5 aperonnet 228
	public void ajouterListeners() {
229
 
2 aperonnet 230
		// gestion du clic sur le bouton précedent
231
		prev.addClickListener(new ClickListener() {
232
 
233
			// en cas de clic
234
			public void onClick(Widget sender) {
235
				// on notifie le médiateur
236
				getIMediateur().clicBoutonZoomImage("prev");
237
			}
5 aperonnet 238
 
2 aperonnet 239
		});
5 aperonnet 240
 
2 aperonnet 241
		// gestion du clic sur le bouton suivant
242
		suiv.addClickListener(new ClickListener() {
243
 
244
			// en cas de clic
245
			public void onClick(Widget sender) {
5 aperonnet 246
				// on notifie le médiateur
2 aperonnet 247
				getIMediateur().clicBoutonZoomImage("suiv");
248
			}
5 aperonnet 249
 
2 aperonnet 250
		});
5 aperonnet 251
 
2 aperonnet 252
		// gestion du redimensionnement
253
		this.addListener(new PanelListenerAdapter() {
5 aperonnet 254
 
2 aperonnet 255
			// lors d'un redimensionnement de l'application
5 aperonnet 256
 
257
			public void onBodyResize(Panel panel, java.lang.String width,
258
					java.lang.String height) {
2 aperonnet 259
				// on vérifie et on retaille l'image
5 aperonnet 260
				verifierEtRetaillerImage();
2 aperonnet 261
			}
5 aperonnet 262
		});
263
 
2 aperonnet 264
		// gestion du redimensionnement lors de l'affichage du conteneur
265
		imageConteneur.addListener(new PanelListenerAdapter() {
5 aperonnet 266
 
2 aperonnet 267
			// avant de finir d'afficher
5 aperonnet 268
 
269
			public void onAfterLayout(Container self) {
2 aperonnet 270
				// on redimensionne
5 aperonnet 271
				verifierEtRetaillerImage();
2 aperonnet 272
			}
5 aperonnet 273
		});
274
 
2 aperonnet 275
	}
276
 
277
	/**
5 aperonnet 278
	 * Verifie si l'image est plus grande que le conteneur et la retaille le cas
279
	 * echeant
2 aperonnet 280
	 */
5 aperonnet 281
	public void verifierEtRetaillerImage() {
2 aperonnet 282
		// si l'image est nulle
5 aperonnet 283
		if (image == null) {
2 aperonnet 284
			// on ne fait rien
5 aperonnet 285
			return;
286
		}
287
 
2 aperonnet 288
		// on prend la taille originale de l'image
5 aperonnet 289
		int originalX = getTailleImage()[0];
290
		int originalY = getTailleImage()[1];
291
 
292
		// on la transforme en float (la division entre entier donne de curieux
293
		// résultats)
294
		float fOriginalX = (new Float(originalX)).floatValue();
295
		float fOriginalY = (new Float(originalY)).floatValue();
296
 
2 aperonnet 297
		// et on fait le rapport longueur sur hauteur (pour connaitre le ratio)
5 aperonnet 298
		float rapportTaille = fOriginalX / fOriginalY;
299
 
2 aperonnet 300
		// la nouvelle taille est pour le moment égale à l'ancienne
5 aperonnet 301
		int nouvelleTailleX = originalX;
302
		int nouvelleTailleY = originalY;
303
 
2 aperonnet 304
		// on prend la taille du conteneur
5 aperonnet 305
		int tailleConteneurX = imageConteneur.getWidth();
306
		int tailleConteneurY = imageConteneur.getHeight();
307
 
2 aperonnet 308
		// si celle-ci est égale à 0 (conteneur mal initialisé)
5 aperonnet 309
		/*
310
		 * if(imageConteneur.getHeight() == 0 && tailleConteneurX == 0) { // on
311
		 * essaie de la calculer en fonction de la taille du parent et des
312
		 * frères tailleConteneurY = this.getHeight() ; tailleConteneurX =
313
		 * this.getWidth() - prev.getOffsetWidth() * 2 ;
314
		 *  }
315
		 */
316
 
317
		// si l'image ne rentre pas telle quelle (longueur ou hauteur trop
318
		// grande)
319
		if (originalY > tailleConteneurY || originalX > tailleConteneurX) {
2 aperonnet 320
			// si la longueur de l'image est la plus grande des deux
5 aperonnet 321
			if (originalX > originalY) {
322
				// on prend la longueur comme taille de référence, qu'on met à
323
				// la longueur du conteneur
324
				nouvelleTailleX = tailleConteneurX;
325
				// et on recalcule la hauteur, par rapport à la nouvelle
326
				// longueur, en gardant le format de 'limage
327
				nouvelleTailleY = (int) Math.floor(nouvelleTailleX * 1
328
						/ rapportTaille);
329
			} else {
330
				// si la hauteur est la plus grande, on fait le même genre
331
				// d'opération en prenant la hauteur comme référence
332
				nouvelleTailleY = tailleConteneurY;
333
				nouvelleTailleX = (int) Math.floor(nouvelleTailleY
334
						* rapportTaille);
2 aperonnet 335
			}
336
		}
5 aperonnet 337
 
2 aperonnet 338
		// on modifie enfin la taille de l'image pour qu'elle soit affichée
5 aperonnet 339
		getImage().setSize("" + nouvelleTailleX + "px",
340
				"" + nouvelleTailleY + "px");
2 aperonnet 341
	}
5 aperonnet 342
 
343
	public void configDragAndDrop()
344
	{
2 aperonnet 345
 
5 aperonnet 346
		// on fabrique la nouvelle configuration
347
		// les éléments sur lesquels on fait du drag 'n drop doivent tous avoir le même ddGroup
348
		DropTargetConfig dtc = new DropTargetConfig();
349
		dtc.setdDdGroup("DragGroupName");
350
 
351
		//La drop target permet de gérer l'évenement onDrop sur l'élement courant
352
		@SuppressWarnings("unused")
353
		DropTarget tg = new DropTarget(this, dtc)
354
		{
355
			public boolean notifyDrop(DragSource source, EventObject e, DragData data){
356
 
357
				// si on reçoit des données provenant d'une grille
358
				if(data instanceof GridDragData)
359
		    	  {
360
		    		  		// on appelle le médiateur
361
		    		  		return iMediateur.lierObsDD(source, e, data,getId()) ;
362
		    	  }
363
				return false ;
364
			}
365
 
366
			public String notifyOver(DragSource source, EventObject e, DragData data){
367
			    return "x-dd-drop-ok";
368
			}
369
		};
370
 
371
	}
372
 
2 aperonnet 373
	/**
374
	 * Accesseur pour le médiateur
5 aperonnet 375
	 *
2 aperonnet 376
	 * @return le médiateur associé à la vue
377
	 */
378
	public ImageMediateur getIMediateur() {
379
		return iMediateur;
380
	}
381
 
382
	/**
383
	 * Accesseur au conteneur de l'image
5 aperonnet 384
	 *
2 aperonnet 385
	 * @return le conteneur de l'image
386
	 */
387
	public Image getImage() {
388
		return image;
389
	}
5 aperonnet 390
 
391
	/**
392
	 * Acesseurs pour l'identifiant de l'image
393
	 * @return l'id de l'image
394
	 */
395
	public String getIdImage()
396
	{
397
		return idImage ;
398
	}
2 aperonnet 399
 
400
	/**
401
	 * Accesseur pour le bouton précédent
5 aperonnet 402
	 *
2 aperonnet 403
	 * @return le bouton précédent
404
	 */
405
	public com.google.gwt.user.client.ui.Button getPrev() {
406
		return prev;
407
	}
408
 
409
	/**
410
	 * Accesseur pour le bouton suivant
5 aperonnet 411
	 *
2 aperonnet 412
	 * @return le bouton suivant
413
	 */
414
	public com.google.gwt.user.client.ui.Button getSuiv() {
415
		return suiv;
416
	}
5 aperonnet 417
 
2 aperonnet 418
	/**
419
	 * Setter pour la taille de l'image
5 aperonnet 420
	 *
7 aperonnet 421
	 * @param x
5 aperonnet 422
	 *            la largeur en pixels
7 aperonnet 423
	 * @param y
5 aperonnet 424
	 *            la hauteur en pixels
2 aperonnet 425
	 */
5 aperonnet 426
	public void setTailleImage(int x, int y) {
427
		imageHeight = y;
428
		imageWidth = x;
2 aperonnet 429
	}
430
 
431
	/**
5 aperonnet 432
	 * Setteur pour l'identifiant de l'image
433
	 * @param id le nouvel identifiant
434
	 */
435
	public void setIdImage(String id)
436
	{
437
		idImage = id ;
438
	}
439
 
440
	/**
2 aperonnet 441
	 * renvoie la taille originale de l'image
5 aperonnet 442
	 *
2 aperonnet 443
	 * @return un tableau de deux entiers contenant la largeur puis la hauteur
444
	 */
5 aperonnet 445
	public int[] getTailleImage() {
446
		int[] taille = { imageHeight, imageWidth };
447
 
448
		return taille;
2 aperonnet 449
	}
5 aperonnet 450
 
451
	/**
452
	 * Accesseur pour le conteneur de l'image
453
	 * @return le conteur de l'image
454
	 */
455
	public Panel getImageConteneur() {
2 aperonnet 456
 
5 aperonnet 457
		return imageConteneur;
458
 
2 aperonnet 459
	}
460
}