Subversion Repositories eFlore/Applications.cel

Rev

Rev 2757 | 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
 
2627 mathias 3
import org.tela_botanica.client.i18n.Msg;
94 jpm 4
import org.tela_botanica.client.interfaces.Rafraichissable;
989 aurelien 5
import org.tela_botanica.client.modeles.objets.ImageCarnet;
94 jpm 6
import org.tela_botanica.client.observation.ObservationMediateur;
7
 
338 aurelien 8
import com.google.gwt.event.dom.client.ClickEvent;
9
import com.google.gwt.event.dom.client.ClickHandler;
10
import com.google.gwt.event.dom.client.LoadEvent;
11
import com.google.gwt.event.dom.client.LoadHandler;
94 jpm 12
import com.google.gwt.user.client.DOM;
13
import com.google.gwt.user.client.Event;
213 aurelien 14
import com.google.gwt.user.client.Window;
2656 aurelien 15
import com.google.gwt.user.client.ui.HTML;
94 jpm 16
import com.google.gwt.user.client.ui.Image;
213 aurelien 17
import com.gwtext.client.core.AnimationConfig;
94 jpm 18
import com.gwtext.client.core.EventObject;
213 aurelien 19
import com.gwtext.client.core.Ext;
20
import com.gwtext.client.core.ExtElement;
94 jpm 21
import com.gwtext.client.core.RegionPosition;
22
import com.gwtext.client.widgets.Panel;
213 aurelien 23
import com.gwtext.client.widgets.ToolTip;
94 jpm 24
import com.gwtext.client.widgets.layout.BorderLayout;
25
import com.gwtext.client.widgets.layout.BorderLayoutData;
104 jpm 26
import com.gwtext.client.widgets.menu.BaseItem;
27
import com.gwtext.client.widgets.menu.Item;
28
import com.gwtext.client.widgets.menu.Menu;
29
import com.gwtext.client.widgets.menu.event.MenuListenerAdapter;
94 jpm 30
 
31
/**
32
 * Panneau d'affichage d'une image avec des boutons précdents et suivant
33
 *
34
 * @author aurelien
35
 *
36
 */
37
public class MiniZoomImageVue extends Panel implements Rafraichissable {
38
 
39
	/**
40
	 * Le médiateur associé à la vue
41
	 */
42
	private ObservationMediateur oMediateur = null;
245 aurelien 43
 
44
	/**
45
	 * Le titre du panneau
46
	 */
2627 mathias 47
	private static String titrePanneau = Msg.get("images-liees");
94 jpm 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
 
213 aurelien 81
	private String[] infosImages[] = null ;
94 jpm 82
 
83
	private int index = 0 ;
84
 
85
	/**
213 aurelien 86
	 * true pour animer les transitions
87
	 */
88
	private boolean animerTransition = false;
89
	/**
90
	 * Détermine la durée de la transition
91
	 */
92
	private float dureeAnimation = (float) 0.15;
93
 
94
	/**
94 jpm 95
	 * Booleen d'initalisation général
96
	 */
97
	private boolean initialise = false;
98
 
99
	/**
100
	 * Booleen d'initalisation du conteneur d'image
101
	 */
102
	private boolean conteneurInitialise = false;
213 aurelien 103
 
2627 mathias 104
	private ToolTip tp = new ToolTip("<div class=\"x-tooltip-help\"> " + Msg.get("double-clic-agrandir") + " </div>") ;
213 aurelien 105
 
2627 mathias 106
	com.gwtext.client.widgets.Window imgZoom = new com.gwtext.client.widgets.Window(Msg.get("agrandissement")) ;
213 aurelien 107
 
108
	Image imgAgrandie = null;
2656 aurelien 109
 
110
	private HTML htmlVide = new HTML();
94 jpm 111
 
112
	/**
113
	 * Constructeur sans argument (privé car ne doit être utilisé)
114
	 */
115
	@SuppressWarnings("unused")
116
	private MiniZoomImageVue() {
117
		super();
118
	}
119
 
120
	/**
121
	 * Constructeur avec argument
122
	 *
123
	 * @param im
124
	 *            le médiateur à associer à la vue
125
	 */
126
	public MiniZoomImageVue(ObservationMediateur im) {
245 aurelien 127
		super(titrePanneau);
94 jpm 128
		setId("x-view-mini-zoom-panel");
129
		// on associe le médiateur
130
		oMediateur = im;
131
 
132
		prev.setStylePrimaryName("x-view-zoom-button-p");
133
		suiv.setStylePrimaryName("x-view-zoom-button-s");
134
 
213 aurelien 135
		imgZoom.setCloseAction(com.gwtext.client.widgets.Window.HIDE) ;
298 aurelien 136
		imgZoom.setConstrain(true);
213 aurelien 137
 
94 jpm 138
		// on crée une image qui gère le double clic et la roulette de la souris
139
		image = new Image() {
140
 
1292 aurelien 141
			@Override
94 jpm 142
			public void onBrowserEvent(Event event) {
143
 
144
				// lors d'un déplacement de la roulette
145
				if (Event.ONMOUSEWHEEL == DOM.eventGetType(event)) {
146
 
147
					// on simule un clic sur le bouton précédent
148
					if (event.getMouseWheelVelocityY() >= 1) {
149
						prev.click();
150
					}
151
 
152
					// ou suivant
153
					if (event.getMouseWheelVelocityY() <= -1) {
154
						suiv.click();
155
					}
156
				}
104 jpm 157
 
158
				if(Event.ONCONTEXTMENU == DOM.eventGetType(event)) {
159
 
160
					event.preventDefault() ;
161
					int[] xy = {event.getClientX(),event.getClientY()} ;
162
					afficherMenu(xy) ;
163
				}
213 aurelien 164
 
165
				// lors du double clic
166
				if (Event.ONDBLCLICK == DOM.eventGetType(event)) {
279 aurelien 167
					if(imgZoom.isVisible()) {
168
							imgZoom.hide();
169
					} else {
170
						afficherPanneauAgrandi();
171
					}
213 aurelien 172
				}
94 jpm 173
			}
174
 
175
		};
176
 
130 aurelien 177
		image.setPixelSize(150, 150);
178
 
213 aurelien 179
		infosImages = new String[0][0] ;
94 jpm 180
 
181
		this.setHeader(true);
182
 
183
		imageConteneur = new Panel() ;
184
		imageConteneur.setBorder(false);
185
 
186
		imageConteneur.add(image);
187
		imageConteneur.setId("x-view-mini-zoom-img");
2656 aurelien 188
		imageConteneur.add(htmlVide);
94 jpm 189
 
190
		// il n'existe pas de méthode pour ajouter un listener pour le double
191
		// clic sur une image
192
		// alors on lui dit manuellement de capter l'évènement double clic
193
		image.sinkEvents(Event.ONDBLCLICK);
194
		image.sinkEvents(Event.ONMOUSEWHEEL);
104 jpm 195
		image.sinkEvents(Event.ONCONTEXTMENU) ;
94 jpm 196
 
197
		this.setLayout(new BorderLayout());
198
 
130 aurelien 199
		prev.setWidth("15%");
200
		suiv.setWidth("15%");
94 jpm 201
 
202
		this.add(prev, new BorderLayoutData(RegionPosition.WEST));
203
		this.add(imageConteneur, new BorderLayoutData(RegionPosition.CENTER));
204
		this.add(suiv, new BorderLayoutData(RegionPosition.EAST));
205
 
206
		imageConteneur.setMaskDisabled(true);
207
		this.setBorder(false);
208
 
209
		conteneurInitialise = true;
210
		initialise = true;
211
 
2656 aurelien 212
		image.setVisible(false);
213
 
214
		afficherImageSinonAfficherMessage(false);
94 jpm 215
		// on ajoute les listeners
216
		ajouterListeners();
217
 
218
	}
219
 
220
	/**
221
	 * Méthode héritée de l'interface rafraichissable
222
	 *
223
	 * @param nouvelleDonnees
224
	 *            les nouvelles données
225
	 * @param repandreRafraichissement
226
	 *            le booleen qui dit si on doit répnadre l'évènement
227
	 */
1292 aurelien 228
	@Override
94 jpm 229
	public void rafraichir(Object nouvelleDonnees,
230
			boolean repandreRafraichissement) {
231
 
232
		// si on reçoit une string
213 aurelien 233
		if (nouvelleDonnees instanceof String[][] && initialise
234
				&& conteneurInitialise && ((String[][])nouvelleDonnees).length != 0) {
235
			infosImages = (String[][]) nouvelleDonnees;
94 jpm 236
			index = 0 ;
2656 aurelien 237
			afficherImageSinonAfficherMessage(true);
94 jpm 238
			afficherImage() ;
239
		} else {
213 aurelien 240
 
2656 aurelien 241
			afficherImageSinonAfficherMessage(false);
94 jpm 242
		}
243
	}
244
 
245
	public void afficherImage()
246
	{
247
		// c'est l'url de l'image qu'on associe à la vue
213 aurelien 248
		if(infosImages != null && infosImages.length != 0)
94 jpm 249
		{
2656 aurelien 250
			setTitle(titrePanneau+"         "+(index+1)+" / "+infosImages.length);
735 aurelien 251
			getImage().setUrl(getUrlMiniature(index));
213 aurelien 252
			imageWidth = Integer.parseInt(infosImages[index][1]);
253
			imageHeight = Integer.parseInt(infosImages[index][2]);
254
			verifierEtRetaillerImage();
245 aurelien 255
			activerPanneau(true);
256
		}
257
 
258
		if(infosImages != null && infosImages.length > 1) {
259
			prev.setEnabled(true);
260
			suiv.setEnabled(true);
261
		} else {
213 aurelien 262
			prev.setEnabled(false);
263
			suiv.setEnabled(false);
94 jpm 264
		}
265
	}
2656 aurelien 266
 
267
	private void afficherImageSinonAfficherMessage(boolean afficherImage) {
268
		if(afficherImage) {
269
			htmlVide.setVisible(false);
270
		} else {
271
			setTitle(Msg.get("aucune-image-liee"));
272
			afficherHtmlVide();
273
		}
274
		image.setVisible(afficherImage);
275
	}
276
 
277
 
278
	private void afficherHtmlVide() {
279
		String htmlDivVide = "<div class=\"aucune_image_pour\"> "+Msg.get("aucune-image-liee")+"</div>";
280
		htmlVide.setHeight("150px");
281
		htmlVide.setHTML(htmlDivVide);
282
		htmlVide.setVisible(true);
283
	}
94 jpm 284
 
285
	/**
286
	 * Active visuellement le panneau et les boutons
287
	 */
245 aurelien 288
	public void activerPanneau(boolean activer) {
289
		if(activer) {
290
			this.getEl().unmask();
291
		} else {
292
			this.getEl().mask();
293
		}
94 jpm 294
	}
295
 
296
	/**
297
	 * Ajoute les listeners pour la gestions d'évènement
298
	 */
299
	public void ajouterListeners() {
300
 
301
		// gestion du clic sur le bouton précedent
338 aurelien 302
		prev.addClickHandler(new ClickHandler() {
94 jpm 303
 
1292 aurelien 304
			@Override
338 aurelien 305
			public void onClick(ClickEvent event) {
94 jpm 306
				if(infosImages.length != 0) {
307
					if(index == 0)
308
					{
309
						index = infosImages.length - 1 ;
310
					}
311
					else
312
					{
313
						index-- ;
314
					}
315
 
316
					afficherImage() ;
317
				}
318
			}
319
 
320
		});
321
 
322
		// gestion du clic sur le bouton suivant
338 aurelien 323
		suiv.addClickHandler(new ClickHandler() {
94 jpm 324
 
325
			// en cas de clic
1292 aurelien 326
			@Override
338 aurelien 327
			public void onClick(ClickEvent event) {
94 jpm 328
 
329
				if(infosImages.length != 0) {
330
					if(index == infosImages.length - 1)
331
					{
332
						index = 0 ;
333
					}
334
					else
335
					{
336
						index++ ;
337
					}
338
 
339
					afficherImage() ;
340
				}
341
 
342
			}
343
 
344
		});
130 aurelien 345
 
94 jpm 346
	}
347
 
348
	/**
349
	 * Accesseur pour le médiateur
350
	 *
351
	 * @return le médiateur associé à la vue
352
	 */
353
	public ObservationMediateur getIMediateur() {
354
		return oMediateur;
355
	}
356
 
357
	/**
358
	 * Accesseur au conteneur de l'image
359
	 *
360
	 * @return le conteneur de l'image
361
	 */
362
	public Image getImage() {
363
		return image;
364
	}
365
 
366
	/**
367
	 * Acesseurs pour l'identifiant de l'image
368
	 * @return l'id de l'image
369
	 */
370
	public String getIdImage()
371
	{
213 aurelien 372
		return infosImages[index][0] ;
94 jpm 373
	}
374
 
375
	/**
376
	 * Accesseur pour le bouton précédent
377
	 *
378
	 * @return le bouton précédent
379
	 */
380
	public com.google.gwt.user.client.ui.Button getPrev() {
381
		return prev;
382
	}
383
 
384
	/**
385
	 * Accesseur pour le bouton suivant
386
	 *
387
	 * @return le bouton suivant
388
	 */
389
	public com.google.gwt.user.client.ui.Button getSuiv() {
390
		return suiv;
391
	}
392
 
393
	/**
394
	 * Setter pour la taille de l'image
395
	 *
396
	 * @param x
397
	 *            la largeur en pixels
398
	 * @param y
399
	 *            la hauteur en pixels
400
	 */
401
	public void setTailleImage(int x, int y) {
402
		imageHeight = y;
403
		imageWidth = x;
404
	}
405
 
406
	/**
407
	 * Setteur pour l'identifiant de l'image
408
	 * @param id le nouvel identifiant
409
	 */
410
	public void setIdImage(String id)
411
	{
412
		idImage = id ;
413
	}
414
 
415
	/**
416
	 * renvoie la taille originale de l'image
417
	 *
418
	 * @return un tableau de deux entiers contenant la largeur puis la hauteur
419
	 */
420
	public int[] getTailleImage() {
421
		int[] taille = { imageHeight, imageWidth };
422
 
423
		return taille;
424
	}
425
 
426
	/**
427
	 * Accesseur pour le conteneur de l'image
428
	 * @return le conteur de l'image
429
	 */
430
	public Panel getImageConteneur() {
431
 
432
		return imageConteneur;
433
 
434
	}
104 jpm 435
 
436
	public void raz() {
437
 
213 aurelien 438
		infosImages = new String[0][0] ;
104 jpm 439
		getImage().setUrl("");
440
 
441
	}
442
 
443
	public void supprimerLiaisonImage() {
444
 
445
		if(infosImages.length > 0) {
446
 
447
			getImage().setUrl("") ;
448
			int nouvelleTaille = infosImages.length - 1 ;
449
			int indexSupp = index ;
450
 
213 aurelien 451
			String[][] nouveauInfosImages = new String[nouvelleTaille][3] ;
104 jpm 452
			int j = 0 ;
453
 
454
			for(int i = 0 ; i < infosImages.length ; i++) {
455
 
456
				if(i != indexSupp) {
457
 
458
					nouveauInfosImages[j] = infosImages[i] ;
459
					j++ ;
460
				}
461
			}
462
 
463
			infosImages = nouveauInfosImages ;
464
			index = 0 ;
465
 
466
			afficherImage() ;
467
		}
468
	}
469
 
470
	public void afficherMenu(int[] xy) {
471
 
472
		Menu mn = new Menu() ;
2627 mathias 473
		final Item suppLiaison = new Item(Msg.get("supprimer-liaison"));
104 jpm 474
 
475
		mn.addItem(suppLiaison) ;
476
 
477
		mn.addListener(new MenuListenerAdapter() {
478
 
1292 aurelien 479
			@Override
104 jpm 480
			public void onItemClick(BaseItem item, EventObject e) {
481
 
482
				// si c'est l'aide
483
				if (item.equals(suppLiaison)) {
484
					// on notifie le médiateur
485
					getIMediateur().supprimerLiaisonObsImage() ;
486
				}
487
			}
488
 
489
		}) ;
490
 
491
		mn.showAt(xy) ;
492
	}
493
 
130 aurelien 494
	/**
495
	 * Verifie si l'image est plus grande que le conteneur et la retaille le cas
496
	 * echeant
497
	 */
498
	public void verifierEtRetaillerImage() {
213 aurelien 499
 
130 aurelien 500
		// si l'image est nulle
501
		if (image == null) {
502
			// on ne fait rien
503
			return;
504
		}
505
 
213 aurelien 506
		int[] dim = calculerDimensions(getTailleImage(),300,imageConteneur.getWidth());
145 aurelien 507
		getImage().setSize("" + dim[0] + "px",
508
				"" + dim[1] + "px");
130 aurelien 509
 
213 aurelien 510
		doLayout();
145 aurelien 511
 
213 aurelien 512
		if(imgZoom.isVisible()) {
513
			agrandirImage();
514
		}
130 aurelien 515
	}
145 aurelien 516
 
213 aurelien 517
	public int[] calculerDimensions(int[] tailleXY, double tailleMax, double tailleConteneur) {
145 aurelien 518
 
519
		float[] tailleXYf = {new Float(tailleXY[0]),new Float(tailleXY[1])} ;
213 aurelien 520
        float tailleOr = Math.min(new Float(tailleMax),new Float(tailleConteneur)) ;
145 aurelien 521
        float maxTaille = Math.max(tailleXYf[1],tailleXYf[0]) ;
522
        float[] XYresize = new float[2];
523
 
524
        if(maxTaille == tailleXY[0]) {
525
            float rapport = tailleXYf[1]/tailleXYf[0] ;
526
            XYresize[0] = tailleOr ;
527
            XYresize[1] = tailleOr*rapport ;
528
        }else {
529
            float rapport = tailleXYf[0]/tailleXYf[1] ;
530
            XYresize[1] = tailleOr ;
531
            XYresize[0] = tailleOr*rapport ;
532
        }
533
 
279 aurelien 534
        int[] res = {(int)Math.round(XYresize[0]*0.85),(int)Math.round(XYresize[1]*0.85)} ;
145 aurelien 535
 
536
        return res;
537
    }
213 aurelien 538
 
539
	protected void agrandirImage() {
540
 
541
			String urlAgrandie = "";
542
 
543
			if(infosImages == null) {
544
				urlAgrandie = "ill_liaison.png";
545
				setTailleImage(265, 270);
546
			} else {
735 aurelien 547
				urlAgrandie = getUrlAgrandie(index);
213 aurelien 548
			}
549
 
550
			if(imgAgrandie == null) {
551
				imgAgrandie = new Image(urlAgrandie);
552
				imgZoom.add(imgAgrandie);
553
 
338 aurelien 554
				imgAgrandie.addLoadHandler(new LoadHandler() {
213 aurelien 555
 
1292 aurelien 556
					@Override
338 aurelien 557
					public void onLoad(LoadEvent event) {
213 aurelien 558
						int[] tailleImage = calculerDimensions(getTailleImage(),getTailleImage()[1],Window.getClientHeight()*0.75);
559
						ExtElement imgElement = Ext.get(imgAgrandie.getElement());
560
						if(animerTransition) {
561
							AnimationConfig a = new AnimationConfig() ;
1292 aurelien 562
							a.setDuration(dureeAnimation);
213 aurelien 563
							imgElement.setHeight(tailleImage[1], a);
564
							imgElement.setWidth(tailleImage[0], a);
565
 
566
							ExtElement winElement = Ext.get(imgZoom.getElement());
567
							winElement.setHeight(tailleImage[1], a);
568
							winElement.setWidth(tailleImage[0], a);
569
						} else {
570
							imgElement.setHeight(tailleImage[1], false);
571
							imgElement.setWidth(tailleImage[0], false);
572
 
573
							ExtElement winElement = Ext.get(imgZoom.getElement());
574
							winElement.setHeight(tailleImage[1], false);
575
							winElement.setWidth(tailleImage[0], false);
576
						}
577
					}
578
 
579
				});
580
 
581
			} else {
582
				imgAgrandie.setUrl(urlAgrandie);
583
				imgAgrandie.setVisible(true);
584
			}
585
	}
586
 
735 aurelien 587
	private String getUrlMiniature(int index) {
588
 
973 aurelien 589
		String[][] paramsImage = {{"id_image",infosImages[index][0]}};
735 aurelien 590
		ImageCarnet ic = new ImageCarnet(paramsImage);
591
 
592
		return ic.getUrlFormatGalerie();
593
	}
594
 
595
	private String getUrlAgrandie(int index) {
973 aurelien 596
		String[][] paramsImage = {{"id_image",infosImages[index][0]}};
735 aurelien 597
		ImageCarnet ic = new ImageCarnet(paramsImage);
598
 
599
		return ic.getUrlFormatZoom();
600
	}
601
 
213 aurelien 602
	private void afficherPanneauAgrandi() {
237 aurelien 603
		agrandirImage();
604
		imgZoom.show(this.getElement());
605
		imgZoom.setPosition((int)(Window.getClientWidth() - Window.getClientWidth()*0.50),(int)(Window.getClientHeight() - Window.getClientHeight()*0.85));
213 aurelien 606
	}
94 jpm 607
}
608