Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
94 jpm 1
package org.tela_botanica.client.vues;
2
 
3
import org.tela_botanica.client.image.ImageMediateur;
4
import org.tela_botanica.client.interfaces.Rafraichissable;
104 jpm 5
import org.tela_botanica.client.modeles.Configuration;
94 jpm 6
import org.tela_botanica.client.observation.ObservationMediateur;
7
 
8
import com.google.gwt.user.client.DOM;
9
import com.google.gwt.user.client.Event;
10
import com.google.gwt.user.client.Window;
11
import com.google.gwt.user.client.ui.ClickListener;
12
import com.google.gwt.user.client.ui.Image;
104 jpm 13
import com.google.gwt.user.client.ui.MenuItem;
94 jpm 14
import com.google.gwt.user.client.ui.Widget;
15
import com.gwtext.client.core.EventObject;
16
import com.gwtext.client.core.RegionPosition;
17
import com.gwtext.client.dd.DragData;
18
import com.gwtext.client.dd.DragSource;
19
import com.gwtext.client.dd.DropTarget;
20
import com.gwtext.client.dd.DropTargetConfig;
130 aurelien 21
import com.gwtext.client.widgets.BoxComponent;
22
import com.gwtext.client.widgets.Component;
94 jpm 23
import com.gwtext.client.widgets.Container;
24
import com.gwtext.client.widgets.Panel;
130 aurelien 25
import com.gwtext.client.widgets.event.PanelListener;
94 jpm 26
import com.gwtext.client.widgets.event.PanelListenerAdapter;
27
import com.gwtext.client.widgets.grid.GridDragData;
28
import com.gwtext.client.widgets.layout.BorderLayout;
29
import com.gwtext.client.widgets.layout.BorderLayoutData;
104 jpm 30
import com.gwtext.client.widgets.menu.BaseItem;
31
import com.gwtext.client.widgets.menu.Item;
32
import com.gwtext.client.widgets.menu.Menu;
33
import com.gwtext.client.widgets.menu.event.MenuListener;
34
import com.gwtext.client.widgets.menu.event.MenuListenerAdapter;
94 jpm 35
 
36
/**
37
 * Panneau d'affichage d'une image avec des boutons précdents et suivant
38
 *
39
 * @author aurelien
40
 *
41
 */
42
public class MiniZoomImageVue extends Panel implements Rafraichissable {
43
 
44
	/**
45
	 * Le médiateur associé à la vue
46
	 */
47
	private ObservationMediateur oMediateur = null;
48
 
49
	/**
50
	 * Panneau conteneur pour l'image
51
	 */
52
	private Panel imageConteneur = null;
53
	/**
54
	 * l'image à afficher
55
	 */
97 jpm 56
	private Image image = new Image("");
94 jpm 57
	/**
58
	 * Bouton précédent
59
	 */
60
	private final com.google.gwt.user.client.ui.Button prev = new com.google.gwt.user.client.ui.Button();
61
	/**
62
	 * Bouton suivant
63
	 */
64
	private final com.google.gwt.user.client.ui.Button suiv = new com.google.gwt.user.client.ui.Button();
65
 
66
	/**
67
	 * Taille originale Y de l'image
68
	 */
69
	private int imageHeight = 0;
70
 
71
	/**
72
	 * Taille originale X de l'image
73
	 */
74
	private int imageWidth = 0;
75
 
76
	/**
77
	 * Identifiant de l'image
78
	 */
79
	private String idImage = "0" ;
80
 
81
	private String[] infosImages = null ;
82
 
83
	private int index = 0 ;
84
 
85
	/**
86
	 * Booleen d'initalisation général
87
	 */
88
	private boolean initialise = false;
89
 
90
	/**
91
	 * Booleen d'initalisation du conteneur d'image
92
	 */
93
	private boolean conteneurInitialise = false;
94
 
95
	/**
96
	 * Constructeur sans argument (privé car ne doit être utilisé)
97
	 */
98
	@SuppressWarnings("unused")
99
	private MiniZoomImageVue() {
100
		super();
101
	}
102
 
103
	/**
104
	 * Constructeur avec argument
105
	 *
106
	 * @param im
107
	 *            le médiateur à associer à la vue
108
	 */
109
	public MiniZoomImageVue(ObservationMediateur im) {
110
		super("Image liées");
111
		setId("x-view-mini-zoom-panel");
112
		// on associe le médiateur
113
		oMediateur = im;
114
 
115
		prev.setStylePrimaryName("x-view-zoom-button-p");
116
		suiv.setStylePrimaryName("x-view-zoom-button-s");
117
 
118
		// on crée une image qui gère le double clic et la roulette de la souris
119
		image = new Image() {
120
 
121
			public void onBrowserEvent(Event event) {
122
 
123
				// lors d'un déplacement de la roulette
124
				if (Event.ONMOUSEWHEEL == DOM.eventGetType(event)) {
125
 
126
					// on simule un clic sur le bouton précédent
127
					if (event.getMouseWheelVelocityY() >= 1) {
128
						prev.click();
129
					}
130
 
131
					// ou suivant
132
					if (event.getMouseWheelVelocityY() <= -1) {
133
						suiv.click();
134
					}
135
				}
104 jpm 136
 
137
				if(Event.ONCONTEXTMENU == DOM.eventGetType(event)) {
138
 
139
					event.preventDefault() ;
140
					int[] xy = {event.getClientX(),event.getClientY()} ;
141
					afficherMenu(xy) ;
142
				}
94 jpm 143
			}
144
 
145
		};
146
 
130 aurelien 147
		image.setPixelSize(150, 150);
148
 
94 jpm 149
		infosImages = new String[0] ;
150
 
151
		this.setHeader(true);
152
 
153
		imageConteneur = new Panel() ;
154
		imageConteneur.setBorder(false);
155
 
156
		imageConteneur.add(image);
157
		imageConteneur.setId("x-view-mini-zoom-img");
158
 
159
		// il n'existe pas de méthode pour ajouter un listener pour le double
160
		// clic sur une image
161
		// alors on lui dit manuellement de capter l'évènement double clic
162
		image.sinkEvents(Event.ONDBLCLICK);
163
		image.sinkEvents(Event.ONMOUSEWHEEL);
104 jpm 164
		image.sinkEvents(Event.ONCONTEXTMENU) ;
94 jpm 165
 
166
		// l'image de base est vide
97 jpm 167
		image.setUrl("");
94 jpm 168
 
169
		this.setLayout(new BorderLayout());
170
 
130 aurelien 171
		prev.setWidth("15%");
172
		suiv.setWidth("15%");
94 jpm 173
 
174
		this.add(prev, new BorderLayoutData(RegionPosition.WEST));
175
		this.add(imageConteneur, new BorderLayoutData(RegionPosition.CENTER));
176
		this.add(suiv, new BorderLayoutData(RegionPosition.EAST));
177
 
178
		imageConteneur.setMaskDisabled(true);
179
		this.setBorder(false);
180
 
181
		conteneurInitialise = true;
182
		initialise = true;
183
 
184
		// on ajoute les listeners
185
		ajouterListeners();
186
 
187
	}
188
 
189
	/**
190
	 * Méthode héritée de l'interface rafraichissable
191
	 *
192
	 * @param nouvelleDonnees
193
	 *            les nouvelles données
194
	 * @param repandreRafraichissement
195
	 *            le booleen qui dit si on doit répnadre l'évènement
196
	 */
197
	public void rafraichir(Object nouvelleDonnees,
198
			boolean repandreRafraichissement) {
199
 
200
		// si on reçoit une string
201
		if (nouvelleDonnees instanceof String[] && initialise
202
				&& conteneurInitialise) {
203
			infosImages = (String[]) nouvelleDonnees;
204
			index = 0 ;
205
			afficherImage() ;
206
 
207
		} else {
208
			// sinon on met une image vide
209
			infosImages = new String[0] ;
97 jpm 210
			getImage().setUrl("");
94 jpm 211
		}
212
	}
213
 
214
	public void afficherImage()
215
	{
216
		// c'est l'url de l'image qu'on associe à la vue
217
		if(infosImages.length != 0)
218
		{
97 jpm 219
			activerPanneau() ;
104 jpm 220
			getImage().setUrl(convertirIdEnUrl(infosImages[index]));
130 aurelien 221
			imageWidth =getImage().getWidth();
222
			imageHeight = getImage().getHeight();
223
			verifierEtRetaillerImage();
94 jpm 224
		}
225
		else
226
		{
97 jpm 227
			desactiverPanneau() ;
94 jpm 228
		}
229
	}
230
 
231
	/**
232
	 * Desactive visuellement le panneau et les boutons
233
	 */
234
	public void desactiverPanneau() {
97 jpm 235
		getImage().setUrl("");
94 jpm 236
		prev.setEnabled(false);
237
		suiv.setEnabled(false);
238
	}
239
 
240
	/**
241
	 * Active visuellement le panneau et les boutons
242
	 */
243
	public void activerPanneau() {
244
		prev.setEnabled(true);
245
		suiv.setEnabled(true);
246
	}
247
 
248
	/**
249
	 * Ajoute les listeners pour la gestions d'évènement
250
	 */
251
	public void ajouterListeners() {
252
 
253
		// gestion du clic sur le bouton précedent
254
		prev.addClickListener(new ClickListener() {
255
 
256
			// en cas de clic
257
			public void onClick(Widget sender) {
258
 
259
				if(infosImages.length != 0) {
260
					if(index == 0)
261
					{
262
						index = infosImages.length - 1 ;
263
					}
264
					else
265
					{
266
						index-- ;
267
					}
268
 
269
					afficherImage() ;
270
				}
271
			}
272
 
273
		});
274
 
275
		// gestion du clic sur le bouton suivant
276
		suiv.addClickListener(new ClickListener() {
277
 
278
			// en cas de clic
279
			public void onClick(Widget sender) {
280
 
281
				if(infosImages.length != 0) {
282
					if(index == infosImages.length - 1)
283
					{
284
						index = 0 ;
285
					}
286
					else
287
					{
288
						index++ ;
289
					}
290
 
291
					afficherImage() ;
292
				}
293
 
294
			}
295
 
296
		});
130 aurelien 297
 
298
		/*addListener(new PanelListenerAdapter() {
299
			public void onResize(BoxComponent component, int adjWidth, int adjHeight, int rawWidth, int rawHeight)  {
300
				verifierEtRetaillerImage();
301
			}
302
		});*/
94 jpm 303
	}
304
 
305
	/**
306
	 * Accesseur pour le médiateur
307
	 *
308
	 * @return le médiateur associé à la vue
309
	 */
310
	public ObservationMediateur getIMediateur() {
311
		return oMediateur;
312
	}
313
 
314
	/**
315
	 * Accesseur au conteneur de l'image
316
	 *
317
	 * @return le conteneur de l'image
318
	 */
319
	public Image getImage() {
320
		return image;
321
	}
322
 
323
	/**
324
	 * Acesseurs pour l'identifiant de l'image
325
	 * @return l'id de l'image
326
	 */
327
	public String getIdImage()
328
	{
104 jpm 329
		return infosImages[index] ;
94 jpm 330
	}
331
 
332
	/**
333
	 * Accesseur pour le bouton précédent
334
	 *
335
	 * @return le bouton précédent
336
	 */
337
	public com.google.gwt.user.client.ui.Button getPrev() {
338
		return prev;
339
	}
340
 
341
	/**
342
	 * Accesseur pour le bouton suivant
343
	 *
344
	 * @return le bouton suivant
345
	 */
346
	public com.google.gwt.user.client.ui.Button getSuiv() {
347
		return suiv;
348
	}
349
 
350
	/**
351
	 * Setter pour la taille de l'image
352
	 *
353
	 * @param x
354
	 *            la largeur en pixels
355
	 * @param y
356
	 *            la hauteur en pixels
357
	 */
358
	public void setTailleImage(int x, int y) {
359
		imageHeight = y;
360
		imageWidth = x;
361
	}
362
 
363
	/**
364
	 * Setteur pour l'identifiant de l'image
365
	 * @param id le nouvel identifiant
366
	 */
367
	public void setIdImage(String id)
368
	{
369
		idImage = id ;
370
	}
371
 
372
	/**
373
	 * renvoie la taille originale de l'image
374
	 *
375
	 * @return un tableau de deux entiers contenant la largeur puis la hauteur
376
	 */
377
	public int[] getTailleImage() {
378
		int[] taille = { imageHeight, imageWidth };
379
 
380
		return taille;
381
	}
382
 
383
	/**
384
	 * Accesseur pour le conteneur de l'image
385
	 * @return le conteur de l'image
386
	 */
387
	public Panel getImageConteneur() {
388
 
389
		return imageConteneur;
390
 
391
	}
104 jpm 392
 
393
	public void raz() {
394
 
395
		infosImages = new String[0] ;
396
		getImage().setUrl("");
397
 
398
	}
399
 
400
	public void supprimerLiaisonImage() {
401
 
402
		if(infosImages.length > 0) {
403
 
404
			getImage().setUrl("") ;
405
			int nouvelleTaille = infosImages.length - 1 ;
406
			int indexSupp = index ;
407
 
408
			String[] nouveauInfosImages = new String[nouvelleTaille] ;
409
			int j = 0 ;
410
 
411
			for(int i = 0 ; i < infosImages.length ; i++) {
412
 
413
				if(i != indexSupp) {
414
 
415
					nouveauInfosImages[j] = infosImages[i] ;
416
					j++ ;
417
				}
418
			}
419
 
420
			infosImages = nouveauInfosImages ;
421
			index = 0 ;
422
 
423
			afficherImage() ;
424
		}
425
	}
426
 
427
	public void afficherMenu(int[] xy) {
428
 
429
		Menu mn = new Menu() ;
430
		final Item suppLiaison = new Item("Supprimer la liaison") ;
431
 
432
		mn.addItem(suppLiaison) ;
433
 
434
		mn.addListener(new MenuListenerAdapter() {
435
 
436
			public void onItemClick(BaseItem item, EventObject e) {
437
 
438
				// si c'est l'aide
439
				if (item.equals(suppLiaison)) {
440
					// on notifie le médiateur
441
					getIMediateur().supprimerLiaisonObsImage() ;
442
				}
443
			}
444
 
445
		}) ;
446
 
447
		mn.showAt(xy) ;
448
	}
449
 
450
	public String convertirIdEnUrl(String idImg)
451
	{
452
		int maxZeros = 9 - idImg.length();
453
 
454
		for (int j = 0; j < maxZeros; j++) {
455
			idImg = "0" + idImg;
456
		}
457
 
458
		String baseUrl = Configuration.getImageBaseUrl() ;
459
 
460
		String dossierNv1 = idImg.substring(0, 3);
461
		String dossierNv2 = idImg.substring(3, 6);
462
		String fichierNv = idImg.substring(6, 9);
463
 
464
		String nomFichier = dossierNv1 + "_" + dossierNv2 + "_" + fichierNv;
465
 
466
		String[] infosFichier = { nomFichier, dossierNv1, dossierNv2 };
467
 
468
		String urlImg = baseUrl + infosFichier[1] + "/" + infosFichier[2] + "/M/"
469
		+ infosFichier[0] + "_M.jpg";
470
 
471
		return urlImg ;
472
	}
130 aurelien 473
 
474
	/**
475
	 * Verifie si l'image est plus grande que le conteneur et la retaille le cas
476
	 * echeant
477
	 */
478
	public void verifierEtRetaillerImage() {
479
		// si l'image est nulle
480
		if (image == null) {
481
			// on ne fait rien
482
			return;
483
		}
484
 
485
		// on prend la taille originale de l'image
486
		int originalX = getTailleImage()[0];
487
		int originalY = getTailleImage()[1];
488
 
489
		// on la transforme en float (la division entre entier donne de curieux
490
		// résultats)
491
		float fOriginalX = (new Float(originalX)).floatValue();
492
		float fOriginalY = (new Float(originalY)).floatValue();
493
 
494
		// et on fait le rapport longueur sur hauteur (pour connaitre le ratio)
495
		float rapportTaille = fOriginalX / fOriginalY;
496
 
497
		// la nouvelle taille est pour le moment égale à l'ancienne
498
		int nouvelleTailleX = originalX;
499
		int nouvelleTailleY = originalY;
500
 
501
		// on prend la taille du conteneur
502
		int tailleConteneurX = imageConteneur.getWidth();
503
		int tailleConteneurY = imageConteneur.getHeight();
504
 
505
		int maxConteneur = Math.min(tailleConteneurX, tailleConteneurY);
506
		int max = Math.min(maxConteneur, 300);
507
 
508
		// si l'image ne rentre pas telle quelle (longueur ou hauteur trop
509
		// grande)
510
		// si la longueur de l'image est la plus grande des deux
511
 
512
			int maxImage = Math.max(originalX, originalY);
513
 
514
			if(maxImage == originalX) {
515
				// on prend la longueur comme taille de référence, qu'on met à
516
				// la longueur du conteneur
517
				nouvelleTailleX = max;
518
				// et on recalcule la hauteur, par rapport à la nouvelle
519
				// longueur, en gardant le format de 'limage
520
				nouvelleTailleY = (int) Math.floor(nouvelleTailleX * 1
521
						/ rapportTaille);
522
			}
523
			else
524
			{
525
				// si la hauteur est la plus grande, on fait le même genre
526
				// d'opération en prenant la hauteur comme référence
527
				nouvelleTailleY = max;
528
				nouvelleTailleX = (int) Math.floor(nouvelleTailleY
529
						* rapportTaille);
530
			}
531
 
532
		// on modifie enfin la taille de l'image pour qu'elle soit affichée
533
		getImage().setSize("" + nouvelleTailleX + "px",
534
				"" + nouvelleTailleY + "px");
535
 
536
		doLayout();
537
	}
94 jpm 538
}
539