Subversion Repositories eFlore/Applications.cel

Rev

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

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